]>
Commit | Line | Data |
---|---|---|
e8a92fe1 RB |
1 | /* |
2 | * Copyright (c) Vicent Marti. All rights reserved. | |
3 | * | |
4 | * This file is part of clar, distributed under the ISC license. | |
5 | * For full terms see the included COPYING file. | |
6 | */ | |
2e6f06a8 VM |
7 | #ifndef __CLAR_TEST_H__ |
8 | #define __CLAR_TEST_H__ | |
9 | ||
10 | #include <stdlib.h> | |
11 | ||
0f65733b VM |
12 | enum cl_test_status { |
13 | CL_TEST_OK, | |
14 | CL_TEST_FAILURE, | |
15 | CL_TEST_SKIP | |
16 | }; | |
17 | ||
10be94e9 ET |
18 | void clar_test_init(int argc, char *argv[]); |
19 | int clar_test_run(void); | |
20 | void clar_test_shutdown(void); | |
21 | ||
2e6f06a8 VM |
22 | int clar_test(int argc, char *argv[]); |
23 | ||
10be94e9 ET |
24 | const char *clar_sandbox_path(void); |
25 | ||
2e6f06a8 VM |
26 | void cl_set_cleanup(void (*cleanup)(void *), void *opaque); |
27 | void cl_fs_cleanup(void); | |
28 | ||
cfcb346d ET |
29 | /** |
30 | * cl_trace_* is a hook to provide a simple global tracing | |
31 | * mechanism. | |
32 | * | |
33 | * The goal here is to let main() provide clar-proper | |
34 | * with a callback to optionally write log info for | |
35 | * test operations into the same stream used by their | |
36 | * actual tests. This would let them print test names | |
37 | * and maybe performance data as they choose. | |
38 | * | |
39 | * The goal is NOT to alter the flow of control or to | |
40 | * override test selection/skipping. (So the callback | |
41 | * does not return a value.) | |
42 | * | |
43 | * The goal is NOT to duplicate the existing | |
44 | * pass/fail/skip reporting. (So the callback | |
45 | * does not accept a status/errorcode argument.) | |
46 | * | |
47 | */ | |
48 | typedef enum cl_trace_event { | |
49 | CL_TRACE__SUITE_BEGIN, | |
50 | CL_TRACE__SUITE_END, | |
51 | CL_TRACE__TEST__BEGIN, | |
52 | CL_TRACE__TEST__END, | |
53 | CL_TRACE__TEST__RUN_BEGIN, | |
54 | CL_TRACE__TEST__RUN_END, | |
55 | CL_TRACE__TEST__LONGJMP, | |
56 | } cl_trace_event; | |
57 | ||
58 | typedef void (cl_trace_cb)( | |
59 | cl_trace_event ev, | |
60 | const char *suite_name, | |
61 | const char *test_name, | |
62 | void *payload); | |
63 | ||
64 | /** | |
65 | * Register a callback into CLAR to send global trace events. | |
66 | * Pass NULL to disable. | |
67 | */ | |
68 | void cl_trace_register(cl_trace_cb *cb, void *payload); | |
69 | ||
70 | ||
2e6f06a8 VM |
71 | #ifdef CLAR_FIXTURE_PATH |
72 | const char *cl_fixture(const char *fixture_name); | |
73 | void cl_fixture_sandbox(const char *fixture_name); | |
74 | void cl_fixture_cleanup(const char *fixture_name); | |
75 | #endif | |
76 | ||
77 | /** | |
78 | * Assertion macros with explicit error message | |
79 | */ | |
80 | #define cl_must_pass_(expr, desc) clar__assert((expr) >= 0, __FILE__, __LINE__, "Function call failed: " #expr, desc, 1) | |
81 | #define cl_must_fail_(expr, desc) clar__assert((expr) < 0, __FILE__, __LINE__, "Expected function call to fail: " #expr, desc, 1) | |
82 | #define cl_assert_(expr, desc) clar__assert((expr) != 0, __FILE__, __LINE__, "Expression is not true: " #expr, desc, 1) | |
83 | ||
84 | /** | |
85 | * Check macros with explicit error message | |
86 | */ | |
87 | #define cl_check_pass_(expr, desc) clar__assert((expr) >= 0, __FILE__, __LINE__, "Function call failed: " #expr, desc, 0) | |
88 | #define cl_check_fail_(expr, desc) clar__assert((expr) < 0, __FILE__, __LINE__, "Expected function call to fail: " #expr, desc, 0) | |
89 | #define cl_check_(expr, desc) clar__assert((expr) != 0, __FILE__, __LINE__, "Expression is not true: " #expr, desc, 0) | |
90 | ||
91 | /** | |
92 | * Assertion macros with no error message | |
93 | */ | |
94 | #define cl_must_pass(expr) cl_must_pass_(expr, NULL) | |
95 | #define cl_must_fail(expr) cl_must_fail_(expr, NULL) | |
96 | #define cl_assert(expr) cl_assert_(expr, NULL) | |
97 | ||
98 | /** | |
99 | * Check macros with no error message | |
100 | */ | |
101 | #define cl_check_pass(expr) cl_check_pass_(expr, NULL) | |
102 | #define cl_check_fail(expr) cl_check_fail_(expr, NULL) | |
103 | #define cl_check(expr) cl_check_(expr, NULL) | |
104 | ||
105 | /** | |
106 | * Forced failure/warning | |
107 | */ | |
7202ec29 RB |
108 | #define cl_fail(desc) clar__fail(__FILE__, __LINE__, "Test failed.", desc, 1) |
109 | #define cl_warning(desc) clar__fail(__FILE__, __LINE__, "Warning during test execution:", desc, 0) | |
2e6f06a8 | 110 | |
0f65733b VM |
111 | #define cl_skip() clar__skip() |
112 | ||
2e6f06a8 VM |
113 | /** |
114 | * Typed assertion macros | |
115 | */ | |
cf94024c RB |
116 | #define cl_assert_equal_s(s1,s2) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2, 1, "%s", (s1), (s2)) |
117 | #define cl_assert_equal_s_(s1,s2,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%s", (s1), (s2)) | |
7202ec29 | 118 | |
09debe12 ET |
119 | #define cl_assert_equal_wcs(wcs1,wcs2) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2, 1, "%ls", (wcs1), (wcs2)) |
120 | #define cl_assert_equal_wcs_(wcs1,wcs2,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%ls", (wcs1), (wcs2)) | |
121 | ||
dd954a37 ET |
122 | #define cl_assert_equal_strn(s1,s2,len) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2, 1, "%.*s", (s1), (s2), (int)(len)) |
123 | #define cl_assert_equal_strn_(s1,s2,len,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%.*s", (s1), (s2), (int)(len)) | |
806571f3 | 124 | |
09debe12 ET |
125 | #define cl_assert_equal_wcsn(wcs1,wcs2,len) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2, 1, "%.*ls", (wcs1), (wcs2), (int)(len)) |
126 | #define cl_assert_equal_wcsn_(wcs1,wcs2,len,note) clar__assert_equal(__FILE__,__LINE__,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%.*ls", (wcs1), (wcs2), (int)(len)) | |
127 | ||
cf94024c RB |
128 | #define cl_assert_equal_i(i1,i2) clar__assert_equal(__FILE__,__LINE__,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2)) |
129 | #define cl_assert_equal_i_(i1,i2,note) clar__assert_equal(__FILE__,__LINE__,#i1 " != " #i2 " (" #note ")", 1, "%d", (i1), (i2)) | |
130 | #define cl_assert_equal_i_fmt(i1,i2,fmt) clar__assert_equal(__FILE__,__LINE__,#i1 " != " #i2, 1, (fmt), (int)(i1), (int)(i2)) | |
7202ec29 | 131 | |
cf94024c RB |
132 | #define cl_assert_equal_b(b1,b2) clar__assert_equal(__FILE__,__LINE__,#b1 " != " #b2, 1, "%d", (int)((b1) != 0),(int)((b2) != 0)) |
133 | ||
134 | #define cl_assert_equal_p(p1,p2) clar__assert_equal(__FILE__,__LINE__,"Pointer mismatch: " #p1 " != " #p2, 1, "%p", (p1), (p2)) | |
7202ec29 | 135 | |
0f65733b | 136 | void clar__skip(void); |
2e6f06a8 | 137 | |
7202ec29 RB |
138 | void clar__fail( |
139 | const char *file, | |
140 | int line, | |
141 | const char *error, | |
142 | const char *description, | |
143 | int should_abort); | |
144 | ||
2e6f06a8 VM |
145 | void clar__assert( |
146 | int condition, | |
147 | const char *file, | |
148 | int line, | |
149 | const char *error, | |
150 | const char *description, | |
151 | int should_abort); | |
152 | ||
cf94024c RB |
153 | void clar__assert_equal( |
154 | const char *file, | |
155 | int line, | |
156 | const char *err, | |
157 | int should_abort, | |
158 | const char *fmt, | |
159 | ...); | |
2e6f06a8 VM |
160 | |
161 | #endif |