@@ -454,4 +454,144 @@ end
454454 end
455455end
456456
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+
457597end # global testset
0 commit comments