# Testing --- ## Macros ```c TEST(NAME) { // TEST BODY } ASSERT(CONDITION, FAIL_STRING) FAIL(FAIL_STRING) ``` ## Object Definitions ```c typedef struct { const char *name; kpl_error error; } kpl_test; // TODO STORE ERRORS FOR PRINT AT END #define _TEST_FN(NAME) static void kpl_test_fn_##NAME([[gnu::constructor]] kpl_test *_test) #define TEST(NAME) \ _TEST_FN(NAME); \ [[gnu::constructor]] static void _kpl_test_constructor_##NAME(void) { \ kpl_test _test = { .name = #NAME; .error = nullptr }; \ kpl_test_fn_##NAME(&test); \ if (_test.error) { \ /* TODO STORE ERROR */ \ } \ /* TODO PRINT STATUS */ \ } \ _TEST_FN(NAME) // TODO ASSERT // TODO FAIL ```