@spectrum-web-components/textfield 0.11.3 → 0.11.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/textfield",
3
- "version": "0.11.3",
3
+ "version": "0.11.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -49,7 +49,7 @@
49
49
  "@spectrum-web-components/icon": "^0.11.5",
50
50
  "@spectrum-web-components/icons-ui": "^0.8.5",
51
51
  "@spectrum-web-components/icons-workflow": "^0.8.5",
52
- "@spectrum-web-components/shared": "^0.13.6",
52
+ "@spectrum-web-components/shared": "^0.13.7",
53
53
  "tslib": "^2.0.0"
54
54
  },
55
55
  "devDependencies": {
@@ -60,5 +60,5 @@
60
60
  "sideEffects": [
61
61
  "./sp-*.js"
62
62
  ],
63
- "gitHead": "caf12727e7f91dcf961e1fadacc727eea9ece27b"
63
+ "gitHead": "dd76f9532fdea946880147cc7645f113b998c326"
64
64
  }
@@ -0,0 +1,18 @@
1
+ /*
2
+ Copyright 2020 Adobe. All rights reserved.
3
+ This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License. You may obtain a copy
5
+ of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ Unless required by applicable law or agreed to in writing, software distributed under
8
+ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ OF ANY KIND, either express or implied. See the License for the specific language
10
+ governing permissions and limitations under the License.
11
+ */
12
+ import '@spectrum-web-components/textfield/sp-textfield.js';
13
+ import { html } from 'lit';
14
+ import { measureFixtureCreation } from '../../../../test/benchmark/helpers.js';
15
+ measureFixtureCreation(html `
16
+ <sp-textfield placeholder="Enter your name"></sp-textfield>
17
+ `);
18
+ //# sourceMappingURL=test-basic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-basic.js","sourceRoot":"","sources":["test-basic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAEF,OAAO,oDAAoD,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,sBAAsB,CAAC,IAAI,CAAA;;CAE1B,CAAC,CAAC","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport '@spectrum-web-components/textfield/sp-textfield.js';\nimport { html } from 'lit';\nimport { measureFixtureCreation } from '../../../../test/benchmark/helpers.js';\n\nmeasureFixtureCreation(html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n`);\n"]}
@@ -0,0 +1,15 @@
1
+ /*
2
+ Copyright 2020 Adobe. All rights reserved.
3
+ This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License. You may obtain a copy
5
+ of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ Unless required by applicable law or agreed to in writing, software distributed under
8
+ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ OF ANY KIND, either express or implied. See the License for the specific language
10
+ governing permissions and limitations under the License.
11
+ */
12
+ import * as stories from '../stories/textarea.stories.js';
13
+ import { regressVisuals } from '../../../test/visual/test.js';
14
+ regressVisuals('TextareaStories', stories);
15
+ //# sourceMappingURL=textarea.test-vrt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.test-vrt.js","sourceRoot":"","sources":["textarea.test-vrt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAEF,OAAO,KAAK,OAAO,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport * as stories from '../stories/textarea.stories.js';\nimport { regressVisuals } from '../../../test/visual/test.js';\n\nregressVisuals('TextareaStories', stories);\n"]}
@@ -0,0 +1,15 @@
1
+ /*
2
+ Copyright 2020 Adobe. All rights reserved.
3
+ This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License. You may obtain a copy
5
+ of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ Unless required by applicable law or agreed to in writing, software distributed under
8
+ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ OF ANY KIND, either express or implied. See the License for the specific language
10
+ governing permissions and limitations under the License.
11
+ */
12
+ import * as stories from '../stories/textfield.stories.js';
13
+ import { regressVisuals } from '../../../test/visual/test.js';
14
+ regressVisuals('TextfieldStories', stories);
15
+ //# sourceMappingURL=textfield.test-vrt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textfield.test-vrt.js","sourceRoot":"","sources":["textfield.test-vrt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAEF,OAAO,KAAK,OAAO,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,cAAc,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport * as stories from '../stories/textfield.stories.js';\nimport { regressVisuals } from '../../../test/visual/test.js';\n\nregressVisuals('TextfieldStories', stories);\n"]}
@@ -0,0 +1,735 @@
1
+ import { __asyncValues } from "tslib";
2
+ import { elementUpdated, expect, html, litFixture } from '@open-wc/testing';
3
+ import { sendKeys } from '@web/test-runner-commands';
4
+ import { sendMouse } from '../../../test/plugins/browser.js';
5
+ import { findDescribedNode } from '../../../test/testing-helpers-a11y.js';
6
+ import '@spectrum-web-components/help-text/sp-help-text.js';
7
+ import '../sp-textfield.js';
8
+ describe('Textfield', () => {
9
+ it('loads default textfield accessibly', async () => {
10
+ const el = await litFixture(html `
11
+ <sp-textfield label="Enter Your Name"></sp-textfield>
12
+ `);
13
+ await elementUpdated(el);
14
+ await expect(el).to.be.accessible();
15
+ });
16
+ it('loads multiline textfield accessibly', async () => {
17
+ const el = await litFixture(html `
18
+ <sp-textfield label="Enter your name" multiline></sp-textfield>
19
+ `);
20
+ await elementUpdated(el);
21
+ await expect(el).to.be.accessible();
22
+ });
23
+ it('manages tabIndex while disabled', async () => {
24
+ const el = await litFixture(html `
25
+ <sp-textfield placeholder="Enter Your Name"></sp-textfield>
26
+ `);
27
+ await elementUpdated(el);
28
+ expect(el.tabIndex).to.equal(0);
29
+ el.disabled = true;
30
+ await elementUpdated(el);
31
+ expect(el.tabIndex).to.equal(-1);
32
+ el.tabIndex = 2;
33
+ await elementUpdated(el);
34
+ expect(el.tabIndex).to.equal(-1);
35
+ el.disabled = false;
36
+ await elementUpdated(el);
37
+ expect(el.tabIndex).to.equal(2);
38
+ });
39
+ it('manages tabIndex before first render', async () => {
40
+ const el = document.createElement('sp-textfield');
41
+ expect(el.focusElement).to.be.null;
42
+ expect(el.tabIndex).to.equal(0);
43
+ el.remove();
44
+ });
45
+ it('loads', async () => {
46
+ const testPlaceholder = 'Enter your name';
47
+ const el = await litFixture(html `
48
+ <sp-textfield placeholder=${testPlaceholder}></sp-textfield>
49
+ `);
50
+ expect(el).to.not.equal(undefined);
51
+ const input = el.shadowRoot
52
+ ? el.shadowRoot.querySelector('input')
53
+ : null;
54
+ expect(input).to.not.be.null;
55
+ const placeholder = input ? input.placeholder : null;
56
+ expect(placeholder).to.equal(testPlaceholder);
57
+ });
58
+ it('multiline', async () => {
59
+ const el = await litFixture(html `
60
+ <sp-textfield
61
+ placeholder="Enter your name"
62
+ multiline
63
+ ></sp-textfield>
64
+ `);
65
+ expect(el).to.not.equal(undefined);
66
+ const input = el.shadowRoot
67
+ ? el.shadowRoot.querySelector('textarea')
68
+ : null;
69
+ expect(input).to.not.be.null;
70
+ });
71
+ it('resizes by default', async () => {
72
+ const el = await litFixture(html `
73
+ <sp-textfield
74
+ multiline
75
+ label="No resize control"
76
+ placeholder="No resize control"
77
+ ></sp-textfield>
78
+ `);
79
+ const startBounds = el.getBoundingClientRect();
80
+ await sendMouse({
81
+ steps: [
82
+ {
83
+ type: 'move',
84
+ position: [startBounds.right - 2, startBounds.bottom - 2],
85
+ },
86
+ {
87
+ type: 'down',
88
+ },
89
+ {
90
+ type: 'move',
91
+ position: [startBounds.right + 50, startBounds.bottom + 50],
92
+ },
93
+ {
94
+ type: 'up',
95
+ },
96
+ ],
97
+ });
98
+ const endBounds = el.getBoundingClientRect();
99
+ expect(endBounds.width).to.be.greaterThan(startBounds.width);
100
+ expect(endBounds.height).to.be.greaterThan(startBounds.height);
101
+ });
102
+ it('accepts resize styling', async () => {
103
+ const el = await litFixture(html `
104
+ <sp-textfield
105
+ multiline
106
+ style="resize: none;"
107
+ label="No resize control"
108
+ placeholder="No resize control"
109
+ ></sp-textfield>
110
+ `);
111
+ const startBounds = el.getBoundingClientRect();
112
+ await sendMouse({
113
+ steps: [
114
+ {
115
+ type: 'move',
116
+ position: [startBounds.right - 2, startBounds.bottom - 2],
117
+ },
118
+ {
119
+ type: 'down',
120
+ },
121
+ {
122
+ type: 'move',
123
+ position: [startBounds.right + 50, startBounds.bottom + 50],
124
+ },
125
+ {
126
+ type: 'up',
127
+ },
128
+ ],
129
+ });
130
+ const endBounds = el.getBoundingClientRect();
131
+ expect(endBounds.width).equals(startBounds.width);
132
+ expect(endBounds.height).equals(startBounds.height);
133
+ });
134
+ it('grows', async () => {
135
+ const el = await litFixture(html `
136
+ <sp-textfield
137
+ placeholder="Enter your name"
138
+ multiline
139
+ grows
140
+ ></sp-textfield>
141
+ `);
142
+ expect(el).to.not.equal(undefined);
143
+ const sizer = el.shadowRoot
144
+ ? el.shadowRoot.querySelector('#sizer')
145
+ : null;
146
+ expect(sizer).to.not.be.null;
147
+ });
148
+ it('valid', async () => {
149
+ const el = await litFixture(html `
150
+ <sp-textfield
151
+ placeholder="Enter your number"
152
+ pattern="[\\d]+"
153
+ value="123"
154
+ required
155
+ ></sp-textfield>
156
+ `);
157
+ await elementUpdated(el);
158
+ expect(el).to.not.equal(undefined);
159
+ const input = el.shadowRoot
160
+ ? el.shadowRoot.querySelector('#valid')
161
+ : null;
162
+ expect(input).to.not.be.null;
163
+ });
164
+ it('valid - multiline', async () => {
165
+ const el = await litFixture(html `
166
+ <sp-textfield
167
+ placeholder="Enter your number"
168
+ pattern="[\\d]+"
169
+ value="123"
170
+ required
171
+ multiline
172
+ ></sp-textfield>
173
+ `);
174
+ await elementUpdated(el);
175
+ expect(el).to.not.equal(undefined);
176
+ const input = el.shadowRoot
177
+ ? el.shadowRoot.querySelector('#valid')
178
+ : null;
179
+ expect(input).to.not.be.null;
180
+ });
181
+ it('valid - required', async () => {
182
+ const el = await litFixture(html `
183
+ <sp-textfield
184
+ placeholder="Enter your number"
185
+ value="123"
186
+ required
187
+ ></sp-textfield>
188
+ `);
189
+ await elementUpdated(el);
190
+ expect(el).to.not.equal(undefined);
191
+ const input = el.shadowRoot
192
+ ? el.shadowRoot.querySelector('#valid')
193
+ : null;
194
+ expect(input).to.not.be.null;
195
+ });
196
+ it('valid - multiline - required', async () => {
197
+ const el = await litFixture(html `
198
+ <sp-textfield
199
+ placeholder="Enter your number"
200
+ value="123"
201
+ required
202
+ multiline
203
+ ></sp-textfield>
204
+ `);
205
+ await elementUpdated(el);
206
+ expect(el).to.not.equal(undefined);
207
+ const input = el.shadowRoot
208
+ ? el.shadowRoot.querySelector('#valid')
209
+ : null;
210
+ expect(input).to.not.be.null;
211
+ });
212
+ it('valid - boundary-type assertions', async () => {
213
+ const el = await litFixture(html `
214
+ <sp-textfield
215
+ placeholder="Enter your number"
216
+ pattern="^[\\d]+$"
217
+ value="123"
218
+ required
219
+ ></sp-textfield>
220
+ `);
221
+ await elementUpdated(el);
222
+ expect(el).to.not.equal(undefined);
223
+ const input = el.shadowRoot
224
+ ? el.shadowRoot.querySelector('#valid')
225
+ : null;
226
+ expect(input).to.not.be.null;
227
+ });
228
+ it('valid - multiline - boundary-type assertions', async () => {
229
+ const el = await litFixture(html `
230
+ <sp-textfield
231
+ placeholder="Enter your number"
232
+ pattern="^[\\d]+$"
233
+ value="123"
234
+ required
235
+ multiline
236
+ ></sp-textfield>
237
+ `);
238
+ await elementUpdated(el);
239
+ expect(el).to.not.equal(undefined);
240
+ const input = el.shadowRoot
241
+ ? el.shadowRoot.querySelector('#valid')
242
+ : null;
243
+ expect(input).to.not.be.null;
244
+ });
245
+ it('valid - unicode', async () => {
246
+ const el = await litFixture(html `
247
+ <sp-textfield
248
+ placeholder="Enter your name"
249
+ pattern="\\p{L}{4,8}"
250
+ value="你的名字"
251
+ required
252
+ ></sp-textfield>
253
+ `);
254
+ await elementUpdated(el);
255
+ expect(el).to.not.equal(undefined);
256
+ const input = el.shadowRoot
257
+ ? el.shadowRoot.querySelector('#valid')
258
+ : null;
259
+ expect(input).to.not.be.null;
260
+ });
261
+ it('valid - multiline - unicode', async () => {
262
+ const el = await litFixture(html `
263
+ <sp-textfield
264
+ placeholder="Enter your name"
265
+ pattern="\\p{L}{4,8}"
266
+ value="你的名字"
267
+ required
268
+ multiline
269
+ ></sp-textfield>
270
+ `);
271
+ await elementUpdated(el);
272
+ expect(el).to.not.equal(undefined);
273
+ const input = el.shadowRoot
274
+ ? el.shadowRoot.querySelector('#valid')
275
+ : null;
276
+ expect(input).to.not.be.null;
277
+ });
278
+ it('invalid', async () => {
279
+ const el = await litFixture(html `
280
+ <sp-textfield
281
+ placeholder="Enter your number"
282
+ pattern="[\\d]+"
283
+ value="123 not valid"
284
+ required
285
+ ></sp-textfield>
286
+ `);
287
+ await elementUpdated(el);
288
+ expect(el).to.not.equal(undefined);
289
+ const input = el.shadowRoot
290
+ ? el.shadowRoot.querySelector('#invalid')
291
+ : null;
292
+ expect(input).to.not.be.null;
293
+ });
294
+ it('invalid - multiline', async () => {
295
+ const el = await litFixture(html `
296
+ <sp-textfield
297
+ placeholder="Enter your number"
298
+ pattern="[\\d]+"
299
+ value="123 not valid"
300
+ required
301
+ multiline
302
+ ></sp-textfield>
303
+ `);
304
+ await elementUpdated(el);
305
+ expect(el).to.not.equal(undefined);
306
+ const input = el.shadowRoot
307
+ ? el.shadowRoot.querySelector('#invalid')
308
+ : null;
309
+ expect(input).to.not.be.null;
310
+ });
311
+ it('invalid - required', async () => {
312
+ const el = await litFixture(html `
313
+ <sp-textfield
314
+ placeholder="Enter your number"
315
+ value=""
316
+ required
317
+ ></sp-textfield>
318
+ `);
319
+ await elementUpdated(el);
320
+ expect(el).to.not.equal(undefined);
321
+ const input = el.shadowRoot
322
+ ? el.shadowRoot.querySelector('#invalid')
323
+ : null;
324
+ expect(input).to.not.be.null;
325
+ });
326
+ it('invalid - multiline - required', async () => {
327
+ const el = await litFixture(html `
328
+ <sp-textfield
329
+ placeholder="Enter your number"
330
+ value=""
331
+ required
332
+ multiline
333
+ ></sp-textfield>
334
+ `);
335
+ await elementUpdated(el);
336
+ expect(el).to.not.equal(undefined);
337
+ const input = el.shadowRoot
338
+ ? el.shadowRoot.querySelector('#invalid')
339
+ : null;
340
+ expect(input).to.not.be.null;
341
+ });
342
+ it('invalid - unicode', async () => {
343
+ const el = await litFixture(html `
344
+ <sp-textfield
345
+ placeholder="Enter your number"
346
+ pattern="\\p{N}+"
347
+ value="123 not valid"
348
+ required
349
+ ></sp-textfield>
350
+ `);
351
+ await elementUpdated(el);
352
+ expect(el).to.not.equal(undefined);
353
+ const input = el.shadowRoot
354
+ ? el.shadowRoot.querySelector('#invalid')
355
+ : null;
356
+ expect(input).to.not.be.null;
357
+ });
358
+ it('invalid - multiline - unicode', async () => {
359
+ const el = await litFixture(html `
360
+ <sp-textfield
361
+ placeholder="Enter your number"
362
+ pattern="\\p{N}+"
363
+ value="123 not valid"
364
+ required
365
+ multiline
366
+ ></sp-textfield>
367
+ `);
368
+ await elementUpdated(el);
369
+ expect(el).to.not.equal(undefined);
370
+ const input = el.shadowRoot
371
+ ? el.shadowRoot.querySelector('#invalid')
372
+ : null;
373
+ expect(input).to.not.be.null;
374
+ });
375
+ it('invalid - boundary-type assertions', async () => {
376
+ const el = await litFixture(html `
377
+ <sp-textfield
378
+ placeholder="Enter your number"
379
+ pattern="^\\p{N}+$"
380
+ value="123 not valid"
381
+ required
382
+ ></sp-textfield>
383
+ `);
384
+ await elementUpdated(el);
385
+ expect(el).to.not.equal(undefined);
386
+ const input = el.shadowRoot
387
+ ? el.shadowRoot.querySelector('#invalid')
388
+ : null;
389
+ expect(input).to.not.be.null;
390
+ });
391
+ it('invalid - multiline - boundary-type assertions', async () => {
392
+ const el = await litFixture(html `
393
+ <sp-textfield
394
+ placeholder="Enter your number"
395
+ pattern="^\\p{N}+$"
396
+ value="123 not valid"
397
+ required
398
+ multiline
399
+ ></sp-textfield>
400
+ `);
401
+ await elementUpdated(el);
402
+ expect(el).to.not.equal(undefined);
403
+ const input = el.shadowRoot
404
+ ? el.shadowRoot.querySelector('#invalid')
405
+ : null;
406
+ expect(input).to.not.be.null;
407
+ });
408
+ it('receives focus', async () => {
409
+ let activeElement = null;
410
+ const onFocusIn = (event) => {
411
+ const path = event.composedPath();
412
+ activeElement = path[0];
413
+ };
414
+ document.addEventListener('focusin', onFocusIn);
415
+ const el = await litFixture(html `
416
+ <sp-textfield placeholder="Enter your name"></sp-textfield>
417
+ `);
418
+ await elementUpdated(el);
419
+ el.focus();
420
+ await elementUpdated(el);
421
+ expect(activeElement === el.focusElement).to.be.true;
422
+ document.removeEventListener('focusin', onFocusIn);
423
+ });
424
+ it('does not receive focus when disabled', async () => {
425
+ let activeElement = null;
426
+ const onFocusIn = (event) => {
427
+ const path = event.composedPath();
428
+ activeElement = path[0];
429
+ };
430
+ document.addEventListener('focusin', onFocusIn);
431
+ const el = await litFixture(html `
432
+ <sp-textfield
433
+ disabled
434
+ placeholder="Enter your name"
435
+ ></sp-textfield>
436
+ `);
437
+ await elementUpdated(el);
438
+ el.focus();
439
+ await elementUpdated(el);
440
+ expect(activeElement === el.focusElement).to.be.false;
441
+ expect(document.activeElement === el).to.be.false;
442
+ document.removeEventListener('focusin', onFocusIn);
443
+ el.click();
444
+ await elementUpdated(el);
445
+ expect(activeElement === el.focusElement).to.be.false;
446
+ expect(document.activeElement === el).to.be.false;
447
+ document.removeEventListener('focusin', onFocusIn);
448
+ });
449
+ it('accepts input', async () => {
450
+ const testValue = 'Test Name';
451
+ const el = await litFixture(html `
452
+ <sp-textfield placeholder="Enter your name"></sp-textfield>
453
+ `);
454
+ await elementUpdated(el);
455
+ el.focusElement.value = testValue;
456
+ el.focusElement.dispatchEvent(new Event('input'));
457
+ expect(el.value).to.equal(testValue);
458
+ });
459
+ it('selects', async () => {
460
+ const testValue = 'Test Name';
461
+ const el = await litFixture(html `
462
+ <sp-textfield value=${testValue}></sp-textfield>
463
+ `);
464
+ await elementUpdated(el);
465
+ expect(el.value).to.equal(testValue);
466
+ el.focus();
467
+ el.select();
468
+ await sendKeys({ press: 'Backspace' });
469
+ expect(el.value).to.equal('');
470
+ });
471
+ it('setSelectionRange', async () => {
472
+ const testValue = 'Test Name';
473
+ const el = await litFixture(html `
474
+ <sp-textfield value=${testValue}></sp-textfield>
475
+ `);
476
+ await elementUpdated(el);
477
+ expect(el.value).to.equal(testValue);
478
+ el.focus();
479
+ el.setSelectionRange(0, 'Test '.length);
480
+ await sendKeys({ press: 'Backspace' });
481
+ expect(el.value).to.equal('Name');
482
+ });
483
+ it('accepts maxlength', async () => {
484
+ const el = await litFixture(html `
485
+ <sp-textfield
486
+ placeholder="Enter your name"
487
+ maxlength="3"
488
+ minlength="2"
489
+ required
490
+ ></sp-textfield>
491
+ `);
492
+ await elementUpdated(el);
493
+ el.focus();
494
+ await sendKeys({
495
+ type: 'a',
496
+ });
497
+ await elementUpdated(el);
498
+ expect(el.value).to.equal('a');
499
+ expect(el.checkValidity()).to.be.false;
500
+ await sendKeys({
501
+ type: 'b',
502
+ });
503
+ await elementUpdated(el);
504
+ expect(el.value).to.equal('ab');
505
+ expect(el.checkValidity());
506
+ await sendKeys({
507
+ type: 'c',
508
+ });
509
+ await elementUpdated(el);
510
+ expect(el.value).to.equal('abc');
511
+ expect(el.checkValidity());
512
+ await sendKeys({
513
+ type: 'd',
514
+ });
515
+ await elementUpdated(el);
516
+ expect(el.value).to.equal('abc');
517
+ expect(el.checkValidity());
518
+ await sendKeys({
519
+ press: 'Backspace',
520
+ });
521
+ await elementUpdated(el);
522
+ expect(el.value).to.equal('ab');
523
+ expect(el.checkValidity());
524
+ await sendKeys({
525
+ press: 'Backspace',
526
+ });
527
+ await elementUpdated(el);
528
+ expect(el.value).to.equal('a');
529
+ expect(el.checkValidity()).to.be.false;
530
+ });
531
+ it('dispatches a `change` event', async () => {
532
+ const testValue = 'Test Name';
533
+ let eventSource = null;
534
+ const onChange = (event) => {
535
+ eventSource = event.composedPath()[0];
536
+ };
537
+ const el = await litFixture(html `
538
+ <sp-textfield
539
+ placeholder="Enter your name"
540
+ @change=${onChange}
541
+ ></sp-textfield>
542
+ `);
543
+ await elementUpdated(el);
544
+ el.focusElement.value = testValue;
545
+ el.focusElement.dispatchEvent(new Event('input'));
546
+ el.focusElement.dispatchEvent(new Event('change'));
547
+ expect(el.value).to.equal(testValue);
548
+ const testSource = eventSource;
549
+ expect(testSource).to.equal(el);
550
+ });
551
+ it('passes through `autocomplete` attribute', async () => {
552
+ let el = await litFixture(html `
553
+ <sp-textfield autocomplete="off"></sp-textfield>
554
+ `);
555
+ await elementUpdated(el);
556
+ let input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;
557
+ expect(input).to.exist;
558
+ if (input) {
559
+ expect(input.getAttribute('autocomplete')).to.equal('off');
560
+ }
561
+ el = await litFixture(html `
562
+ <sp-textfield></sp-textfield>
563
+ `);
564
+ await elementUpdated(el);
565
+ input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;
566
+ expect(input).to.exist;
567
+ if (input) {
568
+ expect(input.getAttribute('autocomplete')).to.not.exist;
569
+ }
570
+ });
571
+ it('tests on `required` changes', async () => {
572
+ const el = await litFixture(html `
573
+ <sp-textfield value=""></sp-textfield>
574
+ `);
575
+ await elementUpdated(el);
576
+ expect(el.invalid).to.be.false;
577
+ el.required = true;
578
+ await elementUpdated(el);
579
+ expect(el.invalid).to.be.true;
580
+ });
581
+ it('manages `allowed-keys`', async () => {
582
+ const el = await litFixture(html `
583
+ <sp-textfield allowed-keys="asdf"></sp-textfield>
584
+ `);
585
+ await elementUpdated(el);
586
+ expect(el.value).to.equal('');
587
+ const inputElement = el.focusElement;
588
+ el.focusElement.value = 'asdf';
589
+ inputElement.dispatchEvent(new InputEvent('input'));
590
+ await elementUpdated(el);
591
+ expect(el.value).to.equal('asdf');
592
+ inputElement.value = `asdff`;
593
+ inputElement.setSelectionRange(1, 1);
594
+ inputElement.dispatchEvent(new InputEvent('input'));
595
+ await elementUpdated(el);
596
+ expect(el.value).to.equal('asdff');
597
+ expect(inputElement.selectionStart).to.equal(1);
598
+ inputElement.value = `asdoff`;
599
+ inputElement.setSelectionRange(4, 4);
600
+ inputElement.dispatchEvent(new InputEvent('input'));
601
+ await elementUpdated(el);
602
+ expect(el.value).to.equal('asdff');
603
+ expect(inputElement.selectionStart).to.equal(3);
604
+ });
605
+ describe('type attribute', () => {
606
+ // references:
607
+ // https://developer.mozilla.org/en-US/docs/Glossary/IDL#content_versus_idl_attributes
608
+ // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes
609
+ // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#keywords-and-enumerated-attributes
610
+ it('assigns valid attributes to the property', async () => {
611
+ var e_1, _a;
612
+ const types = [
613
+ 'text',
614
+ 'url',
615
+ 'tel',
616
+ 'email',
617
+ 'password',
618
+ ];
619
+ try {
620
+ for (var types_1 = __asyncValues(types), types_1_1; types_1_1 = await types_1.next(), !types_1_1.done;) {
621
+ const t = types_1_1.value;
622
+ const el = await litFixture(html `
623
+ <sp-textfield type=${t}></sp-textfield>
624
+ `);
625
+ expect(el.type).equals(t);
626
+ el.setAttribute('type', 'url');
627
+ expect(el.type).equals('url');
628
+ }
629
+ }
630
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
631
+ finally {
632
+ try {
633
+ if (types_1_1 && !types_1_1.done && (_a = types_1.return)) await _a.call(types_1);
634
+ }
635
+ finally { if (e_1) throw e_1.error; }
636
+ }
637
+ });
638
+ it('represents invalid and missing attributes as "text"', async () => {
639
+ const el1 = await litFixture(html `
640
+ <sp-textfield></sp-textfield>
641
+ `);
642
+ const el2 = await litFixture(html `
643
+ <sp-textfield type="time"></sp-textfield>
644
+ `);
645
+ expect(el1.type).equals('text');
646
+ expect(el2.type).equals('text');
647
+ el1.setAttribute('type', 'submit');
648
+ expect(el1.type).equals('text');
649
+ });
650
+ it('reflects valid property assignments', async () => {
651
+ const el = await litFixture(html `
652
+ <sp-textfield type="url"></sp-textfield>
653
+ `);
654
+ el.type = 'email';
655
+ await elementUpdated(el);
656
+ expect(el.getAttribute('type')).equals('email');
657
+ expect(el.type).equals('email');
658
+ });
659
+ it('reflects invalid assignments but sets state to "text"', async () => {
660
+ const el = await litFixture(html `
661
+ <sp-textfield type="url"></sp-textfield>
662
+ `);
663
+ // eslint-disable-next-line
664
+ // @ts-ignore
665
+ el.type = 'range';
666
+ await elementUpdated(el);
667
+ expect(el.getAttribute('type')).equals('range');
668
+ expect(el.type).equals('text');
669
+ });
670
+ });
671
+ describe('help text', () => {
672
+ const name = 'This is a textfield';
673
+ const description = 'This text helps you fill it out';
674
+ const descriptionNegative = 'This text helps you when invalid';
675
+ it('accepts help text in `slot="help-text"`', async () => {
676
+ const el = await litFixture(html `
677
+ <sp-textfield label=${name}>
678
+ <sp-help-text slot="help-text">${description}</sp-help-text>
679
+ </sp-textfield>
680
+ `);
681
+ await elementUpdated(el);
682
+ await findDescribedNode(name, description);
683
+ });
684
+ it('accepts help text in `slot="help-text"` w/ own ID', async () => {
685
+ const el = await litFixture(html `
686
+ <sp-textfield label=${name}>
687
+ <sp-help-text slot="help-text" id="help-text-id-1">
688
+ ${description}
689
+ </sp-help-text>
690
+ </sp-textfield>
691
+ `);
692
+ await elementUpdated(el);
693
+ await findDescribedNode(name, description);
694
+ });
695
+ it('manages neutral/negative help text pairs', async () => {
696
+ const el = await litFixture(html `
697
+ <sp-textfield label=${name}>
698
+ <sp-help-text slot="help-text">${description}</sp-help-text>
699
+ <sp-help-text slot="negative-help-text">
700
+ ${descriptionNegative}
701
+ </sp-help-text>
702
+ </sp-textfield>
703
+ `);
704
+ const negativeHelpText = el.querySelector('[slot="negative-help-text"]');
705
+ await elementUpdated(el);
706
+ expect(negativeHelpText.variant).to.equal('neutral');
707
+ await findDescribedNode(name, description);
708
+ el.invalid = true;
709
+ await elementUpdated(el);
710
+ expect(negativeHelpText.variant).to.equal('negative');
711
+ await findDescribedNode(name, descriptionNegative);
712
+ });
713
+ it('manages neutral/negative help text pairs w/ own IDs', async () => {
714
+ const el = await litFixture(html `
715
+ <sp-textfield label=${name}>
716
+ <sp-help-text slot="help-text" id="help-text-id-2">
717
+ ${description}
718
+ </sp-help-text>
719
+ <sp-help-text slot="negative-help-text" id="help-text-id-3">
720
+ ${descriptionNegative}
721
+ </sp-help-text>
722
+ </sp-textfield>
723
+ `);
724
+ const negativeHelpText = el.querySelector('[slot="negative-help-text"]');
725
+ await elementUpdated(el);
726
+ expect(negativeHelpText.variant).to.equal('neutral');
727
+ await findDescribedNode(name, description);
728
+ el.invalid = true;
729
+ await elementUpdated(el);
730
+ expect(negativeHelpText.variant).to.equal('negative');
731
+ await findDescribedNode(name, descriptionNegative);
732
+ });
733
+ });
734
+ });
735
+ //# sourceMappingURL=textfield.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textfield.test.js","sourceRoot":"","sources":["textfield.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { Textfield, TextfieldType } from '../';\nimport { elementUpdated, expect, html, litFixture } from '@open-wc/testing';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport { findDescribedNode } from '../../../test/testing-helpers-a11y.js';\nimport { HelpText } from '@spectrum-web-components/help-text';\nimport '@spectrum-web-components/help-text/sp-help-text.js';\nimport '../sp-textfield.js';\n\ndescribe('Textfield', () => {\n it('loads default textfield accessibly', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter Your Name\"></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n });\n it('loads multiline textfield accessibly', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield label=\"Enter your name\" multiline></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n });\n\n it('manages tabIndex while disabled', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter Your Name\"></sp-textfield>\n `\n );\n\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(0);\n\n el.disabled = true;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.tabIndex = 2;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(-1);\n\n el.disabled = false;\n await elementUpdated(el);\n\n expect(el.tabIndex).to.equal(2);\n });\n\n it('manages tabIndex before first render', async () => {\n const el = document.createElement('sp-textfield') as Textfield;\n\n expect(el.focusElement).to.be.null;\n expect(el.tabIndex).to.equal(0);\n\n el.remove();\n });\n it('loads', async () => {\n const testPlaceholder = 'Enter your name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=${testPlaceholder}></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('input')\n : null;\n expect(input).to.not.be.null;\n const placeholder = input ? input.placeholder : null;\n expect(placeholder).to.equal(testPlaceholder);\n });\n it('multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('textarea')\n : null;\n expect(input).to.not.be.null;\n });\n it('resizes by default', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n const startBounds = el.getBoundingClientRect();\n\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 2, startBounds.bottom - 2],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = el.getBoundingClientRect();\n expect(endBounds.width).to.be.greaterThan(startBounds.width);\n expect(endBounds.height).to.be.greaterThan(startBounds.height);\n });\n it('accepts resize styling', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n multiline\n style=\"resize: none;\"\n label=\"No resize control\"\n placeholder=\"No resize control\"\n ></sp-textfield>\n `\n );\n const startBounds = el.getBoundingClientRect();\n\n await sendMouse({\n steps: [\n {\n type: 'move',\n position: [startBounds.right - 2, startBounds.bottom - 2],\n },\n {\n type: 'down',\n },\n {\n type: 'move',\n position: [startBounds.right + 50, startBounds.bottom + 50],\n },\n {\n type: 'up',\n },\n ],\n });\n\n const endBounds = el.getBoundingClientRect();\n expect(endBounds.width).equals(startBounds.width);\n expect(endBounds.height).equals(startBounds.height);\n });\n it('grows', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n multiline\n grows\n ></sp-textfield>\n `\n );\n expect(el).to.not.equal(undefined);\n const sizer = el.shadowRoot\n ? el.shadowRoot.querySelector('#sizer')\n : null;\n expect(sizer).to.not.be.null;\n });\n it('valid', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^[\\\\d]+$\"\n value=\"123\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"\\\\p{L}{4,8}\"\n value=\"你的名字\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('valid - multiline - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n pattern=\"\\\\p{L}{4,8}\"\n value=\"你的名字\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#valid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"[\\\\d]+\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline - required', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n value=\"\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"\\\\p{N}+\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline - unicode', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"\\\\p{N}+\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^\\\\p{N}+$\"\n value=\"123 not valid\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('invalid - multiline - boundary-type assertions', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your number\"\n pattern=\"^\\\\p{N}+$\"\n value=\"123 not valid\"\n required\n multiline\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n expect(el).to.not.equal(undefined);\n const input = el.shadowRoot\n ? el.shadowRoot.querySelector('#invalid')\n : null;\n expect(input).to.not.be.null;\n });\n it('receives focus', async () => {\n let activeElement: HTMLInputElement | null = null;\n const onFocusIn = (event: Event): void => {\n const path = event.composedPath();\n activeElement = path[0] as HTMLInputElement;\n };\n document.addEventListener('focusin', onFocusIn);\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focus();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.true;\n document.removeEventListener('focusin', onFocusIn);\n });\n it('does not receive focus when disabled', async () => {\n let activeElement: HTMLInputElement | null = null;\n const onFocusIn = (event: Event): void => {\n const path = event.composedPath();\n activeElement = path[0] as HTMLInputElement;\n };\n document.addEventListener('focusin', onFocusIn);\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n disabled\n placeholder=\"Enter your name\"\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focus();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.false;\n expect(document.activeElement === el).to.be.false;\n document.removeEventListener('focusin', onFocusIn);\n\n el.click();\n await elementUpdated(el);\n\n expect(activeElement === el.focusElement).to.be.false;\n expect(document.activeElement === el).to.be.false;\n document.removeEventListener('focusin', onFocusIn);\n });\n it('accepts input', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield placeholder=\"Enter your name\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focusElement.value = testValue;\n el.focusElement.dispatchEvent(new Event('input'));\n\n expect(el.value).to.equal(testValue);\n });\n it('selects', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=${testValue}></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal(testValue);\n\n el.focus();\n el.select();\n await sendKeys({ press: 'Backspace' });\n expect(el.value).to.equal('');\n });\n it('setSelectionRange', async () => {\n const testValue = 'Test Name';\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=${testValue}></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal(testValue);\n\n el.focus();\n el.setSelectionRange(0, 'Test '.length);\n await sendKeys({ press: 'Backspace' });\n expect(el.value).to.equal('Name');\n });\n it('accepts maxlength', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n maxlength=\"3\"\n minlength=\"2\"\n required\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n el.focus();\n\n await sendKeys({\n type: 'a',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('a');\n expect(el.checkValidity()).to.be.false;\n\n await sendKeys({\n type: 'b',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('ab');\n expect(el.checkValidity());\n\n await sendKeys({\n type: 'c',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('abc');\n expect(el.checkValidity());\n\n await sendKeys({\n type: 'd',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('abc');\n expect(el.checkValidity());\n\n await sendKeys({\n press: 'Backspace',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('ab');\n expect(el.checkValidity());\n\n await sendKeys({\n press: 'Backspace',\n });\n await elementUpdated(el);\n expect(el.value).to.equal('a');\n expect(el.checkValidity()).to.be.false;\n });\n it('dispatches a `change` event', async () => {\n const testValue = 'Test Name';\n let eventSource = null as Textfield | null;\n const onChange = (event: Event): void => {\n eventSource = event.composedPath()[0] as Textfield;\n };\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield\n placeholder=\"Enter your name\"\n @change=${onChange}\n ></sp-textfield>\n `\n );\n await elementUpdated(el);\n\n el.focusElement.value = testValue;\n el.focusElement.dispatchEvent(new Event('input'));\n el.focusElement.dispatchEvent(new Event('change'));\n\n expect(el.value).to.equal(testValue);\n const testSource = eventSource as Textfield;\n expect(testSource).to.equal(el);\n });\n it('passes through `autocomplete` attribute', async () => {\n let el = await litFixture<Textfield>(\n html`\n <sp-textfield autocomplete=\"off\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n let input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;\n expect(input).to.exist;\n if (input) {\n expect(input.getAttribute('autocomplete')).to.equal('off');\n }\n\n el = await litFixture<Textfield>(\n html`\n <sp-textfield></sp-textfield>\n `\n );\n await elementUpdated(el);\n input = el.shadowRoot ? el.shadowRoot.querySelector('input') : null;\n expect(input).to.exist;\n if (input) {\n expect(input.getAttribute('autocomplete')).to.not.exist;\n }\n });\n it('tests on `required` changes', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield value=\"\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.invalid).to.be.false;\n\n el.required = true;\n await elementUpdated(el);\n expect(el.invalid).to.be.true;\n });\n it('manages `allowed-keys`', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield allowed-keys=\"asdf\"></sp-textfield>\n `\n );\n await elementUpdated(el);\n expect(el.value).to.equal('');\n\n const inputElement = el.focusElement;\n\n el.focusElement.value = 'asdf';\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdf');\n\n inputElement.value = `asdff`;\n inputElement.setSelectionRange(1, 1);\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdff');\n expect(inputElement.selectionStart).to.equal(1);\n\n inputElement.value = `asdoff`;\n inputElement.setSelectionRange(4, 4);\n inputElement.dispatchEvent(new InputEvent('input'));\n\n await elementUpdated(el);\n expect(el.value).to.equal('asdff');\n expect(inputElement.selectionStart).to.equal(3);\n });\n describe('type attribute', () => {\n // references:\n // https://developer.mozilla.org/en-US/docs/Glossary/IDL#content_versus_idl_attributes\n // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes\n // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#keywords-and-enumerated-attributes\n\n it('assigns valid attributes to the property', async () => {\n const types: TextfieldType[] = [\n 'text',\n 'url',\n 'tel',\n 'email',\n 'password',\n ];\n for await (const t of types) {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=${t}></sp-textfield>\n `\n );\n expect(el.type).equals(t);\n\n el.setAttribute('type', 'url');\n expect(el.type).equals('url');\n }\n });\n it('represents invalid and missing attributes as \"text\"', async () => {\n const el1 = await litFixture<Textfield>(\n html`\n <sp-textfield></sp-textfield>\n `\n );\n\n const el2 = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"time\"></sp-textfield>\n `\n );\n expect(el1.type).equals('text');\n expect(el2.type).equals('text');\n\n el1.setAttribute('type', 'submit');\n expect(el1.type).equals('text');\n });\n it('reflects valid property assignments', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"url\"></sp-textfield>\n `\n );\n\n el.type = 'email';\n await elementUpdated(el);\n\n expect(el.getAttribute('type')).equals('email');\n expect(el.type).equals('email');\n });\n it('reflects invalid assignments but sets state to \"text\"', async () => {\n const el = await litFixture<Textfield>(\n html`\n <sp-textfield type=\"url\"></sp-textfield>\n `\n );\n\n // eslint-disable-next-line\n // @ts-ignore\n el.type = 'range';\n await elementUpdated(el);\n\n expect(el.getAttribute('type')).equals('range');\n expect(el.type).equals('text');\n });\n });\n describe('help text', () => {\n const name = 'This is a textfield';\n const description = 'This text helps you fill it out';\n const descriptionNegative = 'This text helps you when invalid';\n it('accepts help text in `slot=\"help-text\"`', async () => {\n const el = await litFixture(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\">${description}</sp-help-text>\n </sp-textfield>\n `);\n\n await elementUpdated(el);\n\n await findDescribedNode(name, description);\n });\n it('accepts help text in `slot=\"help-text\"` w/ own ID', async () => {\n const el = await litFixture(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\" id=\"help-text-id-1\">\n ${description}\n </sp-help-text>\n </sp-textfield>\n `);\n\n await elementUpdated(el);\n\n await findDescribedNode(name, description);\n });\n it('manages neutral/negative help text pairs', async () => {\n const el = await litFixture<Textfield>(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\">${description}</sp-help-text>\n <sp-help-text slot=\"negative-help-text\">\n ${descriptionNegative}\n </sp-help-text>\n </sp-textfield>\n `);\n const negativeHelpText = el.querySelector(\n '[slot=\"negative-help-text\"]'\n ) as HelpText;\n\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('neutral');\n await findDescribedNode(name, description);\n\n el.invalid = true;\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('negative');\n await findDescribedNode(name, descriptionNegative);\n });\n it('manages neutral/negative help text pairs w/ own IDs', async () => {\n const el = await litFixture<Textfield>(html`\n <sp-textfield label=${name}>\n <sp-help-text slot=\"help-text\" id=\"help-text-id-2\">\n ${description}\n </sp-help-text>\n <sp-help-text slot=\"negative-help-text\" id=\"help-text-id-3\">\n ${descriptionNegative}\n </sp-help-text>\n </sp-textfield>\n `);\n const negativeHelpText = el.querySelector(\n '[slot=\"negative-help-text\"]'\n ) as HelpText;\n\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('neutral');\n await findDescribedNode(name, description);\n\n el.invalid = true;\n await elementUpdated(el);\n\n expect(negativeHelpText.variant).to.equal('negative');\n await findDescribedNode(name, descriptionNegative);\n });\n });\n});\n"]}