@@ -922,4 +922,58 @@ mod tests {
922922 ) ;
923923 Ok ( ( ) )
924924 }
925+
926+ #[ test]
927+ fn test_rescale_decimal_upscale_within_precision ( ) {
928+ let result = rescale_decimal :: < Decimal128Type , Decimal128Type > (
929+ 12_345_i128 , // 123.45 with scale 2
930+ 5 ,
931+ 2 ,
932+ 8 ,
933+ 5 ,
934+ ) ;
935+ assert_eq ! ( result, Some ( 12_345_000_i128 ) ) ;
936+ }
937+
938+ #[ test]
939+ fn test_rescale_decimal_downscale_rounds_half_away_from_zero ( ) {
940+ let positive = rescale_decimal :: < Decimal128Type , Decimal128Type > (
941+ 1_050_i128 , // 1.050 with scale 3
942+ 5 , 3 , 5 , 1 ,
943+ ) ;
944+ assert_eq ! ( positive, Some ( 11_i128 ) ) ; // 1.1 with scale 1
945+
946+ let negative = rescale_decimal :: < Decimal128Type , Decimal128Type > (
947+ -1_050_i128 , // -1.050 with scale 3
948+ 5 ,
949+ 3 ,
950+ 5 ,
951+ 1 ,
952+ ) ;
953+ assert_eq ! ( negative, Some ( -11_i128 ) ) ; // -1.1 with scale 1
954+ }
955+
956+ #[ test]
957+ fn test_rescale_decimal_downscale_large_delta_returns_zero ( ) {
958+ let result = rescale_decimal :: < Decimal32Type , Decimal32Type > ( 12_345_i32 , 9 , 9 , 9 , 4 ) ;
959+ assert_eq ! ( result, Some ( 0_i32 ) ) ;
960+ }
961+
962+ #[ test]
963+ fn test_rescale_decimal_upscale_overflow_returns_none ( ) {
964+ let result = rescale_decimal :: < Decimal32Type , Decimal32Type > ( 9_999_i32 , 4 , 0 , 5 , 2 ) ;
965+ assert_eq ! ( result, None ) ;
966+ }
967+
968+ #[ test]
969+ fn test_rescale_decimal_invalid_input_precision_scale_returns_none ( ) {
970+ let result = rescale_decimal :: < Decimal128Type , Decimal128Type > ( 123_i128 , 39 , 39 , 38 , 38 ) ;
971+ assert_eq ! ( result, None ) ;
972+ }
973+
974+ #[ test]
975+ fn test_rescale_decimal_invalid_output_precision_scale_returns_none ( ) {
976+ let result = rescale_decimal :: < Decimal128Type , Decimal128Type > ( 123_i128 , 38 , 38 , 39 , 39 ) ;
977+ assert_eq ! ( result, None ) ;
978+ }
925979}
0 commit comments