/** * @file test_common.h * @brief 最小 C 测试框架 — 无外部依赖 * * 用法: * #include "test_common.h" * TEST(test_name) { ASSERT_EQ(a, b); } * int main(void) { RUN_ALL; return 0; } */ #ifndef TEST_COMMON_H #define TEST_COMMON_H #include #include #include #include /* ── 断言 ── */ static int __test_pass = 0; static int __test_fail = 0; static const char *__current_test = ""; #define ASSERT_EQ(a, b) do { if ((a) != (b)) { \ printf(" FAIL %s:%d: ASSERT_EQ(%s, %s) — actual=%ld expected=%ld\n", \ __FILE__, __LINE__, #a, #b, (long)(a), (long)(b)); __test_fail++; return; } \ } while(0) #define ASSERT_EQ_U(a, b) do { if ((a) != (b)) { \ printf(" FAIL %s:%d: ASSERT_EQ(%s, %s) — actual=%lu expected=%lu\n", \ __FILE__, __LINE__, #a, #b, (unsigned long)(a), (unsigned long)(b)); __test_fail++; return; } \ } while(0) #define ASSERT_NEQ(a, b) do { if ((a) == (b)) { \ printf(" FAIL %s:%d: ASSERT_NEQ(%s, %s) — both=%ld\n", \ __FILE__, __LINE__, #a, #b, (long)(a)); __test_fail++; return; } \ } while(0) #define ASSERT_TRUE(cond) do { if (!(cond)) { \ printf(" FAIL %s:%d: ASSERT_TRUE(%s) — false\n", \ __FILE__, __LINE__, #cond); __test_fail++; return; } \ } while(0) #define ASSERT_FALSE(cond) do { if (cond) { \ printf(" FAIL %s:%d: ASSERT_FALSE(%s) — true\n", \ __FILE__, __LINE__, #cond); __test_fail++; return; } \ } while(0) #define ASSERT_STR_EQ(a, b) do { if (strcmp((a), (b)) != 0) { \ printf(" FAIL %s:%d: ASSERT_STR_EQ — actual=\"%s\" expected=\"%s\"\n", \ __FILE__, __LINE__, (a), (b)); __test_fail++; return; } \ } while(0) #define ASSERT_FLOAT_EQ(a, b, tol) do { if (fabs((a)-(b)) > (tol)) { \ printf(" FAIL %s:%d: ASSERT_FLOAT_EQ — actual=%f expected=%f\n", \ __FILE__, __LINE__, (double)(a), (double)(b)); __test_fail++; return; } \ } while(0) /* ── 测试注册 ── */ #define TEST(name) static void test_##name(void) #define RUN_TEST(name) do { \ __current_test = #name; \ printf(" [TEST] %s\n", #name); \ test_##name(); \ if (__test_fail) printf(" [FAIL] %s\n", #name); \ else printf(" [PASS] %s\n", #name); \ } while(0) #define RUN_ALL do { \ printf("\n=== Running Tests ===\n\n"); \ __test_fail = 0; \ TEST_LIST \ printf("\n=== Results: %d passed, %d failed ===\n", \ __test_pass, __test_fail); \ } while(0) #endif /* TEST_COMMON_H */