<!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-reviewer-list</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-autocomplete.html">

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

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

<script>
  suite('gr-autocomplete tests', () => {
    let element;
    let sandbox;

    setup(() => {
      element = fixture('basic');
      sandbox = sinon.sandbox.create();
    });

    teardown(() => {
      sandbox.restore();
    });

    test('renders', done => {
      let promise;
      const queryStub = sandbox.spy(input => {
        return promise = Promise.resolve([
          {name: input + ' 0', value: 0},
          {name: input + ' 1', value: 1},
          {name: input + ' 2', value: 2},
          {name: input + ' 3', value: 3},
          {name: input + ' 4', value: 4},
        ]);
      });
      element.query = queryStub;
      assert.isTrue(element.$.suggestions.hidden);
      assert.equal(element.$.suggestions.$.cursor.index, -1);

      element.text = 'blah';

      assert.isTrue(queryStub.called);
      element._focused = true;

      promise.then(() => {
        assert.isFalse(element.$.suggestions.hasAttribute('hidden'));
        const suggestions =
            Polymer.dom(element.$.suggestions.root).querySelectorAll('li');
        assert.equal(suggestions.length, 5);

        for (let i = 0; i < 5; i++) {
          assert.equal(suggestions[i].textContent, 'blah ' + i);
        }

        assert.notEqual(element.$.suggestions.$.cursor.index, -1);
        done();
      });
    });

    test('esc key behavior', done => {
      let promise;
      const queryStub = sandbox.spy(() => {
        return promise = Promise.resolve([
          {name: 'blah', value: 123},
        ]);
      });
      element.query = queryStub;

      assert.isTrue(element.$.suggestions.hidden);

      element._focused = true;
      element.text = 'blah';

      promise.then(() => {
        assert.isFalse(element.$.suggestions.hidden);

        const cancelHandler = sandbox.spy();
        element.addEventListener('cancel', cancelHandler);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 27, null, 'esc');
        assert.isFalse(cancelHandler.called);
        assert.isTrue(element.$.suggestions.hidden);
        assert.equal(element._suggestions.length, 0);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 27, null, 'esc');
        assert.isTrue(cancelHandler.called);
        done();
      });
    });

    test('emits commit and handles cursor movement', done => {
      let promise;
      const queryStub = sandbox.spy(input => {
        return promise = Promise.resolve([
          {name: input + ' 0', value: 0},
          {name: input + ' 1', value: 1},
          {name: input + ' 2', value: 2},
          {name: input + ' 3', value: 3},
          {name: input + ' 4', value: 4},
        ]);
      });
      element.query = queryStub;

      assert.isTrue(element.$.suggestions.hidden);
      assert.equal(element.$.suggestions.$.cursor.index, -1);
      element._focused = true;
      element.text = 'blah';

      promise.then(() => {
        assert.isFalse(element.$.suggestions.hidden);

        const commitHandler = sandbox.spy();
        element.addEventListener('commit', commitHandler);

        assert.equal(element.$.suggestions.$.cursor.index, 0);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 40, null,
            'down');

        assert.equal(element.$.suggestions.$.cursor.index, 1);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 40, null,
            'down');

        assert.equal(element.$.suggestions.$.cursor.index, 2);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 38, null, 'up');

        assert.equal(element.$.suggestions.$.cursor.index, 1);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 13, null,
            'enter');

        assert.equal(element.value, 1);
        assert.isTrue(commitHandler.called);
        assert.equal(commitHandler.getCall(0).args[0].detail.value, 1);
        assert.isTrue(element.$.suggestions.hidden);
        assert.isTrue(element._focused);
        done();
      });
    });

    test('clear-on-commit behavior (off)', done => {
      let promise;
      const queryStub = sandbox.spy(() => {
        return promise = Promise.resolve([{name: 'suggestion', value: 0}]);
      });
      element.query = queryStub;
      element.text = 'blah';

      promise.then(() => {
        const commitHandler = sandbox.spy();
        element.addEventListener('commit', commitHandler);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 13, null,
            'enter');

        assert.isTrue(commitHandler.called);
        assert.equal(element.text, 'suggestion');
        done();
      });
    });

    test('clear-on-commit behavior (on)', done => {
      let promise;
      const queryStub = sandbox.spy(() => {
        return promise = Promise.resolve([{name: 'suggestion', value: 0}]);
      });
      element.query = queryStub;
      element.text = 'blah';
      element.clearOnCommit = true;

      promise.then(() => {
        const commitHandler = sandbox.spy();
        element.addEventListener('commit', commitHandler);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 13, null,
            'enter');

        assert.isTrue(commitHandler.called);
        assert.equal(element.text, '');
        done();
      });
    });

    test('threshold guards the query', () => {
      const queryStub = sandbox.spy(() => {
        return Promise.resolve([]);
      });
      element.query = queryStub;

      element.threshold = 2;

      element.text = 'a';

      assert.isFalse(queryStub.called);

      element.text = 'ab';

      assert.isTrue(queryStub.called);
    });

    test('_computeClass respects border property', () => {
      assert.equal(element._computeClass(), '');
      assert.equal(element._computeClass(false), '');
      assert.equal(element._computeClass(true), 'borderless');
    });

    test('undefined or empty text results in no suggestions', () => {
      sandbox.spy(element, '_updateSuggestions');
      element.text = undefined;
      assert(element._updateSuggestions.calledOnce);
      assert.equal(element._suggestions.length, 0);
    });

    test('multi completes only the last part of the query', done => {
      let promise;
      const queryStub = sandbox.stub()
          .returns(promise = Promise.resolve([{name: 'suggestion', value: 0}]));
      element.query = queryStub;
      element.text = 'blah blah';
      element.multi = true;

      promise.then(() => {
        const commitHandler = sandbox.spy();
        element.addEventListener('commit', commitHandler);

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 13, null,
            'enter');

        assert.isTrue(commitHandler.called);
        assert.equal(element.text, 'blah 0');
        done();
      });
    });

    test('tab key completes only when suggestions exist', () => {
      const commitStub = sandbox.stub(element, '_commit');
      element._suggestions = [];
      MockInteractions.pressAndReleaseKeyOn(element.$.input, 9, null, 'tab');
      assert.isFalse(commitStub.called);
      element._suggestions = ['tunnel snakes rule!'];
      MockInteractions.pressAndReleaseKeyOn(element.$.input, 9, null, 'tab');
      assert.isTrue(commitStub.called);
      assert.isTrue(element._focused);
    });

    test('tabCompleteWithoutCommit flag functions', () => {
      const commitHandler = sandbox.spy();
      element.addEventListener('commit', commitHandler);
      element._suggestions = ['tunnel snakes rule!'];
      element.tabCompleteWithoutCommit = true;
      MockInteractions.pressAndReleaseKeyOn(element.$.input, 9, null, 'tab');
      assert.isFalse(commitHandler.called);
      element.tabCompleteWithoutCommit = false;
      element._suggestions = ['tunnel snakes rule!'];
      MockInteractions.pressAndReleaseKeyOn(element.$.input, 9, null, 'tab');
      assert.isTrue(commitHandler.called);
    });

    test('_focused flag properly triggered', done => {
      flush(() => {
        assert.isFalse(element._focused);
        const input = element.$$('input');
        MockInteractions.focus(input);
        assert.isTrue(element._focused);
        done();
      });
    });

    test('_focused flag shows/hides the suggestions', () => {
      const suggestions = ['hello', 'its me'];
      assert.isTrue(element._computeSuggestionsHidden(suggestions, false));
      assert.isFalse(element._computeSuggestionsHidden(suggestions, true));
    });

    test('tap on suggestion commits and refocuses on input', () => {
      const focusSpy = sandbox.spy(element, 'focus');
      const commitSpy = sandbox.spy(element, '_commit');
      element._focused = true;
      element._suggestions = [{name: 'first suggestion'}];
      Polymer.dom.flush();
      assert.isFalse(element.$.suggestions.hidden);
      MockInteractions.tap(element.$.suggestions.$$('li:first-child'));
      flushAsynchronousOperations();
      assert.isTrue(focusSpy.called);
      assert.isTrue(commitSpy.called);
      assert.isTrue(element.$.suggestions.hidden);
      assert.isTrue(element._focused);
    });

    test('input-keydown event fired', () => {
      const listener = sandbox.spy();
      element.addEventListener('input-keydown', listener);
      MockInteractions.pressAndReleaseKeyOn(element.$.input, 9, null, 'tab');
      flushAsynchronousOperations();
      assert.isTrue(listener.called);
    });
  });
</script>
