diff options
| author | Mattias Andrée <m@maandree.se> | 2025-12-12 23:00:18 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2025-12-12 23:00:18 +0100 |
| commit | 3988d39b3eb67817cada58e62e63f2a0fa63663c (patch) | |
| tree | 6a693e05d583389f91c7de3cb7e7721cad56441e /libj2_abs_j2i.c | |
| parent | Add signed integers (arithmetics and some testing not implemented yet) (diff) | |
| download | libj2-3988d39b3eb67817cada58e62e63f2a0fa63663c.tar.gz libj2-3988d39b3eb67817cada58e62e63f2a0fa63663c.tar.bz2 libj2-3988d39b3eb67817cada58e62e63f2a0fa63663c.tar.xz | |
Add some tests and fix mistakes
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libj2_abs_j2i.c')
| -rw-r--r-- | libj2_abs_j2i.c | 150 |
1 files changed, 148 insertions, 2 deletions
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 |
