#include #include #include #include "test_framework.h" #include "test_declarations.h" #define STR_(x) #x #define STR(x) STR_(x) // Referred to via extern in 'test_framework.c' atomic_flag test_framework_assertion_failed = ATOMIC_FLAG_INIT; static void report(const char *clr, const char *label, const char *name, clock_t taken) { printf("\x1B[%sm[%s] %s (%lfs)\n", clr, label, name, (double)taken / CLOCKS_PER_SEC); } static void report_success(const char *name, clock_t taken) { report("32", " OK ", name, taken); } static void report_failure(const char *name, clock_t taken) { report("31", "FAILED", name, taken); } #define RUN_TEST(name) do { \ atomic_flag_clear(&test_framework_assertion_failed); \ const clock_t start_ = clock(); \ const int ret_ = TEST(name)(); \ const clock_t diff_ = clock() - start_; \ if (ret_ == 0 && !atomic_flag_test_and_set(&test_framework_assertion_failed)) { \ report_success(STR(name), diff_); \ } else { \ report_failure(STR(name), diff_); \ return 1; \ } \ } while (0) static int run_tests(void) { RUN_TEST(hashtable_unit1); RUN_TEST(hashtable); return 0; } int main(void) { return run_tests(); }