<!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', function() {
    var element;
    var sandbox;

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

    teardown(function() {
      sandbox.restore();
    });

    test('renders', function(done) {
      var promise;
      var queryStub = sandbox.spy(function(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.hasAttribute('hidden'));
      assert.equal(element.$.cursor.index, -1);

      element.text = 'blah';

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

      promise.then(function() {
        assert.isFalse(element.$.suggestions.hasAttribute('hidden'));

        var suggestions = element.$.suggestions.querySelectorAll('li');
        assert.equal(suggestions.length, 5);

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

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

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

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

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

      promise.then(function() {
        assert.isFalse(element.$.suggestions.hasAttribute('hidden'));

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

        MockInteractions.pressAndReleaseKeyOn(element.$.input, 27, null, 'esc');
        assert.isFalse(cancelHandler.called);
        assert.isTrue(element.$.suggestions.hasAttribute('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', function(done) {
      var promise;
      var queryStub = sandbox.spy(function(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.hasAttribute('hidden'));
      assert.equal(element.$.cursor.index, -1);
      element._focused = true;
      element.text = 'blah';

      promise.then(function() {
        assert.isFalse(element.$.suggestions.hasAttribute('hidden'));

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

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

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

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

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

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

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

        assert.equal(element.$.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.hasAttribute('hidden'));

        done();
      });
    });

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

      promise.then(function() {
        var 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)', function(done) {
      var promise;
      var queryStub = sandbox.spy(function() {
        return promise = Promise.resolve([{name: 'suggestion', value: 0}]);
      });
      element.query = queryStub;
      element.text = 'blah';
      element.clearOnCommit = true;

      promise.then(function() {
        var 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', function() {
      var queryStub = sandbox.spy(function() {
        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', function() {
      assert.equal(element._computeClass(), '');
      assert.equal(element._computeClass(false), '');
      assert.equal(element._computeClass(true), 'borderless');
    });

    test('undefined or empty text results in no suggestions', function() {
      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', function(done) {
      var promise;
      var queryStub = sandbox.stub()
          .returns(promise = Promise.resolve([{name: 'suggestion', value: 0}]));
      element.query = queryStub;
      element.text = 'blah blah';
      element.multi = true;

      promise.then(function() {
        var 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', function() {
      var 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);
    });

    test('tabCompleteWithoutCommit flag functions', function() {
      var 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', function(done) {
      flush(function() {
        assert.isFalse(element._focused);
        var input = element.$$('input');
        MockInteractions.focus(input);
        assert.isTrue(element._focused);
        done();
      });
    });

    test('_focused flag shows/hides the suggestions', function() {
      var 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', function() {
      var focusSpy = sandbox.spy(element, 'focus');
      var commitSpy = sandbox.spy(element, '_commit');
      element._focused = true;
      element._suggestions = [{name: 'first suggestion'}];
      Polymer.dom.flush();
      assert.isFalse(element.$.suggestions.hasAttribute('hidden'));
      MockInteractions.tap(element.$$('#suggestions li:first-child'));
      flushAsynchronousOperations();
      assert.isTrue(focusSpy.called);
      assert.isTrue(commitSpy.called);
      assert.isTrue(element.$.suggestions.hasAttribute('hidden'));
      assert.isTrue(element._focused);
    });

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