1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/* ==========================================================================
Licensed under BSD 2clause license. See LICENSE file for more information
Author: Michał Łyszczek <michal.lyszczek@bofc.pl>
========================================================================== */
/* ==== mtest version v0.2.0 ================================================ */
/* ==========================================================================
Tests uses simple TAP output format (http://testanything.org)
========================================================================== */
/* ==== include files ======================================================= */
#include <stdio.h>
/* ==== public macros ======================================================= */
/* ==========================================================================
macro with definitions, call this macro no more and no less than ONCE in
global scope. Its task is to define some variables used by mtest macros.
========================================================================== */
#define mt_defs() \
const char *curr_test; \
int mt_test_status; \
int mt_total_tests = 0; \
int mt_total_failed = 0
/* ==========================================================================
macro with extern declarations of variables defined by mt_defs(). This
macro should be called in any .c file, that uses mt_* function and does
not have mt_defs() called in.
========================================================================== */
#define mt_defs_ext() \
extern const char *curr_test; \
extern int mt_test_status; \
extern int mt_total_tests; \
extern int mt_total_failed;
/* ==========================================================================
macro runs test 'f'. 'f' is just a function (without parenthesis ()).
========================================================================== */
#define mt_run(f) do { \
curr_test = #f; \
mt_test_status = 0; \
++mt_total_tests; \
f(); \
if (mt_test_status != 0) \
{ \
fprintf(stdout, "not ok %d - %s\n", mt_total_tests, curr_test); \
++mt_total_failed; \
} \
else \
fprintf(stdout, "ok %d - %s\n", mt_total_tests, curr_test); \
} while(0)
/* ==========================================================================
simple assert, when expression 'e' is evaluated to false, assert message
will be logged, and macro will force function to return
========================================================================== */
#define mt_assert(e) do { \
if (!(e)) \
{ \
fprintf(stdout, "# assert [%s:%d] %s, %s\n", \
__FILE__, __LINE__, curr_test, #e); \
mt_test_status = -1; \
return; \
} } while (0)
/* ==========================================================================
same as mt_assert, but function is not forced to return, and test can
continue
========================================================================== */
#define mt_fail(e) do { \
if (!(e)) \
{ \
fprintf(stdout, "# assert [%s:%d] %s, %s\n", \
__FILE__, __LINE__, curr_test, #e); \
mt_test_status = -1; \
} } while (0)
/* ==========================================================================
shortcut macro to test if function exits with success (with return value
set to 0)
========================================================================== */
#define mt_fok(e) mt_fail(e == 0)
/* ==========================================================================
shortcut macro to test if function fails as expected, with return code
set to -1, and expected errno errn
========================================================================== */
#define mt_ferr(e, errn) do { \
errno = 0; \
mt_fail(e == -1); \
mt_fail(errno == errn); \
} while (0)
/* ==========================================================================
prints test plan, in format 1..<number_of_test_run>. If all tests have
passed, macro will return current function with code 0, else it returns
number of failed tests. If number of failed tests exceeds 254, then 254
will be returned
========================================================================== */
#define mt_return() do { \
fprintf(stdout, "1..%d\n", mt_total_tests); \
return mt_total_failed > 254 ? 254 : mt_total_failed; } while(0)
|