3 #include "test_utils.h"
5 const char *cyan
= "", *red
= "", *green
= "", *yellow
= "", *reset
= "";
6 uint passed
, failed
, t_verbose
= 0;
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
))) {
27 static void t_indent(uint depth
)
30 for (i
= 0; i
< depth
; i
++) {
31 printf("%s", indent_str
);
35 void t_start(const char *fmt
, ...)
41 printf("%s### ", cyan
);
42 vfprintf(stdout
, fmt
, ap
);
43 printf("%s\n", reset
);
51 if (!t_depth
|| failed
) {
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
, ...)
68 printf("%sPASS%s ", green
, reset
);
70 vfprintf(stdout
, fmt
, ap
);
75 void t_fail(const char *fmt
, ...)
81 printf("%sFAIL%s ", red
, reset
);
83 vfprintf(stdout
, fmt
, ap
);
88 void t_diag(const char *fmt
, ...)
92 t_indent(t_depth
+ 1);
94 vfprintf(stdout
, fmt
, ap
);
100 int ok_int(int a
, int b
, const char *name
)
108 t_diag("%d != %d. delta: %d", a
, b
, delta(a
, b
));
112 int ok_uint(uint a
, uint b
, const char *name
)
120 t_diag("%u != %u. delta: %u", a
, b
, delta(a
, b
));
124 int ok_str(const char *a
, const char *b
, const char *name
)
126 if ((!a
&& !b
) || (a
&& b
&& !strcmp(a
, b
))) {
132 t_diag("'%s' != '%s'", a
, b
);
136 void __attribute__((__noreturn__
)) crash(const char *fmt
, ...)
141 vfprintf(stderr
, fmt
, ap
);