83#define __FUNCTION__ __func__
86#if !defined(__clang__) && __GNUC__ > 3
87#pragma GCC diagnostic ignored "-Wclobbered"
154 if (suite == NULL)
return;
178 if (suite->
tests == NULL) {
201 if (suite->
name == NULL) {
202 out_writer(
"*** Test Suite ***\n", 1, 19, out_target);
204 out_writer(
"*** Test Suite : ", 1, 17, out_target);
205 out_writer(suite->
name, 1, strlen(suite->
name), out_target);
206 out_writer(
" ***\n", 1, 5, out_target);
211 elem->test(suite, out_target, out_writer);
213 out_writer(
"\nAll test completed.\n", 1, 21, out_target);
217 " Tests: %5u\n Success: %5u\n Failure: %5u\n\n",
220 out_writer(total, 1, len, out_target);
228#define cx_test_run_f(suite, file) cx_test_run(suite, (void*)file, (cx_write_func)fwrite)
234#define cx_test_run_stdout(suite) cx_test_run_f(suite, stdout)
243#define CX_TEST(name) void name(CxTestSuite* _suite_,void *_output_, cx_write_func _writefnc_)
261#define CX_TEST_DO _writefnc_("Running ", 1, 8, _output_);\
262 _writefnc_(__FUNCTION__, 1, strlen(__FUNCTION__), _output_);\
263 _writefnc_("... ", 1, 4, _output_);\
265 for (unsigned int _cx_test_loop_ = 0 ;\
266 _cx_test_loop_ == 0 && !setjmp(_env_);\
267 _writefnc_("success.\n", 1, 9, _output_),\
268 _suite_->success++, _cx_test_loop_++)
278#define CX_TEST_ASSERTM(condition,message) if (!(condition)) { \
279 const char *_assert_msg_ = message; \
280 _writefnc_(_assert_msg_, 1, strlen(_assert_msg_), _output_); \
281 _writefnc_(".\n", 1, 2, _output_); \
282 _suite_->failure++; \
293#define CX_TEST_ASSERT(condition) CX_TEST_ASSERTM(condition, #condition " failed")
306#define CX_TEST_SUBROUTINE(name,...) void name(CxTestSuite* _suite_,\
307 void *_output_, cx_write_func _writefnc_, jmp_buf _env_, __VA_ARGS__)
322#define CX_TEST_CALL_SUBROUTINE(name,...) \
323 name(_suite_,_output_,_writefnc_,_env_,__VA_ARGS__)
Common definitions and feature checks.
#define CX_MALLOC
The attributed function always returns freshly allocated memory.
Definition common.h:156
#define CX_INLINE
Declares a function to be inlined.
Definition common.h:311
#define CX_CSTR_ARG(idx)
No support for null_terminated_string_arg in clang or GCC below 14.
Definition common.h:211
size_t(* cx_write_func)(const void *, size_t, size_t, void *)
Function pointer compatible with fwrite-like functions.
Definition common.h:325
#define CX_NONNULL
All pointer arguments must be non-NULL.
Definition common.h:141
#define CX_NODISCARD
Warn about discarded return value.
Definition common.h:256
Strings that know their length.
Structure for the internal list of test cases.
Definition test.h:100
CxTest test
Test case.
Definition test.h:103
CxTestSet * next
Pointer to the next list element.
Definition test.h:106
A test suite containing multiple test cases.
Definition test.h:112
const char * name
The optional name of this test suite.
Definition test.h:121
unsigned int success
The number of successful tests after the suite has been run.
Definition test.h:115
unsigned int failure
The number of failed tests after the suite has been run.
Definition test.h:118
CxTestSet * tests
Internal list of test cases.
Definition test.h:127
void(* CxTest)(CxTestSuite *, void *, cx_write_func)
Pointer to a test function.
Definition test.h:94
static CxTestSuite * cx_test_suite_new(const char *name)
Creates a new test suite.
Definition test.h:136
static int cx_test_register(CxTestSuite *suite, CxTest test)
Registers a test function with the specified test suite.
Definition test.h:173
static void cx_test_suite_free(CxTestSuite *suite)
Deallocates a test suite.
Definition test.h:153
static void cx_test_run(CxTestSuite *suite, void *out_target, cx_write_func out_writer)
Runs a test suite and writes the test log to the specified stream.
Definition test.h:200