1 /* ----------------------------------------------------------------------------
2 tinytest - A tiny C unit-testing library
3 Copyright (C) 2010 Mark A Lindner
5 This file is part of tinytest.
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public License
9 as published by the Free Software Foundation; either version 2.1 of
10 the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Library General Public
18 License along with this library; if not, see
19 <http://www.gnu.org/licenses/>.
20 ----------------------------------------------------------------------------
30 typedef int tt_bool_t;
35 typedef struct tt_test_t
38 void (*function)(void);
40 struct tt_test_t *next;
43 typedef struct tt_testsuite_t
46 tt_test_t *first_test;
48 tt_test_t *current_test;
54 typedef enum { TT_VAL_INT, TT_VAL_UINT, TT_VAL_INT64, TT_VAL_UINT64,
55 TT_VAL_DOUBLE, TT_VAL_STR, TT_VAL_PTR } tt_valtype_t;
57 typedef enum { TT_OP_INT_EQ, TT_OP_INT_NE, TT_OP_INT_LT, TT_OP_INT_LE,
58 TT_OP_INT_GT, TT_OP_INT_GE, TT_OP_UINT_EQ, TT_OP_UINT_NE,
59 TT_OP_UINT_LT, TT_OP_UINT_LE, TT_OP_UINT_GT, TT_OP_UINT_GE,
60 TT_OP_INT64_EQ, TT_OP_INT64_NE, TT_OP_INT64_LT, TT_OP_INT64_LE,
61 TT_OP_INT64_GT, TT_OP_INT64_GE, TT_OP_UINT64_EQ,
62 TT_OP_UINT64_NE, TT_OP_UINT64_LT, TT_OP_UINT64_LE,
63 TT_OP_UINT64_GT, TT_OP_UINT64_GE, TT_OP_DOUBLE_EQ,
64 TT_OP_DOUBLE_NE, TT_OP_DOUBLE_LT, TT_OP_DOUBLE_LE,
65 TT_OP_DOUBLE_GT, TT_OP_DOUBLE_GE, TT_OP_STR_EQ, TT_OP_STR_NE,
66 TT_OP_STR_LT, TT_OP_STR_LE, TT_OP_STR_GT, TT_OP_STR_GE,
67 TT_OP_PTR_EQ, TT_OP_PTR_NE, TT_OP_TRUE, TT_OP_FALSE,
68 TT_OP_FILE_EQ, TT_OP_FILE_NE, TT_OP_TXTFILE_EQ,
69 TT_OP_TXTFILE_NE } tt_op_t;
71 typedef struct tt_val_t
76 unsigned int uint_val;
78 unsigned long long uint64_val;
86 extern tt_testsuite_t *tt_suite_create(const char *name);
88 extern void tt_suite_destroy(tt_testsuite_t *suite);
90 extern void tt_suite_add_test(tt_testsuite_t *suite, const char *name,
91 void (*function)(void));
93 extern void tt_suite_run(tt_testsuite_t *suite);
95 extern void tt_expect(const char *file, int line, const char *aexpr,
96 tt_op_t op, const char *bexpr,
97 const tt_val_t a, const tt_val_t b,
100 extern void tt_expect_bool(const char *file, int line, const char *expr,
101 tt_op_t op, int val, tt_bool_t fatal);
103 extern void tt_fail(const char *file, int line, const char *message, ...);
105 extern tt_bool_t tt_file_exists(const char *file);
109 extern void tt_test_int(const char *file, int line, const char *aexpr,
110 tt_op_t op, const char *bexpr, int a, int b,
113 #define TT_TEST_INT_(A, OP, B, F) \
114 tt_test_int(__FILE__, __LINE__, #A, (OP), #B, (A), (B), (F))
118 #define TT_TEST_INT_(A, OP, B, F) \
119 tt_expect(__FILE__, __LINE__, #A, (OP), #B, \
120 (tt_val_t){ TT_VAL_INT, .value.int_val = (A) }, \
121 (tt_val_t){ TT_VAL_INT, .value.int_val = (B) }, \
126 #define TT_EXPECT_INT_EQ(A, B) \
127 TT_TEST_INT_((A), TT_OP_INT_EQ, (B), TT_FALSE)
129 #define TT_ASSERT_INT_EQ(A, B) \
130 TT_TEST_INT_((A), TT_OP_INT_EQ, (B), TT_TRUE)
132 #define TT_EXPECT_INT_NE(A, B) \
133 TT_TEST_INT_((A), TT_OP_INT_NE, (B), TT_FALSE)
135 #define TT_ASSERT_INT_NE(A, B) \
136 TT_TEST_INT_((A), TT_OP_INT_NE, (B), TT_TRUE)
138 #define TT_EXPECT_INT_LT(A, B) \
139 TT_TEST_INT_((A), TT_OP_INT_LT, (B), TT_FALSE)
141 #define TT_ASSERT_INT_LT(A, B) \
142 TT_TEST_INT_((A), TT_OP_INT_LT, (B), TT_TRUE)
144 #define TT_EXPECT_INT_LE(A, B) \
145 TT_TEST_INT_((A), TT_OP_INT_LE, (B), TT_FALSE)
147 #define TT_ASSERT_INT_LE(A, B) \
148 TT_TEST_INT_((A), TT_OP_INT_LE, (B), TT_TRUE)
150 #define TT_EXPECT_INT_GT(A, B) \
151 TT_TEST_INT_((A), TT_OP_INT_GT, (B), TT_FALSE)
153 #define TT_ASSERT_INT_GT(A, B) \
154 TT_TEST_INT_((A), TT_OP_INT_GT, (B), TT_TRUE)
156 #define TT_EXPECT_INT_GE(A, B) \
157 TT_TEST_INT_((A), TT_OP_INT_GE, (B), TT_FALSE)
159 #define TT_ASSERT_INT_GE(A, B) \
160 TT_TEST_INT_((A), TT_OP_INT_GE, (B), TT_TRUE)
164 extern void tt_test_uint(const char *file, int line, const char *aexpr,
165 tt_op_t op, const char *bexpr, unsigned int a,
166 unsigned int b, tt_bool_t fatal);
168 #define TT_TEST_UINT_(A, OP, B, F) \
169 tt_test_uint(__FILE__, __LINE__, #A, (OP), #B, (A), (B), (F))
173 #define TT_TEST_UINT_(A, OP, B, F) \
174 tt_expect(__FILE__, __LINE__, #A, OP, #B, \
175 (tt_val_t){ TT_VAL_UINT, .value.uint_val = (A) }, \
176 (tt_val_t){ TT_VAL_UINT, .value.uint_val = (B) }, \
181 #define TT_EXPECT_UINT_EQ(A, B) \
182 TT_TEST_UINT_((A), TT_OP_UINT_EQ, (B), TT_FALSE)
184 #define TT_ASSERT_UINT_EQ(A, B) \
185 TT_TEST_UINT_((A), TT_OP_UINT_EQ, (B), TT_TRUE)
187 #define TT_EXPECT_UINT_NE(A, B) \
188 TT_TEST_UINT_((A), TT_OP_UINT_NE, (B), TT_FALSE)
190 #define TT_ASSERT_UINT_NE(A, B) \
191 TT_TEST_UINT_((A), TT_OP_UINT_NE, (B), TT_TRUE)
193 #define TT_EXPECT_UINT_LT(A, B) \
194 TT_TEST_UINT_((A), TT_OP_UINT_LT, (B), TT_FALSE)
196 #define TT_ASSERT_UINT_LT(A, B) \
197 TT_TEST_UINT_((A), TT_OP_UINT_LT, (B), TT_TRUE)
199 #define TT_EXPECT_UINT_LE(A, B) \
200 TT_TEST_UINT_((A), TT_OP_UINT_LE, (B), TT_FALSE)
202 #define TT_ASSERT_UINT_LE(A, B) \
203 TT_TEST_UINT_((A), TT_OP_UINT_LE, (B), TT_TRUE)
205 #define TT_EXPECT_UINT_GT(A, B) \
206 TT_TEST_UINT_((A), TT_OP_UINT_GT, (B), TT_FALSE)
208 #define TT_ASSERT_UINT_GT(A, B) \
209 TT_TEST_UINT_((A), TT_OP_UINT_GT, (B), TT_TRUE)
211 #define TT_EXPECT_UINT_GE(A, B) \
212 TT_TEST_UINT_((A), TT_OP_UINT_GE, (B), TT_FALSE)
214 #define TT_ASSERT_UINT_GE(A, B) \
215 TT_TEST_UINT_((A), TT_OP_UINT_GE, (B), TT_TRUE)
219 extern void tt_test_int64(const char *file, int line, const char *aexpr,
220 tt_op_t op, const char *bexpr, long long a,
221 long long b, tt_bool_t fatal);
223 #define TT_TEST_INT64_(A, OP, B, F) \
224 tt_test_int64(__FILE__, __LINE__, #A, (OP), #B, (A), (B), (F))
228 #define TT_TEST_INT64_(A, OP, B, F) \
229 tt_expect(__FILE__, __LINE__, #A, OP, #B, \
230 (tt_val_t){ TT_VAL_INT64, .value.int64_val = (A) }, \
231 (tt_val_t){ TT_VAL_INT64, .value.int64_val = (B) }, \
236 #define TT_EXPECT_INT64_EQ(A, B) \
237 TT_TEST_INT64_((A), TT_OP_INT64_EQ, (B), TT_FALSE)
239 #define TT_ASSERT_INT64_EQ(A, B) \
240 TT_TEST_INT64_((A), TT_OP_INT64_EQ, (B), TT_TRUE)
242 #define TT_EXPECT_INT64_NE(A, B) \
243 TT_TEST_INT64_((A), TT_OP_INT64_NE, (B), TT_FALSE)
245 #define TT_ASSERT_INT64_NE(A, B) \
246 TT_TEST_INT64_((A), TT_OP_INT64_NE, (B), TT_TRUE)
248 #define TT_EXPECT_INT64_LT(A, B) \
249 TT_TEST_INT64_((A), TT_OP_INT64_LT, (B), TT_FALSE)
251 #define TT_ASSERT_INT64_LT(A, B) \
252 TT_TEST_INT64_((A), TT_OP_INT64_LT, (B), TT_TRUE)
254 #define TT_EXPECT_INT64_LE(A, B) \
255 TT_TEST_INT64_((A), TT_OP_INT64_LE, (B), TT_FALSE)
257 #define TT_ASSERT_INT64_LE(A, B) \
258 TT_TEST_INT64_((A), TT_OP_INT64_LE, (B), TT_TRUE)
260 #define TT_EXPECT_INT64_GT(A, B) \
261 TT_TEST_INT64_((A), TT_OP_INT64_GT, (B), TT_FALSE)
263 #define TT_ASSERT_INT64_GT(A, B) \
264 TT_TEST_INT64_((A), TT_OP_INT64_GT, (B), TT_TRUE)
266 #define TT_EXPECT_INT64_GE(A, B) \
267 TT_TEST_INT64_((A), TT_OP_INT64_GE, (B), TT_FALSE)
269 #define TT_ASSERT_INT64_GE(A, B) \
270 TT_TEST_INT64_((A), TT_OP_INT64_GE, (B), TT_TRUE)
274 extern void tt_test_uint64(const char *file, int line, const char *aexpr,
275 tt_op_t op, const char *bexpr,
276 unsigned long long a, unsigned long long b,
279 #define TT_TEST_UINT64_(A, OP, B, F) \
280 tt_test_uint64(__FILE__, __LINE__, #A, (OP), #B, (A), (B), (F))
284 #define TT_TEST_UINT64_(A, OP, B, F) \
285 tt_expect(__FILE__, __LINE__, #A, OP, #B, \
286 (tt_val_t){ TT_VAL_UINT64, .value.uint64_val = (A) }, \
287 (tt_val_t){ TT_VAL_UINT64, .value.uint64_val = (B) }, \
292 #define TT_EXPECT_UINT64_EQ(A, B) \
293 TT_TEST_UINT64_((A), TT_OP_UINT64_EQ, (B), TT_FALSE)
295 #define TT_ASSERT_UINT64_EQ(A, B) \
296 TT_TEST_UINT64_((A), TT_OP_UINT64_EQ, (B), TT_TRUE)
298 #define TT_EXPECT_UINT64_NE(A, B) \
299 TT_TEST_UINT64_((A), TT_OP_UINT64_NE, (B), TT_FALSE)
301 #define TT_ASSERT_UINT64_NE(A, B) \
302 TT_TEST_UINT64_((A), TT_OP_UINT64_NE, (B), TT_TRUE)
304 #define TT_EXPECT_UINT64_LT(A, B) \
305 TT_TEST_UINT64_((A), TT_OP_UINT64_LT, (B), TT_FALSE)
307 #define TT_ASSERT_UINT64_LT(A, B) \
308 TT_TEST_UINT64_((A), TT_OP_UINT64_LT, (B), TT_TRUE)
310 #define TT_EXPECT_UINT64_LE(A, B) \
311 TT_TEST_UINT64_((A), TT_OP_UINT64_LE, (B), TT_FALSE)
313 #define TT_ASSERT_UINT64_LE(A, B) \
314 TT_TEST_UINT64_((A), TT_OP_UINT64_LE, (B), TT_TRUE)
316 #define TT_EXPECT_UINT64_GT(A, B) \
317 TT_TEST_UINT64_((A), TT_OP_UINT64_GT, (B), TT_FALSE)
319 #define TT_ASSERT_UINT64_GT(A, B) \
320 TT_TEST_UINT64_((A), TT_OP_UINT64_GT, (B), TT_TRUE)
322 #define TT_EXPECT_UINT64_GE(A, B) \
323 TT_TEST_UINT64_((A), TT_OP_UINT64_GE, (B), TT_FALSE)
325 #define TT_ASSERT_UINT64_GE(A, B) \
326 TT_TEST_UINT64_((A), TT_OP_UINT64_GE, (B), TT_TRUE)
330 extern void tt_test_double(const char *file, int line, const char *aexpr,
331 tt_op_t op, const char *bexpr, double a,
332 double b, tt_bool_t fatal);
334 #define TT_TEST_DOUBLE_(A, OP, B, F) \
335 tt_test_double(__FILE__, __LINE__, #A, (OP), #B, (A), (B), (F))
339 #define TT_TEST_DOUBLE_(A, OP, B, F) \
340 tt_expect(__FILE__, __LINE__, #A, OP, #B, \
341 (tt_val_t){ TT_VAL_DOUBLE, .value.double_val = (A) }, \
342 (tt_val_t){ TT_VAL_DOUBLE, .value.double_val = (B) }, \
347 #define TT_EXPECT_DOUBLE_EQ(A, B) \
348 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_EQ, (B), TT_FALSE)
350 #define TT_ASSERT_DOUBLE_EQ(A, B) \
351 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_EQ, (B), TT_TRUE)
353 #define TT_EXPECT_DOUBLE_NE(A, B) \
354 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_NE, (B), TT_FALSE)
356 #define TT_ASSERT_DOUBLE_NE(A, B) \
357 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_NE, (B), TT_TRUE)
359 #define TT_EXPECT_DOUBLE_LT(A, B) \
360 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_LT, (B), TT_FALSE)
362 #define TT_ASSERT_DOUBLE_LT(A, B) \
363 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_LT, (B), TT_TRUE)
365 #define TT_EXPECT_DOUBLE_LE(A, B) \
366 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_LE, (B), TT_FALSE)
368 #define TT_ASSERT_DOUBLE_LE(A, B) \
369 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_LE, (B), TT_TRUE)
371 #define TT_EXPECT_DOUBLE_GT(A, B) \
372 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_GT, (B), TT_FALSE)
374 #define TT_ASSERT_DOUBLE_GT(A, B) \
375 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_GT, (B), TT_TRUE)
377 #define TT_EXPECT_DOUBLE_GE(A, B) \
378 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_GE, (B), TT_FALSE)
380 #define TT_ASSERT_DOUBLE_GE(A, B) \
381 TT_TEST_DOUBLE_((A), TT_OP_DOUBLE_GE, (B), TT_TRUE)
385 extern void tt_test_str(const char *file, int line, const char *aexpr,
386 tt_op_t op, const char *bexpr, const char *a,
387 const char *b, tt_bool_t fatal);
389 #define TT_TEST_STR_(A, OP, B, F) \
390 tt_test_str(__FILE__, __LINE__, #A, (OP), #B, (A), (B), (F))
394 #define TT_TEST_STR_(A, OP, B, F) \
395 tt_expect(__FILE__, __LINE__, #A, OP, #B, \
396 (tt_val_t){ TT_VAL_STR, .value.str_val = (A) }, \
397 (tt_val_t){ TT_VAL_STR, .value.str_val = (B) }, \
402 #define TT_EXPECT_STR_EQ(A, B) \
403 TT_TEST_STR_((A), TT_OP_STR_EQ, (B), TT_FALSE)
405 #define TT_ASSERT_STR_EQ(A, B) \
406 TT_TEST_STR_((A), TT_OP_STR_EQ, (B), TT_TRUE)
408 #define TT_EXPECT_STR_NE(A, B) \
409 TT_TEST_STR_((A), TT_OP_STR_NE, (B), TT_FALSE)
411 #define TT_ASSERT_STR_NE(A, B) \
412 TT_TEST_STR_((A), TT_OP_STR_NE, (B), TT_TRUE)
414 #define TT_EXPECT_STR_LT(A, B) \
415 TT_TEST_STR_((A), TT_OP_STR_LT, (B), TT_FALSE)
417 #define TT_ASSERT_STR_LT(A, B) \
418 TT_TEST_STR_((A), TT_OP_STR_LT, (B), TT_TRUE)
420 #define TT_EXPECT_STR_LE(A, B) \
421 TT_TEST_STR_((A), TT_OP_STR_LE, (B), TT_FALSE)
423 #define TT_ASSERT_STR_LE(A, B) \
424 TT_TEST_STR_((A), TT_OP_STR_LE, (B), TT_TRUE)
426 #define TT_EXPECT_STR_GT(A, B) \
427 TT_TEST_STR_((A), TT_OP_STR_GT, (B), TT_FALSE)
429 #define TT_ASSERT_STR_GT(A, B) \
430 TT_TEST_STR_((A), TT_OP_STR_GT, (B), TT_TRUE)
432 #define TT_EXPECT_STR_GE(A, B) \
433 TT_TEST_STR_((A), TT_OP_STR_GE, (B), TT_FALSE)
435 #define TT_ASSERT_STR_GE(A, B) \
436 TT_TEST_STR_((A), TT_OP_STR_GE, (B), TT_TRUE)
440 extern void tt_test_ptr(const char *file, int line, const char *aexpr,
441 tt_op_t op, const char *bexpr, const void *a,
442 const void *b, tt_bool_t fatal);
444 #define TT_TEST_PTR_(A, OP, B, F) \
445 tt_test_ptr(__FILE__, __LINE__, #A, (OP), #B, (A), (B), (F))
449 #define TT_TEST_PTR_(A, OP, B, F) \
450 tt_expect(__FILE__, __LINE__, #A, OP, #B, \
451 (tt_val_t){ TT_VAL_PTR, .value.ptr_val = (A) }, \
452 (tt_val_t){ TT_VAL_PTR, .value.ptr_val = (B) }, \
457 #define TT_EXPECT_PTR_EQ(A, B) \
458 TT_TEST_PTR_((A), TT_OP_PTR_EQ, (B), TT_FALSE)
460 #define TT_ASSERT_PTR_EQ(A, B) \
461 TT_TEST_PTR_((A), TT_OP_PTR_EQ, (B), TT_TRUE)
463 #define TT_EXPECT_PTR_NE(A, B) \
464 TT_TEST_PTR_((A), TT_OP_PTR_NE, (B), TT_FALSE)
466 #define TT_ASSERT_PTR_NE(A, B) \
467 TT_TEST_PTR_((A), TT_OP_PTR_NE, (B), TT_TRUE)
469 #define TT_EXPECT_PTR_NOTNULL(A) \
470 TT_TEST_PTR_((A), TT_OP_PTR_NE, NULL, TT_FALSE)
472 #define TT_ASSERT_PTR_NOTNULL(A) \
473 TT_TEST_PTR_((A), TT_OP_PTR_NE, NULL, TT_TRUE)
475 #define TT_EXPECT_PTR_NULL(A) \
476 TT_TEST_PTR_((A), TT_OP_PTR_EQ, NULL, TT_FALSE)
478 #define TT_ASSERT_PTR_NULL(A) \
479 TT_TEST_PTR_((A), TT_OP_PTR_EQ, NULL, TT_TRUE)
481 #define TT_EXPECT_TRUE(A) \
482 tt_expect_bool(__FILE__, __LINE__, #A, TT_OP_TRUE, (A), TT_FALSE)
484 #define TT_ASSERT_TRUE(A) \
485 tt_expect_bool(__FILE__, __LINE__, #A, TT_OP_TRUE, (A), TT_TRUE)
487 #define TT_EXPECT_FALSE(A) \
488 tt_expect_bool(__FILE__, __LINE__, #A, TT_OP_FALSE, (A), TT_FALSE)
490 #define TT_ASSERT_FALSE(A) \
491 tt_expect_bool(__FILE__, __LINE__, #A, TT_OP_FALSE, (A), TT_TRUE)
493 #define TT_EXPECT_FILE_EQ(A, B) \
494 TT_TEST_STR_((A), TT_OP_FILE_EQ, (B), TT_FALSE)
496 #define TT_ASSERT_FILE_EQ(A, B) \
497 TT_TEST_STR_((A), TT_OP_FILE_EQ, (B), TT_TRUE)
499 #define TT_EXPECT_FILE_NE(A, B) \
500 TT_TEST_STR_((A), TT_OP_FILE_NE, (B), TT_FALSE)
502 #define TT_ASSERT_FILE_NE(A, B) \
503 TT_TEST_STR_((A), TT_OP_FILE_NE, (B), TT_TRUE)
505 #define TT_EXPECT_TXTFILE_EQ(A, B) \
506 TT_TEST_STR_((A), TT_OP_TXTFILE_EQ, (B), TT_FALSE)
508 #define TT_ASSERT_TXTFILE_EQ(A, B) \
509 TT_TEST_STR_((A), TT_OP_TXTFILE_EQ, (B), TT_TRUE)
511 #define TT_EXPECT_TXTFILE_NE(A, B) \
512 TT_TEST_STR_((A), TT_OP_TXTFILE_NE, (B), TT_FALSE)
514 #define TT_ASSERT_TXTFILE_NE(A, B) \
515 TT_TEST_STR_((A), TT_OP_TXTFILE_NE, (B), TT_TRUE)
517 #define TT_FAIL(M, ...) \
518 tt_fail(__FILE__, __LINE__, (M), __VA_ARGS__)
520 #define TT_SUITE_START(S) \
521 tt_testsuite_t *__suite__ ## S = tt_suite_create(#S)
523 #define TT_SUITE_TEST(S, F) \
524 tt_suite_add_test(__suite__ ## S, #F, F);
529 #define TT_SUITE_END(S) \
530 tt_suite_destroy(__suite__ ## S)
532 #define TT_SUITE_RUN(S) \
533 tt_suite_run(__suite__ ## S)
536 #endif // __tinytest_h