<!DOCTYPE html>
<!--
Copyright (C) 2015 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-patch-range-select</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="../../../test/common-test-setup.html"/>
<script src="../../../bower_components/page/page.js"></script>

<link rel="import" href="gr-patch-range-select.html">

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

<test-fixture id="basic">
  <template>
    <gr-patch-range-select auto></gr-patch-range-select>
  </template>
</test-fixture>

<script>
  suite('gr-patch-range-select tests', () => {
    let element;

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

    test('enabled/disabled options', () => {
      const patchRange = {
        basePatchNum: 'PARENT',
        patchNum: '3',
      };
      for (const patchNum of ['1', '2', '3']) {
        assert.isFalse(element._computeRightDisabled(patchNum, patchRange));
      }
      for (const patchNum of ['PARENT', '1', '2']) {
        assert.isFalse(element._computeLeftDisabled(patchNum, patchRange));
      }
      assert.isTrue(element._computeLeftDisabled('3', patchRange));

      patchRange.basePatchNum = '2';
      assert.isTrue(element._computeLeftDisabled('3', patchRange));
      assert.isTrue(element._computeRightDisabled('1', patchRange));
      assert.isTrue(element._computeRightDisabled('2', patchRange));
      assert.isFalse(element._computeRightDisabled('3', patchRange));
    });

    test('navigation', done => {
      const showStub = sinon.stub(page, 'show');
      const leftSelectEl = element.$.leftPatchSelect;
      const rightSelectEl = element.$.rightPatchSelect;
      const blurSpy = sinon.spy(leftSelectEl, 'blur');
      element.changeNum = '42';
      element.path = 'path/to/file.txt';
      element.availablePatches = ['1', '2', '3'];
      element.patchRange = {
        basePatchNum: 'PARENT',
        patchNum: '3',
      };
      flushAsynchronousOperations();

      let numEvents = 0;
      leftSelectEl.addEventListener('change', e => {
        numEvents++;
        if (numEvents == 1) {
          assert(showStub.lastCall.calledWithExactly(
              '/c/42/3/path/to/file.txt'),
              'Should navigate to /c/42/3/path/to/file.txt');
          leftSelectEl.value = '1';
          element.fire('change', {}, {node: leftSelectEl});
          assert(blurSpy.called, 'Dropdown should be blurred after selection');
        } else if (numEvents == 2) {
          assert(showStub.lastCall.calledWithExactly(
              '/c/42/1..3/path/to/file.txt'),
              'Should navigate to /c/42/1..3/path/to/file.txt');
          showStub.restore();
          done();
        }
      });
      leftSelectEl.value = 'PARENT';
      rightSelectEl.value = '3';
      element.fire('change', {}, {node: leftSelectEl});
    });

    test('filesWeblinks', () => {
      element.filesWeblinks = {
        meta_a: [
          {
            name: 'foo',
            url: 'f.oo',
          },
        ],
        meta_b: [
          {
            name: 'bar',
            url: 'ba.r',
          },
        ],
      };
      flushAsynchronousOperations();
      const domApi = Polymer.dom(element.root);
      assert.equal(
          domApi.querySelector('a[href="f.oo"]').textContent, 'foo');
      assert.equal(
          domApi.querySelector('a[href="ba.r"]').textContent, 'bar');
    });
  });
</script>
