#include "test.h" #include #include #include static jmp_buf s_testJmp; static const char* s_failMsg; void fail(const char* msg) { s_failMsg = msg; longjmp(s_testJmp, 1); } void assert_not_null(void* ptr, const char* msg) { if (ptr == NULL) { fail(msg); } } void assert_str(const char* expected, const char* actual, const char* msg) { if (expected == NULL || actual == NULL || strcmp(expected, actual) != 0) { fail(msg); } } typedef struct { const char* name; Test func; } TestCase; #include "test_token.c" #include "test_parser.c" #include "test_log.c" static int s_totalTests; static int s_greenTests; static TestCase s_tests[] = { {"tokenstream_open_fail", test_tokenstream_open_fail}, {"tokenstream_simple_keyword", test_tokenstream_simple_keyword}, {"tokenstream_keywords_and_symbols", test_tokenstream_keywords_and_symbols}, {"tokenstream_parentheses_and_brackets", test_tokenstream_parentheses_and_brackets}, {"tokenstream_comma", test_tokenstream_comma}, {"tokenstream_whitespace_ignored", test_tokenstream_whitespace_ignored}, {"tokenstream_void_function_signature", test_tokenstream_void_function_signature}, {"tokenstream_info", test_tokenstream_info}, {"parser_module_name", test_parser_module_name}, {"log_error", test_log_error}, }; int main(int argc, char** argv) { (void)argc; (void)argv; s_totalTests = sizeof(s_tests) / sizeof(s_tests[0]); s_greenTests = 0; const char* failedTests[s_totalTests + 1]; int failedCount = 0; for (int i = 0; i < s_totalTests; i++) { printf("%s...", s_tests[i].name); s_failMsg = NULL; if (setjmp(s_testJmp) == 0) { s_tests[i].func(); printf(" [OK]\n"); s_greenTests++; } else { printf(" [FAIL]: %s\n", s_failMsg ? s_failMsg : ""); failedTests[failedCount++] = s_tests[i].name; } } if (failedCount > 0) { printf("\nFailed tests:\n"); for (int i = 0; i < failedCount; i++) { printf(" - %s\n", failedTests[i]); } } printf("\n%d/%d tests passed.\n", s_greenTests, s_totalTests); return failedCount > 0 ? 1 : 0; }