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, ...) acutest_check_(!!(cond), __FILE__, __LINE__, __VA_ARGS__)
95#define TEST_CHECK(cond) acutest_check_(!!(cond), __FILE__, __LINE__, "%s", #cond)
112#define TEST_ASSERT_(cond, ...) \
114 if (!acutest_check_(!!(cond), __FILE__, __LINE__, __VA_ARGS__)) \
117#define TEST_ASSERT(cond) \
119 if (!acutest_check_(!!(cond), __FILE__, __LINE__, "%s", #cond)) \
124# ifndef TEST_NO_EXCEPTIONS
139# define TEST_EXCEPTION(code, exctype) \
141 bool exc_ok_ = false; \
142 const char *msg_ = NULL; \
145 msg_ = "No exception thrown."; \
146 } catch (exctype const &) { \
149 msg_ = "Unexpected exception thrown."; \
151 acutest_check_(exc_ok_, __FILE__, __LINE__, #code " throws " #exctype); \
153 acutest_message_("%s", msg_); \
155# define TEST_EXCEPTION_(code, exctype, ...) \
157 bool exc_ok_ = false; \
158 const char *msg_ = NULL; \
161 msg_ = "No exception thrown."; \
162 } catch (exctype const &) { \
165 msg_ = "Unexpected exception thrown."; \
167 acutest_check_(exc_ok_, __FILE__, __LINE__, __VA_ARGS__); \
169 acutest_message_("%s", msg_); \
192#define TEST_CASE_(...) acutest_case_(__VA_ARGS__)
193#define TEST_CASE(name) acutest_case_("%s", name)
198#ifndef TEST_CASE_MAXSIZE
199# define TEST_CASE_MAXSIZE 64
223#define TEST_MSG(...) acutest_message_(__VA_ARGS__)
228#ifndef TEST_MSG_MAXSIZE
229# define TEST_MSG_MAXSIZE 1024
243#define TEST_DUMP(title, addr, size) acutest_dump_(title, addr, size)
248#ifndef TEST_DUMP_MAXSIZE
249# define TEST_DUMP_MAXSIZE 1024
259#define TEST_SKIP(...) acutest_skip_(__FILE__, __LINE__, __VA_ARGS__)
291#if defined(__GNUC__) || defined(__clang__)
292# define ACUTEST_ATTRIBUTE_(attr) __attribute__((attr))
294# define ACUTEST_ATTRIBUTE_(attr)
316void acutest_dump_(
const char *title,
const void *addr,
size_t size);
330# if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
331# define ACUTEST_UNIX_ 1
335# include <sys/types.h>
336# include <sys/wait.h>
340# if defined CLOCK_PROCESS_CPUTIME_ID && defined CLOCK_MONOTONIC
341# define ACUTEST_HAS_POSIX_TIMER_ 1
345# if defined(_gnu_linux_) || defined(__linux__)
346# define ACUTEST_LINUX_ 1
348# include <sys/stat.h>
351# if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__)
352# define ACUTEST_WIN_ 1
357# if defined(__APPLE__)
358# define ACUTEST_MACOS_
361# include <sys/sysctl.h>
362# include <sys/types.h>
367# ifndef TEST_NO_EXCEPTIONS
373# if __has_include(<valgrind.h>)
374# include <valgrind.h>
389# pragma warning(push)
390# pragma warning(disable : 4996)
452# if defined ACUTEST_WIN_
454static LARGE_INTEGER acutest_timer_freq_;
463 double duration = (double)(end.QuadPart - start.QuadPart);
464 duration /= (double)acutest_timer_freq_.QuadPart;
471# elif defined ACUTEST_HAS_POSIX_TIMER_
472static clockid_t acutest_timer_id_;
479 acutest_timer_id_ = CLOCK_MONOTONIC;
481 acutest_timer_id_ = CLOCK_PROCESS_CPUTIME_ID;
488 return (
double)(end.tv_sec - start.tv_sec) + (
double)(end.tv_nsec - start.tv_nsec) / 1e9;
512# define ACUTEST_COLOR_DEFAULT_ 0
513# define ACUTEST_COLOR_RED_ 1
514# define ACUTEST_COLOR_GREEN_ 2
515# define ACUTEST_COLOR_YELLOW_ 3
516# define ACUTEST_COLOR_DEFAULT_INTENSIVE_ 10
517# define ACUTEST_COLOR_RED_INTENSIVE_ 11
518# define ACUTEST_COLOR_GREEN_INTENSIVE_ 12
519# define ACUTEST_COLOR_YELLOW_INTENSIVE_ 13
533 return printf(
"%s",
buffer);
536# if defined ACUTEST_UNIX_
541 col_str =
"\033[0;31m";
544 col_str =
"\033[0;32m";
547 col_str =
"\033[0;33m";
550 col_str =
"\033[1;31m";
553 col_str =
"\033[1;32m";
556 col_str =
"\033[1;33m";
565 printf(
"%s", col_str);
570# elif defined ACUTEST_WIN_
573 CONSOLE_SCREEN_BUFFER_INFO info;
576 h = GetStdHandle(STD_OUTPUT_HANDLE);
577 GetConsoleScreenBufferInfo(h, &info);
581 attr = FOREGROUND_RED;
584 attr = FOREGROUND_GREEN;
587 attr = FOREGROUND_RED | FOREGROUND_GREEN;
590 attr = FOREGROUND_RED | FOREGROUND_INTENSITY;
593 attr = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
596 attr = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
599 attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
606 SetConsoleTextAttribute(h, attr);
609 SetConsoleTextAttribute(h, info.wAttributes);
621 name = strrchr(path,
'/');
630 const char *alt_name;
632 alt_name = strrchr(path,
'\\');
633 if (alt_name != NULL) {
639 if (alt_name > name) {
658 memset(spaces,
' ',
sizeof(spaces));
659 if (
n < (
int)
sizeof(spaces)) {
660 printf(
"%.*s", (
int)
sizeof(spaces) -
n, spaces);
678 printf(
"# Duration: ");
703 acutest_colored_printf_(color,
"%s", str);
716 static const char spaces[] =
" ";
725 printf(
"%s", spaces);
728 printf(
"%.*s",
n, spaces);
910 static const size_t BYTES_PER_LINE = 16;
930 printf((title[strlen(title) - 1] ==
':') ?
"%s\n" :
"%s:\n", title);
937 printf(
"%08lx: ", (
unsigned long)
line_beg);
940 printf(
" %02x", ((
const unsigned char *)addr)[off]);
948 unsigned char byte = ((
const unsigned char *)addr)[off];
950 printf(
"%c", (iscntrl(
byte) ?
'.' :
byte));
961 printf(
" ... (and more %u bytes)\n", (
unsigned)truncate);
1001 printf(
"Unit tests:\n");
1003 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 = (substr ==
name || strchr(word_delim, substr[-1]) != NULL);
1017 int ends_on_word_boundary =
1018 (substr[pattern_len] ==
'\0' || strchr(word_delim, substr[pattern_len]) != NULL);
1020 if (starts_on_word_boundary && ends_on_word_boundary) {
1024 substr = strstr(substr + 1, pattern);
1107# ifndef TEST_NO_EXCEPTIONS
1149 printf(
"All conditions have passed.\n");
1153 printf(
"Duration: ");
1176# ifndef TEST_NO_EXCEPTIONS
1177 }
catch (std::exception &e) {
1178 const char *what = e.what();
1187 printf(
"C++ exception.\n\n");
1195 printf(
"C++ exception.\n\n");
1211static void acutest_run_(
const struct acutest_test_ *test,
int index,
int master_index) {
1221# if defined(ACUTEST_UNIX_)
1231 if (pid == (pid_t)-1) {
1232 acutest_error_(
"Cannot fork. %s [%d]", strerror(errno), errno);
1233 }
else if (pid == 0) {
1236 state = acutest_do_run_(test, index);
1237 acutest_exit_((
int)state);
1240 waitpid(pid, &exit_code, 0);
1241 if (WIFEXITED(exit_code)) {
1243 }
else if (WIFSIGNALED(exit_code)) {
1245 const char *signame;
1246 switch (WTERMSIG(exit_code)) {
1254 signame =
"SIGQUIT";
1257 signame =
"SIGABRT";
1260 signame =
"SIGKILL";
1263 signame =
"SIGSEGV";
1269 signame =
"SIGTERM";
1272 snprintf(tmp,
sizeof(tmp),
"signal %d", WTERMSIG(exit_code));
1276 acutest_error_(
"Test interrupted by %s.", signame);
1278 acutest_error_(
"Test ended in an unexpected way [%d].", exit_code);
1282# elif defined(ACUTEST_WIN_)
1285 STARTUPINFOA startupInfo;
1286 PROCESS_INFORMATION processInfo;
1293 "%s --worker=%d %s --no-exec --no-summary %s --verbose=%d "
1294 "--color=%s -- \"%s\"",
1298 memset(&startupInfo, 0,
sizeof(startupInfo));
1299 startupInfo.cb =
sizeof(STARTUPINFO);
1301 CreateProcessA(NULL,
buffer, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo)
1303 WaitForSingleObject(processInfo.hProcess, INFINITE);
1304 GetExitCodeProcess(processInfo.hProcess, &exitCode);
1305 CloseHandle(processInfo.hThread);
1306 CloseHandle(processInfo.hProcess);
1318 acutest_error_(
"Aborted.");
1321 acutest_error_(
"Access violation.");
1324 acutest_error_(
"Test ended in an unexpected way [%lu].", exitCode);
1328 acutest_error_(
"Cannot create unit test subprocess [%ld].", GetLastError());
1334 state = acutest_do_run_(test, index);
1340 state = acutest_do_run_(test, index);
1350# if defined(ACUTEST_WIN_)
1352static LONG CALLBACK acutest_seh_exception_filter_(EXCEPTION_POINTERS *ptrs) {
1354 acutest_message_(
"Exception code: 0x%08lx", ptrs->ExceptionRecord->ExceptionCode);
1355 acutest_message_(
"Exception address: 0x%p", ptrs->ExceptionRecord->ExceptionAddress);
1360 return EXCEPTION_EXECUTE_HANDLER;
1364# define ACUTEST_CMDLINE_OPTFLAG_OPTIONALARG_ 0x0001
1365# define ACUTEST_CMDLINE_OPTFLAG_REQUIREDARG_ 0x0002
1367# define ACUTEST_CMDLINE_OPTID_NONE_ 0
1368# define ACUTEST_CMDLINE_OPTID_UNKNOWN_ (-0x7fffffff + 0)
1369# define ACUTEST_CMDLINE_OPTID_MISSINGARG_ (-0x7fffffff + 1)
1370# define ACUTEST_CMDLINE_OPTID_BOGUSARG_ (-0x7fffffff + 2)
1372typedef struct acutest_test_CMDLINE_OPTION_ {
1374 const char *longname;
1377} ACUTEST_CMDLINE_OPTION_;
1380 const ACUTEST_CMDLINE_OPTION_ *options,
const char *arggroup,
1381 int (*callback)(
int ,
const char * )
1383 const ACUTEST_CMDLINE_OPTION_ *opt;
1387 for (i = 0; arggroup[i] !=
'\0'; i++) {
1388 for (opt = options; opt->id != 0; opt++) {
1389 if (arggroup[i] == opt->shortname) {
1395 ret = callback(opt->id, NULL);
1399 badoptname[0] =
'-';
1400 badoptname[1] = arggroup[i];
1401 badoptname[2] =
'\0';
1416# define ACUTEST_CMDLINE_AUXBUF_SIZE_ 32
1419 const ACUTEST_CMDLINE_OPTION_ *options,
int argc,
char **argv,
1420 int (*callback)(
int ,
const char * )
1423 const ACUTEST_CMDLINE_OPTION_ *opt;
1425 int after_doubledash = 0;
1432 if (after_doubledash || strcmp(argv[i],
"-") == 0) {
1435 }
else if (strcmp(argv[i],
"--") == 0) {
1437 after_doubledash = 1;
1438 }
else if (argv[i][0] !=
'-') {
1442 for (opt = options; opt->id != 0; opt++) {
1443 if (opt->longname != NULL && strncmp(argv[i],
"--", 2) == 0) {
1444 size_t len = strlen(opt->longname);
1445 if (strncmp(argv[i] + 2, opt->longname, len) == 0) {
1447 if (argv[i][2 + len] ==
'\0') {
1450 ret = callback(opt->id, NULL);
1455 }
else if (argv[i][2 + len] ==
'=') {
1461 ret = callback(opt->id, argv[i] + 2 + len + 1);
1463 snprintf(auxbuf,
sizeof(auxbuf),
"--%s", opt->longname);
1471 }
else if (opt->shortname !=
'\0' && argv[i][0] ==
'-') {
1472 if (argv[i][1] == opt->shortname) {
1475 if (argv[i][2] !=
'\0') {
1476 ret = callback(opt->id, argv[i] + 2);
1477 }
else if (i + 1 < argc) {
1478 ret = callback(opt->id, argv[++i]);
1484 ret = callback(opt->id, NULL);
1488 if (ret == 0 && argv[i][2] !=
'\0') {
1498 if (argv[i][0] !=
'-') {
1503 char *badoptname = argv[i];
1505 if (strncmp(badoptname,
"--", 2) == 0) {
1507 char *assignment = strchr(badoptname,
'=');
1508 if (assignment != NULL) {
1509 size_t len = (size_t)(assignment - badoptname);
1513 strncpy(auxbuf, badoptname, len);
1515 badoptname = auxbuf;
1537 "Run the specified unit tests; or if the option '--exclude' is used, "
1541 "tests in the suite but those listed. By default, if no tests are "
1544 printf(
"on the command line, all unit tests in the suite are run.\n");
1546 printf(
"Options:\n");
1547 printf(
" -X, --exclude Execute all unit tests but the listed ones\n");
1549 " --exec[=WHEN] If supported, execute unit tests as child "
1552 printf(
" (WHEN is one of 'auto', 'always', 'never')\n");
1553 printf(
" -E, --no-exec Same as --exec=never\n");
1554# if defined ACUTEST_WIN_
1555 printf(
" -t, --time Measure test duration\n");
1556# elif defined ACUTEST_HAS_POSIX_TIMER_
1557 printf(
" -t, --time Measure test duration (real time)\n");
1558 printf(
" --time=TIMER Measure test duration, using given timer\n");
1559 printf(
" (TIMER is one of 'real', 'cpu')\n");
1561 printf(
" --no-summary Suppress printing of test results summary\n");
1562 printf(
" --tap Produce TAP-compliant output\n");
1563 printf(
" (See https://testanything.org/)\n");
1564 printf(
" -x, --xml-output=FILE Enable XUnit output to the given file\n");
1565 printf(
" -l, --list List unit tests in the suite and exit\n");
1566 printf(
" -v, --verbose Make output more verbose\n");
1567 printf(
" --verbose=LEVEL Set verbose level to LEVEL:\n");
1568 printf(
" 0 ... Be silent\n");
1570 " 1 ... Output one line per test (and "
1574 " 2 ... As 1 and failed conditions (this is "
1578 " 3 ... As 1 and all conditions (and "
1579 "extended summary)\n"
1581 printf(
" -q, --quiet Same as --verbose=0\n");
1582 printf(
" --color[=WHEN] Enable colorized output\n");
1583 printf(
" (WHEN is one of 'auto', 'always', 'never')\n");
1584 printf(
" --no-color Same as --color=never\n");
1585 printf(
" -h, --help Display this help and exit\n");
1594 {
'X',
"exclude",
'X', 0},
1595 {
's',
"skip",
'X', 0},
1597 {
'E',
"no-exec",
'E', 0},
1598# if defined ACUTEST_WIN_
1599 {
't',
"time",
't', 0},
1600 {0,
"timer",
't', 0},
1601# elif defined ACUTEST_HAS_POSIX_TIMER_
1605 {0,
"no-summary",
'S', 0},
1607 {
'l',
"list",
'l', 0},
1609 {
'q',
"quiet",
'q', 0},
1611 {0,
"no-color",
'C', 0},
1612 {
'h',
"help",
'h', 0},
1625 if (arg == NULL || strcmp(arg,
"always") == 0) {
1627 }
else if (strcmp(arg,
"never") == 0) {
1629 }
else if (strcmp(arg,
"auto") == 0) {
1632 fprintf(stderr,
"%s: Unrecognized argument '%s' for option --exec.\n",
acutest_argv0_, arg);
1633 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1643# if defined ACUTEST_WIN_ || defined ACUTEST_HAS_POSIX_TIMER_
1644 if (arg == NULL || strcmp(arg,
"real") == 0) {
1646# ifndef ACUTEST_WIN_
1647 }
else if (strcmp(arg,
"cpu") == 0) {
1651 fprintf(stderr,
"%s: Unrecognized argument '%s' for option --time.\n",
acutest_argv0_, arg);
1652 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1680 if (arg == NULL || strcmp(arg,
"always") == 0) {
1682 }
else if (strcmp(arg,
"never") == 0) {
1684 }
else if (strcmp(arg,
"auto") == 0) {
1687 fprintf(stderr,
"%s: Unrecognized argument '%s' for option --color.\n",
acutest_argv0_, arg);
1688 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1709 fprintf(stderr,
"Unable to open '%s': %s\n", arg, strerror(errno));
1716 fprintf(stderr,
"%s: Unrecognized unit test '%s'\n",
acutest_argv0_, arg);
1717 fprintf(stderr,
"Try '%s --list' for list of unit tests.\n",
acutest_argv0_);
1723 fprintf(stderr,
"Unrecognized command line option '%s'.\n", arg);
1724 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1729 fprintf(stderr,
"The command line option '%s' requires an argument.\n", arg);
1730 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1735 fprintf(stderr,
"The command line option '%s' does not expect an argument.\n", arg);
1736 fprintf(stderr,
"Try '%s --help' for more information.\n",
acutest_argv0_);
1745# ifdef ACUTEST_LINUX_
1749 static const int OVERLAP = 32;
1753 pid_t tracer_pid = 0;
1760 fd = open(
"/proc/self/status", O_RDONLY);
1763 static const char pattern[] =
"\nTracerPid:";
1766 while (n_read <
sizeof(buf) - 1) {
1769 n = read(fd, buf + n_read,
sizeof(buf) - 1 - n_read);
1773 n_read += (size_t)
n;
1777 field = strstr(buf, pattern);
1778 if (field != NULL && field < buf +
sizeof(buf) - OVERLAP) {
1779 tracer_pid = (pid_t)atoi(field +
sizeof(pattern) - 1);
1783 if (n_read ==
sizeof(buf) - 1) {
1788 memmove(buf, buf +
sizeof(buf) - 1 - OVERLAP, OVERLAP);
1797 if (tracer_pid != 0) {
1804# ifdef ACUTEST_MACOS_
1808 struct kinfo_proc info;
1813 mib[2] = KERN_PROC_PID;
1816 size =
sizeof(info);
1817 info.kp_proc.p_flag = 0;
1818 sysctl(mib,
sizeof(mib) /
sizeof(*mib), &info, &size, NULL, 0);
1820 if (info.kp_proc.p_flag & P_TRACED) {
1827 if (IsDebuggerPresent()) {
1832# ifdef RUNNING_ON_VALGRIND
1835 if (RUNNING_ON_VALGRIND) {
1849# if defined ACUTEST_UNIX_
1851# elif defined ACUTEST_WIN_
1852# if defined _BORLANDC_
1870 fprintf(stderr,
"Out of memory.\n");
1880# if defined(ACUTEST_WIN_)
1881 SetUnhandledExceptionFilter(acutest_seh_exception_filter_);
1883 _set_abort_behavior(0, _WRITE_ABORT_MSG);
1950 int n_run, n_success, n_failed;
1959 printf(
" Count of run unit tests: %4d\n", n_run);
1960 printf(
" Count of successful unit tests: %4d\n", n_success);
1961 printf(
" Count of failed unit tests: %4d\n", n_failed);
1964 if (n_failed == 0) {
1966 printf(
" No unit tests have failed.\n");
1970 " %d of %d unit tests %s failed.\n", n_failed, n_run, (n_failed == 1) ?
"has" :
"have"
1984 "<testsuite name=\"%s\" tests=\"%d\" errors=\"0\" failures=\"%d\" "
1991 const char *str_state;
1997 switch (details->
state) {
2003 str_state =
"<skipped />";
2007 str_state =
"<failure />";
2011 if (str_state != NULL) {
2044# 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)
static int const char * fmt
#define ACUTEST_COLOR_DEFAULT_INTENSIVE_
static const ACUTEST_CMDLINE_OPTION_ acutest_cmdline_options_[]
static void static int acutest_cmdline_handle_short_opt_group_(const ACUTEST_CMDLINE_OPTION_ *options, const char *arggroup, int(*callback)(int, const char *))
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 int acutest_verbose_level_
const struct acutest_test_ acutest_list_[]
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)
#define ACUTEST_CMDLINE_OPTFLAG_REQUIREDARG_
static int acutest_worker_index_
static int acutest_cmdline_callback_(int id, const char *arg)
static int acutest_test_failures_
#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_
The fiber facing IO API: blocking looking calls a fiber uses to do IO.
enum acutest_state_ state