#include #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)\x1B[0m\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); RUN_TEST(utf8_unit1); RUN_TEST(utf8_random); RUN_TEST(utf8_random_valid); RUN_TEST(utf8_exhaustive_1); return 0; } static unsigned int random_seed_from_device(void) { FILE *f = fopen("/dev/urandom", "r"); if (!f) { fprintf(stderr, "Cannot open /dev/urandom\n"); exit(1); } unsigned int seed; int nread = fread(&seed, 1, sizeof seed, f); if (nread < (int)sizeof seed) { fprintf(stderr, "Cannot read from /dev/urandom\n"); exit(1); } fclose(f); return seed; } int main(void) { unsigned int seed; const char *seed_env_var = getenv("SEED"); if (seed_env_var && seed_env_var[0]) { seed = strtol(seed_env_var, NULL, 10); } else { seed = random_seed_from_device(); } fprintf(stderr, "seed = %u\n", seed); srandom(seed); return run_tests(); }