77#ifndef __CLAR_TEST_H__
88#define __CLAR_TEST_H__
99
10+ #include <inttypes.h>
1011#include <stdlib.h>
1112#include <limits.h>
1213
@@ -149,6 +150,7 @@ const char *cl_fixture_basename(const char *fixture_name);
149150 * Forced failure/warning
150151 */
151152#define cl_fail (desc ) clar__fail(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, "Test failed.", desc, 1)
153+ #define cl_failf (desc ,...) clar__failf(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, "Test failed.", desc, __VA_ARGS__)
152154#define cl_warning (desc ) clar__fail(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, "Warning during test execution:", desc, 0)
153155
154156#define cl_skip () clar__skip()
@@ -168,9 +170,42 @@ const char *cl_fixture_basename(const char *fixture_name);
168170#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))
169171#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))
170172
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))
173+ #define cl_assert_compare_i_ (i1 , i2 , cmp , error , ...) clar__assert_compare_i(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
174+ (i1), (i2), "Expected comparison to hold: " error, __VA_ARGS__)
175+ #define cl_assert_compare_i (i1 , i2 , cmp , error , fmt ) do { \
176+ intmax_t v1 = (i1), v2 = (i2); \
177+ clar__assert_compare_i(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
178+ v1, v2, "Expected comparison to hold: " error, fmt, v1, v2); \
179+ } while (0)
180+ #define cl_assert_equal_i_ (i1 , i2 , ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_EQ, #i1 " == " #i2, __VA_ARGS__)
181+ #define cl_assert_equal_i (i1 , i2 ) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_EQ, #i1 " == " #i2, "%"PRIdMAX " != %"PRIdMAX)
182+ #define cl_assert_equal_i_fmt (i1 , i2 , fmt ) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_EQ, #i1 " == " #i2, fmt " != " fmt, (int)(i1), (int)(i2))
183+ #define cl_assert_lt_i_ (i1 , i2 , ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_LT, #i1 " < " #i2, __VA_ARGS__)
184+ #define cl_assert_lt_i (i1 , i2 ) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_LT, #i1 " < " #i2, "%"PRIdMAX " >= %"PRIdMAX)
185+ #define cl_assert_le_i_ (i1 , i2 , ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_LE, #i1 " <= " #i2, __VA_ARGS__)
186+ #define cl_assert_le_i (i1 , i2 ) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_LE, #i1 " <= " #i2, "%"PRIdMAX " > %"PRIdMAX)
187+ #define cl_assert_gt_i_ (i1 , i2 , ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_GT, #i1 " > " #i2, __VA_ARGS__)
188+ #define cl_assert_gt_i (i1 , i2 ) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_GT, #i1 " > " #i2, "%"PRIdMAX " <= %"PRIdMAX)
189+ #define cl_assert_ge_i_ (i1 , i2 , ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_GE, #i1 " >= " #i2, __VA_ARGS__)
190+ #define cl_assert_ge_i (i1 , i2 ) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_GE, #i1 " >= " #i2, "%"PRIdMAX " < %"PRIdMAX)
191+
192+ #define cl_assert_compare_u_ (u1 , u2 , cmp , error , ...) clar__assert_compare_u(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
193+ (u1), (u2), "Expected comparison to hold: " error, __VA_ARGS__)
194+ #define cl_assert_compare_u (u1 , u2 , cmp , error , fmt ) do { \
195+ uintmax_t v1 = (u1), v2 = (u2); \
196+ clar__assert_compare_u(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
197+ v1, v2, "Expected comparison to hold: " error, fmt, v1, v2); \
198+ } while (0)
199+ #define cl_assert_equal_u_ (u1 , u2 , ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_EQ, #u1 " == " #u2, __VA_ARGS__)
200+ #define cl_assert_equal_u (u1 , u2 ) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_EQ, #u1 " == " #u2, "%"PRIuMAX " != %"PRIuMAX)
201+ #define cl_assert_lt_u_ (u1 , u2 , ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_LT, #u1 " < " #u2, __VA_ARGS__)
202+ #define cl_assert_lt_u (u1 , u2 ) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_LT, #u1 " < " #u2, "%"PRIuMAX " >= %"PRIuMAX)
203+ #define cl_assert_le_u_ (u1 , u2 , ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_LE, #u1 " <= " #u2, __VA_ARGS__)
204+ #define cl_assert_le_u (u1 , u2 ) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_LE, #u1 " <= " #u2, "%"PRIuMAX " > %"PRIuMAX)
205+ #define cl_assert_gt_u_ (u1 , u2 , ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_GT, #u1 " > " #u2, __VA_ARGS__)
206+ #define cl_assert_gt_u (u1 , u2 ) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_GT, #u1 " > " #u2, "%"PRIuMAX " <= %"PRIuMAX)
207+ #define cl_assert_ge_u_ (u1 , u2 , ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_GE, #u1 " >= " #u2, __VA_ARGS__)
208+ #define cl_assert_ge_u (u1 , u2 ) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_GE, #u1 " >= " #u2, "%"PRIuMAX " < %"PRIuMAX)
174209
175210#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))
176211
@@ -186,6 +221,15 @@ void clar__fail(
186221 const char * description ,
187222 int should_abort );
188223
224+ void clar__failf (
225+ const char * file ,
226+ const char * func ,
227+ size_t line ,
228+ int should_abort ,
229+ const char * error ,
230+ const char * description ,
231+ ...);
232+
189233void clar__assert (
190234 int condition ,
191235 const char * file ,
@@ -204,6 +248,38 @@ void clar__assert_equal(
204248 const char * fmt ,
205249 ...);
206250
251+ enum clar_comparison {
252+ CLAR_COMPARISON_EQ ,
253+ CLAR_COMPARISON_LT ,
254+ CLAR_COMPARISON_LE ,
255+ CLAR_COMPARISON_GT ,
256+ CLAR_COMPARISON_GE ,
257+ };
258+
259+ void clar__assert_compare_i (
260+ const char * file ,
261+ const char * func ,
262+ size_t line ,
263+ int should_abort ,
264+ enum clar_comparison cmp ,
265+ intmax_t value1 ,
266+ intmax_t value2 ,
267+ const char * error ,
268+ const char * description ,
269+ ...);
270+
271+ void clar__assert_compare_u (
272+ const char * file ,
273+ const char * func ,
274+ size_t line ,
275+ int should_abort ,
276+ enum clar_comparison cmp ,
277+ uintmax_t value1 ,
278+ uintmax_t value2 ,
279+ const char * error ,
280+ const char * description ,
281+ ...);
282+
207283void clar__set_invokepoint (
208284 const char * file ,
209285 const char * func ,
0 commit comments