@@ -412,45 +412,120 @@ end
412
412
end
413
413
end
414
414
415
+ @testset " parse_round" begin
416
+ @test FixedPointDecimals. parse_round (Int, " 44" , RoundNearest) == 0
417
+ @test FixedPointDecimals. parse_round (Int, " 45" , RoundNearest) == 0
418
+ @test FixedPointDecimals. parse_round (Int, " 46" , RoundNearest) == 1
419
+ @test FixedPointDecimals. parse_round (Int, " 54" , RoundNearest) == 0
420
+ @test FixedPointDecimals. parse_round (Int, " 55" , RoundNearest) == 1
421
+ @test FixedPointDecimals. parse_round (Int, " 56" , RoundNearest) == 1
422
+
423
+ # Handle a number of digits that exceeds the storage capacity of Int128
424
+ @test FixedPointDecimals. parse_round (Int8, " 9" ^ 40 , RoundNearest) == 1
425
+ end
426
+
415
427
@testset " parse" begin
416
428
# Note: the underscore used in the reinterpreted integer is used to indicate the decimal
417
429
# place.
418
- @test parse (FD2, " 123" ) == reinterpret (FD2, 123_00 )
419
- @test parse (FD2, " .123" ) == reinterpret (FD2, 0_12 )
420
- @test parse (FD2, " 1.23" ) == reinterpret (FD2, 1_23 )
421
- @test parse (FD2, " 12.3" ) == reinterpret (FD2, 12_30 )
422
- @test parse (FD2, " 123." ) == reinterpret (FD2, 123_00 )
423
- @test_skip parse (FD2, " 123.456" ) == reinterpret (FD2, 123_46 )
424
- @test_skip parse (FD2, " 123.455" ) == reinterpret (FD2, 123_46 )
425
- @test_skip parse (FD2, " 123.465" ) == reinterpret (FD2, 123_46 )
426
-
427
- @test parse (FD2, " -123" ) == reinterpret (FD2, - 123_00 )
428
- @test parse (FD2, " -.123" ) == reinterpret (FD2, - 0_12 )
429
- @test parse (FD2, " -1.23" ) == reinterpret (FD2, - 1_23 )
430
- @test parse (FD2, " -12.3" ) == reinterpret (FD2, - 12_30 )
431
- @test parse (FD2, " -123." ) == reinterpret (FD2, - 123_00 )
432
-
433
- @test parse (FD4, " 12e0" ) == reinterpret (FD4, 00012_0000 )
434
- @test parse (FD4, " 12e3" ) == reinterpret (FD4, 12000_0000 )
435
- @test parse (FD4, " 12e-3" ) == reinterpret (FD4, 00000_0120 )
436
- @test parse (FD4, " 1.2e0" ) == reinterpret (FD4, 00001_2000 )
437
- @test parse (FD4, " 1.2e3" ) == reinterpret (FD4, 01200_0000 )
438
- @test parse (FD4, " 1.2e-3" ) == reinterpret (FD4, 00000_0012 )
439
- @test parse (FD4, " 1.2e-4" ) == reinterpret (FD4, 00000_0001 )
440
- @test_skip parse (FD4, " 1.5e-4" ) == reinterpret (FD4, 00000_0002 )
441
- @test_throws OverflowError parse (" 1.2e100" )
442
-
443
- @test parse (FD4, " -12e0" ) == reinterpret (FD4, - 00012_0000 )
444
- @test parse (FD4, " -12e3" ) == reinterpret (FD4, - 12000_0000 )
445
- @test parse (FD4, " -12e-3" ) == reinterpret (FD4, - 00000_0120 )
446
- @test parse (FD4, " -1.2e0" ) == reinterpret (FD4, - 00001_2000 )
447
- @test parse (FD4, " -1.2e3" ) == reinterpret (FD4, - 01200_0000 )
448
- @test parse (FD4, " -1.2e-3" ) == reinterpret (FD4, - 00000_0012 )
449
-
450
- @test parse (FD2, " 2.3" ) == reinterpret (FD2, 2_30 )
451
-
452
- @test_throws ArgumentError parse (FD4, " foo" )
453
- @test_throws ArgumentError parse (FD4, " 1.2.3" )
430
+ @testset " decimal position" begin
431
+ @test parse (FD2, " 123" ) == reinterpret (FD2, 123_00 )
432
+ @test parse (FD2, " 0.123" ) == reinterpret (FD2, 0_12 )
433
+ @test parse (FD2, " .123" ) == reinterpret (FD2, 0_12 )
434
+ @test parse (FD2, " 1.23" ) == reinterpret (FD2, 1_23 )
435
+ @test parse (FD2, " 12.3" ) == reinterpret (FD2, 12_30 )
436
+ @test parse (FD2, " 123." ) == reinterpret (FD2, 123_00 )
437
+ @test parse (FD2, " 123.0" ) == reinterpret (FD2, 123_00 )
438
+
439
+ @test parse (FD2, " -123" ) == reinterpret (FD2, - 123_00 )
440
+ @test parse (FD2, " -0.123" ) == reinterpret (FD2, - 0_12 )
441
+ @test parse (FD2, " -.123" ) == reinterpret (FD2, - 0_12 )
442
+ @test parse (FD2, " -1.23" ) == reinterpret (FD2, - 1_23 )
443
+ @test parse (FD2, " -12.3" ) == reinterpret (FD2, - 12_30 )
444
+ @test parse (FD2, " -123." ) == reinterpret (FD2, - 123_00 )
445
+ @test parse (FD2, " -123.0" ) == reinterpret (FD2, - 123_00 )
446
+ end
447
+
448
+ @testset " scientific notation" begin
449
+ @test parse (FD4, " 12e0" ) == reinterpret (FD4, 00012_0000 )
450
+ @test parse (FD4, " 12e3" ) == reinterpret (FD4, 12000_0000 )
451
+ @test parse (FD4, " 12e-3" ) == reinterpret (FD4, 00000_0120 )
452
+ @test parse (FD4, " 1.2e0" ) == reinterpret (FD4, 00001_2000 )
453
+ @test parse (FD4, " 1.2e3" ) == reinterpret (FD4, 01200_0000 )
454
+ @test parse (FD4, " 1.2e-3" ) == reinterpret (FD4, 00000_0012 )
455
+ @test parse (FD4, " 1.2e-4" ) == reinterpret (FD4, 00000_0001 )
456
+
457
+ @test parse (FD4, " -12e0" ) == reinterpret (FD4, - 00012_0000 )
458
+ @test parse (FD4, " -12e3" ) == reinterpret (FD4, - 12000_0000 )
459
+ @test parse (FD4, " -12e-3" ) == reinterpret (FD4, - 00000_0120 )
460
+ @test parse (FD4, " -1.2e0" ) == reinterpret (FD4, - 00001_2000 )
461
+ @test parse (FD4, " -1.2e3" ) == reinterpret (FD4, - 01200_0000 )
462
+ @test parse (FD4, " -1.2e-3" ) == reinterpret (FD4, - 00000_0012 )
463
+
464
+ @test parse (FD2, " 999e-1" ) == reinterpret (FD2, 99_90 )
465
+ @test parse (FD2, " 999e-2" ) == reinterpret (FD2, 09_99 )
466
+ @test parse (FD2, " 999e-3" ) == reinterpret (FD2, 01_00 )
467
+ @test parse (FD2, " 999e-4" ) == reinterpret (FD2, 00_10 )
468
+ @test parse (FD2, " 999e-5" ) == reinterpret (FD2, 00_01 )
469
+ @test parse (FD2, " 999e-6" ) == reinterpret (FD2, 00_00 )
470
+
471
+ @test parse (FD2, " -999e-1" ) == reinterpret (FD2, - 99_90 )
472
+ @test parse (FD2, " -999e-2" ) == reinterpret (FD2, - 09_99 )
473
+ @test parse (FD2, " -999e-3" ) == reinterpret (FD2, - 01_00 )
474
+ @test parse (FD2, " -999e-4" ) == reinterpret (FD2, - 00_10 )
475
+ @test parse (FD2, " -999e-5" ) == reinterpret (FD2, - 00_01 )
476
+ @test parse (FD2, " -999e-6" ) == reinterpret (FD2, - 00_00 )
477
+
478
+ @test parse (FD4, " 9" ^ 96 * " e-100" ) == reinterpret (FD4, 0_001 )
479
+ end
480
+
481
+ @testset " round to nearest" begin
482
+ @test parse (FD2, " 0.444" ) == reinterpret (FD2, 0_44 )
483
+ @test parse (FD2, " 0.445" ) == reinterpret (FD2, 0_44 )
484
+ @test parse (FD2, " 0.446" ) == reinterpret (FD2, 0_45 )
485
+ @test parse (FD2, " 0.454" ) == reinterpret (FD2, 0_45 )
486
+ @test parse (FD2, " 0.455" ) == reinterpret (FD2, 0_46 )
487
+ @test parse (FD2, " 0.456" ) == reinterpret (FD2, 0_46 )
488
+
489
+ @test parse (FD2, " -0.444" ) == reinterpret (FD2, - 0_44 )
490
+ @test parse (FD2, " -0.445" ) == reinterpret (FD2, - 0_44 )
491
+ @test parse (FD2, " -0.446" ) == reinterpret (FD2, - 0_45 )
492
+ @test parse (FD2, " -0.454" ) == reinterpret (FD2, - 0_45 )
493
+ @test parse (FD2, " -0.455" ) == reinterpret (FD2, - 0_46 )
494
+ @test parse (FD2, " -0.456" ) == reinterpret (FD2, - 0_46 )
495
+
496
+ @test parse (FD2, " 0.009" ) == reinterpret (FD2, 0_01 )
497
+ @test parse (FD2, " -0.009" ) == reinterpret (FD2, - 0_01 )
498
+
499
+ @test parse (FD4, " 1.5e-4" ) == reinterpret (FD4, 0_0002 )
500
+ end
501
+
502
+ @testset " round to zero" begin
503
+ @test parse (FD2, " 0.444" , RoundToZero) == reinterpret (FD2, 0_44 )
504
+ @test parse (FD2, " 0.445" , RoundToZero) == reinterpret (FD2, 0_44 )
505
+ @test parse (FD2, " 0.446" , RoundToZero) == reinterpret (FD2, 0_44 )
506
+ @test parse (FD2, " 0.454" , RoundToZero) == reinterpret (FD2, 0_45 )
507
+ @test parse (FD2, " 0.455" , RoundToZero) == reinterpret (FD2, 0_45 )
508
+ @test parse (FD2, " 0.456" , RoundToZero) == reinterpret (FD2, 0_45 )
509
+
510
+ @test parse (FD2, " -0.444" , RoundToZero) == reinterpret (FD2, - 0_44 )
511
+ @test parse (FD2, " -0.445" , RoundToZero) == reinterpret (FD2, - 0_44 )
512
+ @test parse (FD2, " -0.446" , RoundToZero) == reinterpret (FD2, - 0_44 )
513
+ @test parse (FD2, " -0.454" , RoundToZero) == reinterpret (FD2, - 0_45 )
514
+ @test parse (FD2, " -0.455" , RoundToZero) == reinterpret (FD2, - 0_45 )
515
+ @test parse (FD2, " -0.456" , RoundToZero) == reinterpret (FD2, - 0_45 )
516
+
517
+ @test parse (FD2, " 0.009" , RoundToZero) == reinterpret (FD2, 0_00 )
518
+ @test parse (FD2, " -0.009" , RoundToZero) == reinterpret (FD2, 0_00 )
519
+
520
+ @test parse (FD4, " 1.5e-4" , RoundToZero) == reinterpret (FD4, 0_0001 )
521
+ end
522
+
523
+ @testset " invalid" begin
524
+ @test_throws OverflowError parse (FD4, " 1.2e100" )
525
+ @test_throws ArgumentError parse (FD4, " foo" )
526
+ @test_throws ArgumentError parse (FD4, " 1.2.3" )
527
+ @test_throws ArgumentError parse (FD4, " 1.2" , RoundUp)
528
+ end
454
529
end
455
530
456
531
end # global testset
0 commit comments