whamm 0.1.0

A framework for 'Wasm Application Monitoring and Manipulation'
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
#![allow(clippy::type_complexity)]
use crate::common::error::WhammError;
use crate::parser::tests::setup_logger;
use crate::parser::types::{Expr, NumLit, Rule, Value, WhammParser};
use crate::parser::whamm_parser::{handle_float, handle_int};
use log::error;
use pest::iterators::Pair;
use pest::Parser;

#[test]
#[rustfmt::skip]
pub fn test_int32s() {
    setup_logger();
    let s = test_i32;
    let u = test_u32;

    u(0,        "0",        "0x0",          "0b0");
    u(0,        "0",        "0x000",        "0b0000");
    u(0,        "0",        "0X0",          "0B0");
    u(0,        "0",        "0X000",        "0B0000");
    u(1,        "1",        "0x1",          "0b1");
    s(-1,       "-1",       "0xffffffff",   "0b11111111111111111111111111111111");
    u(2,        "2",        "0x2",          "0b10");
    s(-2,       "-2",       "0xfffffffe",   "0b11111111111111111111111111111110");
    u(3,        "3",        "0x3",          "0b11");
    s(-3,       "-3",       "0xfffffffd",   "0b11111111111111111111111111111101");
    u(4,        "4",        "0x4",          "0b100");
    s(-4,       "-4",       "0xfffffffc",   "0b11111111111111111111111111111100");
    u(5,        "5",        "0x5",          "0b101");
    s(-5,       "-5",       "0xfffffffb",   "0b11111111111111111111111111111011");
    s(-6,       "-6",       "0xfffffffa",   "0b11111111111111111111111111111010");
    u(6,        "6",        "0x6",          "0b110");
    u(7,        "7",        "0x7",          "0b111");
    s(-7,       "-7",       "0xfffffff9",   "0b11111111111111111111111111111001");
    u(8,        "8",        "0x8",          "0b1000");
    s(-8,       "-8",       "0xfffffff8",   "0b11111111111111111111111111111000");
    u(9,        "9",        "0x9",          "0b1001");
    s(-9,       "-9",       "0xfffffff7",   "0b11111111111111111111111111110111");
    u(10,       "10",       "0xa",          "0b1010");
    s(-10,      "-10",      "0xfffffff6",   "0b11111111111111111111111111110110");
    u(11,       "11",       "0xb",          "0b1011");
    s(-11,      "-11",      "0xfffffff5",   "0b11111111111111111111111111110101");
    u(12,       "12",       "0xc",          "0b1100");
    s(-12,      "-12",      "0xfffffff4",   "0b11111111111111111111111111110100");
    u(13,       "13",       "0xd",          "0b1101");
    s(-13,      "-13",      "0xfffffff3",   "0b11111111111111111111111111110011");
    u(14,       "14",       "0xe",          "0b1110");
    s(-14,      "-14",      "0xfffffff2",   "0b11111111111111111111111111110010");
    u(15,       "15",       "0xf",          "0b1111");
    s(-15,      "-15",      "0xfffffff1",   "0b11111111111111111111111111110001");
    u(16,       "16",       "0x10",         "0b10000");
    s(-16,      "-16",      "0xfffffff0",   "0b11111111111111111111111111110000");
    u(17,       "17",       "0x11",         "0b10001");
    s(-17,      "-17",      "0xffffffef",   "0b11111111111111111111111111101111");
    u(18,       "18",       "0x12",         "0b10010");
    s(-18,      "-18",      "0xffffffee",   "0b11111111111111111111111111101110");
    u(23,       "23",       "0x17",         "0b10111");
    s(-23,      "-23",      "0xffffffe9",   "0b11111111111111111111111111101001");
    u(42,       "42",       "0x2a",         "0b101010");
    s(-42,      "-42",      "0xffffffd6",   "0b11111111111111111111111111010110");
    u(56,       "56",       "0x38",         "0b111000");
    s(-56,      "-56",      "0xffffffc8",   "0b11111111111111111111111111001000");
    u(1000000000,   "1000000000",    "0x3b9aca00",    "0b111011100110101100101000000000");
    u(1000000000,   "1000000000",    "0x3B9ACA00",    "0b111011100110101100101000000000");
    u(2000000000,   "2000000000",    "0x77359400",    "0b1110111001101011001010000000000");
    u(2000000000,   "2000000000",    "0x77359400",    "0b1110111001101011001010000000000");
    u(999999999,    "999999999",     "0x3b9ac9ff",    "0b111011100110101100100111111111");
    u(1000000001,   "1000000001",    "0x3b9aca01",    "0b111011100110101100101000000001");
    u(1999999999,   "1999999999",    "0x773593ff",    "0b1110111001101011001001111111111");
    u(2000000001,   "2000000001",    "0x77359401",    "0b1110111001101011001010000000001");
    u(999999998,    "999999998",     "0x3b9ac9fe",    "0b111011100110101100100111111110");
    u(1000000002,   "1000000002",    "0x3b9aca02",    "0b111011100110101100101000000010");
    u(1999999998,   "1999999998",    "0x773593fe",    "0b1110111001101011001001111111110");
    u(2000000002,   "2000000002",    "0x77359402",    "0b1110111001101011001010000000010");
    u(999999997,    "999999997",     "0x3b9ac9fd",    "0b111011100110101100100111111101");
    u(1000000003,   "1000000003",    "0x3b9aca03",    "0b111011100110101100101000000011");
    u(1999999997,   "1999999997",    "0x773593fd",    "0b1110111001101011001001111111101");
    u(2000000003,   "2000000003",    "0x77359403",    "0b1110111001101011001010000000011");
    u(999999996,    "999999996",     "0x3b9ac9fc",    "0b111011100110101100100111111100");
    u(1000000004,   "1000000004",    "0x3b9aca04",    "0b111011100110101100101000000100");
    u(1999999996,   "1999999996",    "0x773593fc",    "0b1110111001101011001001111111100");
    u(2000000004,   "2000000004",    "0x77359404",    "0b1110111001101011001010000000100");
    u(999999995,    "999999995",     "0x3b9ac9fb",    "0b111011100110101100100111111011");
    u(1000000005,   "1000000005",    "0x3b9aca05",    "0b111011100110101100101000000101");
    u(1999999995,   "1999999995",    "0x773593fb",    "0b1110111001101011001001111111011");
    u(2000000005,   "2000000005",    "0x77359405",    "0b1110111001101011001010000000101");
    u(999999994,    "999999994",     "0x3b9ac9fa",    "0b111011100110101100100111111010");
    u(1000000006,   "1000000006",    "0x3b9aca06",    "0b111011100110101100101000000110");
    u(1999999994,   "1999999994",    "0x773593fa",    "0b1110111001101011001001111111010");
    u(2000000006,   "2000000006",    "0x77359406",    "0b1110111001101011001010000000110");
    u(999999993,    "999999993",     "0x3b9ac9f9",    "0b111011100110101100100111111001");
    u(1000000007,   "1000000007",    "0x3b9aca07",    "0b111011100110101100101000000111");
    u(1999999993,   "1999999993",    "0x773593f9",    "0b1110111001101011001001111111001");
    u(2000000007,   "2000000007",    "0x77359407",    "0b1110111001101011001010000000111");
    u(999999992,    "999999992",     "0x3b9ac9f8",    "0b111011100110101100100111111000");
    u(1000000008,   "1000000008",    "0x3b9aca08",    "0b111011100110101100101000001000");
    u(1999999992,   "1999999992",    "0x773593f8",    "0b1110111001101011001001111111000");
    u(2000000008,   "2000000008",    "0x77359408",    "0b1110111001101011001010000001000");
    u(999999991,    "999999991",     "0x3b9ac9f7",    "0b111011100110101100100111110111");
    u(1000000009,   "1000000009",    "0x3b9aca09",    "0b111011100110101100101000001001");
    u(1999999991,   "1999999991",    "0x773593f7",    "0b1110111001101011001001111110111");
    u(2000000009,   "2000000009",    "0x77359409",    "0b1110111001101011001010000001001");
    u(999999990,    "999999990",     "0x3b9ac9f6",    "0b111011100110101100100111110110");
    u(1000000010,   "1000000010",    "0x3b9aca0a",    "0b111011100110101100101000001010");
    u(1999999990,   "1999999990",    "0x773593f6",    "0b1110111001101011001001111110110");
    u(2000000010,   "2000000010",    "0x7735940a",    "0b1110111001101011001010000001010");
    u(999999989,    "999999989",     "0x3b9ac9f5",    "0b111011100110101100100111110101");
    u(1000000011,   "1000000011",    "0x3b9aca0b",    "0b111011100110101100101000001011");
    u(1999999989,   "1999999989",    "0x773593f5",    "0b1110111001101011001001111110101");
    u(2000000011,   "2000000011",    "0x7735940b",    "0b1110111001101011001010000001011");
    u(999999988,    "999999988",     "0x3b9ac9f4",    "0b111011100110101100100111110100");
    u(1000000012,   "1000000012",    "0x3b9aca0c",    "0b111011100110101100101000001100");
    u(1999999988,   "1999999988",    "0x773593f4",    "0b1110111001101011001001111110100");
    u(2000000012,   "2000000012",    "0x7735940c",    "0b1110111001101011001010000001100");
    u(999999987,    "999999987",     "0x3b9ac9f3",    "0b111011100110101100100111110011");
    u(1000000013,   "1000000013",    "0x3b9aca0d",    "0b111011100110101100101000001101");
    u(1999999987,   "1999999987",    "0x773593f3",    "0b1110111001101011001001111110011");
    u(2000000013,   "2000000013",    "0x7735940d",    "0b1110111001101011001010000001101");
    u(999999986,    "999999986",     "0x3b9ac9f2",    "0b111011100110101100100111110010");
    u(1000000014,   "1000000014",    "0x3b9aca0e",    "0b111011100110101100101000001110");
    u(1999999986,   "1999999986",    "0x773593f2",    "0b1110111001101011001001111110010");
    u(2000000014,   "2000000014",    "0x7735940e",    "0b1110111001101011001010000001110");
    u(999999985,    "999999985",     "0x3b9ac9f1",    "0b111011100110101100100111110001");
    u(1000000015,   "1000000015",    "0x3b9aca0f",    "0b111011100110101100101000001111");
    u(1999999985,   "1999999985",    "0x773593f1",    "0b1110111001101011001001111110001");
    u(2000000015,   "2000000015",    "0x7735940f",    "0b1110111001101011001010000001111");
    u(999999984,    "999999984",     "0x3b9ac9f0",    "0b111011100110101100100111110000");
    u(1000000016,   "1000000016",    "0x3b9aca10",    "0b111011100110101100101000010000");
    u(1999999984,   "1999999984",    "0x773593f0",    "0b1110111001101011001001111110000");
    u(2000000016,   "2000000016",    "0x77359410",    "0b1110111001101011001010000010000");
    u(999999983,    "999999983",     "0x3b9ac9ef",    "0b111011100110101100100111101111");
    u(1000000017,   "1000000017",    "0x3b9aca11",    "0b111011100110101100101000010001");
    u(1999999983,   "1999999983",    "0x773593ef",    "0b1110111001101011001001111101111");
    u(2000000017,   "2000000017",    "0x77359411",    "0b1110111001101011001010000010001");
    u(999999982,    "999999982",     "0x3b9ac9ee",    "0b111011100110101100100111101110");
    u(1000000018,   "1000000018",    "0x3b9aca12",    "0b111011100110101100101000010010");
    u(1999999982,   "1999999982",    "0x773593ee",    "0b1110111001101011001001111101110");
    u(2000000018,   "2000000018",    "0x77359412",    "0b1110111001101011001010000010010");
    u(999999977,    "999999977",     "0x3b9ac9e9",    "0b111011100110101100100111101001");
    u(1000000023,   "1000000023",    "0x3b9aca17",    "0b111011100110101100101000010111");
    u(1999999977,   "1999999977",    "0x773593e9",    "0b1110111001101011001001111101001");
    u(2000000023,   "2000000023",    "0x77359417",    "0b1110111001101011001010000010111");
    u(999999958,    "999999958",     "0x3b9ac9d6",    "0b111011100110101100100111010110");
    u(1000000042,   "1000000042",    "0x3b9aca2a",    "0b111011100110101100101000101010");
    u(1999999958,   "1999999958",    "0x773593d6",    "0b1110111001101011001001111010110");
    u(2000000042,   "2000000042",    "0x7735942a",    "0b1110111001101011001010000101010");
    u(999999944,    "999999944",     "0x3b9ac9c8",    "0b111011100110101100100111001000");
    u(1000000056,   "1000000056",    "0x3b9aca38",    "0b111011100110101100101000111000");
    u(1999999944,   "1999999944",    "0x773593c8",    "0b1110111001101011001001111001000");
    u(2000000056,   "2000000056",    "0x77359438",    "0b1110111001101011001010000111000");
    u(77,           "77",            "0x4d",          "0b1001101");
    s(-77,          "-77",           "0xffffffb3",    "0b11111111111111111111111110110011");
    u(999999923,    "999999923",     "0x3b9ac9b3",    "0b111011100110101100100110110011");
    u(1000000077,   "1000000077",    "0x3b9aca4d",    "0b111011100110101100101001001101");
    u(1999999923,   "1999999923",    "0x773593b3",    "0b1110111001101011001001110110011");
    u(2000000077,   "2000000077",    "0x7735944d",    "0b1110111001101011001010001001101");
    u(101,          "101",           "0x65",          "0b1100101");
    s(-101,         "-101",          "0xffffff9b",    "0b11111111111111111111111110011011");
    u(999999899,    "999999899",     "0x3b9ac99b",    "0b111011100110101100100110011011");
    u(1000000101,   "1000000101",    "0x3b9aca65",    "0b111011100110101100101001100101");
    u(1999999899,   "1999999899",    "0x7735939b",    "0b1110111001101011001001110011011");
    u(2000000101,   "2000000101",    "0x77359465",    "0b1110111001101011001010001100101");
    u(125,          "125",           "0x7d",          "0b1111101");
    s(-125,         "-125",          "0xffffff83",    "0b11111111111111111111111110000011");
    u(999999875,    "999999875",     "0x3b9ac983",    "0b111011100110101100100110000011");
    u(1000000125,   "1000000125",    "0x3b9aca7d",    "0b111011100110101100101001111101");
    u(1999999875,   "1999999875",    "0x77359383",    "0b1110111001101011001001110000011");
    u(2000000125,   "2000000125",    "0x7735947d",    "0b1110111001101011001010001111101");
    u(1001,         "1001",          "0x3e9",         "0b1111101001");
    s(-1001,        "-1001",         "0xfffffc17",    "0b11111111111111111111110000010111");
    u(999998999,    "999998999",     "0x3b9ac617",    "0b111011100110101100011000010111");
    u(1000001001,   "1000001001",    "0x3b9acde9",    "0b111011100110101100110111101001");
    u(1999998999,   "1999998999",    "0x77359017",    "0b1110111001101011001000000010111");
    u(2000001001,   "2000001001",    "0x773597e9",    "0b1110111001101011001011111101001");
    u(1120,         "1120",          "0x460",         "0b10001100000");
    s(-1120,        "-1120",         "0xfffffba0",    "0b11111111111111111111101110100000");
    u(999998880,    "999998880",     "0x3b9ac5a0",    "0b111011100110101100010110100000");
    u(1000001120,   "1000001120",    "0x3b9ace60",    "0b111011100110101100111001100000");
    u(1999998880,   "1999998880",    "0x77358fa0",    "0b1110111001101011000111110100000");
    u(2000001120,   "2000001120",    "0x77359860",    "0b1110111001101011001100001100000");
    u(32767,        "32767",         "0x7fff",        "0b111111111111111");
    s(-32767,       "-32767",        "0xffff8001",    "0b11111111111111111000000000000001");
    u(999967233,    "999967233",     "0x3b9a4a01",    "0b111011100110100100101000000001");
    u(1000032767,   "1000032767",    "0x3b9b49ff",    "0b111011100110110100100111111111");
    u(1999967233,   "1999967233",    "0x77351401",    "0b1110111001101010001010000000001");
    u(2000032767,   "2000032767",    "0x773613ff",    "0b1110111001101100001001111111111");
    u(32768,        "32768",         "0x8000",        "0b1000000000000000");
    s(-32768,       "-32768",        "0xffff8000",    "0b11111111111111111000000000000000");
    u(999967232,    "999967232",     "0x3b9a4a00",    "0b111011100110100100101000000000");
    u(1000032768,   "1000032768",    "0x3b9b4a00",    "0b111011100110110100101000000000");
    u(1999967232,   "1999967232",    "0x77351400",    "0b1110111001101010001010000000000");
    u(2000032768,   "2000032768",    "0x77361400",    "0b1110111001101100001010000000000");
    u(32769,        "32769",         "0x8001",        "0b1000000000000001");
    s(-32769,       "-32769",        "0xffff7fff",    "0b11111111111111110111111111111111");
    u(999967231,    "999967231",     "0x3b9a49ff",    "0b111011100110100100100111111111");
    u(1000032769,   "1000032769",    "0x3b9b4a01",    "0b111011100110110100101000000001");
    u(1999967231,   "1999967231",    "0x773513ff",    "0b1110111001101010001001111111111");
    u(2000032769,   "2000032769",    "0x77361401",    "0b1110111001101100001010000000001");
    u(64000,        "64000",         "0xfa00",        "0b1111101000000000");
    s(-64000,       "-64000",        "0xffff0600",    "0b11111111111111110000011000000000");
    u(999936000,    "999936000",     "0x3b99d000",    "0b111011100110011101000000000000");
    u(1000064000,   "1000064000",    "0x3b9bc400",    "0b111011100110111100010000000000");
    u(1999936000,   "1999936000",    "0x77349a00",    "0b1110111001101001001101000000000");
    u(2000064000,   "2000064000",    "0x77368e00",    "0b1110111001101101000111000000000");
    u(65535,        "65535",         "0xffff",        "0b1111111111111111");
    s(-65535,       "-65535",        "0xffff0001",    "0b11111111111111110000000000000001");
    u(999934465,    "999934465",     "0x3b99ca01",    "0b111011100110011100101000000001");
    u(1000065535,   "1000065535",    "0x3b9bc9ff",    "0b111011100110111100100111111111");
    u(1999934465,   "1999934465",    "0x77349401",    "0b1110111001101001001010000000001");
    u(2000065535,   "2000065535",    "0x773693ff",    "0b1110111001101101001001111111111");
    u(65536,        "65536",         "0x10000",       "0b10000000000000000");
    s(-65536,       "-65536",        "0xffff0000",    "0b11111111111111110000000000000000");
    u(999934464,    "999934464",     "0x3b99ca00",    "0b111011100110011100101000000000");
    u(1000065536,   "1000065536",    "0x3b9bca00",    "0b111011100110111100101000000000");
    u(1999934464,   "1999934464",    "0x77349400",    "0b1110111001101001001010000000000");
    u(2000065536,   "2000065536",    "0x77369400",    "0b1110111001101101001010000000000");
    u(1000982,      "1000982",       "0xf4616",       "0b11110100011000010110");
    s(-1000982,     "-1000982",      "0xfff0b9ea",    "0b11111111111100001011100111101010");
    u(998999018,    "998999018",     "0x3b8b83ea",    "0b111011100010111000001111101010");
    u(1001000982,   "1001000982",    "0x3baa1016",    "0b111011101010100001000000010110");
    u(1998999018,   "1998999018",    "0x77264dea",    "0b1110111001001100100110111101010");
    u(2001000982,   "2001000982",    "0x7744da16",    "0b1110111010001001101101000010110");
    u(2147483647,   "2147483647",    "0x7fffffff",    "0b1111111111111111111111111111111");
    u(2147483646,   "2147483646",    "0x7ffffffe",    "0b1111111111111111111111111111110");
    s(-2147483648,  "-2147483648",   "0x80000000",    "0b10000000000000000000000000000000");
    s(-2147483648,  "-2147483648",   "0x80000000",    "0b10000000000000000000000000000000");
    u(2147483647,   "2147483647",    "0x7fffffff",    "0b1111111111111111111111111111111");
    s(-2147483647,  "-2147483647",   "0x80000001",    "0b10000000000000000000000000000001");
    u(2147483647,   "2_147_483_647",    "0x7fffffff",    "0b1111111111111111111111111111111");
    s(-2147483647,  "-2_147_483_647",   "0x80000001",    "0b10000000000000000000000000000001");

    u(2147483646,   "2147483646",    "0x7fFFfffE",    "0b1111111111111111111111111111110");
    u(999934465,    "999934465",     "0X3B99CA01",    "0B111011100110011100101000000001");
    u(1000065535,   "1000065535",    "0X3B9BC9FF",    "0B111011100110111100100111111111");
    u(999999997,    "999999997",     "0X3B9AC9FD",    "0B111011100110101100100111111101");
    s(-32768,       "-32768",        "0xFFFF8000",    "0b11111111111111111000000000000000");
    s(-32767,       "-32767",        "0xFFFF8001",    "0b11111111111111111000000000000001");
    s(-65536,       "-65536",        "0xFFFF0000",    "0b11111111111111110000000000000000");
    s(-65535,       "-65535",        "0xFFFF0001",    "0b11111111111111110000000000000001");
    u(32768,        "32768",         "0x8000",        "0b01000000000000000");
    u(32768,        "32768",         "0x8000",        "0b00001000000000000000");
    u(32768,        "32768",         "0x8000",        "0b00000000000000001000000000000000");

    u(3,        "3",        "0x3",        "0b0011");
    u(3,        "3",        "0x3",        "0b000011");
    u(3,        "3",        "0x3",        "0b0000011");
    u(3,        "3",        "0x3",        "0b0000000011");
}
#[test]
#[rustfmt::skip]
pub fn test_int64s() {
    setup_logger();
    let t = parse_int;

    // ==== HEX ====

    t(NumLit::i64(0), "0x000000000");
    t(NumLit::i64(0), "0x00000000000000");
    t(NumLit::i64(0), "0x000000000000000");
    t(NumLit::i64(0), "0x0000000000000000");
    t(NumLit::i64(1), "0x0000000000000001");
    t(NumLit::i64(2), "0x0000000000000002");
    t(NumLit::i64(3), "0x0000000000000003");
    t(NumLit::i64(4), "0x0000000000000004");
    t(NumLit::i64(5), "0x0000000000000005");
    t(NumLit::i64(6), "0x0000000000000006");
    t(NumLit::i64(7), "0x0000000000000007");
    t(NumLit::i64(8), "0x0000000000000008");
    t(NumLit::i64(9), "0x0000000000000009");
    t(NumLit::i64(10), "0x000000000000000a");
    t(NumLit::i64(11), "0x000000000000000b");
    t(NumLit::i64(12), "0x000000000000000c");
    t(NumLit::i64(13), "0x000000000000000d");
    t(NumLit::i64(14), "0x000000000000000e");
    t(NumLit::i64(15), "0x000000000000000f");
    t(NumLit::i64(1313626124122587136), "0x123aF00000000000");

    t(NumLit::i64(-1), "0xFFFFFFFFFFFFFFFF");
    t(NumLit::i64(-1), "0xffffffffffffffff");

    t(NumLit::i64(4294826559511677440), "0x3b9a4a003b9b4a00");
    t(NumLit::i64(8589793856511677440), "0x7735140077361400");
    t(NumLit::i64(140746078257151), "0x00008001ffff7fff");
    t(NumLit::i64(140746078257151), "0x0008001ffff7fff");
    t(NumLit::i64(140746078257151), "0x008001ffff7fff");
    t(NumLit::i64(140746078257151), "0x08001ffff7fff");
    t(NumLit::i64(140746078257151), "0x8001ffff7fff");
    t(NumLit::i64(4294826555216710145), "0x3b9a49ff3b9b4a01");
    t(NumLit::i64(8589793852216710145), "0x773513ff77361401");
    t(NumLit::i64(274882201847296), "0x0000fa00ffff0600");
    t(NumLit::i64(4294692419093120000), "0x3b99d0003b9bc400");
    t(NumLit::i64(8589659716093120000), "0x77349a0077368e00");
    t(NumLit::i64(281474976645121), "0x0000ffffffff0001");
    t(NumLit::i64(4294685826318322175), "0x3b99ca013b9bc9ff");
    t(NumLit::i64(8589653123318322175), "0x77349401773693ff");
    t(NumLit::i64(281479271612416), "0x00010000ffff0000");
    t(NumLit::i64(281479271612416), "0x0010000ffff0000");
    t(NumLit::i64(281479271612416), "0x010000ffff0000");
    t(NumLit::i64(281479271612416), "0x10000ffff0000");
    t(NumLit::i64(4294685822023354880), "0x3b99ca003b9bca00");
    t(NumLit::i64(8589653119023354880), "0x7734940077369400");
    t(NumLit::i64(4299189247850986), "0x000f4616fff0b9ea");
    t(NumLit::i64(4299189247850986), "0x00f4616fff0b9ea");
    t(NumLit::i64(4299189247850986), "0x0f4616fff0b9ea");
    t(NumLit::i64(4299189247850986), "0xf4616fff0b9ea");
    t(NumLit::i64(4290668112047116310), "0x3b8b83ea3baa1016");
    t(NumLit::i64(8585635409047116310), "0x77264dea7744da16");
    t(NumLit::i64(9223372034707292158), "0x7fffffff7ffffffe");
    t(NumLit::i64(-9223372034707292160), "0x8000000080000000");
    t(NumLit::i64(9223372034707292161), "0x7fffffff80000001");

    // ==== DEC ====

    t(NumLit::u64(6392438068), "6392438068");
    t(NumLit::u64(19177314205), "19177314205");
    t(NumLit::u64(57531942616), "57531942616");
    t(NumLit::u64(172595827849), "172595827849");
    t(NumLit::u64(517787483548), "517787483548");
    t(NumLit::u64(1553362450645), "1553362450645");
    t(NumLit::u64(4660087351936), "4660087351936");
    t(NumLit::u64(13980262055809), "13980262055809");
    t(NumLit::u64(41940786167428), "41940786167428");
    t(NumLit::u64(125822358502285), "125822358502285");
    t(NumLit::u64(377467075506856), "377467075506856");
    t(NumLit::u64(1132401226520569), "1132401226520569");
    t(NumLit::u64(3397203679561708), "3397203679561708");
    t(NumLit::u64(10191611038685125), "10191611038685125");
    t(NumLit::u64(30574833116055376), "30574833116055376");
    t(NumLit::u64(91724499348166129), "91724499348166129");
    t(NumLit::u64(275173498044498388), "275173498044498388");
    t(NumLit::u64(825520494133495165), "825520494133495165");
    t(NumLit::u64(825520494133495165), "825520494133495165");
    t(NumLit::u64(825520494133495165), "825520494133495165");
    t(NumLit::u64(3842309267894817852), "3842309267894817852");
    t(NumLit::u64(3842309267894817852), "3_842_309_267_894_817_852");

    t(NumLit::i64(-15690529805), "-15690529805");
    t(NumLit::i64(-47071589414), "-47071589414");
    t(NumLit::i64(-141214768241), "-141214768241");
    t(NumLit::i64(-423644304722), "-423644304722");
    t(NumLit::i64(-1270932914165), "-1270932914165");
    t(NumLit::i64(-3812798742494), "-3812798742494");
    t(NumLit::i64(-11438396227481), "-11438396227481");
    t(NumLit::i64(-34315188682442), "-34315188682442");
    t(NumLit::i64(-102945566047325), "-102945566047325");
    t(NumLit::i64(-308836698141974), "-308836698141974");
    t(NumLit::i64(-926510094425921), "-926510094425921");
    t(NumLit::i64(-2779530283277762), "-2779530283277762");
    t(NumLit::i64(-8338590849833285), "-8338590849833285");
    t(NumLit::i64(-25015772549499854), "-25015772549499854");
    t(NumLit::i64(-75047317648499561), "-75047317648499561");
    t(NumLit::i64(-225141952945498682), "-225141952945498682");
    t(NumLit::i64(-675425858836496045), "-675425858836496045");
    t(NumLit::i64(-2026277576509488134), "-2026277576509488134");
    t(NumLit::i64(-6078832729528464401), "-6078832729528464401");
    t(NumLit::i64(-6078832729528464401), "-6_078_832_729_528_464_401");

    t(NumLit::u64(9223372036854775807), "9223372036854775807");
    t(NumLit::i64(-9223372036854775808), "-9223372036854775808");

    // ==== BIN ====

    t(NumLit::i64(0x00000FA9), "0b0000000000000000000000000000111110101001");
    t(NumLit::i64(0x00002EFC), "0b00000000000000000000000000000010111011111100");
    t(NumLit::i64(0x00008CF5), "0b00000000000000000000000000000001000110011110101");
    t(NumLit::i64(0x0001A6E0), "0b00000000000000000000000000011010011011100000");
    t(NumLit::i64(0x0004F4A1), "0b0000000000000000000000000000001001111010010100001");
    t(NumLit::i64(0x000EDDE4), "0b000000000000000000000000000000011101101110111100100");
    t(NumLit::i64(0x002C99AD), "0b00000000000000000000000000000001011001001100110101101");
    t(NumLit::i64(0x0085CD08), "0b000000000000000000000000000000100001011100110100001000");
    t(NumLit::i64(0x01916719), "0b00000000000000000000000000001100100010110011100011001");
    t(NumLit::i64(0x04B4354C), "0b00000000000000000000100101101000011010101001100");
    t(NumLit::i64(0x0E1C9FE5), "0b000000000000000001110000111001001111111100101");

    t(NumLit::i64(0x00000005), "0b0000000000000000000000000000000000000000000000000000000000000101");
    t(NumLit::i64(0x00000010), "0b0000000000000000000000000000000000000000000000000000000000010000");
    t(NumLit::i64(0x00000031), "0b0000000000000000000000000000000000000000000000000000000000110001");
    t(NumLit::i64(0x00000094), "0b0000000000000000000000000000000000000000000000000000000010010100");
    t(NumLit::i64(0x000001BD), "0b0000000000000000000000000000000000000000000000000000000110111101");
    t(NumLit::i64(0x00000538), "0b0000000000000000000000000000000000000000000000000000010100111000");
    t(NumLit::i64(0x00000FA9), "0b0000000000000000000000000000000000000000000000000000111110101001");
    t(NumLit::i64(0x00002EFC), "0b0000000000000000000000000000000000000000000000000010111011111100");
    t(NumLit::i64(0x00008CF5), "0b0000000000000000000000000000000000000000000000001000110011110101");
    t(NumLit::i64(0x0001A6E0), "0b0000000000000000000000000000000000000000000000011010011011100000");
    t(NumLit::i64(0x0004F4A1), "0b0000000000000000000000000000000000000000000001001111010010100001");
    t(NumLit::i64(0x000EDDE4), "0b0000000000000000000000000000000000000000000011101101110111100100");
    t(NumLit::i64(0x002C99AD), "0b0000000000000000000000000000000000000000001011001001100110101101");
    t(NumLit::i64(0x0085CD08), "0b0000000000000000000000000000000000000000100001011100110100001000");
    t(NumLit::i64(0x01916719), "0b0000000000000000000000000000000000000001100100010110011100011001");
    t(NumLit::i64(0x04B4354C), "0b0000000000000000000000000000000000000100101101000011010101001100");
    t(NumLit::i64(0x0E1C9FE5), "0b0000000000000000000000000000000000001110000111001001111111100101");
    t(NumLit::i64(0x2A55DFB0), "0b0000000000000000000000000000000000101010010101011101111110110000");
    t(NumLit::i64(0x7F019F11), "0b0000000000000000000000000000000001111111000000011001111100010001");
    
    t(NumLit::i64(0x000000017D04DD34), "0b0000000000000000000000000000000101111101000001001101110100110100");
    t(NumLit::i64(0x00000004770E979D), "0b0000000000000000000000000000010001110111000011101001011110011101");
    t(NumLit::i64(0x0000000D652BC6D8), "0b0000000000000000000000000000110101100101001010111100011011011000");
    t(NumLit::i64(0x000000282F835489), "0b0000000000000000000000000010100000101111100000110101010010001001");
    t(NumLit::i64(0x000000788E89FD9C), "0b0000000000000000000000000111100010001110100010011111110110011100");
    t(NumLit::i64(0x00000169AB9DF8D5), "0b0000000000000000000000010110100110101011100111011111100011010101");
    t(NumLit::i64(0x0000043D02D9EA80), "0b0000000000000000000001000011110100000010110110011110101010000000");
    t(NumLit::i64(0x00000CB7088DBF81), "0b0000000000000000000011001011011100001000100011011011111110000001");
    t(NumLit::i64(0x0000262519A93E84), "0b0000000000000000001001100010010100011001101010010011111010000100");
    t(NumLit::i64(0x0000726F4CFBBB8D), "0b0000000000000000011100100110111101001100111110111011101110001101");
    t(NumLit::i64(0x0001574DE6F332A8), "0b0000000000000001010101110100110111100110111100110011001010101000");
    t(NumLit::i64(0x000405E9B4D997F9), "0b0000000000000100000001011110100110110100110110011001011111111001");
    t(NumLit::i64(0x000C11BD1E8CC7EC), "0b0000000000001100000100011011110100011110100011001100011111101100");
    t(NumLit::i64(0x002435375BA657C5), "0b0000000000100100001101010011011101011011101001100101011111000101");
    t(NumLit::i64(0x006C9FA612F30750), "0b0000000001101100100111111010011000010010111100110000011101010000");
    t(NumLit::i64(0x0145DEF238D915F1), "0b0000000101000101110111101111001000111000110110010001010111110001");
    t(NumLit::i64(0x03D19CD6AA8B41D4), "0b0000001111010001100111001101011010101010100010110100000111010100");
    t(NumLit::i64(0x0B74D683FFA1C57D), "0b0000101101110100110101101000001111111111101000011100010101111101");
    t(NumLit::i64(0x225E838BFEE55078), "0b0010001001011110100000111000101111111110111001010101000001111000");
    t(NumLit::i64(0x671B8AA3FCAFF169), "0b0110011100011011100010101010001111111100101011111111000101101001");
    t(NumLit::i64(0x35529FEBF60FD43C), "0b0011010101010010100111111110101111110110000011111101010000111100");
    t(NumLit::i64(0xFFFFFFFFFFFFFFFEu64 as i64), "0b1111111111111111111111111111111111111111111111111111111111111110");
    t(NumLit::i64(0xFFFFFFFFFFFFFFFBu64 as i64), "0b1111111111111111111111111111111111111111111111111111111111111011");
    t(NumLit::i64(0xFFFFFFFFFFFFFFF2u64 as i64), "0b1111111111111111111111111111111111111111111111111111111111110010");
    t(NumLit::i64(0xFFFFFFFFFFFFFFD7u64 as i64), "0b1111111111111111111111111111111111111111111111111111111111010111");
    t(NumLit::i64(0xFFFFFFFFFFFFFF86u64 as i64), "0b1111111111111111111111111111111111111111111111111111111110000110");
    t(NumLit::i64(0xFFFFFFFFFFFFFE93u64 as i64), "0b1111111111111111111111111111111111111111111111111111111010010011");
    t(NumLit::i64(0xFFFFFFFFFFFFFBBAu64 as i64), "0b1111111111111111111111111111111111111111111111111111101110111010");
    t(NumLit::i64(0xFFFFFFFFFFFFF32Fu64 as i64), "0b1111111111111111111111111111111111111111111111111111001100101111");
    t(NumLit::i64(0xFFFFFFFFFFFFD98Eu64 as i64), "0b1111111111111111111111111111111111111111111111111101100110001110");
    t(NumLit::i64(0xFFFFFFFFFFFF8CABu64 as i64), "0b1111111111111111111111111111111111111111111111111000110010101011");
    t(NumLit::i64(0xFFFFFFFFFFFEA602u64 as i64), "0b1111111111111111111111111111111111111111111111101010011000000010");
    t(NumLit::i64(0xFFFFFFFFFFFBF207u64 as i64), "0b1111111111111111111111111111111111111111111110111111001000000111");
    t(NumLit::i64(0xFFFFFFFFFFF3D616u64 as i64), "0b1111111111111111111111111111111111111111111100111101011000010110");
    t(NumLit::i64(0xFFFFFFFFFFDB8243u64 as i64), "0b1111111111111111111111111111111111111111110110111000001001000011");
    t(NumLit::i64(0xFFFFFFFFFF9286CAu64 as i64), "0b1111111111111111111111111111111111111111100100101000011011001010");
    t(NumLit::i64(0xFFFFFFFFFEB7945Fu64 as i64), "0b1111111111111111111111111111111111111110101101111001010001011111");
    t(NumLit::i64(0xFFFFFFFFFC26BD1Eu64 as i64), "0b1111111111111111111111111111111111111100001001101011110100011110");
    t(NumLit::i64(0xFFFFFFFFF474375Bu64 as i64), "0b1111111111111111111111111111111111110100011101000011011101011011");
    t(NumLit::i64(0xFFFFFFFFDD5CA612u64 as i64), "0b1111111111111111111111111111111111011101010111001010011000010010");
    t(NumLit::i64(0xFFFFFFFF9815F237u64 as i64), "0b1111111111111111111111111111111110011000000101011111001000110111");
    t(NumLit::i64(0xFFFFFFFEC841D6A6u64 as i64), "0b1111111111111111111111111111111011001000010000011101011010100110");
    t(NumLit::i64(0xFFFFFFFC58C583F3u64 as i64), "0b1111111111111111111111111111110001011000110001011000001111110011");
    t(NumLit::i64(0xFFFFFFF50A508BDAu64 as i64), "0b1111111111111111111111111111010100001010010100001000101111011010");
    t(NumLit::i64(0xFFFFFFDF1EF1A38Fu64 as i64), "0b1111111111111111111111111101111100011110111100011010001110001111");
    t(NumLit::i64(0xFFFFFF9D5CD4EAAEu64 as i64), "0b1111111111111111111111111001110101011100110101001110101010101110");
    t(NumLit::i64(0xFFFFFED8167EC00Bu64 as i64), "0b1111111111111111111111101101100000010110011111101100000000001011");
    t(NumLit::i64(0xFFFFFC88437C4022u64 as i64), "0b1111111111111111111111001000100001000011011111000100000000100010");
    t(NumLit::i64(0xFFFFF598CA74C067u64 as i64), "0b1111111111111111111101011001100011001010011101001100000001100111");
    t(NumLit::i64(0xFFFFE0CA5F5E4136u64 as i64), "0b1111111111111111111000001100101001011111010111100100000100110110");
    t(NumLit::i64(0xFFFFA25F1E1AC3A3u64 as i64), "0b1111111111111111101000100101111100011110000110101100001110100011");
    t(NumLit::i64(0xFFFEE71D5A504AEAu64 as i64), "0b1111111111111110111001110001110101011010010100000100101011101010");
    t(NumLit::i64(0xFFFCB5580EF0E0BFu64 as i64), "0b1111111111111100101101010101100000001110111100001110000010111111");
    t(NumLit::i64(0xFFF620082CD2A23Eu64 as i64), "0b1111111111110110001000000000100000101100110100101010001000111110");
    t(NumLit::i64(0xFFE260188677E6BBu64 as i64), "0b1111111111100010011000000001100010000110011101111110011010111011");
    t(NumLit::i64(0xFFA720499367B432u64 as i64), "0b1111111110100111001000000100100110010011011001111011010000110010");
    t(NumLit::i64(0xFEF560DCBA371C97u64 as i64), "0b1111111011110101011000001101110010111010001101110001110010010111");
    t(NumLit::i64(0xFCE022962EA555C6u64 as i64), "0b1111110011100000001000101001011000101110101001010101010111000110");
    t(NumLit::i64(0xF6A067C28BF00153u64 as i64), "0b1111011010100000011001111100001010001011111100000000000101010011");
    t(NumLit::i64(0xE3E13747A3D003FAu64 as i64), "0b1110001111100001001101110100011110100011110100000000001111111010");
    t(NumLit::i64(0xABA3A5D6EB700BEFu64 as i64), "0b1010101110100011101001011101011011101011011100000000101111101111");
}
#[test]
#[rustfmt::skip]
pub fn test_f32s() {
    setup_logger();
    let t = test_float;

    t(NumLit::f32(9.0),             "9.0");
    t(NumLit::f32(9.),              "9.");
    t(NumLit::f32(0.0),             "0.0");
    t(NumLit::f32(0.),              "0.");
    t(NumLit::f32(8.1),             "8.1");
    t(NumLit::f32(7.22),            "7.22");
    t(NumLit::f32(6.333),           "6.333");
    t(NumLit::f32(5.4444),          "5.4444");
    t(NumLit::f32(4.55555),         "4.55555");
    t(NumLit::f32(3.666666),        "3.666666");
    t(NumLit::f32(2.7777777),       "2.7777777");
    t(NumLit::f32(1.888_888_8),      "1.88888888");
    t(NumLit::f32(-1.888_888_8),     "-1.88888888");
    t(NumLit::f32(0.999999999),     "0.999999999");
    t(NumLit::f32(-0.999999999),    "-0.999999999");

    t(NumLit::f32(0.25),      "0.25");
    t(NumLit::f32(0.1),       "0.1");
    t(NumLit::f32(0.2),       "0.2");
    t(NumLit::f32(0.3),       "0.3");
    t(NumLit::f32(0.4),       "0.4");
    t(NumLit::f32(0.5),       "0.5");
    t(NumLit::f32(0.6),       "0.6");
    t(NumLit::f32(0.7),       "0.7");
    t(NumLit::f32(0.8),       "0.8");
    t(NumLit::f32(0.9),       "0.9");
    t(NumLit::f32(1.2),       "1.2");
    t(NumLit::f32(1.3),       "1.3");
    t(NumLit::f32(1.4),       "1.4");
    t(NumLit::f32(1.5),       "1.5");
    t(NumLit::f32(1.6),       "1.6");
    t(NumLit::f32(1.7),       "1.7");
    t(NumLit::f32(1.8),       "1.8");
    t(NumLit::f32(1.9),       "1.9");
    t(NumLit::f32(0.77),      "0.77");
    t(NumLit::f32(-0.888),    "-0.888");
    t(NumLit::f32(0.055),     "0.055");
    t(NumLit::f32(-0.003),    "-0.003");
    t(NumLit::f32(0.000256),  "0.000256");

    t(NumLit::f32(-0.2),  "-0.2");
    t(NumLit::f32(-0.3),  "-0.3");
    t(NumLit::f32(-0.7),  "-0.7");
    t(NumLit::f32(1.1),   "1.1");
    t(NumLit::f32(-1.2),  "-1.2");
    t(NumLit::f32(1.3),   "1.3");
    t(NumLit::f32(1.4),   "1.4");
    t(NumLit::f32(1.44),  "1.44");
    t(NumLit::f32(2.33),  "2.33");
    t(NumLit::f32(4.11),  "4.11");
    t(NumLit::f32(5.55),  "5.55");
}

#[test]
#[rustfmt::skip]
pub fn test_exp() {
    let t = test_float;

    t(NumLit::f32(9e0),    "9e0");
    t(NumLit::f32(8e+0),   "8e+0");
    t(NumLit::f32(7e-0),   "7e-0");
    t(NumLit::f32(6E1),    "6E1");
    t(NumLit::f32(5E+1),   "5E+1");
    t(NumLit::f32(4E-1),   "4E-1");
    t(NumLit::f32(-9e10),  "-9e10");
    t(NumLit::f32(-8e+20), "-8e+20");
    t(NumLit::f32(-7e-30), "-7e-30");
    t(NumLit::f32(-4E-61), "-4E-61");

    t(NumLit::f32(9e5),     "9e5");
    t(NumLit::f32(8e+3),    "8e+3");
    t(NumLit::f32(7e-2),    "7e-2");

    t(NumLit::f32(1.0e1),    "1.0e1");
    t(NumLit::f32(-3.0e22),  "-3.0e22");

    t(NumLit::f32(1.0e-1),                "1.0e-1");
    t(NumLit::f32(3.0e-22),               "3.0e-22");
    t(NumLit::f32(5.0e-333),              "5.0e-333");
    t(NumLit::f32(7.0e-4444),             "7.0e-4444");
    t(NumLit::f32(9.0e-55555),            "9.0e-55555");
    t(NumLit::f32(22.0e-666666),          "22.0e-666666");
    t(NumLit::f32(444.0e-7777777),        "444.0e-7777777");
    t(NumLit::f32(6666.0e-88888888),      "6666.0e-88888888");
    t(NumLit::f32(88888.0e-999999999),    "88888.0e-999999999");
    t(NumLit::f32(88_888.0e-999999999),    "88_888.0e-999999999");

    // ==== f64 ====

    t(NumLit::f64(-6E41),   "-6E41");
    t(NumLit::f64(-5E+51),  "-5E+51");

    // ==== infinity/nan ====

    t(NumLit::f32(f32::INFINITY),             "5.0e333");
    t(NumLit::f32(f32::NEG_INFINITY),         "-7.0e4444");
    t(NumLit::f32(f32::INFINITY),             "9.0e55555");
    t(NumLit::f32(f32::NEG_INFINITY),         "-22.0e666666");
    t(NumLit::f32(f32::INFINITY),             "444.0e7777777");
    t(NumLit::f32(f32::NEG_INFINITY),         "-6666.0e88888888");
    t(NumLit::f32(f32::INFINITY),             "88_888.0e999999999");

    t(NumLit::f32(f32::INFINITY),       "inf");
    t(NumLit::f32(f32::INFINITY),       "infinity");
    t(NumLit::f32(f32::NEG_INFINITY),   "-inf");
    t(NumLit::f32(f32::NEG_INFINITY),   "-infinity");

    // ==== INVALID ====
    let f = fail_parse_float;

    f("--1");
}

// ==== Utilities ====

fn test_i32(exp: i32, dec: &str, hex: &str, bin: &str) {
    parse_int(NumLit::i32(exp), dec);
    parse_int(NumLit::i32(exp), hex);
    parse_int(NumLit::i32(exp), bin);
}
fn test_u32(exp: u32, dec: &str, hex: &str, bin: &str) {
    parse_int(NumLit::u32(exp), dec);
    parse_int(NumLit::i32(exp as i32), hex);
    parse_int(NumLit::i32(exp as i32), bin);
}
fn test_float(exp: NumLit, float: &str) {
    parse_float(exp, float);
}

fn parse_int(exp: NumLit, token: &str) {
    match call_parser(Rule::INT, token, &handle_int) {
        Ok(Expr::Primitive {
            val: Value::Number { val, .. },
            ..
        }) => {
            assert_eq!(exp, val);
        }
        unexp => handle_unexp_fail(unexp, token),
    }
}

fn parse_float(exp: NumLit, token: &str) {
    match call_parser(Rule::FLOAT, token, &handle_float) {
        Ok(Expr::Primitive {
            val: Value::Number { val, .. },
            ..
        }) => {
            assert_eq!(exp, val);
        }
        unexp => handle_unexp_fail(unexp, token),
    }
}

fn fail_parse_float(token: &str) {
    if let Ok(Expr::Primitive {
        val: Value::Number { val, .. },
        ..
    }) = fail_parser(Rule::FLOAT, token, &handle_float)
    {
        handle_unexp_pass(val, token);
    }
}

fn handle_unexp_fail(res: Result<Expr, Vec<WhammError>>, token: &str) {
    match res {
        Ok(expr) => {
            error!("Number did not parse correctly: {token} -> {:?}", expr);
            panic!();
        }
        Err(errs) => {
            error!("Parsing the number caused errors: {token}");
            for e in errs.iter() {
                error!("{:?}", e.ty)
            }
            panic!();
        }
    }
}

fn handle_unexp_pass(expr: NumLit, token: &str) {
    error!(
        "Number passed the parse, but it shouldn't have: {token} -> {:?}",
        expr
    );
    panic!();
}

fn call_parser(
    parse_rule: Rule,
    token: &str,
    handler: &dyn Fn(Pair<Rule>) -> Result<Expr, Vec<WhammError>>,
) -> Result<Expr, Vec<WhammError>> {
    let parse_res = WhammParser::parse(parse_rule, token);
    match parse_res {
        Ok(mut pairs) => handler(pairs.next().unwrap()),
        Err(e) => {
            error!("Parsing the number caused errors: {token}\n{:?}", e);
            panic!();
        }
    }
}

fn fail_parser(
    parse_rule: Rule,
    token: &str,
    handler: &dyn Fn(Pair<Rule>) -> Result<Expr, Vec<WhammError>>,
) -> Result<Expr, Vec<WhammError>> {
    let parse_res = WhammParser::parse(parse_rule, token);
    match parse_res {
        Ok(mut pairs) => handler(pairs.next().unwrap()),
        Err(_) => Err(vec![]),
    }
}