From 3988d39b3eb67817cada58e62e63f2a0fa63663c Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 12 Dec 2025 23:00:18 +0100 Subject: Add some tests and fix mistakes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libj2_abs_j2i.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 2 deletions(-) (limited to 'libj2_abs_j2i.c') diff --git a/libj2_abs_j2i.c b/libj2_abs_j2i.c index 253f44d..999ff8b 100644 --- a/libj2_abs_j2i.c +++ b/libj2_abs_j2i.c @@ -8,7 +8,153 @@ extern inline void libj2_abs_j2i(struct libj2_j2i *a); #else -CONST int main(void) { return 0; } -/* TODO test libj2_abs_j2i{,_to_j2i,_to_j2u} libj2_minus_abs_j2i{,_to_j2i} */ + +static void +check(uintmax_t high, uintmax_t low) +{ + struct libj2_j2i a, r; + struct libj2_j2u u; + + a.high = high; + a.low = low; + libj2_abs_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + libj2_minus_j2i(&a); + libj2_abs_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + + r = (struct libj2_j2i){111, 222}; + a.high = high; + a.low = low; + libj2_abs_j2i_to_j2i((const struct libj2_j2i *)&a, &r); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2i(&a, &r)); + libj2_minus_j2i(&a); + libj2_abs_j2i_to_j2i((const struct libj2_j2i *)&a, &r); + libj2_minus_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2i(&a, &r)); + + u = (struct libj2_j2u){111, 222}; + a.high = high; + a.low = low; + libj2_abs_j2i_to_j2u((const struct libj2_j2i *)&a, &u); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2u(&a, &u)); + libj2_minus_j2i(&a); + libj2_abs_j2i_to_j2u((const struct libj2_j2i *)&a, &u); + libj2_minus_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2u(&a, &u)); + + a.high = high; + a.low = low; + libj2_minus_abs_j2i(&a); + libj2_minus_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + libj2_minus_j2i(&a); + libj2_minus_abs_j2i(&a); + libj2_minus_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + + r = (struct libj2_j2i){111, 222}; + a.high = high; + a.low = low; + libj2_minus_abs_j2i_to_j2i((const struct libj2_j2i *)&a, &r); + libj2_minus_j2i(&r); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2i(&a, &r)); + libj2_minus_j2i(&a); + libj2_minus_abs_j2i_to_j2i((const struct libj2_j2i *)&a, &r); + libj2_minus_j2i(&a); + libj2_minus_j2i(&r); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2i(&a, &r)); +} + + +static void +check_min(void) +{ + const uintmax_t high = ~(UINTMAX_MAX >> 1); + const uintmax_t low = 0; + struct libj2_j2i a, r; + struct libj2_j2u u; + + a.high = high; + a.low = low; + libj2_abs_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + + r = (struct libj2_j2i){111, 222}; + a.high = high; + a.low = low; + libj2_abs_j2i_to_j2i((const struct libj2_j2i *)&a, &r); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2i(&a, &r)); + + u = (struct libj2_j2u){111, 222}; + a.high = high; + a.low = low; + libj2_abs_j2i_to_j2u((const struct libj2_j2i *)&a, &u); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2u_eq_j2u((const void *)&a, &u)); + + a.high = high; + a.low = low; + libj2_minus_abs_j2i(&a); + libj2_minus_j2i(&a); + EXPECT(a.high == high); + EXPECT(a.low == low); + + r = (struct libj2_j2i){111, 222}; + a.high = high; + a.low = low; + libj2_minus_abs_j2i_to_j2i((const struct libj2_j2i *)&a, &r); + libj2_minus_j2i(&r); + EXPECT(a.high == high); + EXPECT(a.low == low); + EXPECT(libj2_j2i_eq_j2i(&a, &r)); +} + + +int +main(void) +{ + check(0, 0); + check(0, 1); + check(1, 0); + check(1, 1); + check(1, 2); + check(0, UINTMAX_MAX - 0U); + check(0, UINTMAX_MAX - 1U); + check(1, UINTMAX_MAX - 0U); + check(1, UINTMAX_MAX - 1U); + check((UINTMAX_MAX >> 1) - 0U, 0); + check((UINTMAX_MAX >> 1) - 0U, 1); + check((UINTMAX_MAX >> 1) - 0U, UINTMAX_MAX - 0U); + check((UINTMAX_MAX >> 1) - 0U, UINTMAX_MAX - 1U); + check((UINTMAX_MAX >> 1) - 1U, 0); + check((UINTMAX_MAX >> 1) - 1U, 01); + check((UINTMAX_MAX >> 1) - 1U, UINTMAX_MAX - 0U); + check((UINTMAX_MAX >> 1) - 1U, UINTMAX_MAX - 1U); + + check_min(); + + return 0; +} #endif -- cgit v1.2.3-70-g09d2