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

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

<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>
