21 #ifndef LELY_TAP_TAP_H_ 22 #define LELY_TAP_TAP_H_ 27 #pragma GCC diagnostic ignored "-Wformat-zero-length" 32 #define TAP_ARGS_HAS_COMMA(...) \ 33 TAP_ARGS_AT_127(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 34 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 35 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 36 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 41 #define TAP_ARGS_AT_127(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ 42 _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ 43 _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, \ 44 _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, \ 45 _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \ 46 _61, _62, _63, _64, _65, _66, _67, _68, _69, _70, _71, _72, \ 47 _73, _74, _75, _76, _77, _78, _79, _80, _81, _82, _83, _84, \ 48 _85, _86, _87, _88, _89, _90, _91, _92, _93, _94, _95, _96, \ 49 _97, _98, _99, _100, _101, _102, _103, _104, _105, _106, _107, \ 50 _108, _109, _110, _111, _112, _113, _114, _115, _116, _117, \ 51 _118, _119, _120, _121, _122, _123, _124, _125, _126, ...) \ 52 TAP_ARGS_AT_127_(__VA_ARGS__, ) 53 #define TAP_ARGS_AT_127_(_127, ...) _127 55 #define TAP_ARGS_HAS_COMMA(...) \ 56 TAP_ARGS_AT_63(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0) 60 #define TAP_ARGS_AT_63(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \ 61 _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, \ 62 _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, \ 63 _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, \ 64 _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \ 66 TAP_ARGS_AT_63_(__VA_ARGS__, ) 67 #define TAP_ARGS_AT_63_(_63, ...) _63 71 #define TAP_ARGS_DEFAULT(arg, ...) \ 72 TAP_ARGS_DEFAULT_(TAP_ARGS_HAS_COMMA(__VA_ARGS__), arg, __VA_ARGS__) 73 #define TAP_ARGS_DEFAULT_(n, ...) TAP_ARGS_DEFAULT__(n, __VA_ARGS__) 74 #define TAP_ARGS_DEFAULT__(n, ...) TAP_ARGS_DEFAULT_##n(__VA_ARGS__) 75 #define TAP_ARGS_DEFAULT_0(arg, ...) __VA_ARGS__, arg 76 #define TAP_ARGS_DEFAULT_1(arg, ...) __VA_ARGS__ 85 #define tap_plan(...) tap_plan_(TAP_ARGS_DEFAULT("", __VA_ARGS__)) 86 #define tap_plan_(...) tap_plan__(__VA_ARGS__) 87 #define tap_plan__(n, ...) tap_plan_impl(n, "" __VA_ARGS__) 96 #define tap_test(...) tap_test_(TAP_ARGS_DEFAULT("", __VA_ARGS__)) 97 #define tap_test_(...) tap_test__(__VA_ARGS__) 98 #define tap_test__(expr, ...) \ 99 tap_test_impl(!!(expr), #expr, __FILE__, __LINE__, "" __VA_ARGS__) 109 #define tap_pass(...) tap_test_impl(1, "", __FILE__, __LINE__, "" __VA_ARGS__) 119 #define tap_fail(...) tap_test_impl(0, "", __FILE__, __LINE__, "" __VA_ARGS__) 126 #define tap_todo(...) tap_todo_(TAP_ARGS_DEFAULT("", __VA_ARGS__)) 127 #define tap_todo_(...) tap_todo__(__VA_ARGS__) 128 #define tap_todo__(expr, ...) \ 129 tap_test_impl(!!(expr), #expr, __FILE__, __LINE__, \ 130 " # TODO " __VA_ARGS__) 136 #define tap_skip(...) tap_skip_(TAP_ARGS_DEFAULT("", __VA_ARGS__)) 137 #define tap_skip_(...) tap_skip__(__VA_ARGS__) 138 #define tap_skip__(expr, ...) tap_pass(" # SKIP " __VA_ARGS__) 145 #define tap_diag(...) tap_diag_impl("# " __VA_ARGS__) 153 #define tap_abort(...) tap_abort_impl("" __VA_ARGS__) 160 #define tap_assert(expr) \ 162 : tap_abort("%s:%d: Assertion `%s' failed.", __FILE__, \ 170 void tap_plan_impl(
int n,
const char *format, ...) format_printf__(2, 3);
171 int tap_test_impl(
int test,
const char *expr,
const char *
file,
int line,
172 const char *format, ...) format_printf__(5, 6);
173 void tap_diag_impl(
const char *format, ...) format_printf__(1, 2);
174 _Noreturn void tap_abort_impl(
const char *format, ...) format_printf__(1, 2);
180 #endif // !LELY_TAP_TAP_H_ This header file is part of the Lely libraries; it contains the compiler feature definitions.
#define _Noreturn
A function declared with a _Noreturn function specifier SHALL not return to its caller.