10#ifndef CLIBS_UNIT_TESTS_H
11#define CLIBS_UNIT_TESTS_H
22#if !defined( LINE_PREF_WIDTH )
24#define LINE_PREF_WIDTH 100
27#if LINE_PREF_WIDTH < 32
28static const size_t TESTS_LINE_WIDTH = ( 32 + 1 );
30static const size_t TESTS_LINE_WIDTH = LINE_PREF_WIDTH;
35#define COLOR_FAIL FOREGROUND_RED
39#define COLOR_SUCC FOREGROUND_GREEN
43#define COLOR_NOTE FOREGROUND_CYAN
47#define COLOR_TEST_TAG FOREGROUND_YELLOW
52#define TEST_NAME_CREATOR( TOK ) CLIBS_UNIT_TESTS_## TOK
64#ifndef UNIT_TESTS_SILENT
76#define TEST( HANDLE ) \
77 int TEST_NAME_CREATOR( HANDLE )( void ) \
79 int TEST_NAME_CREATOR( failed_total ) = 0; \
80 int TEST_NAME_CREATOR( ran_total ) = 0; \
81 const char *TEST_NAME_CREATOR( test_handle ) = #HANDLE; \
82 printf( COLOR_TEST_TAG "[TEST]" COLOR_DEFAULT " " #HANDLE "\n" );
84#define TEST( HANDLE ) \
85 int TEST_NAME_CREATOR( HANDLE )( void ) \
87 int TEST_NAME_CREATOR( failed_total ) = 0; \
88 int TEST_NAME_CREATOR( ran_total ) = 0; \
89 const char *TEST_NAME_CREATOR( test_handle ) = #HANDLE;
98 printf( COLOR_TEST_TAG "[TEST]" COLOR_DEFAULT " %s: ran %i tests, " PRINT_COLOR \
99 "%i successful" COLOR_DEFAULT ", " PRINT_COLOR \
100 "%i failed" COLOR_DEFAULT "\n", \
101 TEST_NAME_CREATOR( test_handle ), \
102 TEST_NAME_CREATOR( ran_total ), \
103 TEST_NAME_CREATOR( ran_total ) - TEST_NAME_CREATOR( failed_total ) == 0 \
106 TEST_NAME_CREATOR( ran_total ) - TEST_NAME_CREATOR( failed_total ), \
107 TEST_NAME_CREATOR( failed_total ) == 0 ? COLOR_SUCC : COLOR_FAIL, \
108 TEST_NAME_CREATOR( failed_total ) ); \
109 TEST_NAME_CREATOR( TOTAL_FAILED_UNIT ) += TEST_NAME_CREATOR( failed_total ); \
110 TEST_NAME_CREATOR( TOTAL_RAN_UNIT ) += TEST_NAME_CREATOR( ran_total ); \
111 return TEST_NAME_CREATOR( failed_total ) == 0 ? 0 : 1; \
120#define RUN_TEST( HANDLE ) \
123 TEST_NAME_CREATOR( TOTAL_FAILED ) += TEST_NAME_CREATOR( HANDLE )(); \
124 ++TEST_NAME_CREATOR( TOTAL_RAN ); \
157 const char *filename,
159 const bool isCritical )
161#ifndef UNIT_TESTS_SILENT
165 static const size_t msg_indent =
STRLEN(
" " );
166 ssize_t ln = TESTS_LINE_WIDTH - msg_indent;
173 ln -= printf(
"[%s", isCritical ?
"CRITICAL" :
"UNIT TEST" );
177 static char buffer[
sizeof( __FILE_NAME__ ) + 20 + 7 + 1 ];
178 snprintf( buffer,
sizeof buffer,
" // %s @ %d", filename, lineno );
179 ln -= printf(
"%s", buffer );
183 ln -= printf(
" %s ", cond_str );
185 static const size_t MSG_END_PART_LEN =
STRLEN(
" SUCCESS" ) ;
187 ln -= MSG_END_PART_LEN;
192 for (
size_t i = 0; i < msg_indent; ++i )
196#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 201112L
197 _Static_assert( TESTS_LINE_WIDTH > ( MSG_END_PART_LEN + msg_indent ),
198 "TESTS_LINE_WIDTH must be greater than the const part" );
202 ln > 0 ? ( size_t ) ln : TESTS_LINE_WIDTH - MSG_END_PART_LEN - msg_indent;
204 for (
size_t i = 0; i < ndots; ++i )
209 passed ?
"SUCCESS" :
"FAILURE" );
230#define UNIT_TEST( CONDITION ) \
233 if ( !UNIT_TEST_( #CONDITION, CONDITION, __FILE_NAME__, __LINE__, false ) ) \
234 ++TEST_NAME_CREATOR( failed_total ); \
235 ++TEST_NAME_CREATOR( ran_total ); \
249#define CRITICAL_TEST( CONDITION ) \
252 ++TEST_NAME_CREATOR( ran_total ); \
253 if ( !UNIT_TEST_( #CONDITION, CONDITION, __FILE_NAME__, __LINE__, true ) ) \
255 ++TEST_NAME_CREATOR( failed_total ); \
#define LibraryDefined
Definition attributes.h:107
#define NoReturn
Function always exits.
Definition attributes.h:83
#define STRLEN(STRING)
For string literals.
Definition misc.h:19
#define COLOR_DEFAULT
Definition terminal_colors.h:33
#define PRINT_COLOR
Definition terminal_colors.h:18
LibraryDefined bool SetTerminalColor(FILE *stream, const char *Color)
Definition terminal_colors.h:79
LibraryDefined void SET_UNIT_TEST_VERBOSITY(const bool verbose)
Definition unit_tests.h:271
#define COLOR_TEST_TAG
Definition unit_tests.h:47
LibraryDefined bool GET_UNIT_TEST_VERBOSITY(void)
Definition unit_tests.h:279
#define COLOR_NOTE
Definition unit_tests.h:43
#define TEST_NAME_CREATOR(TOK)
To avoid namespace collisions.
Definition unit_tests.h:52
#define COLOR_SUCC
Definition unit_tests.h:39
#define COLOR_FAIL
Definition unit_tests.h:35
LibraryDefined NoReturn void FINISH_TESTING(void)
Definition unit_tests.h:134