#pragma once #include #include static int _t_pass = 0, _t_fail = 0; static const char *_t_current = ""; #define T_RUN(fn) do { \ _t_current = #fn; \ int _before = _t_fail; \ fn(); \ fprintf(stderr, " %-48s %s\n", #fn, (_t_fail == _before) ? "ok" : "FAIL"); \ } while(0) #define T_CHECK(expr) do { \ if (expr) { _t_pass++; } \ else { _t_fail++; \ fprintf(stderr, " check failed: %s (%s:%d)\n", #expr, __FILE__, __LINE__); } \ } while(0) #define T_EQ(a,b) T_CHECK((a) == (b)) #define T_NEQ(a,b) T_CHECK((a) != (b)) #define T_GE(a,b) T_CHECK((a) >= (b)) #define T_LE(a,b) T_CHECK((a) <= (b)) #define T_GT(a,b) T_CHECK((a) > (b)) #define T_SUMMARY() do { \ fprintf(stderr, "\n%d passed %d failed\n", _t_pass, _t_fail); \ return _t_fail ? 1 : 0; \ } while(0) #define T_SECTION(name) fprintf(stderr, "\n%s\n", name) #define T_SKIP(reason) do { \ fprintf(stderr, " SKIP: %s\n", reason); \ return 0; \ } while(0)