From e2e9ad1d82241e887d2b6f075864a56926921019 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Mon, 29 Jun 2020 21:04:01 -0300 Subject: [PATCH] Added dependency `utkarshkukreti/check.c` for tests --- c/check.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 c/check.h diff --git a/c/check.h b/c/check.h new file mode 100644 index 0000000..aa79b50 --- /dev/null +++ b/c/check.h @@ -0,0 +1,69 @@ +#ifndef CHECK_H +#define CHECK_H + +#include + +static int check_passed = 0, check_failed = 0, check_skipped = 0, + current_level = 0; + +// Unicode characters, to make output pretty. +static const char *tick = "\u2713", + *cross = "\u2717", + *arrow = "\u2794"; + +// ANSI Escape Sequences +static const char *red = "\x1b[31m", + *green = "\x1b[32m", + *blue = "\x1b[34m", + *end = "\x1b[0m"; + +#define describe(message, block) do {\ + int skip = 0; \ + indent(current_level); \ + printf("%s%s %s%s\n", blue, arrow, message, end); \ + current_level++; \ + block; \ + current_level--; \ + (void)skip; \ +} while(0); + +#define context describe +#define it describe + +#define check(expr) checkm((expr), #expr); + +#define checkm(expr, message) do {\ + indent(current_level); \ + if(skip) { \ + printf("%s? %s%s\n", blue, message, end); \ + check_skipped++; \ + } else {\ + if((expr)) {\ + printf("%s%s %s\n", green, tick, message); \ + check_passed++; \ + } else {\ + printf("%s%s %s (%s:%d)\n", red, cross, message, __FILE__, __LINE__); \ + check_failed++; \ + skip = 1; \ + } \ + } \ +} while(0); + +static void indent(int level) { + while(level--) { + printf(" "); + } +} + +static inline void check_print_stats() { + printf("\n%s %s %d assertions, %d passed, %d skipped, %d failed.%s\n", + check_failed ? red : check_skipped ? blue : green, + check_failed ? cross : tick, + check_passed + check_failed + check_skipped, + check_passed, + check_skipped, + check_failed, + end); +} + +#endif