changeset 408:0ea90751a62d

tests: disable entirely automatic registration
author David Demelier <markand@malikania.fr>
date Fri, 08 Apr 2022 15:59:08 +0200
parents e6f972e04519
children 6011ad866e99
files extern/librexo/CMakeLists.txt extern/librexo/rexo.h tests/test-action-script.c tests/test-action.c tests/test-alloc.c tests/test-character.c tests/test-color.c tests/test-drawable.c tests/test-error.c tests/test-map.c tests/test-save-quest.c tests/test-save.c tests/test-state.c tests/test-tileset.c tests/test-util.c tests/test-vfs-directory.c tests/test-vfs-zip.c tests/test.h
diffstat 18 files changed, 218 insertions(+), 175 deletions(-) [+]
line wrap: on
line diff
--- a/extern/librexo/CMakeLists.txt	Wed Apr 06 12:09:25 2022 +0200
+++ b/extern/librexo/CMakeLists.txt	Fri Apr 08 15:59:08 2022 +0200
@@ -26,4 +26,8 @@
 )
 set_target_properties(libmlk-rexo PROPERTIES FOLDER extern)
 
+if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
+	target_compile_options(libmlk-rexo INTERFACE -Wno-format)
+endif ()
+
 source_group("" FILES ${libmlk-rexo_SOURCE_DIR}/rexo.h)
--- a/extern/librexo/rexo.h	Wed Apr 06 12:09:25 2022 +0200
+++ b/extern/librexo/rexo.h	Fri Apr 08 15:59:08 2022 +0200
@@ -258,7 +258,7 @@
 rx_main(rx_size test_case_count,
         const struct rx_test_case *test_cases,
         int argc,
-        const char **argv);
+        const char * const *argv);
 
 #if defined(__cplusplus)
 }
@@ -4698,7 +4698,16 @@
    anything registered in these sections.
 */
 
-#if defined(_MSC_VER)
+#if !defined(RX_DISABLE_TEST_DISCOVERY)                                        \
+    && (defined(_MSC_VER) || defined(__GNUC__))
+    #define RX__TEST_DISCOVERY 1
+#else
+    #define RX__TEST_DISCOVERY 0
+#endif
+
+#if !RX__TEST_DISCOVERY
+    #define RX__TEST_SUITE_REGISTER(name) RX__REQUIRE_SEMICOLON
+#elif defined(_MSC_VER)
     __pragma(section("rxsuite$a", read))
     __pragma(section("rxsuite$b", read))
     __pragma(section("rxsuite$c", read))
@@ -4719,7 +4728,7 @@
 
     #define RX__TEST_SUITE_SECTION_BEGIN (&rx__test_suite_section_begin + 1)
     #define RX__TEST_SUITE_SECTION_END (&rx__test_suite_section_end)
-#else
+#elif defined(__GNUC__)
     #if defined(RX__PLATFORM_DARWIN)
         extern const struct rx__test_suite_desc * const __start_rxsuite        \
             __asm("section$start$__DATA$rxsuite");
@@ -4749,7 +4758,9 @@
     #define RX__TEST_SUITE_SECTION_END (&__stop_rxsuite)
 #endif
 
-#if defined(_MSC_VER)
+#if !RX__TEST_DISCOVERY
+    #define RX__TEST_CASE_REGISTER(suite_name, name) RX__REQUIRE_SEMICOLON
+#elif defined(_MSC_VER)
     __pragma(section("rxcase$a", read))
     __pragma(section("rxcase$b", read))
     __pragma(section("rxcase$c", read))
@@ -4770,7 +4781,7 @@
 
     #define RX__TEST_CASE_SECTION_BEGIN (&rx__test_case_section_begin + 1)
     #define RX__TEST_CASE_SECTION_END (&rx__test_case_section_end)
-#else
+#elif defined(__GNUC__)
     #if defined(RX__PLATFORM_DARWIN)
         extern const struct rx__test_case_desc * const __start_rxcase          \
             __asm("section$start$__DATA$rxcase");
@@ -4866,7 +4877,7 @@
 };
 
 #define RX__TEST_SUITE_(id, config_desc)                                       \
-    static const struct rx__test_suite_desc                                    \
+    RX__MAYBE_UNUSED static const struct rx__test_suite_desc                   \
     RX__TEST_SUITE_DESC_GET_ID(id)                                             \
         = {#id, config_desc};                                                  \
                                                                                \
@@ -4893,7 +4904,7 @@
     static void                                                                \
     suite_id##_##id(RX__DEFINE_PARAMS(void));                                  \
                                                                                \
-    static const struct rx__test_case_desc                                     \
+    RX__MAYBE_UNUSED static const struct rx__test_case_desc                    \
     RX__TEST_CASE_DESC_GET_ID(suite_id, id)                                    \
         = {#suite_id,                                                          \
            #id,                                                                \
@@ -5172,7 +5183,7 @@
 /* Implementation: Helpers                                         O-(''Q)
    -------------------------------------------------------------------------- */
 
-static int
+RX__MAYBE_UNUSED static int
 rx__compare_test_cases(const void *a, const void *b)
 {
     int out;
@@ -6052,8 +6063,8 @@
 RX__PRINTF_CHECK(10, 0)
 RX__MAYBE_UNUSED static void
 rx__ptr_assess_comparison(struct rx_context *context,
-                          void *x1,
-                          void *x2,
+                          const void *x1,
+                          const void *x2,
                           enum rx__op op,
                           const char *expr1,
                           const char *expr2,
@@ -6152,7 +6163,7 @@
 RX__PRINTF_CHECK(8, 0)
 RX__MAYBE_UNUSED static void
 rx__ptr_assess_alignment(struct rx_context *context,
-                         void *x,
+                         const void *x,
                          size_t alignment,
                          const char *expr,
                          const char *file,
@@ -6588,6 +6599,14 @@
 
     RX_ASSERT(test_case_count != NULL);
 
+#if !RX__TEST_DISCOVERY
+    RX__UNUSED(test_cases);
+    RX__UNUSED(i);
+    RX__UNUSED(c_it);
+
+    *test_case_count = 0;
+    return;
+#else
     if (test_cases == NULL) {
         *test_case_count = 0;
         for (c_it = RX__TEST_CASE_SECTION_BEGIN;
@@ -6668,6 +6687,7 @@
           *test_case_count,
           sizeof *test_cases,
           rx__compare_test_cases);
+#endif
 }
 
 RX__MAYBE_UNUSED RX__STORAGE enum rx_status
@@ -6686,7 +6706,7 @@
 rx_main(rx_size test_case_count,
         const struct rx_test_case *test_cases,
         int argc,
-        const char **argv)
+        const char * const *argv)
 {
     RX__UNUSED(argc);
     RX__UNUSED(argv);
--- a/tests/test-action-script.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-action-script.c	Fri Apr 08 15:59:08 2022 +0200
@@ -85,7 +85,7 @@
 	((struct invokes *)act->data)->finish++;
 }
 
-TEST_DECL(basics_init)
+RX_TEST_CASE(basics, init)
 {
 	struct script sc;
 
@@ -95,7 +95,7 @@
 	RX_UINT_REQUIRE_EQUAL(sc.cur, 0U);
 }
 
-TEST_DECL(basics_append)
+RX_TEST_CASE(basics, append)
 {
 	struct action act[3] = {0};
 	struct script sc = {0};
@@ -121,7 +121,7 @@
 	script_finish(&sc);
 }
 
-TEST_DECL(basics_handle)
+RX_TEST_CASE(basics, handle)
 {
 	struct {
 		struct invokes inv;
@@ -197,7 +197,7 @@
 	RX_INT_REQUIRE_EQUAL(table[2].inv.finish, 0);
 }
 
-TEST_DECL(basics_update)
+RX_TEST_CASE(basics, update)
 {
 	struct {
 		struct invokes inv;
@@ -290,7 +290,7 @@
 	RX_INT_REQUIRE_EQUAL(table[2].inv.finish, 0);
 }
 
-TEST_DECL(basics_draw)
+RX_TEST_CASE(basics, draw)
 {
 	struct {
 		struct invokes inv;
@@ -366,7 +366,7 @@
 	RX_INT_REQUIRE_EQUAL(table[2].inv.finish, 0);
 }
 
-TEST_DECL(basics_finish)
+RX_TEST_CASE(basics, finish)
 {
 	struct {
 		struct invokes inv;
@@ -405,7 +405,7 @@
 	RX_INT_REQUIRE_EQUAL(table[2].inv.finish, 1);
 }
 
-TEST_DECL(action_simple)
+RX_TEST_CASE(action, simple)
 {
 	struct {
 		struct invokes inv;
@@ -530,17 +530,17 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "init", basics_init),
-	TEST_DEF("basics", "append", basics_append),
-	TEST_DEF("basics", "handle", basics_handle),
-	TEST_DEF("basics", "update", basics_update),
-	TEST_DEF("basics", "draw", basics_draw),
-	TEST_DEF("basics", "finish", basics_finish),
-	TEST_DEF("action", "simple", action_simple)
+	TEST(basics, init),
+	TEST(basics, append),
+	TEST(basics, handle),
+	TEST(basics, update),
+	TEST(basics, draw),
+	TEST(basics, finish),
+	TEST(action, simple)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-action.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-action.c	Fri Apr 08 15:59:08 2022 +0200
@@ -87,7 +87,7 @@
 	((struct invokes *)act->data)->finish = 1;
 }
 
-TEST_DECL(basics_handle)
+RX_TEST_CASE(basics, handle)
 {
 	struct invokes inv = {0};
 	struct action act = INIT(&inv, my_update_true);
@@ -101,7 +101,7 @@
 	RX_REQUIRE(!inv.finish);
 }
 
-TEST_DECL(basics_update)
+RX_TEST_CASE(basics, update)
 {
 	struct {
 		struct invokes inv;
@@ -128,7 +128,7 @@
 	RX_REQUIRE(!table[1].inv.finish);
 }
 
-TEST_DECL(basics_draw)
+RX_TEST_CASE(basics, draw)
 {
 	struct invokes inv = {0};
 	struct action act = INIT(&inv, my_update_true);
@@ -142,7 +142,7 @@
 	RX_REQUIRE(!inv.finish);
 }
 
-TEST_DECL(basics_end)
+RX_TEST_CASE(basics, end)
 {
 	struct invokes inv = {0};
 	struct action act = INIT(&inv, my_update_true);
@@ -156,7 +156,7 @@
 	RX_REQUIRE(!inv.finish);
 }
 
-TEST_DECL(basics_finish)
+RX_TEST_CASE(basics, finish)
 {
 	struct invokes inv = {0};
 	struct action act = INIT(&inv, my_update_true);
@@ -170,7 +170,7 @@
 	RX_REQUIRE(inv.finish);
 }
 
-TEST_DECL(stack_add)
+RX_TEST_CASE(stack, add)
 {
 	struct action *actions[10];
 	struct action_stack st = {0};
@@ -188,7 +188,7 @@
 	RX_INT_REQUIRE_EQUAL(action_stack_add(&st, &act), -1);
 }
 
-TEST_DECL(stack_handle)
+RX_TEST_CASE(stack, handle)
 {
 	struct {
 		int called;
@@ -213,7 +213,7 @@
 	RX_REQUIRE(table[2].called);
 }
 
-TEST_DECL(stack_update)
+RX_TEST_CASE(stack, update)
 {
 	struct {
 		struct invokes inv;
@@ -311,7 +311,7 @@
 	RX_PTR_REQUIRE_EQUAL(st.actions[6], NULL);
 }
 
-TEST_DECL(stack_draw)
+RX_TEST_CASE(stack, draw)
 {
 	struct {
 		struct invokes inv;
@@ -380,7 +380,7 @@
 	RX_REQUIRE(!table[6].inv.finish);
 }
 
-TEST_DECL(stack_finish)
+RX_TEST_CASE(stack, finish)
 {
 	struct {
 		struct invokes inv;
@@ -412,20 +412,20 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "handle", basics_handle),
-	TEST_DEF("basics", "update", basics_update),
-	TEST_DEF("basics", "draw", basics_draw),
-	TEST_DEF("basics", "end", basics_end),
-	TEST_DEF("basics", "finish", basics_finish),
-	TEST_DEF("stack", "add", stack_add),
-	TEST_DEF("stack", "handle", stack_handle),
-	TEST_DEF("stack", "update", stack_update),
-	TEST_DEF("stack", "draw", stack_draw),
-	TEST_DEF("stack", "finish", stack_finish)
+	TEST(basics, handle),
+	TEST(basics, update),
+	TEST(basics, draw),
+	TEST(basics, end),
+	TEST(basics, finish),
+	TEST(stack, add),
+	TEST(stack, handle),
+	TEST(stack, update),
+	TEST(stack, draw),
+	TEST(stack, finish)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-alloc.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-alloc.c	Fri Apr 08 15:59:08 2022 +0200
@@ -16,9 +16,9 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <rexo.h>
+#include <core/alloc.h>
 
-#include <core/alloc.h>
+#include "test.h"
 
 struct point {
 	int x;
@@ -68,23 +68,29 @@
 	.free = my_free
 };
 
-RX_SET_UP(standard_setup)
+RX_SET_UP(basics_set_up)
 {
 	alloc_set(&standard_funcs);
 
 	return RX_SUCCESS;
 }
 
-RX_SET_UP(my_setup)
+RX_TEAR_DOWN(basics_tear_down)
+{
+}
+
+RX_SET_UP(custom_set_up)
 {
 	alloc_set(&my_funcs);
 
 	return RX_SUCCESS;
 }
 
-RX_FIXTURE(standard_fixture, void *, .set_up = standard_setup);
+RX_TEAR_DOWN(custom_tear_down)
+{
+}
 
-RX_TEST_CASE(test, array_simple, .fixture = standard_fixture)
+RX_TEST_CASE(basics, array_simple)
 {
 	struct point *points;
 
@@ -110,7 +116,7 @@
 	RX_INT_REQUIRE_EQUAL(points[3].y, 0);
 }
 
-RX_TEST_CASE(test, pool_simple, .fixture = standard_fixture)
+RX_TEST_CASE(basics, pool_simple)
 {
 	struct alloc_pool pool;
 	struct point *p, *data;
@@ -162,7 +168,7 @@
 	RX_UINT_REQUIRE_EQUAL(pool.elemsize, 0);
 }
 
-RX_TEST_CASE(test, sdupf, .fixture = standard_fixture)
+RX_TEST_CASE(basics, sdupf)
 {
 	char *str = alloc_sdupf("Hello %s", "David");
 
@@ -170,9 +176,7 @@
 	free(str);
 }
 
-RX_FIXTURE(my_fixture, void *, .set_up = my_setup);
-
-RX_TEST_CASE(test, custom, .fixture = my_fixture)
+RX_TEST_CASE(custom, count)
 {
 	alloc_free(alloc_new(10));
 	alloc_free(alloc_new0(20));
@@ -183,8 +187,15 @@
 	RX_INT_REQUIRE_EQUAL(my_stats.free_count, 3U);
 }
 
+static const struct rx_test_case tests[] = {
+	TEST_FIXTURE(basics, array_simple, void *),
+	TEST_FIXTURE(basics, pool_simple, void *),
+	TEST_FIXTURE(basics, sdupf, void *),
+	TEST_FIXTURE(custom, count, void *)
+};
+
 int
 main(int argc, char **argv)
 {
-	return rx_main(0, NULL, argc, (const char **)argv) == RX_SUCCESS ? 0 : 1;
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-character.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-character.c	Fri Apr 08 15:59:08 2022 +0200
@@ -24,19 +24,19 @@
 
 #include "test.h"
 
-RX_SET_UP(basics_setup)
+RX_SET_UP(basics_set_up)
 {
 	remove("test.db");
 
 	return RX_SUCCESS;
 }
 
-RX_TEAR_DOWN(basics_teardown)
+RX_TEAR_DOWN(basics_tear_down)
 {
 	remove("test.db");
 }
 
-TEST_DECL(basics_load)
+RX_TEST_CASE(basics, load)
 {
 	struct save db;
 	struct character ch = {
@@ -74,11 +74,11 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF_FIX("basics", "load", basics_load, void *, basics_setup, basics_teardown)
+	TEST_FIXTURE(basics, load, void *)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-color.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-color.c	Fri Apr 08 15:59:08 2022 +0200
@@ -20,41 +20,41 @@
 
 #include "test.h"
 
-TEST_DECL(basics_red)
+RX_TEST_CASE(basics, red)
 {
 	RX_INT_REQUIRE_EQUAL(COLOR_R(0xa3000000), 163);
 }
 
-TEST_DECL(basics_green)
+RX_TEST_CASE(basics, green)
 {
 	RX_INT_REQUIRE_EQUAL(COLOR_G(0x00130000), 19);
 }
 
-TEST_DECL(basics_blue)
+RX_TEST_CASE(basics, blue)
 {
 	RX_INT_REQUIRE_EQUAL(COLOR_B(0x0000ee00), 238);
 }
 
-TEST_DECL(basics_alpha)
+RX_TEST_CASE(basics, alpha)
 {
 	RX_INT_REQUIRE_EQUAL(COLOR_A(0x000000ff), 255);
 }
 
-TEST_DECL(basics_simple)
+RX_TEST_CASE(basics, simple)
 {
 	RX_UINT_REQUIRE_EQUAL(COLOR_HEX(170, 187, 204, 238), 0xaabbccee);
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "red", basics_red),
-	TEST_DEF("basics", "green", basics_green),
-	TEST_DEF("basics", "blue", basics_blue),
-	TEST_DEF("basics", "alpha", basics_alpha),
-	TEST_DEF("basics", "simple", basics_simple)
+	TEST(basics, red),
+	TEST(basics, green),
+	TEST(basics, blue),
+	TEST(basics, alpha),
+	TEST(basics, simple),
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-drawable.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-drawable.c	Fri Apr 08 15:59:08 2022 +0200
@@ -75,7 +75,7 @@
 	((struct invokes *)dw->data)->finish = 1;
 }
 
-TEST_DECL(basics_update)
+RX_TEST_CASE(basics, update)
 {
 	struct {
 		struct invokes inv;
@@ -100,7 +100,7 @@
 	RX_REQUIRE(!table[1].inv.finish);
 }
 
-TEST_DECL(basics_draw)
+RX_TEST_CASE(basics, draw)
 {
 	struct invokes inv = {0};
 	struct drawable dw = INIT(&inv, my_update_true);
@@ -113,7 +113,7 @@
 	RX_REQUIRE(!inv.finish);
 }
 
-TEST_DECL(basics_end)
+RX_TEST_CASE(basics, end)
 {
 	struct invokes inv = {0};
 	struct drawable dw = INIT(&inv, my_update_true);
@@ -126,7 +126,7 @@
 	RX_REQUIRE(!inv.finish);
 }
 
-TEST_DECL(basics_finish)
+RX_TEST_CASE(basics, finish)
 {
 	struct invokes inv = {0};
 	struct drawable dw = INIT(&inv, my_update_true);
@@ -139,7 +139,7 @@
 	RX_REQUIRE(inv.finish);
 }
 
-TEST_DECL(stack_add)
+RX_TEST_CASE(stack, add)
 {
 	struct drawable *drawables[10];
 	struct drawable_stack st = {0};
@@ -157,7 +157,7 @@
 	RX_INT_REQUIRE_EQUAL(drawable_stack_add(&st, &dw), -1);
 }
 
-TEST_DECL(stack_update)
+RX_TEST_CASE(stack, update)
 {
 	struct {
 		struct invokes inv;
@@ -247,7 +247,7 @@
 	RX_PTR_REQUIRE_EQUAL(st.objects[6], NULL);
 }
 
-TEST_DECL(stack_draw)
+RX_TEST_CASE(stack, draw)
 {
 	struct {
 		struct invokes inv;
@@ -308,7 +308,7 @@
 	RX_REQUIRE(!table[6].inv.finish);
 }
 
-TEST_DECL(stack_finish)
+RX_TEST_CASE(stack, finish)
 {
 	struct {
 		struct invokes inv;
@@ -338,18 +338,18 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "update", basics_update),
-	TEST_DEF("basics", "draw", basics_draw),
-	TEST_DEF("basics", "end", basics_end),
-	TEST_DEF("basics", "finish", basics_finish),
-	TEST_DEF("stack", "add", stack_add),
-	TEST_DEF("stack", "update", stack_update),
-	TEST_DEF("stack", "draw", stack_draw),
-	TEST_DEF("stack", "finish", stack_finish)
+	TEST(basics, update),
+	TEST(basics, draw),
+	TEST(basics, end),
+	TEST(basics, finish),
+	TEST(stack, add),
+	TEST(stack, update),
+	TEST(stack, draw),
+	TEST(stack, finish),
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-error.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-error.c	Fri Apr 08 15:59:08 2022 +0200
@@ -20,18 +20,18 @@
 
 #include "test.h"
 
-TEST_DECL(basics_simple)
+RX_TEST_CASE(basics, simple)
 {
 	errorf("Failed: %d", 123);
 	RX_STR_REQUIRE_EQUAL("Failed: 123", error());
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "simple", basics_simple)
+	TEST(basics, simple)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-map.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-map.c	Fri Apr 08 15:59:08 2022 +0200
@@ -27,7 +27,7 @@
 
 #include "test.h"
 
-TEST_DECL(basics_sample)
+RX_TEST_CASE(basics, sample)
 {
 	struct map_file loader = {0};
 	struct map map = {0};
@@ -88,7 +88,7 @@
 	map_file_finish(&loader);
 }
 
-TEST_DECL(error_title)
+RX_TEST_CASE(error, title)
 {
 	struct map_file loader = {0};
 	struct map map = {0};
@@ -99,7 +99,7 @@
 	map_file_finish(&loader);
 }
 
-TEST_DECL(error_columns)
+RX_TEST_CASE(error, columns)
 {
 	struct map_file loader = {0};
 	struct map map = {0};
@@ -110,7 +110,7 @@
 	map_file_finish(&loader);
 }
 
-TEST_DECL(error_rows)
+RX_TEST_CASE(error, rows)
 {
 	struct map_file loader = {0};
 	struct map map = {0};
@@ -122,10 +122,10 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "sample", basics_sample),
-	TEST_DEF("error", "title", error_title),
-	TEST_DEF("error", "columns", error_columns),
-	TEST_DEF("error", "rows", error_rows)
+	TEST(basics, sample),
+	TEST(error, title),
+	TEST(error, columns),
+	TEST(error, rows)
 };
 
 int
@@ -140,5 +140,5 @@
 	if (core_init("fr.malikania", "test") < 0 || window_open("test-map", 100, 100) < 0)
 		return 1;
 
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-save-quest.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-save-quest.c	Fri Apr 08 15:59:08 2022 +0200
@@ -23,7 +23,7 @@
 
 #include "test.h"
 
-RX_SET_UP(basics_setup)
+RX_SET_UP(basics_set_up)
 {
 	if (save_open_path(RX_DATA, "quest.db", SAVE_MODE_WRITE) < 0)
 		return RX_ERROR;
@@ -31,13 +31,13 @@
 	return RX_SUCCESS;
 }
 
-RX_TEAR_DOWN(basics_teardown)
+RX_TEAR_DOWN(basics_tear_down)
 {
 	save_finish(RX_DATA);
 	remove("quest.db");
 }
 
-TEST_DECL(basics_load)
+RX_TEST_CASE(basics, load)
 {
 	struct quest_step steps[] = {
 		{
@@ -69,11 +69,11 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF_FIX("basics", "load", basics_load, struct save, basics_setup, basics_teardown)
+	TEST_FIXTURE(basics, load, struct save)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-save.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-save.c	Fri Apr 08 15:59:08 2022 +0200
@@ -23,13 +23,18 @@
 
 #include "test.h"
 
-RX_TEAR_DOWN(basics_teardown)
+RX_SET_UP(basics_set_up)
+{
+	return RX_SUCCESS;
+}
+
+RX_TEAR_DOWN(basics_tear_down)
 {
 	remove("1.db");
 	remove("2.db");
 }
 
-TEST_DECL(basics_read)
+RX_TEST_CASE(basics, read)
 {
 	struct save db;
 
@@ -38,7 +43,7 @@
 	save_finish(&db);
 }
 
-TEST_DECL(basics_write)
+RX_TEST_CASE(basics, write)
 {
 	struct save db[2] = {0};
 
@@ -131,12 +136,12 @@
 #endif
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF_FIX("basics", "read", basics_read, void *, NULL, basics_teardown),
-	TEST_DEF_FIX("basics", "write", basics_write, void *, NULL, basics_teardown)
+	TEST_FIXTURE(basics, read, void *),
+	TEST_FIXTURE(basics, write, void *)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv)
+	return TEST_RUN_ALL(tests, argc, argv)
 }
--- a/tests/test-state.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-state.c	Fri Apr 08 15:59:08 2022 +0200
@@ -38,14 +38,14 @@
 
 static struct state *states[16];
 
-RX_SET_UP(basics_setup)
+RX_SET_UP(basics_set_up)
 {
 	game_init(states, UTIL_SIZE(states));
 
 	return RX_SUCCESS;
 }
 
-RX_TEAR_DOWN(basics_teardown)
+RX_TEAR_DOWN(basics_tear_down)
 {
 	game_quit();
 }
@@ -114,7 +114,7 @@
 	.finish = my_finish \
 }
 
-TEST_DECL(basics_start)
+RX_TEST_CASE(basics, start)
 {
 	struct invokes inv = {0};
 	struct state state = INIT(&inv);
@@ -128,7 +128,7 @@
 	RX_UINT_REQUIRE_EQUAL(inv.finish, 0U);
 }
 
-TEST_DECL(basics_handle)
+RX_TEST_CASE(basics, handle)
 {
 	struct invokes inv = {0};
 	struct state state = INIT(&inv);
@@ -142,7 +142,7 @@
 	RX_UINT_REQUIRE_EQUAL(inv.finish, 0U);
 }
 
-TEST_DECL(basics_update)
+RX_TEST_CASE(basics, update)
 {
 	struct invokes inv = {0};
 	struct state state = INIT(&inv);
@@ -156,7 +156,7 @@
 	RX_UINT_REQUIRE_EQUAL(inv.finish, 0U);
 }
 
-TEST_DECL(basics_draw)
+RX_TEST_CASE(basics, draw)
 {
 	struct invokes inv = {0};
 	struct state state = INIT(&inv);
@@ -170,7 +170,7 @@
 	RX_UINT_REQUIRE_EQUAL(inv.finish, 0U);
 }
 
-TEST_DECL(basics_end)
+RX_TEST_CASE(basics, end)
 {
 	struct invokes inv = {0};
 	struct state state = INIT(&inv);
@@ -184,7 +184,7 @@
 	RX_UINT_REQUIRE_EQUAL(inv.finish, 0U);
 }
 
-TEST_DECL(basics_finish)
+RX_TEST_CASE(basics, finish)
 {
 	struct invokes inv = {0};
 	struct state state = INIT(&inv);
@@ -198,7 +198,7 @@
 	RX_UINT_REQUIRE_EQUAL(inv.finish, 1U);
 }
 
-TEST_DECL(basics_game)
+RX_TEST_CASE(basics, game)
 {
 	static struct {
 		struct invokes inv;
@@ -322,17 +322,17 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "start", basics_start),
-	TEST_DEF("basics", "handle", basics_handle),
-	TEST_DEF("basics", "update", basics_update),
-	TEST_DEF("basics", "draw", basics_draw),
-	TEST_DEF("basics", "end", basics_end),
-	TEST_DEF("basics", "finish", basics_finish),
-	TEST_DEF_FIX("basics", "game", basics_game, void *, basics_setup, basics_teardown)
+	TEST(basics, start),
+	TEST(basics, handle),
+	TEST(basics, update),
+	TEST(basics, draw),
+	TEST(basics, end),
+	TEST(basics, finish),
+	TEST_FIXTURE(basics, game, void *)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-tileset.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-tileset.c	Fri Apr 08 15:59:08 2022 +0200
@@ -24,7 +24,7 @@
 
 #include "test.h"
 
-TEST_DECL(basics_sample)
+RX_TEST_CASE(basics, sample)
 {
 	struct tileset_file loader = {0};
 	struct tileset tileset;
@@ -62,7 +62,7 @@
 	tileset_file_finish(&loader);
 }
 
-TEST_DECL(error_tilewidth)
+RX_TEST_CASE(error, tilewidth)
 {
 	struct tileset_file loader = {0};
 	struct tileset tileset = {0};
@@ -70,7 +70,7 @@
 	RX_INT_REQUIRE_EQUAL(tileset_file_open(&loader, &tileset, DIRECTORY "/maps/error-tilewidth.tileset"), -1);
 }
 
-TEST_DECL(error_tileheight)
+RX_TEST_CASE(error, tileheight)
 {
 	struct tileset_file loader = {0};
 	struct tileset tileset = {0};
@@ -78,7 +78,7 @@
 	RX_INT_REQUIRE_EQUAL(tileset_file_open(&loader, &tileset, DIRECTORY "/maps/error-tileheight.tileset"), -1);
 }
 
-TEST_DECL(error_image)
+RX_TEST_CASE(error, image)
 {
 	struct tileset_file loader = {0};
 	struct tileset tileset = {0};
@@ -87,10 +87,10 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "sample", basics_sample),
-	TEST_DEF("error", "tilewidth", error_tilewidth),
-	TEST_DEF("error", "tileheight", error_tileheight),
-	TEST_DEF("error", "image", error_image),
+	TEST(basics, sample),
+	TEST(error, tilewidth),
+	TEST(error, tileheight),
+	TEST(error, image)
 };
 
 int
@@ -99,5 +99,5 @@
 	if (core_init("fr.malikania", "test") < 0 || window_open("test-tileset", 100, 100) < 0)
 		return 1;
 
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-util.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-util.c	Fri Apr 08 15:59:08 2022 +0200
@@ -20,7 +20,7 @@
 
 #include "test.h"
 
-TEST_DECL(test_nrand)
+RX_TEST_CASE(basics, nrand)
 {
 	int found[10] = {0};
 
@@ -40,11 +40,11 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF("basics", "nrand", test_nrand)
+	TEST(basics, nrand)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-vfs-directory.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-vfs-directory.c	Fri Apr 08 15:59:08 2022 +0200
@@ -21,19 +21,22 @@
 
 #include "test.h"
 
-RX_SET_UP(setup)
+RX_SET_UP(basics_set_up)
 {
 	vfs_directory(RX_DATA, DIRECTORY "/vfs/directory");
 
 	return RX_SUCCESS;
 }
 
-RX_TEAR_DOWN(teardown)
+RX_TEAR_DOWN(basics_tear_down)
 {
 	vfs_finish(RX_DATA);
 }
 
-TEST_DECL(basics_read)
+#define error_set_up basics_set_up
+#define error_tear_down basics_tear_down
+
+RX_TEST_CASE(basics, read)
 {
 	struct vfs_file file;
 	char data[256] = {0};
@@ -43,7 +46,7 @@
 	RX_STR_REQUIRE_EQUAL(data, "Hello World!\n");
 }
 
-TEST_DECL(error_notfound)
+RX_TEST_CASE(error, notfound)
 {
 	struct vfs_file file;
 
@@ -51,12 +54,12 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF_FIX("basics", "read", basics_read, struct vfs, setup, teardown),
-	TEST_DEF_FIX("error", "notfound", error_notfound, struct vfs, setup, teardown)
+	TEST_FIXTURE(basics, read, struct vfs),
+	TEST_FIXTURE(error, notfound, struct vfs)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test-vfs-zip.c	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test-vfs-zip.c	Fri Apr 08 15:59:08 2022 +0200
@@ -21,7 +21,7 @@
 
 #include "test.h"
 
-RX_SET_UP(setup)
+RX_SET_UP(basics_set_up)
 {
 	if (vfs_zip(RX_DATA, DIRECTORY "/vfs/data.zip", "r") < 0)
 		return RX_ERROR;
@@ -29,12 +29,15 @@
 	return RX_SUCCESS;
 }
 
-RX_TEAR_DOWN(teardown)
+RX_TEAR_DOWN(basics_tear_down)
 {
 	vfs_finish(RX_DATA);
 }
 
-TEST_DECL(basics_read)
+#define error_set_up basics_set_up
+#define error_tear_down basics_tear_down
+
+RX_TEST_CASE(basics, read)
 {
 	struct vfs_file file;
 	char data[256] = {0};
@@ -44,7 +47,7 @@
 	RX_STR_REQUIRE_EQUAL(data, "Hello from zip file!\n");
 }
 
-TEST_DECL(error_notfound)
+RX_TEST_CASE(error, notfound)
 {
 	struct vfs_file file;
 
@@ -52,12 +55,12 @@
 }
 
 static const struct rx_test_case tests[] = {
-	TEST_DEF_FIX("basics", "read", basics_read, struct vfs, setup, teardown),
-	TEST_DEF_FIX("error", "notfound", error_notfound, struct vfs, setup, teardown),
+	TEST_FIXTURE(basics, read, struct vfs),
+	TEST_FIXTURE(error, notfound, struct vfs)
 };
 
 int
 main(int argc, char **argv)
 {
-	return TEST_RUN(tests, argc, argv);
+	return TEST_RUN_ALL(tests, argc, argv);
 }
--- a/tests/test.h	Wed Apr 06 12:09:25 2022 +0200
+++ b/tests/test.h	Fri Apr 08 15:59:08 2022 +0200
@@ -16,34 +16,31 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#define RX_DISABLE_TEST_DISCOVERY
 #include <rexo.h>
 
 #include <core/util.h>
 
-#define TEST_DECL(name)                                                 \
-static void                                                             \
-name(struct rx_context *RX_PARAM_CONTEXT, void *RX_PARAM_DATA)
-
-#define TEST_DEF(s, n, f)                                               \
+#define TEST(s, n)                                                      \
 {                                                                       \
-        .suite_name = s,                                                \
-        .name = n,                                                      \
-        .run = f                                                        \
+        .suite_name = #s,                                               \
+        .name = #n,                                                     \
+        .run = s##_##n                                                  \
 }
 
-#define TEST_DEF_FIX(s, n, f, type, up, down)                           \
+#define TEST_FIXTURE(s, n, t)                                           \
 {                                                                       \
-        .suite_name = s,                                                \
-        .name = n,                                                      \
-        .run = f,                                                       \
+        .suite_name = #s,                                               \
+        .name = #n,                                                     \
+        .run = s##_##n,                                                 \
         .config.fixture = {                                             \
-                .size = sizeof (type),                                  \
+                .size = sizeof (t),                                     \
                 .config = {                                             \
-                        .set_up = up,                                   \
-                        .tear_down = down                               \
+                        .set_up = s##_set_up,                           \
+                        .tear_down = s##_tear_down                      \
                 }                                                       \
         }                                                               \
 }
 
-#define TEST_RUN(tests, argc, argv)                                     \
+#define TEST_RUN_ALL(tests, argc, argv)                                 \
         rx_main(UTIL_SIZE(tests), tests, argc, (const char **)argv) == RX_SUCCESS ? 0 : 1;