diff options
Diffstat (limited to 'libj2_j2i_xor_sign.c')
| -rw-r--r-- | libj2_j2i_xor_sign.c | 102 |
1 files changed, 100 insertions, 2 deletions
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 |
