X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/1c3b0c0e6f9339e76e42f6393e554c7dfc58e205..cb4da2b973ce208490cb4c54da26a5e245e495a5:/t/rng-test.c diff --git a/t/rng-test.c b/t/rng-test.c index 3f4cf32..c70f752 100644 --- a/t/rng-test.c +++ b/t/rng-test.c @@ -1,6 +1,6 @@ /* * Simple random number generator for testing. - * Copyright © 2022 Nick Bowler + * Copyright © 2022-2024 Nick Bowler * * Directly compare the test lib RNG against the reference implementation. * @@ -19,62 +19,63 @@ */ #include -#include +#include "tap.h" +#if !HAVE_FOR_DECLS +int main(void) +{ + tap_skip_all("cannot compile reference xoshiro256+"); +} +#else +#define TEST_RNG_NO_EXTERNAL_API 1 #include "rng.c" #include "xos256p.c" int main(void) { - unsigned long long seed_state = 0xdeadbeeff00dcafe; unsigned long long test_result, ref_result; unsigned long long ref_state[4], test_state[4]; + uint_least32_t seed_state = 0xdeadbeef; int i, ret = 0; - printf("1..200\n"); + tap_plan(200); for (i = 0; i < 100; i++) { - s[0] = ref_state[0] = test_state[0] = splitmix64(&seed_state); - s[1] = ref_state[1] = test_state[1] = splitmix64(&seed_state); - s[2] = ref_state[2] = test_state[2] = splitmix64(&seed_state); - s[3] = ref_state[3] = test_state[3] = splitmix64(&seed_state); + s[0] = ref_state[0] = test_state[0] = seed64(&seed_state); + s[1] = ref_state[1] = test_state[1] = seed64(&seed_state); + s[2] = ref_state[2] = test_state[2] = seed64(&seed_state); + s[3] = ref_state[3] = test_state[3] = seed64(&seed_state); ref_result = next(); test_result = xoshiro256p(test_state); - if (ref_result != test_result) { - printf("not ok %d rng output\n", 2*i+1); - printf("# Failed, unexpected result\n"); - printf("# with initial state %llx %llx %llx %llx\n", - ref_state[0], ref_state[1], - ref_state[2], ref_state[3]); - printf("# received: %llx\n", test_result); - printf("# expected: %llx\n", ref_result); - ret = EXIT_FAILURE; - } else { - printf("ok %d rng output\n", 2*i+1); + if (!tap_result(ref_result == test_result, "rng output")) { + tap_diag("Failed, unexpected result"); + tap_diag(" with initial state %llx %llx %llx %llx", + ref_state[0], ref_state[1], + ref_state[2], ref_state[3]); + tap_diag(" received: %llx", test_result); + tap_diag(" expected: %llx", ref_result); } - if (s[0] != test_state[0] || s[1] != test_state[1] - || s[2] != test_state[2] || s[3] != test_state[3]) + if (!tap_result(s[0] == test_state[0] && s[1] == test_state[1] + && s[2] == test_state[2] && s[3] == test_state[3], + "rng state update")) { - printf("not ok %d rng state update\n", 2*i+2); - printf("# Failed, state update differed\n"); - printf("# with initial state %llx %llx %llx %llx\n", - ref_state[0], ref_state[1], - ref_state[2], ref_state[3]); - printf("# received: %llx %llx %llx %llx\n", - test_state[0], test_state[1], - test_state[2], test_state[3]); - printf("# expected: %llx %llx %llx %llx\n", - (unsigned long long)s[0], - (unsigned long long)s[1], - (unsigned long long)s[2], - (unsigned long long)s[3]); - ret = EXIT_FAILURE; - } else { - printf("ok %d rng state update\n", 2*i+2); + tap_diag("Failed, state update differed"); + tap_diag(" with initial state %llx %llx %llx %llx", + ref_state[0], ref_state[1], + ref_state[2], ref_state[3]); + tap_diag(" received: %llx %llx %llx %llx", + test_state[0], test_state[1], + test_state[2], test_state[3]); + tap_diag(" expected: %llx %llx %llx %llx", + (unsigned long long)s[0], + (unsigned long long)s[1], + (unsigned long long)s[2], + (unsigned long long)s[3]); } } - return ret; + tap_done(); } +#endif