@@ -454,4 +454,144 @@ end
454
454
end
455
455
end
456
456
457
+ @testset " parse_round" begin
458
+ @test FixedPointDecimals. parse_round (Int, " 44" , RoundNearest) == 0
459
+ @test FixedPointDecimals. parse_round (Int, " 45" , RoundNearest) == 0
460
+ @test FixedPointDecimals. parse_round (Int, " 46" , RoundNearest) == 1
461
+ @test FixedPointDecimals. parse_round (Int, " 54" , RoundNearest) == 0
462
+ @test FixedPointDecimals. parse_round (Int, " 55" , RoundNearest) == 1
463
+ @test FixedPointDecimals. parse_round (Int, " 56" , RoundNearest) == 1
464
+
465
+ # Handle a number of digits that exceeds the storage capacity of Int128
466
+ @test FixedPointDecimals. parse_round (Int8, " 9" ^ 40 , RoundNearest) == 1
467
+ end
468
+
469
+ @testset " parse" begin
470
+ # Note: the underscore used in the reinterpreted integer is used to indicate the decimal
471
+ # place.
472
+ @testset " decimal position" begin
473
+ @test parse (FD2, " 123" ) == reinterpret (FD2, 123_00 )
474
+ @test parse (FD2, " 0.123" ) == reinterpret (FD2, 0_12 )
475
+ @test parse (FD2, " .123" ) == reinterpret (FD2, 0_12 )
476
+ @test parse (FD2, " 1.23" ) == reinterpret (FD2, 1_23 )
477
+ @test parse (FD2, " 12.3" ) == reinterpret (FD2, 12_30 )
478
+ @test parse (FD2, " 123." ) == reinterpret (FD2, 123_00 )
479
+ @test parse (FD2, " 123.0" ) == reinterpret (FD2, 123_00 )
480
+
481
+ @test parse (FD2, " -123" ) == reinterpret (FD2, - 123_00 )
482
+ @test parse (FD2, " -0.123" ) == reinterpret (FD2, - 0_12 )
483
+ @test parse (FD2, " -.123" ) == reinterpret (FD2, - 0_12 )
484
+ @test parse (FD2, " -1.23" ) == reinterpret (FD2, - 1_23 )
485
+ @test parse (FD2, " -12.3" ) == reinterpret (FD2, - 12_30 )
486
+ @test parse (FD2, " -123." ) == reinterpret (FD2, - 123_00 )
487
+ @test parse (FD2, " -123.0" ) == reinterpret (FD2, - 123_00 )
488
+ end
489
+
490
+ @testset " scientific notation" begin
491
+ @test parse (FD4, " 12e0" ) == reinterpret (FD4, 00012_0000 )
492
+ @test parse (FD4, " 12e3" ) == reinterpret (FD4, 12000_0000 )
493
+ @test parse (FD4, " 12e-3" ) == reinterpret (FD4, 00000_0120 )
494
+ @test parse (FD4, " 1.2e0" ) == reinterpret (FD4, 00001_2000 )
495
+ @test parse (FD4, " 1.2e3" ) == reinterpret (FD4, 01200_0000 )
496
+ @test parse (FD4, " 1.2e-3" ) == reinterpret (FD4, 00000_0012 )
497
+ @test parse (FD4, " 1.2e-4" ) == reinterpret (FD4, 00000_0001 )
498
+
499
+ @test parse (FD4, " -12e0" ) == reinterpret (FD4, - 00012_0000 )
500
+ @test parse (FD4, " -12e3" ) == reinterpret (FD4, - 12000_0000 )
501
+ @test parse (FD4, " -12e-3" ) == reinterpret (FD4, - 00000_0120 )
502
+ @test parse (FD4, " -1.2e0" ) == reinterpret (FD4, - 00001_2000 )
503
+ @test parse (FD4, " -1.2e3" ) == reinterpret (FD4, - 01200_0000 )
504
+ @test parse (FD4, " -1.2e-3" ) == reinterpret (FD4, - 00000_0012 )
505
+
506
+ @test parse (FD2, " 999e-1" ) == reinterpret (FD2, 99_90 )
507
+ @test parse (FD2, " 999e-2" ) == reinterpret (FD2, 09_99 )
508
+ @test parse (FD2, " 999e-3" ) == reinterpret (FD2, 01_00 )
509
+ @test parse (FD2, " 999e-4" ) == reinterpret (FD2, 00_10 )
510
+ @test parse (FD2, " 999e-5" ) == reinterpret (FD2, 00_01 )
511
+ @test parse (FD2, " 999e-6" ) == reinterpret (FD2, 00_00 )
512
+
513
+ @test parse (FD2, " -999e-1" ) == reinterpret (FD2, - 99_90 )
514
+ @test parse (FD2, " -999e-2" ) == reinterpret (FD2, - 09_99 )
515
+ @test parse (FD2, " -999e-3" ) == reinterpret (FD2, - 01_00 )
516
+ @test parse (FD2, " -999e-4" ) == reinterpret (FD2, - 00_10 )
517
+ @test parse (FD2, " -999e-5" ) == reinterpret (FD2, - 00_01 )
518
+ @test parse (FD2, " -999e-6" ) == reinterpret (FD2, - 00_00 )
519
+
520
+ @test parse (FD4, " 9" ^ 96 * " e-100" ) == reinterpret (FD4, 0_001 )
521
+ end
522
+
523
+ @testset " round to nearest" begin
524
+ @test parse (FD2, " 0.444" ) == reinterpret (FD2, 0_44 )
525
+ @test parse (FD2, " 0.445" ) == reinterpret (FD2, 0_44 )
526
+ @test parse (FD2, " 0.446" ) == reinterpret (FD2, 0_45 )
527
+ @test parse (FD2, " 0.454" ) == reinterpret (FD2, 0_45 )
528
+ @test parse (FD2, " 0.455" ) == reinterpret (FD2, 0_46 )
529
+ @test parse (FD2, " 0.456" ) == reinterpret (FD2, 0_46 )
530
+
531
+ @test parse (FD2, " -0.444" ) == reinterpret (FD2, - 0_44 )
532
+ @test parse (FD2, " -0.445" ) == reinterpret (FD2, - 0_44 )
533
+ @test parse (FD2, " -0.446" ) == reinterpret (FD2, - 0_45 )
534
+ @test parse (FD2, " -0.454" ) == reinterpret (FD2, - 0_45 )
535
+ @test parse (FD2, " -0.455" ) == reinterpret (FD2, - 0_46 )
536
+ @test parse (FD2, " -0.456" ) == reinterpret (FD2, - 0_46 )
537
+
538
+ @test parse (FD2, " 0.009" ) == reinterpret (FD2, 0_01 )
539
+ @test parse (FD2, " -0.009" ) == reinterpret (FD2, - 0_01 )
540
+
541
+ @test parse (FD4, " 1.5e-4" ) == reinterpret (FD4, 0_0002 )
542
+ end
543
+
544
+ @testset " round to zero" begin
545
+ @test parse (FD2, " 0.444" , RoundToZero) == reinterpret (FD2, 0_44 )
546
+ @test parse (FD2, " 0.445" , RoundToZero) == reinterpret (FD2, 0_44 )
547
+ @test parse (FD2, " 0.446" , RoundToZero) == reinterpret (FD2, 0_44 )
548
+ @test parse (FD2, " 0.454" , RoundToZero) == reinterpret (FD2, 0_45 )
549
+ @test parse (FD2, " 0.455" , RoundToZero) == reinterpret (FD2, 0_45 )
550
+ @test parse (FD2, " 0.456" , RoundToZero) == reinterpret (FD2, 0_45 )
551
+
552
+ @test parse (FD2, " -0.444" , RoundToZero) == reinterpret (FD2, - 0_44 )
553
+ @test parse (FD2, " -0.445" , RoundToZero) == reinterpret (FD2, - 0_44 )
554
+ @test parse (FD2, " -0.446" , RoundToZero) == reinterpret (FD2, - 0_44 )
555
+ @test parse (FD2, " -0.454" , RoundToZero) == reinterpret (FD2, - 0_45 )
556
+ @test parse (FD2, " -0.455" , RoundToZero) == reinterpret (FD2, - 0_45 )
557
+ @test parse (FD2, " -0.456" , RoundToZero) == reinterpret (FD2, - 0_45 )
558
+
559
+ @test parse (FD2, " 0.009" , RoundToZero) == reinterpret (FD2, 0_00 )
560
+ @test parse (FD2, " -0.009" , RoundToZero) == reinterpret (FD2, 0_00 )
561
+
562
+ @test parse (FD4, " 1.5e-4" , RoundToZero) == reinterpret (FD4, 0_0001 )
563
+ end
564
+
565
+ @testset " round throws" begin
566
+ @test parse (FD2, " 0.44" , RoundThrows) == reinterpret (FD2, 0_44 )
567
+ @test parse (FD2, " 0.440" , RoundThrows) == reinterpret (FD2, 0_44 )
568
+
569
+ @test_throws InexactError parse (FD2, " 0.444" , RoundThrows)
570
+ @test_throws InexactError parse (FD2, " 0.445" , RoundThrows)
571
+ @test_throws InexactError parse (FD2, " 0.446" , RoundThrows)
572
+ @test_throws InexactError parse (FD2, " 0.454" , RoundThrows)
573
+ @test_throws InexactError parse (FD2, " 0.455" , RoundThrows)
574
+ @test_throws InexactError parse (FD2, " 0.456" , RoundThrows)
575
+
576
+ @test_throws InexactError parse (FD2, " -0.444" , RoundThrows)
577
+ @test_throws InexactError parse (FD2, " -0.445" , RoundThrows)
578
+ @test_throws InexactError parse (FD2, " -0.446" , RoundThrows)
579
+ @test_throws InexactError parse (FD2, " -0.454" , RoundThrows)
580
+ @test_throws InexactError parse (FD2, " -0.455" , RoundThrows)
581
+ @test_throws InexactError parse (FD2, " -0.456" , RoundThrows)
582
+
583
+ @test_throws InexactError parse (FD2, " 0.009" , RoundThrows)
584
+ @test_throws InexactError parse (FD2, " -0.009" , RoundThrows)
585
+
586
+ @test_throws InexactError parse (FD4, " 1.5e-4" , RoundThrows)
587
+ end
588
+
589
+ @testset " invalid" begin
590
+ @test_throws OverflowError parse (FD4, " 1.2e100" )
591
+ @test_throws ArgumentError parse (FD4, " foo" )
592
+ @test_throws ArgumentError parse (FD4, " 1.2.3" )
593
+ @test_throws ArgumentError parse (FD4, " 1.2" , RoundUp)
594
+ end
595
+ end
596
+
457
597
end # global testset
0 commit comments