#include "test.h" #include #include #include #include static bool any_failure = false; void test_fail(const char *fmt, ...) { any_failure = true; fprintf(stderr, "\x1b[1m\x1b[91mFailure:\x1b[0m "); va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); } static const char *test_dir; #include char **list_dir(const char *dir_name, const char *suffix) { char *dir_path = malloc(strlen(test_dir) + strlen(dir_name) + 8); sprintf(dir_path, "%s/%s", test_dir, dir_name); DIR *dir = opendir(dir_path); if (!dir) { test_fail("Couldn't open test directory %s", dir_path); return NULL; } struct dirent *ent; size_t entries = 0; while ((ent = readdir(dir))) entries++; rewinddir(dir); char **listing = calloc(entries + 1, sizeof (char *)); size_t i = 0; while ((ent = readdir(dir))) { const char *name = ent->d_name; if (strlen(name) < strlen(suffix) || strcmp(name+strlen(name)-strlen(suffix), suffix) != 0 || i >= entries) { continue; } char *path = malloc(strlen(dir_path) + strlen(name) + 8); sprintf(path, "%s/%s", dir_path, name); listing[i++] = path; } closedir(dir); free(dir_path); return listing; } void free_listing(char **listing) { for (size_t i = 0; listing[i]; i++) { free(listing[i]); } free(listing); } int main(int argc, char **argv) { if (argc > 2 || (argc == 2 && strcmp(argv[1], "--help") == 0)) { printf("usage: tests [TEST DIRECTORY]\n"); return EXIT_FAILURE; } test_dir = argc == 2 ? argv[1] : "../tests"; test_parsing(); test_errors(); test_location(); test_interpretation(); if (any_failure) { fprintf(stderr, "\x1b[1m\x1b[91mSome tests failed.\x1b[0m\n"); return EXIT_FAILURE; } else { printf("\x1b[1m\x1b[92mAll tests OK\x1b[0m\n"); return 0; } }