diff --git a/tests/hard_coded/integer_division_zero.m b/tests/hard_coded/integer_division_zero.m index 588ae35e3..e07e93c69 100644 --- a/tests/hard_coded/integer_division_zero.m +++ b/tests/hard_coded/integer_division_zero.m @@ -16,33 +16,46 @@ :- pred main(io::di, io::uo) is det. :- implementation. + :- import_module int. :- import_module integer. :- import_module list. :- import_module string. main(!IO) :- - check("canonical exact remainder", ((pred) is semidet :- - check_unsigned(27, 0, 28, integer.zero)), !IO), - check("canonical nonzero remainder", ((pred) is semidet :- - check_unsigned(27, 0, 28, integer.one)), !IO), + check("canonical exact remainder", + ((pred) is semidet :- + build_check_exponent_offset_shift_rem(27, 0, 28, integer.zero) + ), !IO), + check("canonical nonzero remainder", + ((pred) is semidet :- + build_check_exponent_offset_shift_rem(27, 0, 28, integer.one) + ), !IO), check("significant digits after zero partial remainder", ((pred) is semidet :- B = integer.one << 27, - check_signed((B << 70) + B + integer.one, B, - (integer.one << 70) + integer.one, integer.one)), !IO), - check("scaled and unscaled divisors", ((pred) is semidet :- - list.all_true(check_exponent, [13, 14, 15, 26, 27, 28, 41, 55, 83])), - !IO), - check("zero and small dividends", ((pred) is semidet :- - B = integer.one << 55, - check_signed(integer.zero, B, integer.zero, integer.zero), - check_signed(integer.one, B, integer.zero, integer.one), - check_signed(B - integer.one, B, integer.zero, B - integer.one)), !IO). + build_check_signed_variants((B << 70) + B + integer.one, B, + (integer.one << 70) + integer.one, integer.one) + ), !IO), + check("scaled and unscaled divisors", + ((pred) is semidet :- + list.all_true(build_check_exponent_values, + [13, 14, 15, 26, 27, 28, 41, 55, 83]) + ), !IO), + check("zero and small dividends", + ((pred) is semidet :- + B = integer.one << 55, + build_check_signed_variants(integer.zero, B, integer.zero, + integer.zero), + build_check_signed_variants(integer.one, B, integer.zero, + integer.one), + build_check_signed_variants(B - integer.one, B, integer.zero, + B - integer.one) + ), !IO). -:- pred check_exponent(int::in) is semidet. +:- pred build_check_exponent_values(int::in) is semidet. -check_exponent(Exponent) :- +build_check_exponent_values(Exponent) :- list.all_true( (pred(Offset::in) is semidet :- B = (integer.one << Exponent) + integer(Offset), @@ -50,25 +63,27 @@ check_exponent(Exponent) :- (pred(Shift::in) is semidet :- list.all_true( (pred(R::in) is semidet :- - check_unsigned(Exponent, Offset, Shift, R)), + build_check_exponent_offset_shift_rem(Exponent, + Offset, Shift, R)), [integer.zero, integer.one, B - integer.one]) ), [1, 14, 28, 56]) ), [-1, 0, 1]). -:- pred check_unsigned(int::in, int::in, int::in, integer::in) is semidet. +:- pred build_check_exponent_offset_shift_rem(int::in, int::in, int::in, + integer::in) is semidet. -check_unsigned(Exponent, Offset, Shift, R) :- +build_check_exponent_offset_shift_rem(Exponent, Offset, Shift, R) :- B = (integer.one << Exponent) + integer(Offset), Q = integer.one << Shift, A = B * Q + R, - check_signed(A, B, Q, R). + build_check_signed_variants(A, B, Q, R). -:- pred check_signed(integer::in, integer::in, integer::in, integer::in) - is semidet. +:- pred build_check_signed_variants(integer::in, integer::in, + integer::in, integer::in) is semidet. -check_signed(A, B, Q, R) :- +build_check_signed_variants(A, B, Q, R) :- check_division(A, B, Q, R), check_division(-A, B, -Q, -R), check_division(A, -B, -Q, R), @@ -107,7 +122,8 @@ check_division(A, B, ExpectedQ, ExpectedR) :- A mod B = ExpectedR ). -:- pred check(string::in, (pred)::in((pred) is semidet), io::di, io::uo) is det. +:- pred check(string::in, (pred)::in((pred) is semidet), + io::di, io::uo) is det. check(Label, Test, !IO) :- ( if Test then