<!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,
        line_length: 100,
        show_tabs: true,
        tab_size: 8,
      };
      assert.deepEqual(element.prefs, element._newPrefs);

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

      assert.equal(element._newPrefs.context, 50);
      assert.equal(element._newPrefs.line_length, 80);
      assert.equal(element._newPrefs.tab_size, 4);
      assert.isFalse(element._newPrefs.show_tabs);
    });

    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])'));
    });

    test('ranged comments as a local preference', function() {
      element.localPrefs = {
        ranged_comments: true,
      };
      var inputEl = element.$.enableRangedCommentsInput;
      assert.isTrue(inputEl.checked, 'Binding to localPrefs');
      MockInteractions.tap(inputEl);
      assert.isFalse(inputEl.checked, 'Reacting to range_comments UI event.');
      var saveStub = sinon.stub();
      element.addEventListener('save', saveStub);
      MockInteractions.tap(element.$$('gr-button[primary]'));
      assert.isFalse(element.localPrefs.ranged_comments,
          'Updating localPrefs on save.');
      assert.isTrue(saveStub.called);
      element.removeEventListener('save', saveStub);
    });
  });
</script>
