From bbc28a6dec903c362ed1249ca3b31b26e0d44c15 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sat, 6 Jan 2024 22:34:22 -0500 Subject: [PATCH] tests: Skip reference RNG test on old compilers. The reference implementation for xoshiro256** uses C99-style for loop declarations, which cannot be compiled on some implementations (incl. all versions of GCC in gnu89 mode). Rather than changing the reference code (which kinda defeats the point) arrange for the test to be skipped unless compiler support is available. --- Makefile.am | 4 ++- configure.ac | 3 ++- t/rng-test.c | 69 +++++++++++++++++++++++++-------------------------- tests/game.at | 10 ++------ 4 files changed, 41 insertions(+), 45 deletions(-) diff --git a/Makefile.am b/Makefile.am index ea546a8..dd3c0d2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -108,7 +108,6 @@ EXTRA_DIST += t/game-notime.h t/xos256ss.c $(t_boardbit_OBJECTS): $(gnulib_headers) $(t_overlaygoal_OBJECTS): $(gnulib_headers) -$(t_rng_test_OBJECTS): $(gnulib_headers) t_boardmove_SOURCES = t/boardmove.c src/game.c $(t_boardmove_OBJECTS): $(gnulib_headers) @@ -126,6 +125,9 @@ $(t_ewmhicon_OBJECTS): $(gnulib_headers) t_initboard_SOURCES = t/initboard.c src/game.c $(t_initboard_OBJECTS): $(gnulib_headers) +t_rng_test_SOURCES = t/rng-test.c common/src/tap.c +$(t_rng_test_OBJECTS): $(gnulib_headers) + XPMICONS_LOCOLOR = data/lo16x16.xpm data/lo32x32.xpm data/lo48x48.xpm XPMICONS_HICOLOR = data/hi16x16.xpm data/hi24x24.xpm \ data/hi32x32.xpm data/hi48x48.xpm diff --git a/configure.ac b/configure.ac index 0042b37..9f290c1 100644 --- a/configure.ac +++ b/configure.ac @@ -16,8 +16,9 @@ DX_AUTOMAKE_COMPAT AC_PROG_CC_C99 gl_EARLY -AC_C_FLEXIBLE_ARRAY_MEMBER AC_C_INLINE +AC_C_FLEXIBLE_ARRAY_MEMBER +DX_C_FOR_DECLARATIONS LT_INIT gl_INIT diff --git a/t/rng-test.c b/t/rng-test.c index 9d27f38..e141c0d 100644 --- a/t/rng-test.c +++ b/t/rng-test.c @@ -1,6 +1,6 @@ /* * Test case for xoshiro256** implementation. - * Copyright © 2022-2023 Nick Bowler + * Copyright © 2022-2024 Nick Bowler * * Directly compare the game RNG against the reference implementation. * @@ -19,9 +19,14 @@ */ #include -#include -#include +#include "tap.h" +#if !HAVE_FOR_DECLS +int main(void) +{ + tap_skip_all("cannot compile reference xoshiro256**"); +} +#else #include "game-notime.h" #include "game.c" #include "xos256ss.c" @@ -33,7 +38,7 @@ int main(void) unsigned long long ref_state[4], test_state[4]; 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); @@ -43,40 +48,34 @@ int main(void) ref_result = next(); test_result = xoshiro256ss(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 diff --git a/tests/game.at b/tests/game.at index 7defcdb..7084f6f 100644 --- a/tests/game.at +++ b/tests/game.at @@ -1,4 +1,4 @@ -# Copyright © 2022-2023 Nick Bowler +# Copyright © 2022-2024 Nick Bowler # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -592,13 +592,7 @@ AT_CHECK([boardmove m4_do( AT_CLEANUP -AT_SETUP([xoshiro256** sanity]) - -AT_CHECK([rng-test >out -grep -v '^ok' out], [0], [1..200 -]) - -AT_CLEANUP +TEST_TAP_SIMPLE([xoshiro256** sanity], [rng-test]) AT_SETUP([game_check_goal]) -- 2.43.2