db_updater: Put parentheses back
[merlin.git] / test_utils.c
blob79eb0b8c0a7fd0c5fc4b7f8b77920279b6bb7591
1 #include "shared.h"
2 #include "colors.h"
3 #include "test_utils.h"
5 const char *cyan = "", *red = "", *green = "", *yellow = "", *reset = "";
6 uint passed, failed, t_verbose = 0;
7 static uint t_depth;
8 static const char *indent_str = " ";
10 /* can't be used when a or b has side-effects, but we don't care here */
11 #define max(a, b) (a > b ? a : b)
12 #define min(a, b) (a < b ? a : b)
13 #define delta(a, b) ((max(a, b) - (min(a, b))))
16 void t_set_colors(int force)
18 if (force == 1 || isatty(fileno(stdout))) {
19 cyan = CLR_CYAN;
20 red = CLR_RED;
21 yellow = CLR_YELLOW;
22 green = CLR_GREEN;
23 reset = CLR_RESET;
27 static void t_indent(uint depth)
29 uint i;
30 for (i = 0; i < depth; i++) {
31 printf("%s", indent_str);
35 void t_start(const char *fmt, ...)
37 va_list ap;
39 t_indent(t_depth++);
40 va_start(ap, fmt);
41 printf("%s### ", cyan);
42 vfprintf(stdout, fmt, ap);
43 printf("%s\n", reset);
44 va_end(ap);
47 int t_end(void)
49 if (t_depth)
50 t_depth--;
51 if (!t_depth || failed) {
52 t_indent(t_depth);
53 printf("Test results: %s%u passed%s, %s%u failed%s\n",
54 green, passed, reset, failed ? red : "", failed, failed ? reset : "");
57 return failed ? EXIT_FAILURE : EXIT_SUCCESS;
60 void t_pass(const char *fmt, ...)
62 va_list ap;
64 passed++;
65 if (!t_verbose)
66 return;
67 t_indent(t_depth);
68 printf("%sPASS%s ", green, reset);
69 va_start(ap, fmt);
70 vfprintf(stdout, fmt, ap);
71 va_end(ap);
72 putchar('\n');
75 void t_fail(const char *fmt, ...)
77 va_list ap;
79 failed++;
80 t_indent(t_depth);
81 printf("%sFAIL%s ", red, reset);
82 va_start(ap, fmt);
83 vfprintf(stdout, fmt, ap);
84 va_end(ap);
85 putchar('\n');
88 void t_diag(const char *fmt, ...)
90 if (fmt) {
91 va_list ap;
92 t_indent(t_depth + 1);
93 va_start(ap, fmt);
94 vfprintf(stdout, fmt, ap);
95 va_end(ap);
96 putchar('\n');
100 int ok_int(int a, int b, const char *name)
102 if (a == b) {
103 t_pass("%s", name);
104 return TEST_PASS;
107 t_fail("%s", name);
108 t_diag("%d != %d. delta: %d", a, b, delta(a, b));
109 return TEST_FAIL;
112 int ok_uint(uint a, uint b, const char *name)
114 if (a == b) {
115 t_pass("%s", name);
116 return TEST_PASS;
119 t_fail("%s", name);
120 t_diag("%u != %u. delta: %u", a, b, delta(a, b));
121 return TEST_FAIL;
124 int ok_str(const char *a, const char *b, const char *name)
126 if ((!a && !b) || (a && b && !strcmp(a, b))) {
127 t_pass("%s", name);
128 return TEST_PASS;
131 t_fail("%s", name);
132 t_diag("'%s' != '%s'", a, b);
133 return TEST_FAIL;
136 void __attribute__((__noreturn__)) crash(const char *fmt, ...)
138 va_list ap;
140 va_start(ap, fmt);
141 vfprintf(stderr, fmt, ap);
142 va_end(ap);
143 fputc('\n', stderr);
145 exit(1);