• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!--
2@license
3Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
4This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7Code distributed by Google as part of the polymer project is also
8subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9-->
10<!doctype html>
11<html>
12  <head>
13
14    <title>paper-item tests</title>
15
16    <meta charset="utf-8">
17    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
18    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
19
20    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
21
22    <script src="../../web-component-tester/browser.js"></script>
23    <script src="../../iron-test-helpers/mock-interactions.js"></script>
24
25    <link rel="import" href="../../paper-input/paper-input.html">
26    <link rel="import" href="../paper-item.html">
27    <link rel="import" href="../paper-icon-item.html">
28
29  </head>
30  <body>
31
32    <test-fixture id="item">
33      <template>
34        <div role="listbox">
35          <paper-item>item</paper-item>
36        </div>
37      </template>
38    </test-fixture>
39
40    <test-fixture id="button">
41      <template>
42        <div role="listbox">
43          <button class="paper-item" role="option">item</button>
44        </div>
45      </template>
46    </test-fixture>
47
48    <test-fixture id="iconItem">
49      <template>
50        <div role="listbox">
51          <paper-icon-item>item</paper-icon-item>
52        </div>
53      </template>
54    </test-fixture>
55
56    <test-fixture id="item-with-input">
57      <template>
58        <div role="list">
59          <paper-item><input></paper-item>
60        </div>
61      </template>
62    </test-fixture>
63
64    <test-fixture id="item-with-paper-input">
65      <template>
66        <div role="list">
67          <paper-item><paper-input></paper-input></paper-item>
68        </div>
69      </template>
70    </test-fixture>
71
72    <test-fixture id="iconItem-with-input">
73      <template>
74        <div role="list">
75          <paper-icon-item><input></paper-icon-item>
76        </div>
77      </template>
78    </test-fixture>
79
80    <script>
81      suite('paper-item basic', function() {
82        var item, clickHandler;
83
84        setup(function() {
85          item = fixture('item').querySelector('paper-item');
86          clickHandler = sinon.spy();
87          item.addEventListener('click', clickHandler);
88        });
89
90        test('space triggers a click event', function(done) {
91          MockInteractions.pressSpace(item);
92          Polymer.Base.async(function(){
93            // You need two ticks, one for the MockInteractions event, and one
94            // for the button event.
95            Polymer.Base.async(function(){
96              expect(clickHandler.callCount).to.be.equal(1);
97              done();
98            }, 1);
99          }, 1);
100        });
101
102        test('enter triggers a click event', function(done) {
103          MockInteractions.pressEnter(item);
104          Polymer.Base.async(function(){
105            // You need two ticks, one for the MockInteractions event, and one
106            // for the button event.
107            Polymer.Base.async(function(){
108              expect(clickHandler.callCount).to.be.equal(1);
109              done();
110            }, 1);
111          }, 1);
112        });
113      });
114
115      suite('paper-icon-item basic', function() {
116        var item, clickHandler;
117
118        setup(function() {
119          item = fixture('iconItem').querySelector('paper-icon-item');
120          clickHandler = sinon.spy();
121          item.addEventListener('click', clickHandler);
122        });
123
124        test('space triggers a click event', function(done) {
125          MockInteractions.pressSpace(item);
126          Polymer.Base.async(function(){
127            // You need two ticks, one for the MockInteractions event, and one
128            // for the button event.
129            Polymer.Base.async(function(){
130              expect(clickHandler.callCount).to.be.equal(1);
131              done();
132            }, 1);
133          }, 1);
134        });
135
136        test('click triggers a click event', function(done) {
137          MockInteractions.tap(item);
138          Polymer.Base.async(function(){
139            expect(clickHandler.callCount).to.be.equal(1);
140            done();
141          }, 1);
142        });
143      });
144
145      suite('clickable element inside item', function() {
146        test('paper-item: space in child native input does not trigger a click event', function(done) {
147          var f = fixture('item-with-input');
148          var outerItem = f.querySelector('paper-item');
149          var innerInput = f.querySelector('input');
150
151          var itemClickHandler = sinon.spy();
152          outerItem.addEventListener('click', itemClickHandler);
153
154          innerInput.focus();
155          MockInteractions.pressSpace(innerInput);
156          Polymer.Base.async(function(){
157            expect(itemClickHandler.callCount).to.be.equal(0);
158            done();
159          }, 1);
160        });
161
162        test('paper-item: space in child paper-input does not trigger a click event', function(done) {
163          var f = fixture('item-with-paper-input');
164          var outerItem = f.querySelector('paper-item');
165          var innerInput = f.querySelector('paper-input');
166
167          var itemClickHandler = sinon.spy();
168          outerItem.addEventListener('click', itemClickHandler);
169
170          innerInput.focus();
171          MockInteractions.pressSpace(innerInput);
172          Polymer.Base.async(function(){
173            expect(itemClickHandler.callCount).to.be.equal(0);
174            done();
175          }, 1);
176        });
177
178        test('paper-icon-item: space in child input does not trigger a click event', function(done) {
179          var f = fixture('iconItem-with-input');
180          var outerItem = f.querySelector('paper-icon-item');
181          var innerInput = f.querySelector('input');
182
183          var itemClickHandler = sinon.spy();
184          outerItem.addEventListener('click', itemClickHandler);
185
186          MockInteractions.pressSpace(innerInput);
187          Polymer.Base.async(function(){
188            expect(itemClickHandler.callCount).to.be.equal(0);
189            done();
190          }, 1);
191        });
192      });
193
194      suite('item a11y tests', function() {
195        var item, iconItem;
196
197        setup(function() {
198          item = fixture('item').querySelector('paper-item');
199          iconItem = fixture('iconItem').querySelector('paper-icon-item');
200        });
201
202        test('item has role="listitem"', function() {
203          assert.equal(item.getAttribute('role'), 'option', 'has role="option"');
204        });
205
206        test('icon item has role="listitem"', function() {
207          assert.equal(iconItem.getAttribute('role'), 'option', 'has role="option"');
208        });
209
210        a11ySuite('item');
211        a11ySuite('button');
212        a11ySuite('iconItem');
213      });
214
215    </script>
216
217  </body>
218</html>
219