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_j2i_xor_sign.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-) (limited to 'libj2_j2i_xor_sign.c') diff --git a/libj2_j2i_xor_sign.c b/libj2_j2i_xor_sign.c index fd29268..6935c57 100644 --- a/libj2_j2i_xor_sign.c +++ b/libj2_j2i_xor_sign.c @@ -8,7 +8,105 @@ extern inline void libj2_j2i_xor_sign(struct libj2_j2i *a); #else -CONST int main(void) { return 0; } -/* TODO test libj2_j2i_xor_sign{,_to_j2i,_to_j2u} */ +static uintmax_t +random_ju(void) +{ + size_t n = LIBJ2_JU_BIT; + uintmax_t r = 0; + while (n--) + if (rand() < rand()) + r |= (uintmax_t)1 << n; + return r; +} + + +static void +check(struct libj2_j2i *a) +{ + struct libj2_j2i r, saved, x; + + saved = *a; + + r = (struct libj2_j2i){111, 222}; + libj2_j2i_xor_sign_to_j2i((const struct libj2_j2i *)a, &r); + EXPECT(libj2_j2i_eq_j2i(a, &saved)); + EXPECT(libj2_j2i_eq_j2i(&r, &saved)); + + r = (struct libj2_j2i){111, 222}; + libj2_j2i_xor_sign_to_j2u((const struct libj2_j2i *)a, (struct libj2_j2u *)&r); + EXPECT(libj2_j2i_eq_j2i(a, &saved)); + EXPECT(libj2_j2i_eq_j2i(&r, &saved)); + + r = *a; + libj2_j2i_xor_sign(&r); + EXPECT(libj2_j2i_eq_j2i(&r, &saved)); + + libj2_not_j2u((void *)a); + x = *a; + + r = (struct libj2_j2i){111, 222}; + libj2_j2i_xor_sign_to_j2i((const struct libj2_j2i *)a, &r); + EXPECT(libj2_j2i_eq_j2i(a, &x)); + EXPECT(libj2_j2i_eq_j2i(&r, &saved)); + + r = (struct libj2_j2i){111, 222}; + libj2_j2i_xor_sign_to_j2u((const struct libj2_j2i *)a, (struct libj2_j2u *)&r); + EXPECT(libj2_j2i_eq_j2i(a, &x)); + EXPECT(libj2_j2i_eq_j2i(&r, &saved)); + + r = x; + libj2_j2i_xor_sign(&r); + EXPECT(libj2_j2i_eq_j2i(&r, &saved)); +} + + +int +main(void) +{ + struct libj2_j2i a; + unsigned i; + + srand((unsigned)time(NULL)); + + for (i = 0; i < 256; i++) { + a.high = random_ju() >> 1; + a.low = random_ju(); + check(&a); + + a.high = random_ju() >> 1; + a.low = 0; + check(&a); + + a.high = 0; + a.low = random_ju(); + check(&a); + + a.high = random_ju() >> 1; + a.low = UINTMAX_MAX; + check(&a); + + a.high = random_ju() >> 1; + a.low = 1; + check(&a); + + a.high = 1U; + a.low = random_ju(); + check(&a); + + a.high = UINTMAX_MAX >> 1; + a.low = random_ju(); + check(&a); + } + + a.high = 0; + a.low = 0; + check(&a); + + a.high = UINTMAX_MAX >> 1; + a.low = UINTMAX_MAX; + check(&a); + + return 0; +} #endif -- cgit v1.2.3-70-g09d2