<!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-button</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-button.html">

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

<script>
  suite('gr-select tests', function() {
    var element;
    var sandbox;

    var addSpyOn = function(eventName) {
      var spy = sandbox.spy();
      element.addEventListener(eventName, spy);
      return spy;
    };

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

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

    ['tap', 'click'].forEach(function(eventName) {
      test('dispatches ' + eventName + ' event', function() {
        var spy = addSpyOn(eventName);
        MockInteractions.tap(element);
        assert.isTrue(spy.calledOnce);
      });
    });

    // Keycodes: 32 for Space, 13 for Enter.
    [32, 13].forEach(function(key) {
      test('dispatches tap event on keycode ' + key, function() {
        var tapSpy = sandbox.spy();
        element.addEventListener('tap', tapSpy);
        MockInteractions.pressAndReleaseKeyOn(element, key);
        assert.isTrue(tapSpy.calledOnce);
      })});

    suite('disabled', function() {
      setup(function() {
        element.disabled = true;
      });

      ['tap', 'click'].forEach(function(eventName) {
        test('stops ' + eventName + ' event', function() {
          var spy = addSpyOn(eventName);
          MockInteractions.tap(element);
          assert.isFalse(spy.called);
        });
      });

      // Keycodes: 32 for Space, 13 for Enter.
      [32, 13].forEach(function(key) {
        test('stops tap event on keycode ' + key, function() {
          var tapSpy = sandbox.spy();
          element.addEventListener('tap', tapSpy);
          MockInteractions.pressAndReleaseKeyOn(element, key);
          assert.isFalse(tapSpy.called);
        })});
    });
  });
</script>
