#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_ */
|