1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
/* clap: clar protocol, the traditional clar output format */
static void clar_print_clap_init(int test_count, int suite_count, const char *suite_names)
{
(void)test_count;
printf("Loaded %d suites: %s\n", (int)suite_count, suite_names);
printf("Started (test status codes: OK='.' FAILURE='F' SKIPPED='S')\n");
}
static void clar_print_clap_shutdown(int test_count, int suite_count, int error_count)
{
(void)test_count;
(void)suite_count;
(void)error_count;
printf("\n\n");
clar_report_all();
}
static void clar_print_clap_error(int num, const struct clar_report *report, const struct clar_error *error)
{
printf(" %d) Failure:\n", num);
printf("%s::%s [%s:%"PRIuZ"]\n",
report->suite,
report->test,
error->file,
error->line_number);
printf(" %s\n", error->error_msg);
if (error->description != NULL)
printf(" %s\n", error->description);
printf("\n");
fflush(stdout);
}
static void clar_print_clap_ontest(const char *test_name, int test_number, enum cl_test_status status)
{
(void)test_name;
(void)test_number;
switch(status) {
case CL_TEST_OK: printf("."); break;
case CL_TEST_FAILURE: printf("F"); break;
case CL_TEST_SKIP: printf("S"); break;
case CL_TEST_NOTRUN: printf("N"); break;
}
fflush(stdout);
}
static void clar_print_clap_onsuite(const char *suite_name, int suite_index)
{
if (_clar.report_suite_names)
printf("\n%s", suite_name);
(void)suite_index;
}
static void clar_print_clap_onabort(const char *fmt, va_list arg)
{
vfprintf(stderr, fmt, arg);
}
/* tap: test anywhere protocol format */
static void clar_print_tap_init(int test_count, int suite_count, const char *suite_names)
{
(void)test_count;
(void)suite_count;
(void)suite_names;
printf("TAP version 13\n");
}
static void clar_print_tap_shutdown(int test_count, int suite_count, int error_count)
{
(void)suite_count;
(void)error_count;
printf("1..%d\n", test_count);
}
static void clar_print_tap_error(int num, const struct clar_report *report, const struct clar_error *error)
{
(void)num;
(void)report;
(void)error;
}
static void print_escaped(const char *str)
{
char *c;
while ((c = strchr(str, '\'')) != NULL) {
printf("%.*s", (int)(c - str), str);
printf("''");
str = c + 1;
}
printf("%s", str);
}
static void clar_print_tap_ontest(const char *test_name, int test_number, enum cl_test_status status)
{
const struct clar_error *error = _clar.last_report->errors;
(void)test_name;
(void)test_number;
switch(status) {
case CL_TEST_OK:
printf("ok %d - %s::%s\n", test_number, _clar.active_suite, test_name);
break;
case CL_TEST_FAILURE:
printf("not ok %d - %s::%s\n", test_number, _clar.active_suite, test_name);
printf(" ---\n");
printf(" reason: |\n");
printf(" %s\n", error->error_msg);
if (error->description)
printf(" %s\n", error->description);
printf(" at:\n");
printf(" file: '"); print_escaped(error->file); printf("'\n");
printf(" line: %" PRIuZ "\n", error->line_number);
printf(" function: '%s'\n", error->function);
printf(" ---\n");
break;
case CL_TEST_SKIP:
case CL_TEST_NOTRUN:
printf("ok %d - # SKIP %s::%s\n", test_number, _clar.active_suite, test_name);
break;
}
fflush(stdout);
}
static void clar_print_tap_onsuite(const char *suite_name, int suite_index)
{
printf("# start of suite %d: %s\n", suite_index, suite_name);
}
static void clar_print_tap_onabort(const char *fmt, va_list arg)
{
printf("Bail out! ");
vprintf(fmt, arg);
fflush(stdout);
}
/* indirection between protocol output selection */
#define PRINT(FN, ...) do { \
switch (_clar.output_format) { \
case CL_OUTPUT_CLAP: \
clar_print_clap_##FN (__VA_ARGS__); \
break; \
case CL_OUTPUT_TAP: \
clar_print_tap_##FN (__VA_ARGS__); \
break; \
default: \
abort(); \
} \
} while (0)
static void clar_print_init(int test_count, int suite_count, const char *suite_names)
{
PRINT(init, test_count, suite_count, suite_names);
}
static void clar_print_shutdown(int test_count, int suite_count, int error_count)
{
PRINT(shutdown, test_count, suite_count, error_count);
}
static void clar_print_error(int num, const struct clar_report *report, const struct clar_error *error)
{
PRINT(error, num, report, error);
}
static void clar_print_ontest(const char *test_name, int test_number, enum cl_test_status status)
{
PRINT(ontest, test_name, test_number, status);
}
static void clar_print_onsuite(const char *suite_name, int suite_index)
{
PRINT(onsuite, suite_name, suite_index);
}
static void clar_print_onabort(const char *msg, ...)
{
va_list argp;
va_start(argp, msg);
PRINT(onabort, msg, argp);
va_end(argp);
}