<!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-lite.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">

<script>void(0);</script>

<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>
