From 052144cabb126efe925a96f8a0597a0f2005d206 Mon Sep 17 00:00:00 2001 From: lemon Date: Mon, 23 Feb 2026 20:36:05 +0100 Subject: add metalang99 testsuite (preprocessor stress testing) --- test/external/metalang99/tests/nat.c | 260 +++++++++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 test/external/metalang99/tests/nat.c (limited to 'test/external/metalang99/tests/nat.c') diff --git a/test/external/metalang99/tests/nat.c b/test/external/metalang99/tests/nat.c new file mode 100644 index 0000000..0509d8e --- /dev/null +++ b/test/external/metalang99/tests/nat.c @@ -0,0 +1,260 @@ +// `...` is sometimes used to workaround a TCC bug, see +// . + +#include +#include + +int main(void) { + +#define MATCH_Z_IMPL(...) v(88) // `...` due to the TCC's bug. +#define MATCH_S_IMPL(x) v(x) + + // ML99_natMatch + { + ML99_ASSERT_EQ(ML99_natMatch(v(0), v(MATCH_)), v(88)); + ML99_ASSERT_EQ(ML99_natMatch(v(123), v(MATCH_)), v(122)); + } + +#undef MATCH_Z_IMPL +#undef MATCH_S_IMPL + +#define MATCH_Z_IMPL(x, y, z) v(ML99_ASSERT_UNEVAL(x == 1 && y == 2 && z == 3)) +#define MATCH_S_IMPL(n, x, y, z) v(ML99_ASSERT_UNEVAL(n == 122 && x == 1 && y == 2 && z == 3)) + + // ML99_natMatchWithArgs + { + ML99_EVAL(ML99_natMatchWithArgs(v(0), v(MATCH_), v(1, 2, 3))); + ML99_EVAL(ML99_natMatchWithArgs(v(123), v(MATCH_), v(1, 2, 3))); + } + +#undef MATCH_Z_IMPL +#undef MATCH_S_IMPL + + // ML99_inc + { + ML99_ASSERT_EQ(ML99_inc(v(0)), v(1)); + ML99_ASSERT_EQ(ML99_inc(v(15)), v(16)); + ML99_ASSERT_EQ(ML99_inc(v(198)), v(199)); + ML99_ASSERT_EQ(ML99_inc(v(254)), v(ML99_NAT_MAX)); + ML99_ASSERT_EQ(ML99_inc(v(ML99_NAT_MAX)), v(0)); + } + + // ML99_INC + { + ML99_ASSERT_UNEVAL(ML99_INC(0) == 1); + ML99_ASSERT_UNEVAL(ML99_INC(15) == 16); + ML99_ASSERT_UNEVAL(ML99_INC(254) == ML99_NAT_MAX); + } + + // ML99_dec + { + ML99_ASSERT_EQ(ML99_dec(v(0)), v(ML99_NAT_MAX)); + ML99_ASSERT_EQ(ML99_dec(v(1)), v(0)); + ML99_ASSERT_EQ(ML99_dec(v(71)), v(70)); + ML99_ASSERT_EQ(ML99_dec(v(201)), v(200)); + ML99_ASSERT_EQ(ML99_dec(v(ML99_NAT_MAX)), v(254)); + } + + // ML99_DEC + { + ML99_ASSERT_UNEVAL(ML99_DEC(0) == ML99_NAT_MAX); + ML99_ASSERT_UNEVAL(ML99_DEC(1) == 0); + ML99_ASSERT_UNEVAL(ML99_DEC(ML99_NAT_MAX) == 254); + } + + // ML99_natEq + { + ML99_ASSERT(ML99_natEq(v(0), v(0))); + ML99_ASSERT(ML99_natEq(v(18), v(18))); + ML99_ASSERT(ML99_natEq(v(183), v(183))); + ML99_ASSERT(ML99_natEq(v(ML99_NAT_MAX), v(ML99_NAT_MAX))); + + ML99_ASSERT(ML99_not(ML99_natEq(v(0), v(1)))); + ML99_ASSERT(ML99_not(ML99_natEq(v(198), v(91)))); + } + + // ML99_NAT_EQ + { + ML99_ASSERT_UNEVAL(ML99_NAT_EQ(18, 18)); + ML99_ASSERT_UNEVAL(!ML99_NAT_EQ(198, 91)); + } + + // ML99_natNeq + { + ML99_ASSERT(ML99_natNeq(v(0), v(1))); + ML99_ASSERT(ML99_natNeq(v(0), v(168))); + ML99_ASSERT(ML99_natNeq(v(1), v(34))); + ML99_ASSERT(ML99_natNeq(v(184), v(381))); + ML99_ASSERT(ML99_natNeq(v(3), v(101))); + + ML99_ASSERT(ML99_not(ML99_natNeq(v(0), v(0)))); + ML99_ASSERT(ML99_not(ML99_natNeq(v(101), v(101)))); + } + + // ML99_NAT_NEQ + { + ML99_ASSERT_UNEVAL(ML99_NAT_NEQ(0, 168)); + ML99_ASSERT_UNEVAL(!ML99_NAT_NEQ(101, 101)); + } + + // ML99_greater + { + ML99_ASSERT(ML99_greater(v(1), v(0))); + ML99_ASSERT(ML99_greater(v(ML99_NAT_MAX), v(0))); + ML99_ASSERT(ML99_greater(v(5), v(4))); + ML99_ASSERT(ML99_greater(v(147), v(80))); + ML99_ASSERT(ML99_greater(v(217), v(209))); + + ML99_ASSERT(ML99_not(ML99_greater(v(0), v(13)))); + ML99_ASSERT(ML99_not(ML99_greater(v(17), v(120)))); + } + + // ML99_lesser + { + ML99_ASSERT(ML99_lesser(v(0), v(1))); + ML99_ASSERT(ML99_lesser(v(0), v(ML99_NAT_MAX))); + ML99_ASSERT(ML99_lesser(v(19), v(25))); + ML99_ASSERT(ML99_lesser(v(109), v(110))); + ML99_ASSERT(ML99_lesser(v(10), v(208))); + + ML99_ASSERT(ML99_not(ML99_lesser(v(12), v(0)))); + ML99_ASSERT(ML99_not(ML99_lesser(v(123), v(123)))); + } + + // ML99_greaterEq + { + ML99_ASSERT(ML99_greaterEq(v(0), v(0))); + ML99_ASSERT(ML99_greaterEq(v(18), v(18))); + ML99_ASSERT(ML99_greaterEq(v(175), v(175))); + ML99_ASSERT(ML99_greaterEq(v(ML99_NAT_MAX), v(ML99_NAT_MAX))); + + ML99_ASSERT(ML99_greaterEq(v(1), v(0))); + ML99_ASSERT(ML99_greaterEq(v(ML99_NAT_MAX), v(0))); + ML99_ASSERT(ML99_greaterEq(v(19), v(10))); + ML99_ASSERT(ML99_greaterEq(v(178), v(177))); + + ML99_ASSERT(ML99_not(ML99_greaterEq(v(0), v(7)))); + ML99_ASSERT(ML99_not(ML99_greaterEq(v(1), v(19)))); + } + + // ML99_lesserEq + { + ML99_ASSERT(ML99_lesserEq(v(0), v(0))); + ML99_ASSERT(ML99_lesserEq(v(2), v(2))); + ML99_ASSERT(ML99_lesserEq(v(1), v(1))); + ML99_ASSERT(ML99_lesserEq(v(25), v(25))); + ML99_ASSERT(ML99_lesserEq(v(198), v(198))); + + ML99_ASSERT(ML99_lesserEq(v(0), v(1))); + ML99_ASSERT(ML99_lesserEq(v(0), v(ML99_NAT_MAX))); + ML99_ASSERT(ML99_lesserEq(v(18), v(27))); + ML99_ASSERT(ML99_lesserEq(v(82), v(90))); + ML99_ASSERT(ML99_lesserEq(v(145), v(146))); + ML99_ASSERT(ML99_lesserEq(v(181), v(ML99_NAT_MAX))); + + ML99_ASSERT(ML99_not(ML99_lesserEq(v(7), v(0)))); + ML99_ASSERT(ML99_not(ML99_lesserEq(v(182), v(181)))); + } + + // ML99_add + { + ML99_ASSERT_EQ(ML99_add(v(0), v(0)), v(0)); + ML99_ASSERT_EQ(ML99_add(v(19), v(83)), v(19 + 83)); + ML99_ASSERT_EQ(ML99_add(v(8), v(4)), v(8 + 4)); + ML99_ASSERT_EQ(ML99_add(v(1), v(254)), v(1 + 254)); + } + + // ML99_sub + { + ML99_ASSERT_EQ(ML99_sub(v(1), v(1)), v(1 - 1)); + ML99_ASSERT_EQ(ML99_sub(v(5), v(3)), v(5 - 3)); + ML99_ASSERT_EQ(ML99_sub(v(105), v(19)), v(105 - 19)); + ML99_ASSERT_EQ(ML99_sub(v(ML99_NAT_MAX), v(40)), v(ML99_NAT_MAX - 40)); + } + + // ML99_mul + { + ML99_ASSERT_EQ(ML99_mul(v(11), v(0)), v(0)); + ML99_ASSERT_EQ(ML99_mul(v(0), v(11)), v(0)); + ML99_ASSERT_EQ(ML99_mul(v(15), v(8)), v(15 * 8)); + ML99_ASSERT_EQ(ML99_mul(v(ML99_NAT_MAX), v(1)), v(ML99_NAT_MAX * 1)); + } + + // ML99_div + { + ML99_ASSERT_EQ(ML99_div(v(15), v(1)), v(15)); + ML99_ASSERT_EQ(ML99_div(v(15), v(15)), v(1)); + ML99_ASSERT_EQ(ML99_div(v(45), v(3)), v(45 / 3)); + ML99_ASSERT_EQ(ML99_div(v(ML99_NAT_MAX), v(5)), v(ML99_NAT_MAX / 5)); + } + + // ML99_divChecked + { + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(15), v(1)), ML99_just(v(15)))); + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(15), v(15)), ML99_just(v(1)))); + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(45), v(3)), ML99_just(v(15)))); + ML99_ASSERT( + ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(ML99_NAT_MAX), v(5)), ML99_just(v(51)))); + + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(4), v(0)), ML99_nothing())); + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(3), v(27)), ML99_nothing())); + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(166), v(9)), ML99_nothing())); + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), ML99_divChecked(v(0), v(11)), ML99_nothing())); + } + + // ML99_DIV_CHECKED + { + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), v(ML99_DIV_CHECKED(15, 1)), ML99_just(v(15)))); + ML99_ASSERT(ML99_maybeEq(v(ML99_natEq), v(ML99_DIV_CHECKED(4, 0)), ML99_nothing())); + } + + // ML99_mod + { + ML99_ASSERT_EQ(ML99_mod(v(0), v(1)), v(0 % 1)); + ML99_ASSERT_EQ(ML99_mod(v(0), v(123)), v(0 % 123)); + + ML99_ASSERT_EQ(ML99_mod(v(1), v(28)), v(1 % 28)); + ML99_ASSERT_EQ(ML99_mod(v(1), v(123)), v(1 % 123)); + + ML99_ASSERT_EQ(ML99_mod(v(1), v(1)), v(0)); + ML99_ASSERT_EQ(ML99_mod(v(16), v(4)), v(0)); + ML99_ASSERT_EQ(ML99_mod(v(ML99_NAT_MAX), v(ML99_NAT_MAX)), v(0)); + + ML99_ASSERT_EQ(ML99_mod(v(8), v(3)), v(8 % 3)); + ML99_ASSERT_EQ(ML99_mod(v(10), v(4)), v(10 % 4)); + ML99_ASSERT_EQ(ML99_mod(v(101), v(7)), v(101 % 7)); + + ML99_ASSERT_EQ(ML99_mod(v(13), v(14)), v(13 % 14)); + ML99_ASSERT_EQ(ML99_mod(v(20), v(36)), v(20 % 36)); + ML99_ASSERT_EQ(ML99_mod(v(16), v(ML99_NAT_MAX)), v(16 % ML99_NAT_MAX)); + } + + // ML99_add3, ML99_sub3, ML99_mul3, ML99_div3 + { + ML99_ASSERT_EQ(ML99_add3(v(8), v(2), v(4)), v(8 + 2 + 4)); + ML99_ASSERT_EQ(ML99_sub3(v(14), v(1), v(7)), v(14 - 1 - 7)); + ML99_ASSERT_EQ(ML99_mul3(v(3), v(2), v(6)), v(3 * 2 * 6)); + ML99_ASSERT_EQ(ML99_div3(v(30), v(2), v(3)), v(30 / 2 / 3)); + } + + // ML99_min + { + ML99_ASSERT_EQ(ML99_min(v(0), v(1)), v(0)); + ML99_ASSERT_EQ(ML99_min(v(5), v(7)), v(5)); + ML99_ASSERT_EQ(ML99_min(v(200), v(ML99_NAT_MAX)), v(200)); + } + + // ML99_max + { + ML99_ASSERT_EQ(ML99_max(v(0), v(1)), v(1)); + ML99_ASSERT_EQ(ML99_max(v(5), v(7)), v(7)); + ML99_ASSERT_EQ(ML99_max(v(200), v(ML99_NAT_MAX)), v(ML99_NAT_MAX)); + } + + // ML99_assertIsNat + { + ML99_EVAL(ML99_assertIsNat(v(0))) + ML99_EVAL(ML99_assertIsNat(v(13))) + ML99_EVAL(ML99_assertIsNat(v(255))) + } +} -- cgit v1.2.3