34# if (__cplusplus >= 199711L && !defined __cpp_exceptions) || \
35 ((defined(__GNUC__) || defined(__clang__)) && !defined __EXCEPTIONS)
36# ifndef TEST_NO_EXCEPTIONS
37# define TEST_NO_EXCEPTIONS
73#define TEST_LIST const struct acutest_test_ acutest_list_[]
94#define TEST_CHECK_(cond, ...) \
95 acutest_check_(!!(cond), __FILE__, __LINE__, __VA_ARGS__)
96#define TEST_CHECK(cond) \
97 acutest_check_(!!(cond), __FILE__, __LINE__, "%s", #cond)
114#define TEST_ASSERT_(cond, ...) \
116 if (!acutest_check_(!!(cond), __FILE__, __LINE__, __VA_ARGS__)) \
119#define TEST_ASSERT(cond) \
121 if (!acutest_check_(!!(cond), __FILE__, __LINE__, "%s", #cond)) \
126# ifndef TEST_NO_EXCEPTIONS
141# define TEST_EXCEPTION(code, exctype) \
143 bool exc_ok_ = false; \
144 const char *msg_ = NULL; \
147 msg_ = "No exception thrown."; \
148 } catch (exctype const &) { \
151 msg_ = "Unexpected exception thrown."; \
153 acutest_check_(exc_ok_, __FILE__, __LINE__, \
154 #code " throws " #exctype); \
156 acutest_message_("%s", msg_); \
158# define TEST_EXCEPTION_(code, exctype, ...) \
160 bool exc_ok_ = false; \
161 const char *msg_ = NULL; \
164 msg_ = "No exception thrown."; \
165 } catch (exctype const &) { \
168 msg_ = "Unexpected exception thrown."; \
170 acutest_check_(exc_ok_, __FILE__, __LINE__, __VA_ARGS__); \
172 acutest_message_("%s", msg_); \
195#define TEST_CASE_(...) acutest_case_(__VA_ARGS__)
196#define TEST_CASE(name) acutest_case_("%s", name)
201#ifndef TEST_CASE_MAXSIZE
202# define TEST_CASE_MAXSIZE 64
226#define TEST_MSG(...) acutest_message_(__VA_ARGS__)
231#ifndef TEST_MSG_MAXSIZE
232# define TEST_MSG_MAXSIZE 1024
246#define TEST_DUMP(title, addr, size) acutest_dump_(title, addr, size)
251#ifndef TEST_DUMP_MAXSIZE
252# define TEST_DUMP_MAXSIZE 1024
262#define TEST_SKIP(...) acutest_skip_(__FILE__, __LINE__, __VA_ARGS__)
294#if defined(__GNUC__) || defined(__clang__)
295# define ACUTEST_ATTRIBUTE_(attr) __attribute__((attr))
297# define ACUTEST_ATTRIBUTE_(attr)
319void acutest_dump_(
const char *title,
const void *addr,
size_t size);
334# if defined(unix) || defined(__unix__) || defined(__unix) || \
336# define ACUTEST_UNIX_ 1
340# include <sys/types.h>
341# include <sys/wait.h>
345# if defined CLOCK_PROCESS_CPUTIME_ID && defined CLOCK_MONOTONIC
346# define ACUTEST_HAS_POSIX_TIMER_ 1
350# if defined(_gnu_linux_) || defined(__linux__)
351# define ACUTEST_LINUX_ 1
353# include <sys/stat.h>
356# if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__)
357# define ACUTEST_WIN_ 1
362# if defined(__APPLE__)
363# define ACUTEST_MACOS_
367# include <sys/sysctl.h>
368# include <sys/types.h>
373# ifndef TEST_NO_EXCEPTIONS
379# if __has_include(<valgrind.h>)
380# include <valgrind.h>
395# pragma warning(push)
396# pragma warning(disable : 4996)
457# if defined ACUTEST_WIN_
459static LARGE_INTEGER acutest_timer_freq_;
464 QueryPerformanceFrequency(´st_timer_freq_);
468 QueryPerformanceCounter(ts);
472 double duration = (double)(end.QuadPart - start.QuadPart);
473 duration /= (double)acutest_timer_freq_.QuadPart;
481# elif defined ACUTEST_HAS_POSIX_TIMER_
482static clockid_t acutest_timer_id_;
489 acutest_timer_id_ = CLOCK_MONOTONIC;
491 acutest_timer_id_ = CLOCK_PROCESS_CPUTIME_ID;
495 clock_gettime(acutest_timer_id_, ts);
499 return (
double)(end.tv_sec - start.tv_sec) +
500 (
double)(end.tv_nsec - start.tv_nsec) / 1e9;
525# define ACUTEST_COLOR_DEFAULT_ 0
526# define ACUTEST_COLOR_RED_ 1
527# define ACUTEST_COLOR_GREEN_ 2
528# define ACUTEST_COLOR_YELLOW_ 3
529# define ACUTEST_COLOR_DEFAULT_INTENSIVE_ 10
530# define ACUTEST_COLOR_RED_INTENSIVE_ 11
531# define ACUTEST_COLOR_GREEN_INTENSIVE_ 12
532# define ACUTEST_COLOR_YELLOW_INTENSIVE_ 13
535 acutest_colored_printf_(
int color, const
char *
fmt, ...) {
546 return printf(
"%s",
buffer);
549# if defined ACUTEST_UNIX_
554 col_str =
"\033[0;31m";
557 col_str =
"\033[0;32m";
560 col_str =
"\033[0;33m";
563 col_str =
"\033[1;31m";
566 col_str =
"\033[1;32m";
569 col_str =
"\033[1;33m";
578 printf(
"%s", col_str);
583# elif defined ACUTEST_WIN_
586 CONSOLE_SCREEN_BUFFER_INFO info;
589 h = GetStdHandle(STD_OUTPUT_HANDLE);
590 GetConsoleScreenBufferInfo(h, &info);
594 attr = FOREGROUND_RED;
597 attr = FOREGROUND_GREEN;
600 attr = FOREGROUND_RED | FOREGROUND_GREEN;
603 attr = FOREGROUND_RED | FOREGROUND_INTENSITY;
606 attr = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
609 attr = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED |
610 FOREGROUND_INTENSITY;
613 attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
620 SetConsoleTextAttribute(h, attr);
622 SetConsoleTextAttribute(h, info.wAttributes);
634 name = strrchr(path,
'/');
642 const char *alt_name;
644 alt_name = strrchr(path,
'\\');
645 if (alt_name != NULL)
669 "Test %s... ", test->
name);
670 memset(spaces,
' ',
sizeof(spaces));
671 if (
n < (
int)
sizeof(spaces))
672 printf(
"%.*s", (
int)
sizeof(spaces) -
n, spaces);
681 printf(
"%s %d - %s%s\n",
689 printf(
"# Duration: ");
714 acutest_colored_printf_(color,
"%s", str);
727 static const char spaces[] =
" ";
736 printf(
"%s", spaces);
739 printf(
"%.*s",
n, spaces);
916 static const size_t BYTES_PER_LINE = 16;
934 printf((title[strlen(title) - 1] ==
':') ?
"%s\n" :
"%s:\n", title);
941 printf(
"%08lx: ", (
unsigned long)
line_beg);
944 printf(
" %02x", ((
const unsigned char *)addr)[off]);
951 unsigned char byte = ((
const unsigned char *)addr)[off];
953 printf(
"%c", (iscntrl(
byte) ?
'.' :
byte));
963 printf(
" ... (and more %u bytes)\n", (
unsigned)truncate);
1002 printf(
"Unit tests:\n");
1004 printf(
" %s\n", test->
name);
1008 static const char word_delim[] =
" \t-_/.,:;";
1012 pattern_len = strlen(pattern);
1014 substr = strstr(
name, pattern);
1015 while (substr != NULL) {
1016 int starts_on_word_boundary =
1017 (substr ==
name || strchr(word_delim, substr[-1]) != NULL);
1018 int ends_on_word_boundary =
1019 (substr[pattern_len] ==
'\0' ||
1020 strchr(word_delim, substr[pattern_len]) != NULL);
1022 if (starts_on_word_boundary && ends_on_word_boundary)
1025 substr = strstr(substr + 1, pattern);
1071 acutest_error_(const
char *
fmt, ...) {
1106# ifndef TEST_NO_EXCEPTIONS
1145 printf(
"All conditions have passed.\n");
1149 printf(
"Duration: ");
1171# ifndef TEST_NO_EXCEPTIONS
1172 }
catch (std::exception &e) {
1173 const char *what = e.what();
1181 printf(
"C++ exception.\n\n");
1189 printf(
"C++ exception.\n\n");
1216# if defined(ACUTEST_UNIX_)
1226 if (pid == (pid_t)-1) {
1227 acutest_error_(
"Cannot fork. %s [%d]", strerror(errno), errno);
1228 }
else if (pid == 0) {
1232 acutest_exit_((
int)state);
1235 waitpid(pid, &exit_code, 0);
1236 if (WIFEXITED(exit_code)) {
1238 }
else if (WIFSIGNALED(exit_code)) {
1240 const char *signame;
1241 switch (WTERMSIG(exit_code)) {
1249 signame =
"SIGQUIT";
1252 signame =
"SIGABRT";
1255 signame =
"SIGKILL";
1258 signame =
"SIGSEGV";
1264 signame =
"SIGTERM";
1267 snprintf(tmp,
sizeof(tmp),
"signal %d", WTERMSIG(exit_code));
1271 acutest_error_(
"Test interrupted by %s.", signame);
1273 acutest_error_(
"Test ended in an unexpected way [%d].", exit_code);
1277# elif defined(ACUTEST_WIN_)
1280 STARTUPINFOA startupInfo;
1281 PROCESS_INFORMATION processInfo;
1287 "%s --worker=%d %s --no-exec --no-summary %s --verbose=%d "
1288 "--color=%s -- \"%s\"",
1292 memset(&startupInfo, 0,
sizeof(startupInfo));
1293 startupInfo.cb =
sizeof(STARTUPINFO);
1294 if (CreateProcessA(NULL,
buffer, NULL, NULL, FALSE, 0, NULL, NULL,
1295 &startupInfo, &processInfo)) {
1296 WaitForSingleObject(processInfo.hProcess, INFINITE);
1297 GetExitCodeProcess(processInfo.hProcess, &exitCode);
1298 CloseHandle(processInfo.hThread);
1299 CloseHandle(processInfo.hProcess);
1311 acutest_error_(
"Aborted.");
1314 acutest_error_(
"Access violation.");
1317 acutest_error_(
"Test ended in an unexpected way [%lu].", exitCode);
1321 acutest_error_(
"Cannot create unit test subprocess [%ld].",
1344# if defined(ACUTEST_WIN_)
1346static LONG CALLBACK acutest_seh_exception_filter_(EXCEPTION_POINTERS *ptrs) {
1349 ptrs->ExceptionRecord->ExceptionCode);
1351 ptrs->ExceptionRecord->ExceptionAddress);
1356 return EXCEPTION_EXECUTE_HANDLER;
1360# define ACUTEST_CMDLINE_OPTFLAG_OPTIONALARG_ 0x0001
1361# define ACUTEST_CMDLINE_OPTFLAG_REQUIREDARG_ 0x0002
1363# define ACUTEST_CMDLINE_OPTID_NONE_ 0
1364# define ACUTEST_CMDLINE_OPTID_UNKNOWN_ (-0x7fffffff + 0)
1365# define ACUTEST_CMDLINE_OPTID_MISSINGARG_ (-0x7fffffff + 1)
1366# define ACUTEST_CMDLINE_OPTID_BOGUSARG_ (-0x7fffffff + 2)
1377 int (*callback)(
int ,
const char * )) {
1382 for (i = 0; arggroup[i] !=
'\0'; i++) {
1383 for (opt = options; opt->
id != 0; opt++) {
1389 ret = callback(opt->
id, NULL);
1393 badoptname[0] =
'-';
1394 badoptname[1] = arggroup[i];
1395 badoptname[2] =
'\0';
1408# define ACUTEST_CMDLINE_AUXBUF_SIZE_ 32
1411 int argc,
char **argv,
1412 int (*callback)(
int ,
1417 int after_doubledash = 0;
1424 if (after_doubledash || strcmp(argv[i],
"-") == 0) {
1427 }
else if (strcmp(argv[i],
"--") == 0) {
1429 after_doubledash = 1;
1430 }
else if (argv[i][0] !=
'-') {
1434 for (opt = options; opt->
id != 0; opt++) {
1435 if (opt->
longname != NULL && strncmp(argv[i],
"--", 2) == 0) {
1436 size_t len = strlen(opt->
longname);
1437 if (strncmp(argv[i] + 2, opt->
longname, len) == 0) {
1439 if (argv[i][2 + len] ==
'\0') {
1442 ret = callback(opt->
id, NULL);
1446 }
else if (argv[i][2 + len] ==
'=') {
1450 ret = callback(opt->
id, argv[i] + 2 + len + 1);
1452 snprintf(auxbuf,
sizeof(auxbuf),
"--%s", opt->
longname);
1460 }
else if (opt->
shortname !=
'\0' && argv[i][0] ==
'-') {
1464 if (argv[i][2] !=
'\0')
1465 ret = callback(opt->
id, argv[i] + 2);
1466 else if (i + 1 < argc)
1467 ret = callback(opt->
id, argv[++i]);
1472 ret = callback(opt->
id, NULL);
1476 if (ret == 0 && argv[i][2] !=
'\0')
1478 options, argv[i] + 2, callback);
1486 if (argv[i][0] !=
'-') {
1491 char *badoptname = argv[i];
1493 if (strncmp(badoptname,
"--", 2) == 0) {
1495 char *assignment = strchr(badoptname,
'=');
1496 if (assignment != NULL) {
1497 size_t len = (size_t)(assignment - badoptname);
1500 strncpy(auxbuf, badoptname, len);
1502 badoptname = auxbuf;
1522 printf(
"Run the specified unit tests; or if the option '--exclude' is used, "
1524 printf(
"tests in the suite but those listed. By default, if no tests are "
1526 printf(
"on the command line, all unit tests in the suite are run.\n");
1528 printf(
"Options:\n");
1530 " -X, --exclude Execute all unit tests but the listed ones\n");
1531 printf(
" --exec[=WHEN] If supported, execute unit tests as child "
1534 " (WHEN is one of 'auto', 'always', 'never')\n");
1535 printf(
" -E, --no-exec Same as --exec=never\n");
1536# if defined ACUTEST_WIN_
1537 printf(
" -t, --time Measure test duration\n");
1538# elif defined ACUTEST_HAS_POSIX_TIMER_
1539 printf(
" -t, --time Measure test duration (real time)\n");
1540 printf(
" --time=TIMER Measure test duration, using given timer\n");
1541 printf(
" (TIMER is one of 'real', 'cpu')\n");
1543 printf(
" --no-summary Suppress printing of test results summary\n");
1544 printf(
" --tap Produce TAP-compliant output\n");
1545 printf(
" (See https://testanything.org/)\n");
1546 printf(
" -x, --xml-output=FILE Enable XUnit output to the given file\n");
1547 printf(
" -l, --list List unit tests in the suite and exit\n");
1548 printf(
" -v, --verbose Make output more verbose\n");
1549 printf(
" --verbose=LEVEL Set verbose level to LEVEL:\n");
1550 printf(
" 0 ... Be silent\n");
1551 printf(
" 1 ... Output one line per test (and "
1553 printf(
" 2 ... As 1 and failed conditions (this is "
1555 printf(
" 3 ... As 1 and all conditions (and "
1556 "extended summary)\n");
1557 printf(
" -q, --quiet Same as --verbose=0\n");
1558 printf(
" --color[=WHEN] Enable colorized output\n");
1560 " (WHEN is one of 'auto', 'always', 'never')\n");
1561 printf(
" --no-color Same as --color=never\n");
1562 printf(
" -h, --help Display this help and exit\n");
1571 {
'X',
"exclude",
'X', 0},
1572 {
's',
"skip",
'X', 0},
1574 {
'E',
"no-exec",
'E', 0},
1575# if defined ACUTEST_WIN_
1576 {
't',
"time",
't', 0},
1577 {0,
"timer",
't', 0},
1578# elif defined ACUTEST_HAS_POSIX_TIMER_
1583 {0,
"no-summary",
'S', 0},
1585 {
'l',
"list",
'l', 0},
1587 {
'q',
"quiet",
'q', 0},
1589 {0,
"no-color",
'C', 0},
1590 {
'h',
"help",
'h', 0},
1602 if (arg == NULL || strcmp(arg,
"always") == 0) {
1604 }
else if (strcmp(arg,
"never") == 0) {
1606 }
else if (strcmp(arg,
"auto") == 0) {
1609 fprintf(stderr,
"%s: Unrecognized argument '%s' for option --exec.\n",
1611 fprintf(stderr,
"Try '%s --help' for more information.\n",
1622# if defined ACUTEST_WIN_ || defined ACUTEST_HAS_POSIX_TIMER_
1623 if (arg == NULL || strcmp(arg,
"real") == 0) {
1625# ifndef ACUTEST_WIN_
1626 }
else if (strcmp(arg,
"cpu") == 0) {
1630 fprintf(stderr,
"%s: Unrecognized argument '%s' for option --time.\n",
1632 fprintf(stderr,
"Try '%s --help' for more information.\n",
1662 if (arg == NULL || strcmp(arg,
"always") == 0) {
1664 }
else if (strcmp(arg,
"never") == 0) {
1666 }
else if (strcmp(arg,
"auto") == 0) {
1669 fprintf(stderr,
"%s: Unrecognized argument '%s' for option --color.\n",
1671 fprintf(stderr,
"Try '%s --help' for more information.\n",
1693 fprintf(stderr,
"Unable to open '%s': %s\n", arg, strerror(errno));
1700 fprintf(stderr,
"%s: Unrecognized unit test '%s'\n",
acutest_argv0_, arg);
1701 fprintf(stderr,
"Try '%s --list' for list of unit tests.\n",
1708 fprintf(stderr,
"Unrecognized command line option '%s'.\n", arg);
1709 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1714 fprintf(stderr,
"The command line option '%s' requires an argument.\n",
1716 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1722 "The command line option '%s' does not expect an argument.\n", arg);
1723 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1732# ifdef ACUTEST_LINUX_
1736 static const int OVERLAP = 32;
1740 pid_t tracer_pid = 0;
1747 fd = open(
"/proc/self/status", O_RDONLY);
1750 static const char pattern[] =
"\nTracerPid:";
1753 while (n_read <
sizeof(buf) - 1) {
1756 n = read(fd, buf + n_read,
sizeof(buf) - 1 - n_read);
1759 n_read += (size_t)
n;
1763 field = strstr(buf, pattern);
1764 if (field != NULL && field < buf +
sizeof(buf) - OVERLAP) {
1765 tracer_pid = (pid_t)atoi(field +
sizeof(pattern) - 1);
1769 if (n_read ==
sizeof(buf) - 1) {
1774 memmove(buf, buf +
sizeof(buf) - 1 - OVERLAP, OVERLAP);
1783 if (tracer_pid != 0)
1789# ifdef ACUTEST_MACOS_
1793 struct kinfo_proc info;
1798 mib[2] = KERN_PROC_PID;
1801 size =
sizeof(info);
1802 info.kp_proc.p_flag = 0;
1803 sysctl(mib,
sizeof(mib) /
sizeof(*mib), &info, &size, NULL, 0);
1805 if (info.kp_proc.p_flag & P_TRACED)
1811 if (IsDebuggerPresent())
1815# ifdef RUNNING_ON_VALGRIND
1818 if (RUNNING_ON_VALGRIND)
1831# if defined ACUTEST_UNIX_
1833# elif defined ACUTEST_WIN_
1834# if defined _BORLANDC_
1851 fprintf(stderr,
"Out of memory.\n");
1862# if defined(ACUTEST_WIN_)
1863 SetUnhandledExceptionFilter(acutest_seh_exception_filter_);
1865 _set_abort_behavior(0, _WRITE_ABORT_MSG);
1927 int n_run, n_success, n_failed;
1936 printf(
" Count of run unit tests: %4d\n", n_run);
1937 printf(
" Count of successful unit tests: %4d\n", n_success);
1938 printf(
" Count of failed unit tests: %4d\n", n_failed);
1941 if (n_failed == 0) {
1943 printf(
" No unit tests have failed.\n");
1946 printf(
" %d of %d unit tests %s failed.\n", n_failed, n_run,
1947 (n_failed == 1) ?
"has" :
"have");
1957 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
1959 "<testsuite name=\"%s\" tests=\"%d\" errors=\"0\" failures=\"%d\" "
1967 const char *str_state;
1971 switch (details->
state) {
1977 str_state =
"<skipped />";
1981 str_state =
"<failure />";
1985 if (str_state != NULL)
2017# pragma warning(pop)
#define ACUTEST_CMDLINE_OPTID_NONE_
#define ACUTEST_ATTRIBUTE_(attr)
vsnprintf(buffer, sizeof(buffer), fmt, args)
static void acutest_init_(const char *test_name)
struct acutest_test_CMDLINE_OPTION_ ACUTEST_CMDLINE_OPTION_
static int acutest_test_failures_
static int const char * fmt
#define ACUTEST_COLOR_DEFAULT_INTENSIVE_
static const ACUTEST_CMDLINE_OPTION_ acutest_cmdline_options_[]
static void acutest_line_indent_(int level)
#define ACUTEST_COLOR_GREEN_INTENSIVE_
static int acutest_name_contains_word_(const char *name, const char *pattern)
static int acutest_test_already_logged_
static int acutest_no_exec_
static void acutest_finish_test_line_(enum acutest_state_ state)
void acutest_dump_(const char *title, const void *addr, size_t size)
static FILE * acutest_xml_output_
int acutest_check_(int cond, const char *file, int line, const char *fmt,...)
@ ACUTEST_STATE_NEEDTORUN
static int acutest_worker_
static int acutest_colorize_
static char acutest_case_name_[TEST_CASE_MAXSIZE]
static void acutest_cleanup_(void)
static void acutest_timer_print_diff_(void)
#define ACUTEST_COLOR_GREEN_
static int acutest_case_already_logged_
static int const char char buffer[256]
static const struct acutest_test_ * acutest_current_test_
#define TEST_CASE_MAXSIZE
static int acutest_list_size_
static void acutest_help_(void)
static int acutest_cond_failed_
static int acutest_timer_
#define ACUTEST_CMDLINE_OPTID_MISSINGARG_
static void acutest_fini_(const char *test_name)
static void acutest_timer_get_time_(int *ts)
#define ACUTEST_CMDLINE_OPTID_UNKNOWN_
#define ACUTEST_CMDLINE_OPTID_BOGUSARG_
static void acutest_list_names_(void)
static int acutest_cmdline_read_(const ACUTEST_CMDLINE_OPTION_ *options, int argc, char **argv, int(*callback)(int, const char *))
static void acutest_run_(const struct acutest_test_ *test, int index, int master_index)
static int acutest_verbose_level_
const struct acutest_test_ acutest_list_[]
static int acutest_cmdline_handle_short_opt_group_(const ACUTEST_CMDLINE_OPTION_ *options, const char *arggroup, int(*callback)(int, const char *))
void acutest_timer_init_(void)
#define ACUTEST_CMDLINE_AUXBUF_SIZE_
static int acutest_abort_has_jmp_buf_
static void acutest_begin_test_line_(const struct acutest_test_ *test)
static int acutest_test_skip_count_
int const char int const char int result_color
static char acutest_test_skip_reason_[256]
static int acutest_under_debugger_(void)
static double acutest_timer_diff_(int start, int end)
void acutest_abort_(void) ACUTEST_ATTRIBUTE_(noreturn)
static int acutest_count_(enum acutest_state_ state)
static enum acutest_state_ acutest_do_run_(const struct acutest_test_ *test, int index)
#define ACUTEST_CMDLINE_OPTFLAG_REQUIREDARG_
static int acutest_worker_index_
static int acutest_cmdline_callback_(int id, const char *arg)
#define ACUTEST_COLOR_YELLOW_
static jmp_buf acutest_abort_jmp_buf_
#define ACUTEST_COLOR_RED_INTENSIVE_
static int acutest_test_check_count_
void int const char size_t reason_len
static int acutest_select_(const char *pattern)
#define ACUTEST_COLOR_RED_
#define TEST_DUMP_MAXSIZE
static acutest_timer_type_ acutest_timer_start_
static int acutest_current_index_
static int acutest_no_summary_
static char * acutest_argv0_
static acutest_timer_type_ acutest_timer_end_
#define ACUTEST_CMDLINE_OPTFLAG_OPTIONALARG_
void acutest_case_(const char *fmt,...)
static const char * acutest_basename_(const char *path)
void acutest_message_(const char *fmt,...)
#define ACUTEST_COLOR_YELLOW_INTENSIVE_
static int acutest_exclude_mode_
enum acutest_state_ state