complete-common 1.0.0

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.
@@ -0,0 +1,910 @@
1
+ import { deepStrictEqual, strictEqual } from "node:assert";
2
+ import test, { describe } from "node:test";
3
+ import {
4
+ assertDefined,
5
+ assertNotNull,
6
+ eRange,
7
+ iRange,
8
+ parseFloatSafe,
9
+ parseIntSafe,
10
+ } from "./utils.js";
11
+
12
+ describe("assertsDefined", () => {
13
+ /** We use a value of null since it is the least arbitrary non-undefined value. */
14
+ const value = null as unknown; // eslint-disable-line unicorn/no-null
15
+
16
+ // @ts-expect-error Should fail since we are not in a union with undefined.
17
+ assertDefined(value as boolean, "");
18
+ // @ts-expect-error Should fail since we are not in a union with undefined.
19
+ assertDefined(value as number, "");
20
+ // @ts-expect-error Should fail since we are not in a union with undefined.
21
+ assertDefined(value as string, "");
22
+ // @ts-expect-error Should fail since we are not in a union with undefined.
23
+ assertDefined(value as Function, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
24
+
25
+ assertDefined(value as boolean | undefined, "");
26
+ assertDefined(value as number | undefined, "");
27
+ assertDefined(value as string | undefined, "");
28
+ assertDefined(value as Function | undefined, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
29
+
30
+ // @ts-expect-error Should fail because we are in a union with null instead of undefined.
31
+ assertDefined(value as boolean | null, "");
32
+ // @ts-expect-error Should fail because we are in a union with null instead of undefined.
33
+ assertDefined(value as number | null, "");
34
+ // @ts-expect-error Should fail because we are in a union with null instead of undefined.
35
+ assertDefined(value as string | null, "");
36
+ // @ts-expect-error Should fail because we are in a union with null instead of undefined.
37
+ assertDefined(value as Function | null, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
38
+
39
+ assertDefined(value as boolean | undefined | null, "");
40
+ assertDefined(value as number | undefined | null, "");
41
+ assertDefined(value as string | undefined | null, "");
42
+ assertDefined(value as Function | undefined | null, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
43
+
44
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
45
+ function _genericFunction<T>(_arg: T) {
46
+ const t = undefined as T | undefined;
47
+ assertDefined(t, "");
48
+ }
49
+ });
50
+
51
+ describe("assertsNull", () => {
52
+ const value = undefined as unknown;
53
+
54
+ // @ts-expect-error Should fail since we are not in a union with null.
55
+ assertNotNull(value as boolean, "");
56
+ // @ts-expect-error Should fail since we are not in a union with null.
57
+ assertNotNull(value as number, "");
58
+ // @ts-expect-error Should fail since we are not in a union with null.
59
+ assertNotNull(value as string, "");
60
+ // @ts-expect-error Should fail since we are not in a union with null.
61
+ assertNotNull(value as Function, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
62
+
63
+ assertNotNull(value as boolean | null, "");
64
+ assertNotNull(value as number | null, "");
65
+ assertNotNull(value as string | null, "");
66
+ assertNotNull(value as Function | null, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
67
+
68
+ // @ts-expect-error Should fail because we are in a union with undefined instead of null.
69
+ assertNotNull(value as boolean | undefined, "");
70
+ // @ts-expect-error Should fail because we are in a union with undefined instead of null.
71
+ assertNotNull(value as number | undefined, "");
72
+ // @ts-expect-error Should fail because we are in a union with undefined instead of null.
73
+ assertNotNull(value as string | undefined, "");
74
+ // @ts-expect-error Should fail because we are in a union with undefined instead of null.
75
+ assertNotNull(value as Function | undefined, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
76
+
77
+ assertNotNull(value as boolean | null | undefined, "");
78
+ assertNotNull(value as number | null | undefined, "");
79
+ assertNotNull(value as string | null | undefined, "");
80
+ assertNotNull(value as Function | null | undefined, ""); // eslint-disable-line @typescript-eslint/no-unsafe-function-type
81
+
82
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
83
+ function _genericFunction<T>(_arg: T) {
84
+ const t = null as T | null; // eslint-disable-line unicorn/no-null
85
+ assertNotNull(t, "");
86
+ }
87
+ });
88
+
89
+ describe("eRange", () => {
90
+ describe("1 arg 0", () => {
91
+ test("0", () => {
92
+ const result = [...eRange(0)];
93
+ deepStrictEqual(result, []);
94
+ });
95
+ });
96
+
97
+ describe("1 arg positive", () => {
98
+ test("1", () => {
99
+ const result = [...eRange(1)];
100
+ deepStrictEqual(result, [0]);
101
+ });
102
+
103
+ test("2", () => {
104
+ const result = [...eRange(2)];
105
+ deepStrictEqual(result, [0, 1]);
106
+ });
107
+
108
+ test("3", () => {
109
+ const result = [...eRange(3)];
110
+ deepStrictEqual(result, [0, 1, 2]);
111
+ });
112
+ });
113
+
114
+ describe("1 arg negative", () => {
115
+ test("-1", () => {
116
+ const result = [...eRange(-1)];
117
+ deepStrictEqual(result, []);
118
+ });
119
+ });
120
+
121
+ describe("2 args same", () => {
122
+ test("0, 0", () => {
123
+ const result = [...eRange(0, 0)];
124
+ deepStrictEqual(result, []);
125
+ });
126
+
127
+ test("1, 1", () => {
128
+ const result = [...eRange(1, 1)];
129
+ deepStrictEqual(result, []);
130
+ });
131
+
132
+ test("2, 2", () => {
133
+ const result = [...eRange(2, 2)];
134
+ deepStrictEqual(result, []);
135
+ });
136
+
137
+ test("3, 3", () => {
138
+ const result = [...eRange(3, 3)];
139
+ deepStrictEqual(result, []);
140
+ });
141
+
142
+ test("-1, -1", () => {
143
+ const result = [...eRange(-1, -1)];
144
+ deepStrictEqual(result, []);
145
+ });
146
+
147
+ test("-2, -2", () => {
148
+ const result = [...eRange(-2, -2)];
149
+ deepStrictEqual(result, []);
150
+ });
151
+
152
+ test("-3, -3", () => {
153
+ const result = [...eRange(-3, -3)];
154
+ deepStrictEqual(result, []);
155
+ });
156
+ });
157
+
158
+ describe("2 args increasing", () => {
159
+ test("0, 1", () => {
160
+ const result = [...eRange(0, 1)];
161
+ deepStrictEqual(result, [0]);
162
+ });
163
+
164
+ test("0, 2", () => {
165
+ const result = [...eRange(0, 2)];
166
+ deepStrictEqual(result, [0, 1]);
167
+ });
168
+
169
+ test("0, 3", () => {
170
+ const result = [...eRange(0, 3)];
171
+ deepStrictEqual(result, [0, 1, 2]);
172
+ });
173
+
174
+ test("1, 2", () => {
175
+ const result = [...eRange(1, 2)];
176
+ deepStrictEqual(result, [1]);
177
+ });
178
+
179
+ test("1, 3", () => {
180
+ const result = [...eRange(1, 3)];
181
+ deepStrictEqual(result, [1, 2]);
182
+ });
183
+
184
+ test("1, 4", () => {
185
+ const result = [...eRange(1, 4)];
186
+ deepStrictEqual(result, [1, 2, 3]);
187
+ });
188
+
189
+ test("2, 3", () => {
190
+ const result = [...eRange(2, 3)];
191
+ deepStrictEqual(result, [2]);
192
+ });
193
+
194
+ test("2, 4", () => {
195
+ const result = [...eRange(2, 4)];
196
+ deepStrictEqual(result, [2, 3]);
197
+ });
198
+
199
+ test("2, 5", () => {
200
+ const result = [...eRange(2, 5)];
201
+ deepStrictEqual(result, [2, 3, 4]);
202
+ });
203
+
204
+ test("-3, -1", () => {
205
+ const result = [...eRange(-3, -1)];
206
+ deepStrictEqual(result, [-3, -2]);
207
+ });
208
+
209
+ test("-3, 3", () => {
210
+ const result = [...eRange(-3, 3)];
211
+ deepStrictEqual(result, [-3, -2, -1, 0, 1, 2]);
212
+ });
213
+ });
214
+
215
+ describe("2 args decreasing", () => {
216
+ test("1, 0", () => {
217
+ const result = [...eRange(1, 0)];
218
+ deepStrictEqual(result, []);
219
+ });
220
+
221
+ test("-1, -2", () => {
222
+ const result = [...eRange(-1, -3)];
223
+ deepStrictEqual(result, []);
224
+ });
225
+ });
226
+ });
227
+
228
+ describe("iRange", () => {
229
+ describe("1 arg 0", () => {
230
+ test("0", () => {
231
+ const result = [...iRange(0)];
232
+ deepStrictEqual(result, [0]);
233
+ });
234
+ });
235
+
236
+ describe("1 arg positive", () => {
237
+ test("1", () => {
238
+ const result = [...iRange(1)];
239
+ deepStrictEqual(result, [0, 1]);
240
+ });
241
+
242
+ test("2", () => {
243
+ const result = [...iRange(2)];
244
+ deepStrictEqual(result, [0, 1, 2]);
245
+ });
246
+
247
+ test("3", () => {
248
+ const result = [...iRange(3)];
249
+ deepStrictEqual(result, [0, 1, 2, 3]);
250
+ });
251
+ });
252
+
253
+ describe("1 arg negative", () => {
254
+ test("-1", () => {
255
+ const result = [...iRange(-1)];
256
+ deepStrictEqual(result, []);
257
+ });
258
+ });
259
+
260
+ describe("2 args same", () => {
261
+ test("0, 0", () => {
262
+ const result = [...iRange(0, 0)];
263
+ deepStrictEqual(result, [0]);
264
+ });
265
+
266
+ test("1, 1", () => {
267
+ const result = [...iRange(1, 1)];
268
+ deepStrictEqual(result, [1]);
269
+ });
270
+
271
+ test("2, 2", () => {
272
+ const result = [...iRange(2, 2)];
273
+ deepStrictEqual(result, [2]);
274
+ });
275
+
276
+ test("3, 3", () => {
277
+ const result = [...iRange(3, 3)];
278
+ deepStrictEqual(result, [3]);
279
+ });
280
+
281
+ test("-1, -1", () => {
282
+ const result = [...iRange(-1, -1)];
283
+ deepStrictEqual(result, [-1]);
284
+ });
285
+
286
+ test("-2, -2", () => {
287
+ const result = [...iRange(-2, -2)];
288
+ deepStrictEqual(result, [-2]);
289
+ });
290
+
291
+ test("-3, -3", () => {
292
+ const result = [...iRange(-3, -3)];
293
+ deepStrictEqual(result, [-3]);
294
+ });
295
+ });
296
+
297
+ describe("2 args increasing", () => {
298
+ test("0, 1", () => {
299
+ const result = [...iRange(0, 1)];
300
+ deepStrictEqual(result, [0, 1]);
301
+ });
302
+
303
+ test("0, 2", () => {
304
+ const result = [...iRange(0, 2)];
305
+ deepStrictEqual(result, [0, 1, 2]);
306
+ });
307
+
308
+ test("0, 3", () => {
309
+ const result = [...iRange(0, 3)];
310
+ deepStrictEqual(result, [0, 1, 2, 3]);
311
+ });
312
+
313
+ test("1, 2", () => {
314
+ const result = [...iRange(1, 2)];
315
+ deepStrictEqual(result, [1, 2]);
316
+ });
317
+
318
+ test("1, 3", () => {
319
+ const result = [...iRange(1, 3)];
320
+ deepStrictEqual(result, [1, 2, 3]);
321
+ });
322
+
323
+ test("1, 4", () => {
324
+ const result = [...iRange(1, 4)];
325
+ deepStrictEqual(result, [1, 2, 3, 4]);
326
+ });
327
+
328
+ test("2, 3", () => {
329
+ const result = [...iRange(2, 3)];
330
+ deepStrictEqual(result, [2, 3]);
331
+ });
332
+
333
+ test("2, 4", () => {
334
+ const result = [...iRange(2, 4)];
335
+ deepStrictEqual(result, [2, 3, 4]);
336
+ });
337
+
338
+ test("2, 5", () => {
339
+ const result = [...iRange(2, 5)];
340
+ deepStrictEqual(result, [2, 3, 4, 5]);
341
+ });
342
+
343
+ test("-3, -1", () => {
344
+ const result = [...iRange(-3, -1)];
345
+ deepStrictEqual(result, [-3, -2, -1]);
346
+ });
347
+
348
+ test("-3, 3", () => {
349
+ const result = [...iRange(-3, 3)];
350
+ deepStrictEqual(result, [-3, -2, -1, 0, 1, 2, 3]);
351
+ });
352
+ });
353
+
354
+ describe("2 args decreasing", () => {
355
+ test("1, 0", () => {
356
+ const result = [...iRange(1, 0)];
357
+ deepStrictEqual(result, []);
358
+ });
359
+
360
+ test("-1, -2", () => {
361
+ const result = [...iRange(-1, -3)];
362
+ deepStrictEqual(result, []);
363
+ });
364
+ });
365
+ });
366
+
367
+ describe("parseFloatSafe", () => {
368
+ describe("non valid types", () => {
369
+ test("undefined", () => {
370
+ const result = parseFloatSafe(undefined as unknown as string);
371
+ strictEqual(result, undefined);
372
+ });
373
+
374
+ test("null", () => {
375
+ // eslint-disable-next-line unicorn/no-null
376
+ const result = parseFloatSafe(null as unknown as string);
377
+ strictEqual(result, undefined);
378
+ });
379
+
380
+ test("bigint", () => {
381
+ const result = parseFloatSafe(BigInt(1) as unknown as string);
382
+ strictEqual(result, undefined);
383
+ });
384
+
385
+ test("false", () => {
386
+ const result = parseFloatSafe(false as unknown as string);
387
+ strictEqual(result, undefined);
388
+ });
389
+
390
+ test("true", () => {
391
+ const result = parseFloatSafe(true as unknown as string);
392
+ strictEqual(result, undefined);
393
+ });
394
+
395
+ test("function", () => {
396
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
397
+ const result = parseFloatSafe((() => {}) as unknown as string);
398
+ strictEqual(result, undefined);
399
+ });
400
+
401
+ test("number", () => {
402
+ const result = parseFloatSafe(1 as unknown as string);
403
+ strictEqual(result, undefined);
404
+ });
405
+
406
+ test("object", () => {
407
+ const result = parseFloatSafe({} as string);
408
+ strictEqual(result, undefined);
409
+ });
410
+
411
+ test("symbol", () => {
412
+ const result = parseFloatSafe(Symbol("1") as unknown as string);
413
+ strictEqual(result, undefined);
414
+ });
415
+ });
416
+
417
+ describe("spaces", () => {
418
+ test("space", () => {
419
+ const result = parseFloatSafe(" ");
420
+ strictEqual(result, undefined);
421
+ });
422
+
423
+ test("space + 1", () => {
424
+ const result = parseFloatSafe(" 1");
425
+ strictEqual(result, 1);
426
+ });
427
+
428
+ test("1 + space", () => {
429
+ const result = parseFloatSafe("1 ");
430
+ strictEqual(result, 1);
431
+ });
432
+
433
+ test("space + 1 + space", () => {
434
+ const result = parseFloatSafe(" 1 ");
435
+ strictEqual(result, 1);
436
+ });
437
+
438
+ test("space + -1", () => {
439
+ const result = parseFloatSafe(" -1");
440
+ strictEqual(result, -1);
441
+ });
442
+
443
+ test("-1 + space", () => {
444
+ const result = parseFloatSafe("-1 ");
445
+ strictEqual(result, -1);
446
+ });
447
+
448
+ test("space + -1 + space", () => {
449
+ const result = parseFloatSafe(" -1 ");
450
+ strictEqual(result, -1);
451
+ });
452
+
453
+ test("space + 1.0", () => {
454
+ const result = parseFloatSafe(" 1.0");
455
+ strictEqual(result, 1);
456
+ });
457
+
458
+ test("1.0 + space", () => {
459
+ const result = parseFloatSafe("1.0 ");
460
+ strictEqual(result, 1);
461
+ });
462
+
463
+ test("space + 1.0 + space", () => {
464
+ const result = parseFloatSafe(" 1.0 ");
465
+ strictEqual(result, 1);
466
+ });
467
+
468
+ test("space + -1.0", () => {
469
+ const result = parseFloatSafe(" -1.0");
470
+ strictEqual(result, -1);
471
+ });
472
+
473
+ test("-1.0 + space", () => {
474
+ const result = parseFloatSafe("-1.0 ");
475
+ strictEqual(result, -1);
476
+ });
477
+
478
+ test("space + -1.0 + space", () => {
479
+ const result = parseFloatSafe(" -1.0 ");
480
+ strictEqual(result, -1);
481
+ });
482
+ });
483
+
484
+ describe("tabs", () => {
485
+ test("tab", () => {
486
+ const result = parseFloatSafe(" ");
487
+ strictEqual(result, undefined);
488
+ });
489
+
490
+ test("tab + 1", () => {
491
+ const result = parseFloatSafe(" 1");
492
+ strictEqual(result, 1);
493
+ });
494
+
495
+ test("1 + tab", () => {
496
+ const result = parseFloatSafe("1 ");
497
+ strictEqual(result, 1);
498
+ });
499
+
500
+ test("tab + 1 + tab", () => {
501
+ const result = parseFloatSafe(" 1 ");
502
+ strictEqual(result, 1);
503
+ });
504
+
505
+ test("tab + -1", () => {
506
+ const result = parseFloatSafe(" -1");
507
+ strictEqual(result, -1);
508
+ });
509
+
510
+ test("-1 + tab", () => {
511
+ const result = parseFloatSafe("-1 ");
512
+ strictEqual(result, -1);
513
+ });
514
+
515
+ test("tab + -1 + tab", () => {
516
+ const result = parseFloatSafe(" -1 ");
517
+ strictEqual(result, -1);
518
+ });
519
+
520
+ test("tab + 1.0", () => {
521
+ const result = parseFloatSafe(" 1.0");
522
+ strictEqual(result, 1);
523
+ });
524
+
525
+ test("1.0 + tab", () => {
526
+ const result = parseFloatSafe("1.0 ");
527
+ strictEqual(result, 1);
528
+ });
529
+
530
+ test("tab + 1.0 + tab", () => {
531
+ const result = parseFloatSafe(" 1.0 ");
532
+ strictEqual(result, 1);
533
+ });
534
+
535
+ test("tab + -1.0", () => {
536
+ const result = parseFloatSafe(" -1.0");
537
+ strictEqual(result, -1);
538
+ });
539
+
540
+ test("-1.0 + tab", () => {
541
+ const result = parseFloatSafe("-1.0 ");
542
+ strictEqual(result, -1);
543
+ });
544
+
545
+ test("tab + -1.0 + tab", () => {
546
+ const result = parseFloatSafe(" -1.0 ");
547
+ strictEqual(result, -1);
548
+ });
549
+ });
550
+
551
+ describe("invalid input", () => {
552
+ test("empty string", () => {
553
+ const result = parseFloatSafe("");
554
+ strictEqual(result, undefined);
555
+ });
556
+
557
+ test(".", () => {
558
+ const result = parseFloatSafe(".");
559
+ strictEqual(result, undefined);
560
+ });
561
+
562
+ test("1.", () => {
563
+ const result = parseFloatSafe("1.");
564
+ strictEqual(result, undefined);
565
+ });
566
+
567
+ test("-", () => {
568
+ const result = parseFloatSafe("-");
569
+ strictEqual(result, undefined);
570
+ });
571
+
572
+ test("1-", () => {
573
+ const result = parseFloatSafe("1-");
574
+ strictEqual(result, undefined);
575
+ });
576
+
577
+ test("- 1", () => {
578
+ const result = parseFloatSafe("- 1");
579
+ strictEqual(result, undefined);
580
+ });
581
+
582
+ test("--", () => {
583
+ const result = parseFloatSafe("--");
584
+ strictEqual(result, undefined);
585
+ });
586
+
587
+ test("--1", () => {
588
+ const result = parseFloatSafe("--1");
589
+ strictEqual(result, undefined);
590
+ });
591
+
592
+ test("1--", () => {
593
+ const result = parseFloatSafe("--1");
594
+ strictEqual(result, undefined);
595
+ });
596
+
597
+ test("-- 1", () => {
598
+ const result = parseFloatSafe("-- 1");
599
+ strictEqual(result, undefined);
600
+ });
601
+ });
602
+
603
+ describe("normal integers", () => {
604
+ test("1", () => {
605
+ const result = parseFloatSafe("1");
606
+ strictEqual(result, 1);
607
+ });
608
+
609
+ test("-1", () => {
610
+ const result = parseFloatSafe("-1");
611
+ strictEqual(result, -1);
612
+ });
613
+
614
+ test("10", () => {
615
+ const result = parseFloatSafe("10");
616
+ strictEqual(result, 10);
617
+ });
618
+
619
+ test("-10", () => {
620
+ const result = parseFloatSafe("-10");
621
+ strictEqual(result, -10);
622
+ });
623
+
624
+ test("01", () => {
625
+ const result = parseFloatSafe("01");
626
+ strictEqual(result, 1);
627
+ });
628
+
629
+ test("-01", () => {
630
+ const result = parseFloatSafe("-01");
631
+ strictEqual(result, -1);
632
+ });
633
+ });
634
+
635
+ describe("normal floats", () => {
636
+ test(".1", () => {
637
+ const result = parseFloatSafe(".1");
638
+ strictEqual(result, 0.1);
639
+ });
640
+
641
+ test("1.0", () => {
642
+ const result = parseFloatSafe("1.0");
643
+ strictEqual(result, 1);
644
+ });
645
+
646
+ test("1.1", () => {
647
+ const result = parseFloatSafe("1.1");
648
+ strictEqual(result, 1.1);
649
+ });
650
+
651
+ test("0.1", () => {
652
+ const result = parseFloatSafe("0.1");
653
+ strictEqual(result, 0.1);
654
+ });
655
+
656
+ test("10.0", () => {
657
+ const result = parseFloatSafe("10.0");
658
+ strictEqual(result, 10);
659
+ });
660
+
661
+ test("10.1", () => {
662
+ const result = parseFloatSafe("10.1");
663
+ strictEqual(result, 10.1);
664
+ });
665
+
666
+ test("-10.0", () => {
667
+ const result = parseFloatSafe("-10.0");
668
+ strictEqual(result, -10);
669
+ });
670
+
671
+ test("-10.1", () => {
672
+ const result = parseFloatSafe("-10.1");
673
+ strictEqual(result, -10.1);
674
+ });
675
+
676
+ test("01.0", () => {
677
+ const result = parseFloatSafe("01.0");
678
+ strictEqual(result, 1);
679
+ });
680
+
681
+ test("-01.0", () => {
682
+ const result = parseFloatSafe("-01.0");
683
+ strictEqual(result, -1);
684
+ });
685
+ });
686
+ });
687
+
688
+ describe("parseIntSafe", () => {
689
+ describe("non valid types", () => {
690
+ test("undefined", () => {
691
+ const result = parseIntSafe(undefined as unknown as string);
692
+ strictEqual(result, undefined);
693
+ });
694
+
695
+ test("null", () => {
696
+ // eslint-disable-next-line unicorn/no-null
697
+ const result = parseIntSafe(null as unknown as string);
698
+ strictEqual(result, undefined);
699
+ });
700
+
701
+ test("bigint", () => {
702
+ const result = parseIntSafe(BigInt(1) as unknown as string);
703
+ strictEqual(result, undefined);
704
+ });
705
+
706
+ test("false", () => {
707
+ const result = parseIntSafe(false as unknown as string);
708
+ strictEqual(result, undefined);
709
+ });
710
+
711
+ test("true", () => {
712
+ const result = parseIntSafe(true as unknown as string);
713
+ strictEqual(result, undefined);
714
+ });
715
+
716
+ test("function", () => {
717
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
718
+ const result = parseIntSafe((() => {}) as unknown as string);
719
+ strictEqual(result, undefined);
720
+ });
721
+
722
+ test("number", () => {
723
+ const result = parseIntSafe(1 as unknown as string);
724
+ strictEqual(result, undefined);
725
+ });
726
+
727
+ test("object", () => {
728
+ const result = parseIntSafe({} as string);
729
+ strictEqual(result, undefined);
730
+ });
731
+
732
+ test("symbol", () => {
733
+ const result = parseIntSafe(Symbol("1") as unknown as string);
734
+ strictEqual(result, undefined);
735
+ });
736
+ });
737
+
738
+ describe("spaces", () => {
739
+ test("space", () => {
740
+ const result = parseIntSafe(" ");
741
+ strictEqual(result, undefined);
742
+ });
743
+
744
+ test("space + 1", () => {
745
+ const result = parseIntSafe(" 1");
746
+ strictEqual(result, 1);
747
+ });
748
+
749
+ test("1 + space", () => {
750
+ const result = parseIntSafe("1 ");
751
+ strictEqual(result, 1);
752
+ });
753
+
754
+ test("space + 1 + space", () => {
755
+ const result = parseIntSafe(" 1 ");
756
+ strictEqual(result, 1);
757
+ });
758
+
759
+ test("space + -1", () => {
760
+ const result = parseIntSafe(" -1");
761
+ strictEqual(result, -1);
762
+ });
763
+
764
+ test("-1 + space", () => {
765
+ const result = parseIntSafe("-1 ");
766
+ strictEqual(result, -1);
767
+ });
768
+
769
+ test("space + -1 + space", () => {
770
+ const result = parseIntSafe(" -1 ");
771
+ strictEqual(result, -1);
772
+ });
773
+ });
774
+
775
+ describe("tabs", () => {
776
+ test("tab", () => {
777
+ const result = parseIntSafe(" ");
778
+ strictEqual(result, undefined);
779
+ });
780
+
781
+ test("tab + 1", () => {
782
+ const result = parseIntSafe(" 1");
783
+ strictEqual(result, 1);
784
+ });
785
+
786
+ test("1 + tab", () => {
787
+ const result = parseIntSafe("1 ");
788
+ strictEqual(result, 1);
789
+ });
790
+
791
+ test("tab + 1 + tab", () => {
792
+ const result = parseIntSafe(" 1 ");
793
+ strictEqual(result, 1);
794
+ });
795
+
796
+ test("tab + -1", () => {
797
+ const result = parseIntSafe(" -1");
798
+ strictEqual(result, -1);
799
+ });
800
+
801
+ test("-1 + tab", () => {
802
+ const result = parseIntSafe("-1 ");
803
+ strictEqual(result, -1);
804
+ });
805
+
806
+ test("tab + -1 + tab", () => {
807
+ const result = parseIntSafe(" -1 ");
808
+ strictEqual(result, -1);
809
+ });
810
+ });
811
+
812
+ describe("invalid input", () => {
813
+ test("empty string", () => {
814
+ const result = parseIntSafe("");
815
+ strictEqual(result, undefined);
816
+ });
817
+
818
+ test(".", () => {
819
+ const result = parseIntSafe(".");
820
+ strictEqual(result, undefined);
821
+ });
822
+
823
+ test(".1", () => {
824
+ const result = parseIntSafe(".1");
825
+ strictEqual(result, undefined);
826
+ });
827
+
828
+ test("1.", () => {
829
+ const result = parseIntSafe("1.");
830
+ strictEqual(result, undefined);
831
+ });
832
+
833
+ test("1.0", () => {
834
+ const result = parseIntSafe("1.0");
835
+ strictEqual(result, undefined);
836
+ });
837
+
838
+ test("0.1", () => {
839
+ const result = parseIntSafe("0.1");
840
+ strictEqual(result, undefined);
841
+ });
842
+
843
+ test("-", () => {
844
+ const result = parseIntSafe("-");
845
+ strictEqual(result, undefined);
846
+ });
847
+
848
+ test("1-", () => {
849
+ const result = parseIntSafe("1-");
850
+ strictEqual(result, undefined);
851
+ });
852
+
853
+ test("- 1", () => {
854
+ const result = parseIntSafe("- 1");
855
+ strictEqual(result, undefined);
856
+ });
857
+
858
+ test("--", () => {
859
+ const result = parseIntSafe("--");
860
+ strictEqual(result, undefined);
861
+ });
862
+
863
+ test("--1", () => {
864
+ const result = parseIntSafe("--1");
865
+ strictEqual(result, undefined);
866
+ });
867
+
868
+ test("1--", () => {
869
+ const result = parseIntSafe("--1");
870
+ strictEqual(result, undefined);
871
+ });
872
+
873
+ test("-- 1", () => {
874
+ const result = parseIntSafe("-- 1");
875
+ strictEqual(result, undefined);
876
+ });
877
+ });
878
+
879
+ describe("normal", () => {
880
+ test("1", () => {
881
+ const result = parseIntSafe("1");
882
+ strictEqual(result, 1);
883
+ });
884
+
885
+ test("-1", () => {
886
+ const result = parseIntSafe("-1");
887
+ strictEqual(result, -1);
888
+ });
889
+
890
+ test("10", () => {
891
+ const result = parseIntSafe("10");
892
+ strictEqual(result, 10);
893
+ });
894
+
895
+ test("-10", () => {
896
+ const result = parseIntSafe("-10");
897
+ strictEqual(result, -10);
898
+ });
899
+
900
+ test("01", () => {
901
+ const result = parseIntSafe("01");
902
+ strictEqual(result, 1);
903
+ });
904
+
905
+ test("-01", () => {
906
+ const result = parseIntSafe("-01");
907
+ strictEqual(result, -1);
908
+ });
909
+ });
910
+ });