<!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>keyboard-shortcut-behavior</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="keyboard-shortcut-behavior.html">

<test-fixture id="basic">
  <template>
    <test-element></test-element>
  </template>
</test-fixture>

<test-fixture id="within-overlay">
  <template>
    <gr-overlay>
      <test-element></test-element>
    </gr-overlay>
  </template>
</test-fixture>

<script>
  suite('keyboard-shortcut-behavior tests', function() {
    var element;
    var overlay;
    var sandbox;

    suiteSetup(function() {
      // Define a Polymer element that uses this behavior.
      Polymer({
        is: 'test-element',
        behaviors: [Gerrit.KeyboardShortcutBehavior],
        keyBindings: {
          'k': '_handleKey'
        },
        _handleKey: function() {},
      });
    });

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

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

    test('doesn’t block kb shortcuts for non-whitelisted els', function(done) {
      var divEl = document.createElement('div');
      element.appendChild(divEl);
      element._handleKey = function(e) {
        assert.isFalse(element.shouldSuppressKeyboardShortcut(e));
        done();
      };
      MockInteractions.keyDownOn(divEl, 75, null, 'k');
    });

    test('blocks kb shortcuts for input els', function(done) {
      var inputEl = document.createElement('input');
      element.appendChild(inputEl);
      element._handleKey = function(e) {
        assert.isTrue(element.shouldSuppressKeyboardShortcut(e));
        done();
      };
      MockInteractions.keyDownOn(inputEl, 75, null, 'k');
    });

    test('blocks kb shortcuts for textarea els', function(done) {
      var textareaEl = document.createElement('textarea');
      element.appendChild(textareaEl);
      element._handleKey = function(e) {
        assert.isTrue(element.shouldSuppressKeyboardShortcut(e));
        done();
      };
      MockInteractions.keyDownOn(textareaEl, 75, null, 'k');
    });

    test('blocks kb shortcuts for anything in a gr-overlay', function(done) {
      var divEl = document.createElement('div');
      var element = overlay.querySelector('test-element');
      element.appendChild(divEl);
      element._handleKey = function(e) {
        assert.isTrue(element.shouldSuppressKeyboardShortcut(e));
        done();
      };
      MockInteractions.keyDownOn(divEl, 75, null, 'k');
    });

    test('modifierPressed returns accurate values', function() {
      var spy = sandbox.spy(element, 'modifierPressed');
      element._handleKey = function(e) {
        element.modifierPressed(e);
      };
      MockInteractions.keyDownOn(element, 75, 'shift', 'k');
      assert.isTrue(spy.lastCall.returnValue);
      MockInteractions.keyDownOn(element, 75, null, 'k');
      assert.isFalse(spy.lastCall.returnValue);
      MockInteractions.keyDownOn(element, 75, 'ctrl', 'k');
      assert.isTrue(spy.lastCall.returnValue);
      MockInteractions.keyDownOn(element, 75, null, 'k');
      assert.isFalse(spy.lastCall.returnValue);
      MockInteractions.keyDownOn(element, 75, 'meta', 'k');
      assert.isTrue(spy.lastCall.returnValue);
      MockInteractions.keyDownOn(element, 75, null, 'k');
      assert.isFalse(spy.lastCall.returnValue);
      MockInteractions.keyDownOn(element, 75, 'alt', 'k');
      assert.isTrue(spy.lastCall.returnValue);
    });
  });
</script>
