@@ -412,45 +412,120 @@ end
412412 end
413413end
414414
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+
415427@testset " parse" begin
416428 # Note: the underscore used in the reinterpreted integer is used to indicate the decimal
417429 # 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
454529end
455530
456531end # global testset
0 commit comments