@spectrum-web-components/number-field 1.0.0 → 1.0.2

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.
@@ -1,1739 +0,0 @@
1
- "use strict";
2
- import { html } from "@spectrum-web-components/base";
3
- import {
4
- aTimeout,
5
- elementUpdated,
6
- expect,
7
- nextFrame,
8
- oneEvent
9
- } from "@open-wc/testing";
10
- import { shouldPolyfill } from "@formatjs/intl-numberformat/should-polyfill.js";
11
- import {
12
- currency,
13
- decimals,
14
- Default,
15
- germanDecimals,
16
- indeterminate,
17
- percents,
18
- pixels,
19
- units
20
- } from "../stories/number-field.stories.js";
21
- import "@spectrum-web-components/number-field/sp-number-field.js";
22
- import {
23
- CHANGE_DEBOUNCE_MS,
24
- FRAMES_PER_CHANGE,
25
- indeterminatePlaceholder
26
- } from "@spectrum-web-components/number-field";
27
- import {
28
- a11ySnapshot,
29
- findAccessibilityNode,
30
- sendKeys,
31
- setUserAgent
32
- } from "@web/test-runner-commands";
33
- import { spy } from "sinon";
34
- import { clickBySelector, getElFrom } from "./helpers.js";
35
- import { createLanguageContext } from "../../../tools/reactive-controllers/test/helpers.js";
36
- import { sendMouse } from "../../../test/plugins/browser.js";
37
- import {
38
- fixture,
39
- testForLitDevWarnings
40
- } from "../../../test/testing-helpers.js";
41
- import { isMac } from "@spectrum-web-components/shared/src/platform.js";
42
- describe("NumberField", () => {
43
- before(async () => {
44
- const shouldPolyfillEn = shouldPolyfill("en");
45
- const shouldPolyfillFr = shouldPolyfill("fr");
46
- if (shouldPolyfillEn || shouldPolyfillFr) {
47
- await import("@formatjs/intl-numberformat/polyfill-force.js");
48
- }
49
- if (shouldPolyfillEn) {
50
- await import("@formatjs/intl-numberformat/locale-data/en.js");
51
- }
52
- if (shouldPolyfillFr) {
53
- await import("@formatjs/intl-numberformat/locale-data/fr.js");
54
- }
55
- });
56
- testForLitDevWarnings(async () => await getElFrom(Default({})));
57
- it("loads default number-field accessibly", async () => {
58
- const el = await getElFrom(Default({}));
59
- await elementUpdated(el);
60
- await expect(el).to.be.accessible();
61
- });
62
- describe("receives input", () => {
63
- it("without language context", async () => {
64
- const el = await getElFrom(Default({ value: 1337 }));
65
- el.size = "s";
66
- expect(el.formattedValue).to.equal("1,337");
67
- expect(el.valueAsString).to.equal("1337");
68
- expect(el.value).to.equal(1337);
69
- expect(el.focusElement.value).to.equal("1,337");
70
- el.focus();
71
- await sendKeys({ type: "7331" });
72
- await elementUpdated(el);
73
- await sendKeys({ press: "Enter" });
74
- await elementUpdated(el);
75
- expect(el.formattedValue).to.equal("13,377,331");
76
- expect(el.valueAsString).to.equal("13377331");
77
- expect(el.value).to.equal(13377331);
78
- expect(el.focusElement.value).to.equal("13,377,331");
79
- });
80
- it("with language context", async () => {
81
- const [languageContext] = createLanguageContext("fr");
82
- const el = await getElFrom(html`
83
- <div @sp-language-context=${languageContext}>
84
- ${Default({ value: 1337 })}
85
- </div>
86
- `);
87
- el.size = "l";
88
- expect(el.formattedValue).to.equal("1\u202F337");
89
- expect(el.valueAsString).to.equal("1337");
90
- expect(el.value).to.equal(1337);
91
- expect(el.focusElement.value).to.equal("1\u202F337");
92
- el.focus();
93
- await sendKeys({ type: "7331" });
94
- await elementUpdated(el);
95
- await sendKeys({ press: "Enter" });
96
- await elementUpdated(el);
97
- expect(el.formattedValue).to.equal("13\u202F377\u202F331");
98
- expect(el.valueAsString).to.equal("13377331");
99
- expect(el.value).to.equal(13377331);
100
- expect(el.focusElement.value).to.equal("13\u202F377\u202F331");
101
- });
102
- });
103
- xit("correctly interprets decimal point on iPhone", async () => {
104
- await setUserAgent(
105
- "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1"
106
- );
107
- const el = await getElFrom(decimals({ value: 1234 }));
108
- expect(el.formattedValue).to.equal("1,234");
109
- el.focus();
110
- await sendKeys({ press: "Backspace" });
111
- el.blur();
112
- expect(el.formattedValue).to.equal("123");
113
- el.focus();
114
- await sendKeys({ type: "45" });
115
- el.blur();
116
- expect(el.formattedValue).to.equal("12,345");
117
- el.focus();
118
- await sendKeys({ type: ",6" });
119
- el.blur();
120
- expect(el.formattedValue).to.equal("12,345.6");
121
- el.focus();
122
- await sendKeys({ type: ",7" });
123
- el.blur();
124
- expect(el.formattedValue).to.equal("123,456.7");
125
- el.focus();
126
- await sendKeys({ press: "Backspace" });
127
- await sendKeys({ press: "Backspace" });
128
- el.blur();
129
- expect(el.formattedValue).to.equal("123,456");
130
- });
131
- describe("Step", () => {
132
- it("can be 0", async () => {
133
- const el = await getElFrom(
134
- Default({
135
- step: 0,
136
- min: 0,
137
- max: 10,
138
- value: 5
139
- })
140
- );
141
- el.size = "xl";
142
- expect(el.value).to.equal(5);
143
- expect(el.formattedValue).to.equal("5");
144
- expect(el.valueAsString).to.equal("5");
145
- expect(el.focusElement.value).to.equal("5");
146
- });
147
- it("respects other locales", async () => {
148
- const el = await getElFrom(
149
- germanDecimals({
150
- step: 0.01
151
- })
152
- );
153
- el.value = 2.42;
154
- await elementUpdated(el);
155
- el.size = "xl";
156
- expect(el.value).to.equal(2.42);
157
- expect(el.formattedValue).to.equal("+2,42");
158
- expect(el.focusElement.value).to.equal("+2,42");
159
- await clickBySelector(el, ".step-up");
160
- expect(el.value).to.equal(2.43);
161
- expect(el.formattedValue).to.equal("+2,43");
162
- expect(el.focusElement.value).to.equal("+2,43");
163
- });
164
- it("supports both positive and negative decimal values", async () => {
165
- const el = await getElFrom(
166
- Default({
167
- step: 1e-3,
168
- min: -10,
169
- max: 10,
170
- value: -2.4
171
- })
172
- );
173
- el.size = "xl";
174
- expect(el.value).to.equal(-2.4);
175
- expect(el.valueAsString).to.equal("-2.4");
176
- expect(el.focusElement.value).to.equal("-2.4");
177
- });
178
- it("correctly handles max values greater than 1000 with step=1", async () => {
179
- const el = await getElFrom(
180
- Default({
181
- step: 1,
182
- min: 0,
183
- max: 2e5,
184
- value: 999
185
- })
186
- );
187
- await clickBySelector(el, ".step-up");
188
- expect(el.value).to.equal(1e3);
189
- expect(el.valueAsString).to.equal("1000");
190
- expect(el.formattedValue).to.equal("1,000");
191
- expect(el.focusElement.value).to.equal("1,000");
192
- el.value = 15e3;
193
- await elementUpdated(el);
194
- expect(el.value).to.equal(15e3);
195
- expect(el.valueAsString).to.equal("15000");
196
- expect(el.formattedValue).to.equal("15,000");
197
- expect(el.focusElement.value).to.equal("15,000");
198
- });
199
- });
200
- describe("Increments", () => {
201
- let el;
202
- beforeEach(async () => {
203
- el = await getElFrom(Default({}));
204
- expect(el.value).to.be.NaN;
205
- expect(el.formattedValue).to.equal("");
206
- expect(el.valueAsString).to.equal("NaN");
207
- expect(el.focusElement.value).to.equal("");
208
- });
209
- it('via pointer, only "left" button', async () => {
210
- await clickBySelector(el, ".step-up", { button: "middle" });
211
- expect(el.formattedValue).to.equal("");
212
- expect(el.valueAsString).to.equal("NaN");
213
- expect(el.value).to.be.NaN;
214
- expect(el.focusElement.value).to.equal("");
215
- });
216
- it("via pointer", async () => {
217
- await clickBySelector(el, ".step-up");
218
- expect(el.formattedValue).to.equal("0");
219
- expect(el.valueAsString).to.equal("0");
220
- expect(el.value).to.equal(0);
221
- expect(el.focusElement.value).to.equal("0");
222
- await clickBySelector(el, ".step-up");
223
- expect(el.formattedValue).to.equal("1");
224
- expect(el.valueAsString).to.equal("1");
225
- expect(el.value).to.equal(1);
226
- expect(el.focusElement.value).to.equal("1");
227
- });
228
- it("via arrow up", async () => {
229
- el.focus();
230
- await elementUpdated(el);
231
- await sendKeys({ press: "ArrowUp" });
232
- await elementUpdated(el);
233
- expect(el.formattedValue).to.equal("0");
234
- expect(el.valueAsString).to.equal("0");
235
- expect(el.value).to.equal(0);
236
- expect(el.focusElement.value).to.equal("0");
237
- await sendKeys({ press: "ArrowUp" });
238
- await elementUpdated(el);
239
- expect(el.formattedValue).to.equal("1");
240
- expect(el.valueAsString).to.equal("1");
241
- expect(el.value).to.equal(1);
242
- expect(el.focusElement.value).to.equal("1");
243
- });
244
- it("via arrow up (shift modified)", async () => {
245
- el.focus();
246
- await elementUpdated(el);
247
- await sendKeys({ press: "ArrowUp" });
248
- await elementUpdated(el);
249
- expect(el.formattedValue).to.equal("0");
250
- expect(el.valueAsString).to.equal("0");
251
- expect(el.value).to.equal(0);
252
- expect(el.focusElement.value).to.equal("0");
253
- await sendKeys({ press: "Shift+ArrowUp" });
254
- await elementUpdated(el);
255
- expect(el.formattedValue).to.equal("10");
256
- expect(el.valueAsString).to.equal("10");
257
- expect(el.value).to.equal(10);
258
- expect(el.focusElement.value).to.equal("10");
259
- });
260
- it("via arrow up (custom shift modified value)", async () => {
261
- el.focus();
262
- el.stepModifier = 5;
263
- el.step = 3;
264
- await elementUpdated(el);
265
- await sendKeys({ press: "ArrowUp" });
266
- await elementUpdated(el);
267
- expect(el.formattedValue).to.equal("0");
268
- expect(el.valueAsString).to.equal("0");
269
- expect(el.value).to.equal(0);
270
- expect(el.focusElement.value).to.equal("0");
271
- await sendKeys({ press: "Shift+ArrowUp" });
272
- await elementUpdated(el);
273
- expect(el.formattedValue).to.equal("15");
274
- expect(el.valueAsString).to.equal("15");
275
- expect(el.value).to.equal(15);
276
- expect(el.focusElement.value).to.equal("15");
277
- });
278
- it("via scroll", async () => {
279
- el.focus();
280
- await elementUpdated(el);
281
- expect(el.focused).to.be.true;
282
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: 1 }));
283
- await elementUpdated(el);
284
- expect(el.formattedValue).to.equal("0");
285
- expect(el.valueAsString).to.equal("0");
286
- expect(el.value).to.equal(0);
287
- expect(el.focusElement.value).to.equal("0");
288
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: 100 }));
289
- await elementUpdated(el);
290
- expect(el.formattedValue).to.equal("1");
291
- expect(el.valueAsString).to.equal("1");
292
- expect(el.value).to.equal(1);
293
- expect(el.focusElement.value).to.equal("1");
294
- });
295
- it("via scroll (shift modified)", async () => {
296
- el.focus();
297
- await elementUpdated(el);
298
- expect(el.focused).to.be.true;
299
- el.dispatchEvent(
300
- new WheelEvent("wheel", {
301
- deltaX: 1,
302
- shiftKey: true
303
- })
304
- );
305
- await elementUpdated(el);
306
- expect(el.formattedValue).to.equal("0");
307
- expect(el.valueAsString).to.equal("0");
308
- expect(el.value).to.equal(0);
309
- expect(el.focusElement.value).to.equal("0");
310
- el.dispatchEvent(
311
- new WheelEvent("wheel", {
312
- deltaX: 100,
313
- shiftKey: true
314
- })
315
- );
316
- await elementUpdated(el);
317
- expect(el.formattedValue).to.equal("10");
318
- expect(el.valueAsString).to.equal("10");
319
- expect(el.value).to.equal(10);
320
- expect(el.focusElement.value).to.equal("10");
321
- });
322
- });
323
- describe("Decrements", () => {
324
- let el;
325
- beforeEach(async () => {
326
- el = await getElFrom(Default({}));
327
- expect(el.value).to.be.NaN;
328
- expect(el.formattedValue).to.equal("");
329
- expect(el.valueAsString).to.equal("NaN");
330
- expect(el.focusElement.value).to.equal("");
331
- });
332
- it('via pointer, only "left" button', async () => {
333
- await clickBySelector(el, ".step-down", { button: "middle" });
334
- expect(el.formattedValue).to.equal("");
335
- expect(el.valueAsString).to.equal("NaN");
336
- expect(el.value).to.be.NaN;
337
- expect(el.focusElement.value).to.equal("");
338
- });
339
- it("via pointer", async () => {
340
- await clickBySelector(el, ".step-down");
341
- expect(el.formattedValue).to.equal("0");
342
- expect(el.valueAsString).to.equal("0");
343
- expect(el.value).to.equal(0);
344
- expect(el.focusElement.value).to.equal("0");
345
- await clickBySelector(el, ".step-down");
346
- expect(el.formattedValue).to.equal("-1");
347
- expect(el.valueAsString).to.equal("-1");
348
- expect(el.value).to.equal(-1);
349
- expect(el.focusElement.value).to.equal("-1");
350
- });
351
- it("via arrow down", async () => {
352
- el.focus();
353
- await elementUpdated(el);
354
- await sendKeys({ press: "ArrowDown" });
355
- await elementUpdated(el);
356
- expect(el.formattedValue).to.equal("0");
357
- expect(el.valueAsString).to.equal("0");
358
- expect(el.value).to.equal(0);
359
- expect(el.focusElement.value).to.equal("0");
360
- await sendKeys({ press: "ArrowDown" });
361
- await elementUpdated(el);
362
- expect(el.formattedValue).to.equal("-1");
363
- expect(el.valueAsString).to.equal("-1");
364
- expect(el.value).to.equal(-1);
365
- expect(el.focusElement.value).to.equal("-1");
366
- });
367
- it("via arrow down (shift modified)", async () => {
368
- el.focus();
369
- await elementUpdated(el);
370
- await sendKeys({ press: "ArrowDown" });
371
- await elementUpdated(el);
372
- expect(el.formattedValue).to.equal("0");
373
- expect(el.valueAsString).to.equal("0");
374
- expect(el.value).to.equal(0);
375
- expect(el.focusElement.value).to.equal("0");
376
- await sendKeys({ press: "Shift+ArrowDown" });
377
- await elementUpdated(el);
378
- expect(el.formattedValue).to.equal("-10");
379
- expect(el.valueAsString).to.equal("-10");
380
- expect(el.value).to.equal(-10);
381
- expect(el.focusElement.value).to.equal("-10");
382
- });
383
- it("via arrow up (custom shift modified value)", async () => {
384
- el.focus();
385
- el.stepModifier = 5;
386
- el.step = 3;
387
- await elementUpdated(el);
388
- await sendKeys({ press: "ArrowDown" });
389
- await elementUpdated(el);
390
- expect(el.formattedValue).to.equal("0");
391
- expect(el.valueAsString).to.equal("0");
392
- expect(el.value).to.equal(0);
393
- expect(el.focusElement.value).to.equal("0");
394
- await sendKeys({ press: "Shift+ArrowDown" });
395
- await elementUpdated(el);
396
- expect(el.formattedValue).to.equal("-15");
397
- expect(el.valueAsString).to.equal("-15");
398
- expect(el.value).to.equal(-15);
399
- expect(el.focusElement.value).to.equal("-15");
400
- });
401
- it("via scroll", async () => {
402
- el.focus();
403
- await elementUpdated(el);
404
- expect(el.focused).to.be.true;
405
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: -1 }));
406
- await elementUpdated(el);
407
- expect(el.formattedValue).to.equal("0");
408
- expect(el.valueAsString).to.equal("0");
409
- expect(el.value).to.equal(0);
410
- expect(el.focusElement.value).to.equal("0");
411
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: -100 }));
412
- await elementUpdated(el);
413
- expect(el.formattedValue).to.equal("-1");
414
- expect(el.valueAsString).to.equal("-1");
415
- expect(el.value).to.equal(-1);
416
- expect(el.focusElement.value).to.equal("-1");
417
- });
418
- it("via scroll (shift modified)", async () => {
419
- el.focus();
420
- await elementUpdated(el);
421
- expect(el.focused).to.be.true;
422
- el.dispatchEvent(
423
- new WheelEvent("wheel", {
424
- deltaX: -1,
425
- shiftKey: true
426
- })
427
- );
428
- await elementUpdated(el);
429
- expect(el.formattedValue).to.equal("0");
430
- expect(el.valueAsString).to.equal("0");
431
- expect(el.value).to.equal(0);
432
- expect(el.focusElement.value).to.equal("0");
433
- el.dispatchEvent(
434
- new WheelEvent("wheel", {
435
- deltaX: -100,
436
- shiftKey: true
437
- })
438
- );
439
- await elementUpdated(el);
440
- expect(el.formattedValue).to.equal("-10");
441
- expect(el.valueAsString).to.equal("-10");
442
- expect(el.value).to.equal(-10);
443
- expect(el.focusElement.value).to.equal("-10");
444
- });
445
- });
446
- describe("dispatched events", () => {
447
- const inputSpy = spy();
448
- const changeSpy = spy();
449
- let el;
450
- beforeEach(async () => {
451
- inputSpy.resetHistory();
452
- changeSpy.resetHistory();
453
- el = await getElFrom(Default({ value: 50 }));
454
- el.addEventListener("input", (event) => {
455
- var _a;
456
- inputSpy((_a = event.target) == null ? void 0 : _a.value);
457
- });
458
- el.addEventListener("change", (event) => {
459
- var _a;
460
- changeSpy((_a = event.target) == null ? void 0 : _a.value);
461
- });
462
- });
463
- it("except when changing `value` from the outside", async () => {
464
- el.focus();
465
- await elementUpdated(el);
466
- expect(el.focused).to.be.true;
467
- el.value = 51;
468
- expect(changeSpy.callCount).to.equal(0);
469
- await elementUpdated(el);
470
- el.value = 52;
471
- expect(changeSpy.callCount).to.equal(0);
472
- });
473
- it("handles IME input correctly and dispatches change event", async () => {
474
- el.focus();
475
- el.dispatchEvent(new CompositionEvent("compositionstart"));
476
- await sendKeys({ type: "\uFF11\uFF12\uFF13" });
477
- await elementUpdated(el);
478
- el.dispatchEvent(new CompositionEvent("compositionend"));
479
- await elementUpdated(el);
480
- await sendKeys({ press: "Enter" });
481
- expect(el.value).to.equal(50123);
482
- expect(changeSpy.callCount).to.equal(1);
483
- });
484
- it("via scroll", async () => {
485
- el.focus();
486
- await elementUpdated(el);
487
- expect(el.focused).to.be.true;
488
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: 1 }));
489
- await elementUpdated(el);
490
- expect(el.formattedValue).to.equal("51");
491
- expect(el.valueAsString).to.equal("51");
492
- expect(el.value).to.equal(51);
493
- expect(inputSpy.callCount).to.equal(1);
494
- expect(changeSpy.callCount).to.equal(0);
495
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: 100 }));
496
- await elementUpdated(el);
497
- expect(el.formattedValue).to.equal("52");
498
- expect(el.valueAsString).to.equal("52");
499
- expect(el.value).to.equal(52);
500
- expect(inputSpy.callCount).to.equal(2);
501
- expect(changeSpy.callCount).to.equal(0);
502
- await aTimeout(CHANGE_DEBOUNCE_MS + 10);
503
- expect(inputSpy.callCount).to.equal(2);
504
- expect(changeSpy.callCount).to.equal(1);
505
- });
506
- it("has a useful `value`", async () => {
507
- el.focus();
508
- await sendKeys({ type: "7" });
509
- await sendKeys({ press: "Enter" });
510
- expect(inputSpy.calledWith(507), "input").to.be.true;
511
- expect(changeSpy.calledWith(507), "change").to.be.true;
512
- await sendKeys({ type: ",00" });
513
- await sendKeys({ press: "Enter" });
514
- expect(inputSpy.calledWith(5070), "input").to.be.true;
515
- expect(inputSpy.calledWith(50700), "input").to.be.true;
516
- expect(changeSpy.calledWith(50700), "change").to.be.true;
517
- });
518
- it("has a useful `value` - percent", async () => {
519
- el.formatOptions = { style: "percent" };
520
- el.value = 0.45;
521
- expect(el.value).to.equal(0.45);
522
- el.focus();
523
- await sendKeys({ type: "7" });
524
- expect(inputSpy.calledWith(4.57), "first input").to.be.true;
525
- await sendKeys({ press: "Backspace" });
526
- await sendKeys({ press: "Backspace" });
527
- await sendKeys({ press: "Backspace" });
528
- await sendKeys({ press: "Enter" });
529
- expect(el.value).to.equal(0.04);
530
- expect(inputSpy.calledWith(0.45), "second input").to.be.true;
531
- expect(inputSpy.calledWith(0.04), "third input").to.be.true;
532
- expect(changeSpy.calledWith(0.04), "change").to.be.true;
533
- });
534
- it("has a useful `value` - currency", async () => {
535
- el.formatOptions = {
536
- style: "currency",
537
- currency: "EUR",
538
- currencyDisplay: "code",
539
- currencySign: "accounting"
540
- };
541
- await elementUpdated(el);
542
- el.value = 45;
543
- expect(el.value).to.equal(45);
544
- el.focus();
545
- await sendKeys({ type: "7" });
546
- expect(el.value).to.equal(45.007);
547
- expect(inputSpy.calledWith(el.value), "first input").to.be.true;
548
- await sendKeys({ press: "ArrowLeft" });
549
- await sendKeys({ press: "ArrowLeft" });
550
- await sendKeys({ press: "ArrowLeft" });
551
- await sendKeys({ press: "ArrowLeft" });
552
- await sendKeys({ press: "ArrowLeft" });
553
- await sendKeys({ press: "ArrowLeft" });
554
- await sendKeys({ press: "ArrowLeft" });
555
- await sendKeys({ press: "ArrowLeft" });
556
- await sendKeys({ press: "ArrowLeft" });
557
- await sendKeys({ press: "ArrowLeft" });
558
- await sendKeys({ type: "1" });
559
- await sendKeys({ press: "Enter" });
560
- expect(el.value).to.equal(145.007);
561
- expect(inputSpy.calledWith(145.007), "second input").to.be.true;
562
- expect(changeSpy.calledWith(145.007), "change").to.be.true;
563
- });
564
- it("one input/one change for each Arrow*", async () => {
565
- el.focus();
566
- await sendKeys({ press: "ArrowUp" });
567
- expect(inputSpy.callCount).to.equal(1);
568
- expect(changeSpy.callCount).to.equal(1);
569
- expect(el.value).to.equal(51);
570
- await sendKeys({ press: "ArrowDown" });
571
- expect(inputSpy.callCount).to.equal(2);
572
- expect(changeSpy.callCount).to.equal(2);
573
- expect(el.value).to.equal(50);
574
- });
575
- it("one input/one change for each click", async () => {
576
- await clickBySelector(el, ".step-up");
577
- expect(inputSpy.callCount).to.equal(1);
578
- expect(changeSpy.callCount).to.equal(1);
579
- expect(el.value).to.equal(51);
580
- await clickBySelector(el, ".step-down");
581
- expect(inputSpy.callCount).to.equal(2);
582
- expect(changeSpy.callCount).to.equal(2);
583
- expect(el.value).to.equal(50);
584
- });
585
- it("click with modifier key", async () => {
586
- let target = el.shadowRoot.querySelector(".step-up");
587
- const stepUpRect = target.getBoundingClientRect();
588
- const options = {
589
- bubbles: true,
590
- composed: true,
591
- shiftKey: true,
592
- clientX: stepUpRect.x + 1,
593
- clientY: stepUpRect.y + 1
594
- };
595
- el.buttons.setPointerCapture = () => {
596
- return;
597
- };
598
- el.buttons.releasePointerCapture = () => {
599
- return;
600
- };
601
- let input = oneEvent(el, "input");
602
- target.dispatchEvent(new PointerEvent("pointerdown", options));
603
- await input;
604
- target.dispatchEvent(new PointerEvent("pointerup", options));
605
- expect(inputSpy.callCount).to.equal(1);
606
- expect(changeSpy.callCount).to.equal(1);
607
- expect(el.value).to.equal(60);
608
- target = el.shadowRoot.querySelector(".step-down");
609
- const stepDownRect = target.getBoundingClientRect();
610
- options.clientX = stepDownRect.x + 1;
611
- options.clientY = stepDownRect.y + 1;
612
- input = oneEvent(el, "input");
613
- target.dispatchEvent(new PointerEvent("pointerdown", options));
614
- await input;
615
- target.dispatchEvent(new PointerEvent("pointerup", options));
616
- expect(inputSpy.callCount).to.equal(2);
617
- expect(changeSpy.callCount).to.equal(2);
618
- expect(el.value).to.equal(50);
619
- });
620
- it("many input, but one change", async () => {
621
- const buttonUp = el.shadowRoot.querySelector(
622
- ".step-up"
623
- );
624
- const buttonUpRect = buttonUp.getBoundingClientRect();
625
- const buttonUpPosition = [
626
- buttonUpRect.x + buttonUpRect.width / 2,
627
- buttonUpRect.y + buttonUpRect.height / 2
628
- ];
629
- const buttonDown = el.shadowRoot.querySelector(
630
- ".step-down"
631
- );
632
- const buttonDownRect = buttonDown.getBoundingClientRect();
633
- const buttonDownPosition = [
634
- buttonDownRect.x + buttonDownRect.width / 2,
635
- buttonDownRect.y + buttonDownRect.height / 2
636
- ];
637
- sendMouse({
638
- steps: [
639
- {
640
- type: "move",
641
- position: buttonUpPosition
642
- },
643
- {
644
- type: "down"
645
- }
646
- ]
647
- });
648
- await oneEvent(el, "input");
649
- expect(el.value).to.equal(51);
650
- expect(inputSpy.callCount).to.equal(1);
651
- expect(changeSpy.callCount).to.equal(0);
652
- await oneEvent(el, "input");
653
- expect(el.value).to.equal(52);
654
- expect(inputSpy.callCount).to.equal(2);
655
- expect(changeSpy.callCount).to.equal(0);
656
- await oneEvent(el, "input");
657
- expect(el.value).to.equal(53);
658
- expect(inputSpy.callCount).to.equal(3);
659
- expect(changeSpy.callCount).to.equal(0);
660
- sendMouse({
661
- steps: [
662
- {
663
- type: "move",
664
- position: buttonDownPosition
665
- }
666
- ]
667
- });
668
- let framesToWait = FRAMES_PER_CHANGE * 2;
669
- while (framesToWait) {
670
- framesToWait -= 1;
671
- await nextFrame();
672
- }
673
- expect(inputSpy.callCount).to.equal(5);
674
- expect(changeSpy.callCount).to.equal(0);
675
- await sendMouse({
676
- steps: [
677
- {
678
- type: "up"
679
- }
680
- ]
681
- });
682
- expect(inputSpy.callCount).to.equal(5);
683
- expect(changeSpy.callCount).to.equal(1);
684
- });
685
- it("no change in committed value - using buttons", async () => {
686
- const buttonUp = el.shadowRoot.querySelector(
687
- ".step-up"
688
- );
689
- const buttonUpRect = buttonUp.getBoundingClientRect();
690
- const buttonUpPosition = [
691
- buttonUpRect.x + buttonUpRect.width / 2,
692
- buttonUpRect.y + buttonUpRect.height / 2
693
- ];
694
- const buttonDown = el.shadowRoot.querySelector(
695
- ".step-down"
696
- );
697
- const buttonDownRect = buttonDown.getBoundingClientRect();
698
- const buttonDownPosition = [
699
- buttonDownRect.x + buttonDownRect.width / 2,
700
- buttonDownRect.y + buttonDownRect.height / 2
701
- ];
702
- sendMouse({
703
- steps: [
704
- {
705
- type: "move",
706
- position: buttonUpPosition
707
- },
708
- {
709
- type: "down"
710
- }
711
- ]
712
- });
713
- await oneEvent(el, "input");
714
- expect(el.value).to.equal(51);
715
- expect(inputSpy.callCount).to.equal(1);
716
- expect(changeSpy.callCount).to.equal(0);
717
- await oneEvent(el, "input");
718
- expect(el.value).to.equal(52);
719
- expect(inputSpy.callCount).to.equal(2);
720
- expect(changeSpy.callCount).to.equal(0);
721
- sendMouse({
722
- steps: [
723
- {
724
- type: "move",
725
- position: buttonDownPosition
726
- }
727
- ]
728
- });
729
- let framesToWait = FRAMES_PER_CHANGE * 2;
730
- while (framesToWait) {
731
- framesToWait -= 1;
732
- await nextFrame();
733
- }
734
- expect(inputSpy.callCount).to.equal(4);
735
- expect(changeSpy.callCount).to.equal(0);
736
- await sendMouse({
737
- steps: [
738
- {
739
- type: "up"
740
- }
741
- ]
742
- });
743
- expect(inputSpy.callCount).to.equal(4);
744
- expect(
745
- changeSpy.callCount,
746
- 'value does not change from initial value so no "change" event is dispatched'
747
- ).to.equal(0);
748
- });
749
- });
750
- it("accepts pointer interactions with the stepper UI", async () => {
751
- const inputSpy = spy();
752
- const el = await getElFrom(Default({ value: 50 }));
753
- el.addEventListener("input", () => inputSpy());
754
- expect(el.formattedValue).to.equal("50");
755
- expect(el.valueAsString).to.equal("50");
756
- expect(el.value).to.equal(50);
757
- const buttonUp = el.shadowRoot.querySelector(".step-up");
758
- const buttonUpRect = buttonUp.getBoundingClientRect();
759
- const buttonUpPosition = [
760
- buttonUpRect.x + buttonUpRect.width / 2,
761
- buttonUpRect.y + buttonUpRect.height / 2
762
- ];
763
- const buttonDown = el.shadowRoot.querySelector(
764
- ".step-down"
765
- );
766
- const buttonDownRect = buttonDown.getBoundingClientRect();
767
- const buttonDownPosition = [
768
- buttonDownRect.x + buttonDownRect.width / 2,
769
- buttonDownRect.y + buttonDownRect.height / 2
770
- ];
771
- const outsidePosition = [
772
- buttonDownRect.x + buttonDownRect.width + 5,
773
- buttonDownRect.y + buttonDownRect.height + 5
774
- ];
775
- await sendMouse({
776
- steps: [
777
- {
778
- type: "move",
779
- position: buttonUpPosition
780
- },
781
- {
782
- type: "down"
783
- }
784
- ]
785
- });
786
- await oneEvent(el, "input");
787
- let value = 50 + inputSpy.callCount;
788
- expect(el.formattedValue).to.equal(String(value));
789
- expect(el.valueAsString).to.equal(String(value));
790
- expect(el.value).to.equal(value);
791
- inputSpy.resetHistory();
792
- await sendMouse({
793
- steps: [
794
- {
795
- type: "move",
796
- position: buttonDownPosition
797
- }
798
- ]
799
- });
800
- value = value - inputSpy.callCount;
801
- expect(el.formattedValue).to.equal(String(value));
802
- expect(el.valueAsString).to.equal(String(value));
803
- expect(el.value).to.equal(value);
804
- inputSpy.resetHistory();
805
- await sendMouse({
806
- steps: [
807
- {
808
- type: "move",
809
- position: outsidePosition
810
- }
811
- ]
812
- });
813
- value = value - inputSpy.callCount;
814
- expect(el.formattedValue).to.equal(String(value));
815
- expect(el.valueAsString).to.equal(String(value));
816
- expect(el.value).to.equal(value);
817
- inputSpy.resetHistory();
818
- await oneEvent(el, "input");
819
- value = value - inputSpy.callCount;
820
- expect(el.formattedValue).to.equal(String(value));
821
- expect(el.valueAsString).to.equal(String(value));
822
- expect(el.value).to.equal(value);
823
- inputSpy.resetHistory();
824
- await sendMouse({
825
- steps: [
826
- {
827
- type: "up"
828
- }
829
- ]
830
- });
831
- let framesToWait = FRAMES_PER_CHANGE;
832
- while (framesToWait) {
833
- framesToWait -= 1;
834
- await nextFrame();
835
- }
836
- await elementUpdated(el);
837
- value = value - inputSpy.callCount;
838
- expect(el.formattedValue).to.equal(String(value));
839
- expect(el.valueAsString).to.equal(String(value));
840
- expect(el.value).to.equal(value);
841
- });
842
- it("surfaces `valueAsNumber`", async () => {
843
- const el = await getElFrom(Default({}));
844
- el.value = 1e3;
845
- await elementUpdated(el);
846
- expect(el.formattedValue).to.equal("1,000");
847
- expect(el.valueAsString).to.equal("1000");
848
- expect(el.value).to.equal(1e3);
849
- el.valueAsString = "2222";
850
- await elementUpdated(el);
851
- expect(el.formattedValue).to.equal("2,222");
852
- expect(el.valueAsString).to.equal("2222");
853
- expect(el.value).to.equal(2222);
854
- });
855
- describe("manages `value` with `formatOptions`", () => {
856
- it("manages decimals", async () => {
857
- const el = await getElFrom(decimals({ value: 1.333333 }));
858
- expect(el.value).to.equal(1.33);
859
- expect(el.formattedValue).to.equal("+1.33");
860
- expect(el.valueAsString).to.equal("1.33");
861
- });
862
- it("manages precents", async () => {
863
- const el = await getElFrom(percents({ value: 0.45 }));
864
- expect(el.formattedValue).to.equal("45%");
865
- expect(el.valueAsString).to.equal("0.45");
866
- expect(el.value).to.equal(0.45);
867
- await clickBySelector(el, ".step-down");
868
- await elementUpdated(el);
869
- expect(el.formattedValue).to.equal("44%");
870
- expect(el.valueAsString).to.equal("0.44");
871
- expect(el.value).to.equal(0.44);
872
- await clickBySelector(el, ".step-up");
873
- await elementUpdated(el);
874
- expect(el.formattedValue).to.equal("45%");
875
- expect(el.valueAsString).to.equal("0.45");
876
- expect(el.value).to.equal(0.45);
877
- el.focus();
878
- el.value = 0;
879
- await sendKeys({ type: "54" });
880
- await sendKeys({ press: "Enter" });
881
- expect(el.formattedValue).to.equal("54%");
882
- expect(el.valueAsString).to.equal("0.54");
883
- expect(el.value).to.equal(0.54);
884
- await elementUpdated(el);
885
- expect(el.formattedValue).to.equal("54%");
886
- expect(el.valueAsString).to.equal("0.54");
887
- expect(el.value).to.equal(0.54);
888
- });
889
- it("manages currency", async () => {
890
- const el = await getElFrom(currency({ value: 234.21 }));
891
- expect(el.formattedValue).to.equal("EUR\xA0234.21");
892
- expect(el.valueAsString).to.equal("234.21");
893
- expect(el.value).to.equal(234.21);
894
- });
895
- it("manages units", async () => {
896
- const el = await getElFrom(units({ value: 17 }));
897
- expect(el.formattedValue).to.equal("17 inches");
898
- expect(el.valueAsString).to.equal("17");
899
- expect(el.value).to.equal(17);
900
- });
901
- it("does not select all on click based `focus`", async function() {
902
- this.retries(0);
903
- const modifier = isMac() ? "Meta" : "Control";
904
- const el = await getElFrom(units({ value: 17 }));
905
- expect(el.value).to.equal(17);
906
- const rect = el.focusElement.getBoundingClientRect();
907
- await sendMouse({
908
- steps: [
909
- {
910
- type: "click",
911
- position: [
912
- rect.left + rect.width / 8,
913
- rect.top + rect.height / 2
914
- ]
915
- }
916
- ]
917
- });
918
- await nextFrame();
919
- await nextFrame();
920
- await nextFrame();
921
- await nextFrame();
922
- await elementUpdated(el);
923
- expect(el.focused).to.be.true;
924
- await sendKeys({
925
- press: `${modifier}+KeyC`
926
- });
927
- await nextFrame();
928
- await nextFrame();
929
- await elementUpdated(el);
930
- await sendKeys({
931
- press: "ArrowRight"
932
- });
933
- await nextFrame();
934
- await nextFrame();
935
- await elementUpdated(el);
936
- await sendKeys({
937
- press: `${modifier}+KeyV`
938
- });
939
- await nextFrame();
940
- await nextFrame();
941
- await elementUpdated(el);
942
- expect(el.value, "copy/paste changed the value").to.equal(17);
943
- });
944
- it("selects all on `Tab` based `focus`", async function() {
945
- this.retries(0);
946
- const modifier = isMac() ? "Meta" : "Control";
947
- const el = await getElFrom(units({ value: 17 }));
948
- const input = document.createElement("input");
949
- el.insertAdjacentElement("beforebegin", input);
950
- input.focus();
951
- await sendKeys({
952
- press: "Tab"
953
- });
954
- await nextFrame();
955
- await nextFrame();
956
- await nextFrame();
957
- await nextFrame();
958
- await elementUpdated(el);
959
- expect(el.focused).to.be.true;
960
- await sendKeys({
961
- press: `${modifier}+KeyC`
962
- });
963
- await nextFrame();
964
- await nextFrame();
965
- await elementUpdated(el);
966
- await sendKeys({
967
- press: "ArrowRight"
968
- });
969
- await nextFrame();
970
- await nextFrame();
971
- await elementUpdated(el);
972
- await sendKeys({
973
- press: `${modifier}+KeyV`
974
- });
975
- await nextFrame();
976
- await nextFrame();
977
- await elementUpdated(el);
978
- expect(el.value, "copy/paste did not change the value").to.equal(
979
- 1717
980
- );
981
- });
982
- it("manages units not supported by the browser", async () => {
983
- const el = await getElFrom(pixels({ value: 17 }));
984
- expect(el.formattedValue).to.equal("17px");
985
- expect(el.valueAsString).to.equal("17");
986
- expect(el.value).to.equal(17);
987
- });
988
- });
989
- describe("max", () => {
990
- let el;
991
- let lastInputValue = 0;
992
- let lastChangeValue = 0;
993
- const inputSpy = spy();
994
- const changeSpy = spy();
995
- beforeEach(async () => {
996
- inputSpy.resetHistory();
997
- changeSpy.resetHistory();
998
- el = await getElFrom(
999
- Default({
1000
- max: 10,
1001
- value: 10,
1002
- onInput: (value) => {
1003
- inputSpy(value);
1004
- lastInputValue = value;
1005
- },
1006
- onChange: (value) => {
1007
- changeSpy(value);
1008
- lastChangeValue = value;
1009
- }
1010
- })
1011
- );
1012
- expect(el.formattedValue).to.equal("10");
1013
- expect(el.valueAsString).to.equal("10");
1014
- expect(el.value).to.equal(10);
1015
- });
1016
- it("constrains input", async () => {
1017
- el.focus();
1018
- await sendKeys({ type: "15" });
1019
- await sendKeys({ press: "Enter" });
1020
- await elementUpdated(el);
1021
- expect(lastInputValue, "last input value").to.equal(10);
1022
- expect(lastChangeValue, "last change value").to.equal(
1023
- 0,
1024
- 'value does not change from initial value so no "change" event is dispatched'
1025
- );
1026
- expect(el.formattedValue).to.equal("10");
1027
- expect(el.valueAsString).to.equal("10");
1028
- expect(el.value).to.equal(10);
1029
- });
1030
- it("constrains `value`", async () => {
1031
- el.value = 20;
1032
- await elementUpdated(el);
1033
- expect(el.formattedValue).to.equal("10");
1034
- expect(el.valueAsString).to.equal("10");
1035
- expect(el.value).to.equal(10);
1036
- });
1037
- it("constrains ArrowUp usage", async () => {
1038
- expect(el.value).to.equal(10);
1039
- el.focus();
1040
- await sendKeys({ press: "ArrowUp" });
1041
- expect(el.focusElement.value).to.equal("10");
1042
- await sendKeys({ press: "Shift+ArrowUp" });
1043
- expect(el.focusElement.value).to.equal("10");
1044
- });
1045
- it("constrains pointer usage", async () => {
1046
- expect(el.value).to.equal(10);
1047
- const buttonUp = el.shadowRoot.querySelector(
1048
- ".step-up"
1049
- );
1050
- const buttonUpRect = buttonUp.getBoundingClientRect();
1051
- const buttonUpPosition = [
1052
- buttonUpRect.x + buttonUpRect.width / 2,
1053
- buttonUpRect.y + buttonUpRect.height / 2
1054
- ];
1055
- await sendMouse({
1056
- steps: [
1057
- {
1058
- type: "click",
1059
- position: buttonUpPosition
1060
- }
1061
- ]
1062
- });
1063
- expect(el.value).to.equal(10);
1064
- });
1065
- it("validates on commit", async () => {
1066
- el.focus();
1067
- await sendKeys({ type: "15" });
1068
- await sendKeys({ press: "Enter" });
1069
- await elementUpdated(el);
1070
- expect(el.formattedValue).to.equal("10");
1071
- expect(el.valueAsString).to.equal("10");
1072
- expect(el.value).to.equal(10);
1073
- });
1074
- it("disabled `stepUp` button", async () => {
1075
- await clickBySelector(el, ".step-up");
1076
- expect(el.formattedValue).to.equal("10");
1077
- expect(el.valueAsString).to.equal("10");
1078
- expect(el.value).to.equal(10);
1079
- });
1080
- it("validates late", async () => {
1081
- el.max = 5;
1082
- await elementUpdated(el);
1083
- expect(el.formattedValue).to.equal("5");
1084
- expect(el.valueAsString).to.equal("5");
1085
- expect(el.value).to.equal(5);
1086
- });
1087
- it("dispatches onchange on setting max value", async () => {
1088
- el.value = 5;
1089
- await elementUpdated(el);
1090
- expect(changeSpy.callCount).to.equal(0);
1091
- expect(el.value).to.equal(5);
1092
- el.focus();
1093
- await sendKeys({
1094
- press: "Backspace"
1095
- });
1096
- await sendKeys({
1097
- press: "1"
1098
- });
1099
- await sendKeys({
1100
- press: "5"
1101
- });
1102
- await sendKeys({
1103
- press: "Enter"
1104
- });
1105
- await elementUpdated(el);
1106
- expect(el.value).to.equal(10);
1107
- expect(inputSpy.callCount).to.equal(3);
1108
- expect(changeSpy.callCount).to.equal(1);
1109
- expect(lastChangeValue, "last change value").to.equal(10);
1110
- });
1111
- });
1112
- describe("min", () => {
1113
- let el;
1114
- let lastInputValue = 0;
1115
- let lastChangeValue = 0;
1116
- const inputSpy = spy();
1117
- const changeSpy = spy();
1118
- beforeEach(async () => {
1119
- inputSpy.resetHistory();
1120
- changeSpy.resetHistory();
1121
- el = await getElFrom(
1122
- Default({
1123
- min: 10,
1124
- value: 10,
1125
- onInput: (value) => {
1126
- inputSpy(value);
1127
- lastInputValue = value;
1128
- },
1129
- onChange: (value) => {
1130
- changeSpy(value);
1131
- lastChangeValue = value;
1132
- }
1133
- })
1134
- );
1135
- expect(el.formattedValue).to.equal("10");
1136
- expect(el.valueAsString).to.equal("10");
1137
- expect(el.value).to.equal(10);
1138
- });
1139
- it("constrains input", async () => {
1140
- el.focus();
1141
- await sendKeys({ press: "Backspace" });
1142
- await sendKeys({ press: "Backspace" });
1143
- await sendKeys({ type: "5" });
1144
- await sendKeys({ press: "Enter" });
1145
- await elementUpdated(el);
1146
- expect(lastInputValue, "last input value").to.equal(10);
1147
- expect(lastChangeValue, "last change value").to.equal(
1148
- 0,
1149
- 'value does not change from initial value so no "change" event is dispatched'
1150
- );
1151
- expect(el.formattedValue).to.equal("10");
1152
- expect(el.valueAsString).to.equal("10");
1153
- expect(el.value).to.equal(10);
1154
- el.focus();
1155
- await sendKeys({ press: "Backspace" });
1156
- await sendKeys({ press: "Backspace" });
1157
- await sendKeys({ type: "-2000" });
1158
- await sendKeys({ press: "Enter" });
1159
- expect(el.formattedValue).to.equal("10");
1160
- expect(el.valueAsString).to.equal("10");
1161
- expect(el.value).to.equal(10);
1162
- });
1163
- it("dispatches onchange on setting min value", async () => {
1164
- el.value = 15;
1165
- await elementUpdated(el);
1166
- expect(changeSpy.callCount).to.equal(0);
1167
- expect(el.value).to.equal(15);
1168
- el.focus();
1169
- await sendKeys({
1170
- press: "Backspace"
1171
- });
1172
- await sendKeys({
1173
- press: "Backspace"
1174
- });
1175
- await sendKeys({
1176
- press: "5"
1177
- });
1178
- await sendKeys({
1179
- press: "Enter"
1180
- });
1181
- await elementUpdated(el);
1182
- expect(el.value).to.equal(10);
1183
- expect(inputSpy.callCount).to.equal(3);
1184
- expect(changeSpy.callCount).to.equal(1);
1185
- expect(lastChangeValue, "last change value").to.equal(10);
1186
- });
1187
- xit("manages `inputMode` in iPad", async () => {
1188
- await setUserAgent(
1189
- "Mozilla/5.0 (iPad; CPU OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile15E148 Safari/604.1"
1190
- );
1191
- el.min = 0;
1192
- await elementUpdated(el);
1193
- expect(el.focusElement.inputMode).to.equal("numeric");
1194
- el.min = -10;
1195
- await elementUpdated(el);
1196
- expect(el.focusElement.inputMode).to.equal("numeric");
1197
- el.min = void 0;
1198
- await elementUpdated(el);
1199
- expect(el.focusElement.inputMode).to.equal("numeric");
1200
- el.formatOptions = {
1201
- minimumFractionDigits: 1,
1202
- maximumFractionDigits: 2
1203
- };
1204
- el.min = 0;
1205
- await elementUpdated(el);
1206
- expect(el.focusElement.inputMode).to.equal("decimal");
1207
- });
1208
- xit("manages `inputMode` in iPhone", async () => {
1209
- await setUserAgent(
1210
- "Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"
1211
- );
1212
- el.min = 0;
1213
- await elementUpdated(el);
1214
- expect(el.focusElement.inputMode).to.equal("numeric");
1215
- el.min = -10;
1216
- await elementUpdated(el);
1217
- expect(el.focusElement.inputMode).to.equal("text");
1218
- el.min = void 0;
1219
- await elementUpdated(el);
1220
- expect(el.focusElement.inputMode).to.equal("text");
1221
- el.formatOptions = {
1222
- minimumFractionDigits: 1,
1223
- maximumFractionDigits: 2
1224
- };
1225
- el.min = 0;
1226
- await elementUpdated(el);
1227
- expect(el.focusElement.inputMode).to.equal("decimal");
1228
- });
1229
- xit("manages `inputMode` in Android", async () => {
1230
- await setUserAgent(
1231
- "Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.210 Mobile Safari/537.36"
1232
- );
1233
- el.min = 0;
1234
- await elementUpdated(el);
1235
- expect(el.focusElement.inputMode).to.equal("numeric");
1236
- el.min = -10;
1237
- await elementUpdated(el);
1238
- expect(el.focusElement.inputMode).to.equal("numeric");
1239
- el.min = void 0;
1240
- await elementUpdated(el);
1241
- expect(el.focusElement.inputMode).to.equal("numeric");
1242
- el.formatOptions = {
1243
- minimumFractionDigits: 1,
1244
- maximumFractionDigits: 2
1245
- };
1246
- el.min = 0;
1247
- await elementUpdated(el);
1248
- expect(el.focusElement.inputMode).to.equal("decimal");
1249
- el.formatOptions = {
1250
- minimumFractionDigits: 1,
1251
- maximumFractionDigits: 2
1252
- };
1253
- el.min = -10;
1254
- await elementUpdated(el);
1255
- expect(el.focusElement.inputMode).to.equal("numeric");
1256
- });
1257
- it("constrains `value`", async () => {
1258
- el.value = 0;
1259
- await elementUpdated(el);
1260
- expect(el.formattedValue).to.equal("10");
1261
- expect(el.valueAsString).to.equal("10");
1262
- expect(el.value).to.equal(10);
1263
- });
1264
- it("constrains ArrowDown usage", async () => {
1265
- el.min = 0;
1266
- el.value = 0;
1267
- expect(el.value).to.equal(0);
1268
- el.focus();
1269
- await sendKeys({ press: "ArrowDown" });
1270
- expect(el.formattedValue).to.equal("0");
1271
- expect(el.valueAsString).to.equal("0");
1272
- expect(el.value).to.equal(0);
1273
- await sendKeys({ press: "Shift+ArrowDown" });
1274
- await elementUpdated(el);
1275
- expect(el.formattedValue).to.equal("0");
1276
- expect(el.valueAsString).to.equal("0");
1277
- expect(el.value).to.equal(0);
1278
- });
1279
- it("constrains pointer usage", async () => {
1280
- el.min = 0;
1281
- el.value = 0;
1282
- await elementUpdated(el);
1283
- expect(el.value).to.equal(0);
1284
- const buttonDown = el.shadowRoot.querySelector(
1285
- ".step-down"
1286
- );
1287
- const buttonDownRect = buttonDown.getBoundingClientRect();
1288
- const buttonDownPosition = [
1289
- buttonDownRect.x + buttonDownRect.width / 2,
1290
- buttonDownRect.y + buttonDownRect.height / 2
1291
- ];
1292
- await sendMouse({
1293
- steps: [
1294
- {
1295
- type: "click",
1296
- position: buttonDownPosition
1297
- }
1298
- ]
1299
- });
1300
- await elementUpdated(el);
1301
- expect(el.value).to.equal(0);
1302
- });
1303
- it("validates on commit", async () => {
1304
- el.focus();
1305
- await sendKeys({ press: "0" });
1306
- await sendKeys({ press: "Enter" });
1307
- await elementUpdated(el);
1308
- expect(el.formattedValue).to.equal("100");
1309
- expect(el.valueAsString).to.equal("100");
1310
- expect(el.value).to.equal(100);
1311
- });
1312
- it("disabled `stepDown` button", async () => {
1313
- await clickBySelector(el, ".step-down");
1314
- expect(el.formattedValue).to.equal("10");
1315
- expect(el.valueAsString).to.equal("10");
1316
- expect(el.value).to.equal(10);
1317
- });
1318
- it("validates late", async () => {
1319
- el.min = 15;
1320
- await elementUpdated(el);
1321
- expect(el.formattedValue).to.equal("15");
1322
- expect(el.valueAsString).to.equal("15");
1323
- expect(el.value).to.equal(15);
1324
- });
1325
- });
1326
- describe("step", () => {
1327
- let el;
1328
- beforeEach(async () => {
1329
- el = await getElFrom(Default({ value: 10, step: 5 }));
1330
- expect(el.formattedValue).to.equal("10");
1331
- expect(el.valueAsString).to.equal("10");
1332
- expect(el.value).to.equal(10);
1333
- });
1334
- it("via arrow up", async () => {
1335
- el.focus();
1336
- await elementUpdated(el);
1337
- await sendKeys({ press: "ArrowUp" });
1338
- await elementUpdated(el);
1339
- expect(el.formattedValue).to.equal("15");
1340
- expect(el.valueAsString).to.equal("15");
1341
- expect(el.value).to.equal(15);
1342
- });
1343
- it("via arrow down", async () => {
1344
- el.focus();
1345
- await elementUpdated(el);
1346
- await sendKeys({ press: "ArrowDown" });
1347
- await elementUpdated(el);
1348
- expect(el.formattedValue).to.equal("5");
1349
- expect(el.valueAsString).to.equal("5");
1350
- expect(el.value).to.equal(5);
1351
- });
1352
- it("step up via pointer", async () => {
1353
- await clickBySelector(el, ".step-up");
1354
- expect(el.formattedValue).to.equal("15");
1355
- expect(el.valueAsString).to.equal("15");
1356
- expect(el.value).to.equal(15);
1357
- });
1358
- it("step down via pointer", async () => {
1359
- await clickBySelector(el, ".step-down");
1360
- expect(el.formattedValue).to.equal("5");
1361
- expect(el.valueAsString).to.equal("5");
1362
- expect(el.value).to.equal(5);
1363
- });
1364
- });
1365
- describe("step + constraints", () => {
1366
- let el;
1367
- beforeEach(async () => {
1368
- el = await getElFrom(Default({ step: 5 }));
1369
- expect(el.formattedValue).to.equal("");
1370
- expect(el.valueAsString).to.equal("NaN");
1371
- expect(el.value).to.be.NaN;
1372
- });
1373
- it("steps", async () => {
1374
- el.focus();
1375
- await elementUpdated(el);
1376
- await sendKeys({ press: "ArrowUp" });
1377
- await elementUpdated(el);
1378
- expect(el.formattedValue).to.equal("0");
1379
- expect(el.valueAsString).to.equal("0");
1380
- expect(el.value).to.equal(0);
1381
- await sendKeys({ press: "ArrowUp" });
1382
- await elementUpdated(el);
1383
- expect(el.formattedValue).to.equal("5");
1384
- expect(el.valueAsString).to.equal("5");
1385
- expect(el.value).to.equal(5);
1386
- await sendKeys({ press: "ArrowUp" });
1387
- await elementUpdated(el);
1388
- expect(el.formattedValue).to.equal("10");
1389
- expect(el.valueAsString).to.equal("10");
1390
- expect(el.value).to.equal(10);
1391
- });
1392
- it("steps from min", async () => {
1393
- el.min = 5;
1394
- await elementUpdated(el);
1395
- el.focus();
1396
- await elementUpdated(el);
1397
- await sendKeys({ press: "ArrowUp" });
1398
- await elementUpdated(el);
1399
- expect(el.formattedValue).to.equal("5");
1400
- expect(el.valueAsString).to.equal("5");
1401
- expect(el.value).to.equal(5);
1402
- await sendKeys({ press: "ArrowUp" });
1403
- await elementUpdated(el);
1404
- expect(el.formattedValue).to.equal("10");
1405
- expect(el.valueAsString).to.equal("10");
1406
- expect(el.value).to.equal(10);
1407
- await sendKeys({ press: "ArrowUp" });
1408
- await elementUpdated(el);
1409
- expect(el.formattedValue).to.equal("15");
1410
- expect(el.valueAsString).to.equal("15");
1411
- expect(el.value).to.equal(15);
1412
- });
1413
- it("steps from mismatched min", async () => {
1414
- el.min = 2;
1415
- await elementUpdated(el);
1416
- el.focus();
1417
- await elementUpdated(el);
1418
- await sendKeys({ press: "ArrowUp" });
1419
- await elementUpdated(el);
1420
- expect(el.formattedValue).to.equal("2");
1421
- expect(el.valueAsString).to.equal("2");
1422
- expect(el.value).to.equal(2);
1423
- await sendKeys({ press: "ArrowUp" });
1424
- await elementUpdated(el);
1425
- expect(el.formattedValue).to.equal("7");
1426
- expect(el.valueAsString).to.equal("7");
1427
- expect(el.value).to.equal(7);
1428
- await sendKeys({ press: "ArrowUp" });
1429
- await elementUpdated(el);
1430
- expect(el.formattedValue).to.equal("12");
1431
- expect(el.valueAsString).to.equal("12");
1432
- expect(el.value).to.equal(12);
1433
- });
1434
- it("steps to mismatched max", async () => {
1435
- el.min = 2;
1436
- el.max = 10;
1437
- await elementUpdated(el);
1438
- el.focus();
1439
- await elementUpdated(el);
1440
- await sendKeys({ press: "ArrowUp" });
1441
- await elementUpdated(el);
1442
- expect(el.formattedValue).to.equal("2");
1443
- expect(el.valueAsString).to.equal("2");
1444
- expect(el.value).to.equal(2);
1445
- await sendKeys({ press: "ArrowUp" });
1446
- await elementUpdated(el);
1447
- expect(el.formattedValue).to.equal("7");
1448
- expect(el.valueAsString).to.equal("7");
1449
- expect(el.value).to.equal(7);
1450
- await sendKeys({ press: "ArrowUp" });
1451
- await elementUpdated(el);
1452
- expect(el.formattedValue).to.equal("7");
1453
- expect(el.valueAsString).to.equal("7");
1454
- expect(el.value).to.equal(7);
1455
- });
1456
- it("validates max + step", async () => {
1457
- el.value = 2;
1458
- el.min = 2;
1459
- el.max = 10;
1460
- await elementUpdated(el);
1461
- expect(el.formattedValue).to.equal("2");
1462
- expect(el.valueAsString).to.equal("2");
1463
- expect(el.value).to.equal(2);
1464
- el.value = 11;
1465
- await elementUpdated(el);
1466
- expect(el.formattedValue).to.equal("7");
1467
- expect(el.valueAsString).to.equal("7");
1468
- expect(el.value).to.equal(7);
1469
- el.value = 27;
1470
- await elementUpdated(el);
1471
- expect(el.formattedValue).to.equal("7");
1472
- expect(el.valueAsString).to.equal("7");
1473
- expect(el.value).to.equal(7);
1474
- });
1475
- });
1476
- describe("indeterminate", () => {
1477
- let el;
1478
- beforeEach(async () => {
1479
- el = await getElFrom(indeterminate(indeterminate.args));
1480
- expect(el.formattedValue).to.equal("100");
1481
- expect(el.valueAsString).to.equal("100");
1482
- expect(el.value).to.equal(100);
1483
- expect(
1484
- el.displayValue
1485
- ).to.equal(indeterminatePlaceholder);
1486
- });
1487
- it('remove "-" on focus', async () => {
1488
- el.focus();
1489
- await elementUpdated(el);
1490
- expect(el.formattedValue).to.equal("100");
1491
- expect(el.valueAsString).to.equal("100");
1492
- expect(el.value).to.equal(100);
1493
- expect(
1494
- el.displayValue
1495
- ).to.equal("");
1496
- el.blur();
1497
- await elementUpdated(el);
1498
- expect(el.formattedValue).to.equal("100");
1499
- expect(el.valueAsString).to.equal("100");
1500
- expect(el.value).to.equal(100);
1501
- expect(
1502
- el.displayValue
1503
- ).to.equal(indeterminatePlaceholder);
1504
- });
1505
- it('return to "-" after suplied value is removed', async () => {
1506
- el.focus();
1507
- await elementUpdated(el);
1508
- expect(el.formattedValue).to.equal("100");
1509
- expect(el.valueAsString).to.equal("100");
1510
- expect(el.value).to.equal(100);
1511
- expect(
1512
- el.displayValue
1513
- ).to.equal("");
1514
- await sendKeys({ type: "50" });
1515
- await elementUpdated(el);
1516
- expect(el.formattedValue).to.equal("50");
1517
- expect(el.valueAsString).to.equal("50");
1518
- expect(el.value).to.equal(50);
1519
- expect(
1520
- el.displayValue
1521
- ).to.equal("50");
1522
- await sendKeys({ press: "Backspace" });
1523
- await sendKeys({ press: "Backspace" });
1524
- await elementUpdated(el);
1525
- expect(el.formattedValue).to.equal("100");
1526
- expect(el.valueAsString).to.equal("100");
1527
- expect(el.value).to.equal(100);
1528
- expect(
1529
- el.displayValue
1530
- ).to.equal("");
1531
- el.blur();
1532
- await elementUpdated(el);
1533
- expect(el.formattedValue).to.equal("100");
1534
- expect(el.valueAsString).to.equal("100");
1535
- expect(el.value).to.equal(100);
1536
- expect(
1537
- el.displayValue
1538
- ).to.equal(indeterminatePlaceholder);
1539
- });
1540
- it('starts from `value` on "ArrowUp" keypresses', async () => {
1541
- el.focus();
1542
- await elementUpdated(el);
1543
- await sendKeys({ press: "ArrowUp" });
1544
- await elementUpdated(el);
1545
- expect(el.formattedValue).to.equal("101");
1546
- expect(el.valueAsString).to.equal("101");
1547
- expect(el.value).to.equal(101);
1548
- expect(
1549
- el.displayValue
1550
- ).to.equal("101");
1551
- el.blur();
1552
- await elementUpdated(el);
1553
- expect(el.formattedValue).to.equal("101");
1554
- expect(el.valueAsString).to.equal("101");
1555
- expect(el.value).to.equal(101);
1556
- expect(
1557
- el.displayValue
1558
- ).to.equal("101");
1559
- });
1560
- it("starts from `value` on click `.step-up`", async () => {
1561
- el.focus();
1562
- await elementUpdated(el);
1563
- await clickBySelector(el, ".step-up");
1564
- await elementUpdated(el);
1565
- expect(el.formattedValue).to.equal("101");
1566
- expect(el.valueAsString).to.equal("101");
1567
- expect(el.value).to.equal(101);
1568
- expect(
1569
- el.displayValue
1570
- ).to.equal("101");
1571
- el.blur();
1572
- await elementUpdated(el);
1573
- expect(el.formattedValue).to.equal("101");
1574
- expect(el.valueAsString).to.equal("101");
1575
- expect(el.value).to.equal(101);
1576
- expect(
1577
- el.displayValue
1578
- ).to.equal("101");
1579
- });
1580
- it('starts from `value` on "ArrowDown" keypresses', async () => {
1581
- el.focus();
1582
- await elementUpdated(el);
1583
- await sendKeys({ press: "ArrowDown" });
1584
- await elementUpdated(el);
1585
- expect(el.formattedValue).to.equal("99");
1586
- expect(el.valueAsString).to.equal("99");
1587
- expect(el.value).to.equal(99);
1588
- expect(
1589
- el.displayValue
1590
- ).to.equal("99");
1591
- el.blur();
1592
- await elementUpdated(el);
1593
- expect(el.formattedValue).to.equal("99");
1594
- expect(el.valueAsString).to.equal("99");
1595
- expect(el.value).to.equal(99);
1596
- expect(
1597
- el.displayValue
1598
- ).to.equal("99");
1599
- });
1600
- it("starts from `value` on click `.step-down`", async () => {
1601
- el.focus();
1602
- await elementUpdated(el);
1603
- await clickBySelector(el, ".step-down");
1604
- await elementUpdated(el);
1605
- expect(el.formattedValue).to.equal("99");
1606
- expect(el.valueAsString).to.equal("99");
1607
- expect(el.value).to.equal(99);
1608
- expect(
1609
- el.displayValue
1610
- ).to.equal("99");
1611
- el.blur();
1612
- await elementUpdated(el);
1613
- expect(el.formattedValue).to.equal("99");
1614
- expect(el.valueAsString).to.equal("99");
1615
- expect(el.value).to.equal(99);
1616
- expect(
1617
- el.displayValue
1618
- ).to.equal("99");
1619
- });
1620
- });
1621
- it("removes the stepper UI with [hide-stepper]", async () => {
1622
- const el = await getElFrom(Default({ hideStepper: true }));
1623
- const stepUp = el.shadowRoot.querySelector(".step-up");
1624
- const stepDown = el.shadowRoot.querySelector(".step-down");
1625
- expect(stepUp).to.be.null;
1626
- expect(stepDown).to.be.null;
1627
- });
1628
- describe("Disabled", () => {
1629
- let el;
1630
- beforeEach(async () => {
1631
- el = await getElFrom(Default({ disabled: true, value: 1337 }));
1632
- expect(el.formattedValue).to.equal("1,337");
1633
- expect(el.valueAsString).to.equal("1337");
1634
- expect(el.value).to.equal(1337);
1635
- el.focus();
1636
- await elementUpdated(el);
1637
- });
1638
- afterEach(async () => {
1639
- await elementUpdated(el);
1640
- expect(el.formattedValue).to.equal("1,337");
1641
- expect(el.valueAsString).to.equal("1337");
1642
- expect(el.value).to.equal(1337);
1643
- });
1644
- it("presents as `disabled`", async () => {
1645
- await sendKeys({ type: "12345" });
1646
- await elementUpdated(el);
1647
- await sendKeys({ press: "Enter" });
1648
- });
1649
- it("prevents increment via keyboard", async () => {
1650
- await sendKeys({ press: "ArrowUp" });
1651
- });
1652
- it("prevents decrement via keyboard", async () => {
1653
- await sendKeys({ press: "ArrowDown" });
1654
- });
1655
- it("prevents increment via scroll", async () => {
1656
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: 1 }));
1657
- });
1658
- it("prevents decrement via scroll", async () => {
1659
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: -1 }));
1660
- });
1661
- it("prevents increment via stepper button", async () => {
1662
- await clickBySelector(el, ".step-up");
1663
- });
1664
- it("prevents decrement via stepper button", async () => {
1665
- await clickBySelector(el, ".step-down");
1666
- });
1667
- });
1668
- describe("Readonly", () => {
1669
- let el;
1670
- beforeEach(async () => {
1671
- el = await getElFrom(Default({ readonly: true, value: 1337 }));
1672
- expect(el.formattedValue).to.equal("1,337");
1673
- expect(el.valueAsString).to.equal("1337");
1674
- expect(el.value).to.equal(1337);
1675
- el.focus();
1676
- await elementUpdated(el);
1677
- });
1678
- afterEach(async () => {
1679
- await elementUpdated(el);
1680
- expect(el.formattedValue).to.equal("1,337");
1681
- expect(el.valueAsString).to.equal("1337");
1682
- expect(el.value).to.equal(1337);
1683
- });
1684
- it("presents as `readonly`", async () => {
1685
- await sendKeys({ type: "12345" });
1686
- await elementUpdated(el);
1687
- await sendKeys({ press: "Enter" });
1688
- });
1689
- it("prevents increment via keyboard", async () => {
1690
- await sendKeys({ press: "ArrowUp" });
1691
- });
1692
- it("prevents decrement via keyboard", async () => {
1693
- await sendKeys({ press: "ArrowDown" });
1694
- });
1695
- it("prevents increment via scroll", async () => {
1696
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: 1 }));
1697
- });
1698
- it("prevents decrement via scroll", async () => {
1699
- el.dispatchEvent(new WheelEvent("wheel", { deltaY: -1 }));
1700
- });
1701
- it("prevents increment via stepper button", async () => {
1702
- await clickBySelector(el, ".step-up");
1703
- });
1704
- it("prevents decrement via stepper button", async () => {
1705
- await clickBySelector(el, ".step-down");
1706
- });
1707
- });
1708
- describe("accessibility model", () => {
1709
- it("buttons have proper label", async () => {
1710
- await fixture(html`
1711
- <div>
1712
- ${Default({
1713
- onChange: () => {
1714
- return;
1715
- }
1716
- })}
1717
- </div>
1718
- `);
1719
- const snapshot = await a11ySnapshot(
1720
- {}
1721
- );
1722
- expect(
1723
- findAccessibilityNode(
1724
- snapshot,
1725
- (node) => node.name === "Increase Enter a number"
1726
- ),
1727
- "`name` is the label text"
1728
- ).to.not.be.null;
1729
- expect(
1730
- findAccessibilityNode(
1731
- snapshot,
1732
- (node) => node.name === "Decrease Enter a number"
1733
- ),
1734
- "`name` is the label text"
1735
- ).to.not.be.null;
1736
- });
1737
- });
1738
- });
1739
- //# sourceMappingURL=number-field.test.js.map