8
8
#define __CLAR_TEST_H__
9
9
10
10
#include <stdlib.h>
11
+ #include <limits.h>
12
+
13
+ #if defined(_WIN32 )&& defined(CLAR_WIN32_LONGPATHS )
14
+ # define CLAR_MAX_PATH 4096
15
+ #elif defined(_WIN32 )
16
+ # define CLAR_MAX_PATH MAX_PATH
17
+ #else
18
+ # define CLAR_MAX_PATH PATH_MAX
19
+ #endif
20
+
21
+ #ifndef CLAR_SELFTEST
22
+ # define CLAR_CURRENT_FILE __FILE__
23
+ # define CLAR_CURRENT_LINE __LINE__
24
+ # define CLAR_CURRENT_FUNC __func__
25
+ #else
26
+ # define CLAR_CURRENT_FILE "file"
27
+ # define CLAR_CURRENT_LINE 42
28
+ # define CLAR_CURRENT_FUNC "func"
29
+ #endif
11
30
12
31
enum cl_test_status {
13
32
CL_TEST_OK ,
@@ -30,6 +49,7 @@ void clar_test_shutdown(void);
30
49
int clar_test (int argc ,char * argv []);
31
50
32
51
const char * clar_sandbox_path (void );
52
+ const char * clar_tempdir_path (void );
33
53
34
54
void cl_set_cleanup (void (* cleanup )(void * ),void * opaque );
35
55
void cl_fs_cleanup (void );
@@ -83,19 +103,33 @@ void cl_fixture_cleanup(const char *fixture_name);
83
103
const char * cl_fixture_basename (const char * fixture_name );
84
104
#endif
85
105
106
+ /**
107
+ * Invoke a helper function, which itself will use `cl_assert`
108
+ * constructs. This will preserve the stack information of the
109
+ * current call point, so that function name and line number
110
+ * information is shown from the line of the test, instead of
111
+ * the helper function.
112
+ */
113
+ #define cl_invoke (expr ) \
114
+ do { \
115
+ clar__set_invokepoint(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE); \
116
+ expr; \
117
+ clar__clear_invokepoint(); \
118
+ } while(0)
119
+
86
120
/**
87
121
* Assertion macros with explicit error message
88
122
*/
89
- #define cl_must_pass_ (expr ,desc ) clar__assert((expr) >= 0,__FILE__, __func__, __LINE__ , "Function call failed: " #expr, desc, 1)
90
- #define cl_must_fail_ (expr ,desc ) clar__assert((expr) < 0,__FILE__, __func__, __LINE__ , "Expected function call to fail: " #expr, desc, 1)
91
- #define cl_assert_ (expr ,desc ) clar__assert((expr) != 0,__FILE__, __func__, __LINE__ , "Expression is not true: " #expr, desc, 1)
123
+ #define cl_must_pass_ (expr ,desc ) clar__assert((expr) >= 0,CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Function call failed: " #expr, desc, 1)
124
+ #define cl_must_fail_ (expr ,desc ) clar__assert((expr) < 0,CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Expected function call to fail: " #expr, desc, 1)
125
+ #define cl_assert_ (expr ,desc ) clar__assert((expr) != 0,CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Expression is not true: " #expr, desc, 1)
92
126
93
127
/**
94
128
* Check macros with explicit error message
95
129
*/
96
- #define cl_check_pass_ (expr ,desc ) clar__assert((expr) >= 0,__FILE__, __func__, __LINE__ , "Function call failed: " #expr, desc, 0)
97
- #define cl_check_fail_ (expr ,desc ) clar__assert((expr) < 0,__FILE__, __func__, __LINE__ , "Expected function call to fail: " #expr, desc, 0)
98
- #define cl_check_ (expr ,desc ) clar__assert((expr) != 0,__FILE__, __func__, __LINE__ , "Expression is not true: " #expr, desc, 0)
130
+ #define cl_check_pass_ (expr ,desc ) clar__assert((expr) >= 0,CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Function call failed: " #expr, desc, 0)
131
+ #define cl_check_fail_ (expr ,desc ) clar__assert((expr) < 0,CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Expected function call to fail: " #expr, desc, 0)
132
+ #define cl_check_ (expr ,desc ) clar__assert((expr) != 0,CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Expression is not true: " #expr, desc, 0)
99
133
100
134
/**
101
135
* Assertion macros with no error message
@@ -114,33 +148,33 @@ const char *cl_fixture_basename(const char *fixture_name);
114
148
/**
115
149
* Forced failure/warning
116
150
*/
117
- #define cl_fail (desc ) clar__fail(__FILE__, __func__, __LINE__ , "Test failed.", desc, 1)
118
- #define cl_warning (desc ) clar__fail(__FILE__, __func__, __LINE__ , "Warning during test execution:", desc, 0)
151
+ #define cl_fail (desc ) clar__fail(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Test failed.", desc, 1)
152
+ #define cl_warning (desc ) clar__fail(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE , "Warning during test execution:", desc, 0)
119
153
120
154
#define cl_skip () clar__skip()
121
155
122
156
/**
123
157
* Typed assertion macros
124
158
*/
125
- #define cl_assert_equal_s (s1 ,s2 ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #s1 " != " #s2, 1, "%s", (s1), (s2))
126
- #define cl_assert_equal_s_ (s1 ,s2 ,note ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%s", (s1), (s2))
159
+ #define cl_assert_equal_s (s1 ,s2 ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #s1 " != " #s2, 1, "%s", (s1), (s2))
160
+ #define cl_assert_equal_s_ (s1 ,s2 ,note ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%s", (s1), (s2))
127
161
128
- #define cl_assert_equal_wcs (wcs1 ,wcs2 ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #wcs1 " != " #wcs2, 1, "%ls", (wcs1), (wcs2))
129
- #define cl_assert_equal_wcs_ (wcs1 ,wcs2 ,note ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%ls", (wcs1), (wcs2))
162
+ #define cl_assert_equal_wcs (wcs1 ,wcs2 ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #wcs1 " != " #wcs2, 1, "%ls", (wcs1), (wcs2))
163
+ #define cl_assert_equal_wcs_ (wcs1 ,wcs2 ,note ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%ls", (wcs1), (wcs2))
130
164
131
- #define cl_assert_equal_strn (s1 ,s2 ,len ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #s1 " != " #s2, 1, "%.*s", (s1), (s2), (int)(len))
132
- #define cl_assert_equal_strn_ (s1 ,s2 ,len ,note ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%.*s", (s1), (s2), (int)(len))
165
+ #define cl_assert_equal_strn (s1 ,s2 ,len ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #s1 " != " #s2, 1, "%.*s", (s1), (s2), (int)(len))
166
+ #define cl_assert_equal_strn_ (s1 ,s2 ,len ,note ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #s1 " != " #s2 " (" #note ")", 1, "%.*s", (s1), (s2), (int)(len))
133
167
134
- #define cl_assert_equal_wcsn (wcs1 ,wcs2 ,len ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #wcs1 " != " #wcs2, 1, "%.*ls", (wcs1), (wcs2), (int)(len))
135
- #define cl_assert_equal_wcsn_ (wcs1 ,wcs2 ,len ,note ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%.*ls", (wcs1), (wcs2), (int)(len))
168
+ #define cl_assert_equal_wcsn (wcs1 ,wcs2 ,len ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #wcs1 " != " #wcs2, 1, "%.*ls", (wcs1), (wcs2), (int)(len))
169
+ #define cl_assert_equal_wcsn_ (wcs1 ,wcs2 ,len ,note ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%.*ls", (wcs1), (wcs2), (int)(len))
136
170
137
- #define cl_assert_equal_i (i1 ,i2 ) clar__assert_equal(__FILE__,__func__,__LINE__ ,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2))
138
- #define cl_assert_equal_i_ (i1 ,i2 ,note ) clar__assert_equal(__FILE__,__func__,__LINE__ ,#i1 " != " #i2 " (" #note ")", 1, "%d", (i1), (i2))
139
- #define cl_assert_equal_i_fmt (i1 ,i2 ,fmt ) clar__assert_equal(__FILE__,__func__,__LINE__ ,#i1 " != " #i2, 1, (fmt), (int)(i1), (int)(i2))
171
+ #define cl_assert_equal_i (i1 ,i2 ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2))
172
+ #define cl_assert_equal_i_ (i1 ,i2 ,note ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,#i1 " != " #i2 " (" #note ")", 1, "%d", (i1), (i2))
173
+ #define cl_assert_equal_i_fmt (i1 ,i2 ,fmt ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,#i1 " != " #i2, 1, (fmt), (int)(i1), (int)(i2))
140
174
141
- #define cl_assert_equal_b (b1 ,b2 ) clar__assert_equal(__FILE__,__func__,__LINE__ ,#b1 " != " #b2, 1, "%d", (int)((b1) != 0),(int)((b2) != 0))
175
+ #define cl_assert_equal_b (b1 ,b2 ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,#b1 " != " #b2, 1, "%d", (int)((b1) != 0),(int)((b2) != 0))
142
176
143
- #define cl_assert_equal_p (p1 ,p2 ) clar__assert_equal(__FILE__,__func__,__LINE__ ,"Pointer mismatch: " #p1 " != " #p2, 1, "%p", (p1), (p2))
177
+ #define cl_assert_equal_p (p1 ,p2 ) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE ,"Pointer mismatch: " #p1 " != " #p2, 1, "%p", (p1), (p2))
144
178
145
179
void clar__skip (void );
146
180
@@ -170,4 +204,11 @@ void clar__assert_equal(
170
204
const char * fmt ,
171
205
...);
172
206
207
+ void clar__set_invokepoint (
208
+ const char * file ,
209
+ const char * func ,
210
+ size_t line );
211
+
212
+ void clar__clear_invokepoint (void );
213
+
173
214
#endif