#include "test.h" #include #include #include #include static jmp_buf s_testJmp; static const char* s_failMsg; static char* s_logOutput = NULL; 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); } } void assert_log(const char* expected, const char* msg) { assert_str(expected, s_logOutput, msg); } static void log_append(const char* msg) { size_t oldLen = s_logOutput ? strlen(s_logOutput) : 0; size_t newLen = oldLen + strlen(msg) + 1; char* newOutput = malloc(newLen); if (newOutput) { if (s_logOutput) { strcpy(newOutput, s_logOutput); free(s_logOutput); } else { newOutput[0] = '\0'; } strcat(newOutput, msg); s_logOutput = newOutput; } } static void log_clear() { free(s_logOutput); s_logOutput = NULL; } 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}, {"log_on_line", test_log_on_line}, }; 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++) { log_set_output(log_append); printf("%s...", s_tests[i].name); s_failMsg = NULL; if (setjmp(s_testJmp) == 0) { log_clear(); 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; }