| #ifndef _JTEST_TEST_DEFINE_H_ |
| #define _JTEST_TEST_DEFINE_H_ |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Includes */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| #include "jtest_util.h" |
| #include "jtest_define.h" |
| #include "jtest_test.h" |
| |
| /* For defining macros with optional arguments */ |
| #include "opt_arg/opt_arg.h" |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Macros and Defines */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| /** |
| * Prefix for all #JTEST_TEST_t structs. |
| */ |
| #define JTEST_TEST_STRUCT_NAME_PREFIX G_JTEST_TEST_STRUCT_ |
| |
| /** |
| * Define test template used by #JTEST_TEST_t tests. |
| */ |
| #define JTEST_TEST_FN_TEMPLATE(test_fn) \ |
| JTEST_TEST_RET_t test_fn(void) |
| |
| #define JTEST_TEST_FN_PROTOTYPE JTEST_TEST_FN_TEMPLATE /**< Alias for |
| * #JTEST_TEST_FN_TEMPLATE. */ |
| |
| /** |
| * Evaluate to the name of the #JTEST_TEST_t struct associated with test_fn. |
| */ |
| #define JTEST_TEST_STRUCT_NAME(test_fn) \ |
| JTEST_STRUCT_NAME(JTEST_TEST_STRUCT_NAME_PREFIX, test_fn) |
| |
| /** |
| * Define a #JTEST_TEST_t struct based on the given test_fn. |
| */ |
| #define JTEST_TEST_DEFINE_STRUCT(test_fn) \ |
| JTEST_DEFINE_STRUCT(JTEST_TEST_t, \ |
| JTEST_TEST_STRUCT_NAME(test_fn)) |
| |
| /** |
| * Declare a #JTEST_TEST_t struct based on the given test_fn. |
| */ |
| #define JTEST_TEST_DECLARE_STRUCT(test_fn) \ |
| JTEST_DECLARE_STRUCT(JTEST_TEST_DEFINE_STRUCT(test_fn)) |
| |
| /** |
| * Contents needed to initialize a JTEST_TEST_t struct. |
| */ |
| #define JTEST_TEST_STRUCT_INIT(test_fn, fut, enable) \ |
| test_fn, \ |
| STR_NL(test_fn), \ |
| STR_NL(fut), \ |
| { \ |
| { \ |
| enable, \ |
| 0 \ |
| } \ |
| } \ |
| |
| |
| /** |
| * Initialize the contents of a #JTEST_TEST_t struct. |
| */ |
| #define JTEST_TEST_INIT(test_fn, fut, enable) \ |
| JTEST_TEST_DEFINE_STRUCT(test_fn) = { \ |
| JTEST_TEST_STRUCT_INIT(test_fn, fut, enable) \ |
| } |
| |
| /* Test Definition Macro */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| /** |
| * Define a #JTEST_TEST_t object and a test function. |
| */ |
| #define _JTEST_DEFINE_TEST(test_fn, fut, enable) \ |
| JTEST_TEST_FN_PROTOTYPE(test_fn); \ |
| JTEST_TEST_INIT(test_fn, fut, enable); \ |
| JTEST_TEST_FN_PROTOTYPE(test_fn) /* Notice the lacking semicolon */ |
| |
| /** |
| * Declare a #JTEST_TEST_t object and a test function prototype. |
| */ |
| #define JTEST_DECLARE_TEST(test_fn) \ |
| JTEST_TEST_FN_PROTOTYPE(test_fn); \ |
| JTEST_TEST_DECLARE_STRUCT(test_fn) /* Note the lacking semicolon */ |
| |
| /*--------------------------------------------------------------------------------*/ |
| /* Macros with optional arguments */ |
| /*--------------------------------------------------------------------------------*/ |
| |
| /* Top-level Interface */ |
| #define JTEST_DEFINE_TEST(...) \ |
| JTEST_DEFINE_TEST_(PP_NARG(__VA_ARGS__), ##__VA_ARGS__) |
| |
| /* Dispatch Macro*/ |
| #define JTEST_DEFINE_TEST_(N, ...) \ |
| SPLICE(JTEST_DEFINE_TEST_, N)(__VA_ARGS__) |
| |
| /* Default Arguments */ |
| #define JTEST_DEFINE_TEST_DEFAULT_FUT /* Blank */ |
| #define JTEST_DEFINE_TEST_DEFAULT_ENABLE \ |
| JTEST_TRUE /* Tests enabled by |
| * default. */ |
| |
| /* Dispatch Cases*/ |
| #define JTEST_DEFINE_TEST_1(_1) \ |
| _JTEST_DEFINE_TEST( \ |
| _1, \ |
| JTEST_DEFINE_TEST_DEFAULT_FUT, \ |
| JTEST_DEFINE_TEST_DEFAULT_ENABLE \ |
| ) |
| |
| #define JTEST_DEFINE_TEST_2(_1, _2) \ |
| _JTEST_DEFINE_TEST( \ |
| _1, \ |
| _2, \ |
| JTEST_DEFINE_TEST_DEFAULT_ENABLE \ |
| ) |
| |
| #define JTEST_DEFINE_TEST_3(_1, _2, _3) \ |
| _JTEST_DEFINE_TEST( \ |
| _1, \ |
| _2, \ |
| _3 \ |
| ) |
| |
| #endif /* _JTEST_TEST_DEFINE_H_ */ |