<!DOCTYPE html>
<!--
Copyright (C) 2016 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-diff-preferences</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>

<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
<link rel="import" href="gr-diff-preferences.html">

<test-fixture id="basic">
  <template>
    <gr-diff-preferences></gr-diff-preferences>
  </template>
</test-fixture>

<script>
  suite('gr-diff-preferences tests', function() {
    var element;

    setup(function() {
      element = fixture('basic');
    });

    test('model changes', function() {
      element.prefs = {
        context: 10,
        font_size: 12,
        line_length: 100,
        show_tabs: true,
        tab_size: 8,
        show_whitespace_errors: true,
        syntax_highlighting: true,
      };
      assert.deepEqual(element.prefs, element._newPrefs);

      element.$.contextSelect.value = '50';
      element.fire('change', {}, {node: element.$.contextSelect});
      element.$.columnsInput.bindValue = 80;
      element.$.fontSizeInput.bindValue = 10;
      element.$.tabSizeInput.bindValue = 4;
      MockInteractions.tap(element.$.showTabsInput);
      MockInteractions.tap(element.$.showTrailingWhitespaceInput);
      MockInteractions.tap(element.$.syntaxHighlightInput);
      MockInteractions.tap(element.$.lineWrappingInput);

      assert.equal(element._newPrefs.context, 50);
      assert.equal(element._newPrefs.font_size, 10);
      assert.equal(element._newPrefs.line_length, 80);
      assert.equal(element._newPrefs.tab_size, 4);
      assert.isFalse(element._newPrefs.show_tabs);
      assert.isFalse(element._newPrefs.show_whitespace_errors);
      assert.isTrue(element._newPrefs.line_wrapping);
      assert.isFalse(element._newPrefs.syntax_highlighting);
    });

    test('clicking fit to screen hides line length input', function() {
      element.prefs = {line_wrapping: false};

      assert.isFalse(element.$.columnsPref.hidden);

      MockInteractions.tap(element.$.lineWrappingInput);
      assert.isTrue(element.$.columnsPref.hidden);

      MockInteractions.tap(element.$.lineWrappingInput);
      assert.isFalse(element.$.columnsPref.hidden);
    });

    test('clicking save button calls _handleSave function', function() {
      var savePrefs = sinon.stub(element, '_handleSave');
      MockInteractions.tap(element.$.saveButton);
      flushAsynchronousOperations();
      assert(savePrefs.calledOnce);
      savePrefs.restore();
    });

    test('events', function(done) {
      var savePromise = new Promise(function(resolve) {
        element.addEventListener('save', function() { resolve(); });
      });
      var cancelPromise = new Promise(function(resolve) {
        element.addEventListener('cancel', function() { resolve(); });
      });
      Promise.all([savePromise, cancelPromise]).then(function() {
        done();
      });
      MockInteractions.tap(element.$$('gr-button[primary]'));
      MockInteractions.tap(element.$$('gr-button:not([primary])'));
    });
  });
</script>
