From a02f04a534c88a34ce3772844ab7ad8b88293ec3 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 13 Dec 2025 16:15:32 +0100 Subject: libj2_max_j2i.c, libj2_min_j2i.c: add tests with mixure of signums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libj2_min_j2i.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 2 deletions(-) (limited to 'libj2_min_j2i.c') diff --git a/libj2_min_j2i.c b/libj2_min_j2i.c index 5940110..263b75b 100644 --- a/libj2_min_j2i.c +++ b/libj2_min_j2i.c @@ -101,6 +101,32 @@ neg_expect_untouched(void) } +static void +mix_reset(void) +{ + const uintmax_t umax = UINTMAX_MAX; + const uintmax_t max = UINTMAX_MAX >> 1; + v1 = (struct libj2_j2i){~max, 0}; + v2 = (struct libj2_j2i){umax, umax}; + v3 = (struct libj2_j2i){0, 0}; + v4 = (struct libj2_j2i){0, 1}; + v5 = (struct libj2_j2i){max, umax}; +} + + +static void +mix_expect_untouched(void) +{ + const uintmax_t umax = UINTMAX_MAX; + const uintmax_t max = UINTMAX_MAX >> 1; + EXPECT(libj2_j2i_eq_j2i(&v1, &(struct libj2_j2i){~max, 0}) == 1); + EXPECT(libj2_j2i_eq_j2i(&v2, &(struct libj2_j2i){umax, umax}) == 1); + EXPECT(libj2_j2i_eq_j2i(&v3, &(struct libj2_j2i){0, 0}) == 1); + EXPECT(libj2_j2i_eq_j2i(&v4, &(struct libj2_j2i){0, 1}) == 1); + EXPECT(libj2_j2i_eq_j2i(&v5, &(struct libj2_j2i){max, umax}) == 1); +} + + #define HEAD(X, ...) X #define TAIL(X, ...) __VA_ARGS__ @@ -144,12 +170,84 @@ neg_expect_untouched(void) EXPECT(libj2_j2i_eq_j2i(&(MIN), &r));\ } while (0) +#define MIX_CHECK(MIN, ...)\ + do {\ + mix_reset();\ + \ + r = *(HEAD(__VA_ARGS__));\ + libj2_min_j2i(&r, TAIL(__VA_ARGS__));\ + mix_expect_untouched();\ + EXPECT(libj2_j2i_eq_j2i((MIN), &r));\ + \ + p = libj2_min_j2i_return(__VA_ARGS__);\ + mix_expect_untouched();\ + EXPECT(p != NULL);\ + EXPECT(libj2_j2i_eq_j2i((MIN), p));\ + \ + r = (struct libj2_j2i){111, 222};\ + libj2_min_j2i_to_j2i(__VA_ARGS__, &r);\ + mix_expect_untouched();\ + EXPECT(libj2_j2i_eq_j2i((MIN), &r));\ + } while (0) + + +static void +check_mixed(const struct libj2_j2i *i1, const struct libj2_j2i *i2, const struct libj2_j2i *i3, + const struct libj2_j2i *i4, const struct libj2_j2i *i5) +{ + struct libj2_j2i r; + const struct libj2_j2i *p; + const struct libj2_j2i *is[5]; + size_t n = 0; + size_t i, ii, iii, iv; + + if (i1) + is[n++] = i1; + if (i2) + is[n++] = i2; + if (i3) + is[n++] = i3; + if (i4) + is[n++] = i4; + if (i5) + is[n++] = i5; + + switch (n) { + case 2: + MIX_CHECK(is[0], is[0], is[1], NULL); + MIX_CHECK(is[0], is[1], is[0], NULL); + break; + + case 3: + MIX_CHECK(is[0], is[0], is[1], is[2], NULL); + MIX_CHECK(is[0], is[0], is[2], is[1], NULL); + MIX_CHECK(is[0], is[1], is[0], is[2], NULL); + MIX_CHECK(is[0], is[2], is[0], is[1], NULL); + MIX_CHECK(is[0], is[1], is[2], is[0], NULL); + MIX_CHECK(is[0], is[2], is[1], is[0], NULL); + break; + + case 4: + for (i = 0; i < 4; i++) + for (ii = 0; ii < 4; ii++) + for (iii = 0; iii < 4; iii++) + for (iv = 0; iv < 4; iv++) + if (i != ii && i != iii && i != iv && ii != iii && ii != iv && iii != iv) + MIX_CHECK(is[0], is[i], is[ii], is[iii], is[iv], NULL); + break; + + default: + return; + } +} + int main(void) { struct libj2_j2i r; const struct libj2_j2i *p; + unsigned i; CHECK(v1, &v1, NULL); CHECK(v2, &v2, NULL); @@ -351,9 +449,14 @@ main(void) NEG_CHECK(v13, &v10, &v4, &v5, &v6, &v3, &v7, &v13, &v8, &v12, &v2, &v9, &v1, &v11, NULL); NEG_CHECK(v13, &v9, &v1, &v3, &v8, &v12, &v5, &v6, &v2, &v10, &v11, &v4, &v7, &v13, NULL); + for (i = 1U; i < (1U << 5); i++) + check_mixed((i & 1U) ? &v1 : NULL, + (i & 2U) ? &v2 : NULL, + (i & 4U) ? &v3 : NULL, + (i & 8U) ? &v4 : NULL, + (i & 16U) ? &v5 : NULL); + return 0; } -/* TODO test mixing positive and negative values */ - #endif -- cgit v1.2.3-70-g09d2