Subversion Repositories AFRtranscoder

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #ifndef _JTEST_TEST_DEFINE_H_
  2. #define _JTEST_TEST_DEFINE_H_
  3.  
  4. /*--------------------------------------------------------------------------------*/
  5. /* Includes */
  6. /*--------------------------------------------------------------------------------*/
  7.  
  8. #include "jtest_util.h"
  9. #include "jtest_define.h"
  10. #include "jtest_test.h"
  11.  
  12. /* For defining macros with optional arguments */
  13. #include "opt_arg/opt_arg.h"
  14.  
  15. /*--------------------------------------------------------------------------------*/
  16. /* Macros and Defines */
  17. /*--------------------------------------------------------------------------------*/
  18.  
  19. /**
  20.  *  Prefix for all #JTEST_TEST_t structs.
  21.  */
  22. #define JTEST_TEST_STRUCT_NAME_PREFIX G_JTEST_TEST_STRUCT_
  23.  
  24. /**
  25.  *  Define test template used by #JTEST_TEST_t tests.
  26.  */
  27. #define JTEST_TEST_FN_TEMPLATE(test_fn)                         \
  28.     JTEST_TEST_RET_t test_fn(void)
  29.  
  30. #define JTEST_TEST_FN_PROTOTYPE JTEST_TEST_FN_TEMPLATE /**< Alias for
  31.                                                         * #JTEST_TEST_FN_TEMPLATE. */
  32.  
  33. /**
  34.  *  Evaluate to the name of the #JTEST_TEST_t struct associated with test_fn.
  35.  */
  36. #define JTEST_TEST_STRUCT_NAME(test_fn)                         \
  37.     JTEST_STRUCT_NAME(JTEST_TEST_STRUCT_NAME_PREFIX, test_fn)
  38.  
  39. /**
  40.  *  Define a #JTEST_TEST_t struct based on the given test_fn.
  41.  */
  42. #define JTEST_TEST_DEFINE_STRUCT(test_fn)                   \
  43.     JTEST_DEFINE_STRUCT(JTEST_TEST_t,                       \
  44.                         JTEST_TEST_STRUCT_NAME(test_fn))
  45.  
  46. /**
  47.  *  Declare a #JTEST_TEST_t struct based on the given test_fn.
  48.  */
  49. #define JTEST_TEST_DECLARE_STRUCT(test_fn)      \
  50.     JTEST_DECLARE_STRUCT(JTEST_TEST_DEFINE_STRUCT(test_fn))
  51.  
  52. /**
  53.  *  Contents needed to initialize a JTEST_TEST_t struct.
  54.  */
  55. #define JTEST_TEST_STRUCT_INIT(test_fn, fut, enable)    \
  56.     test_fn,                                            \
  57.         STR_NL(test_fn),                                   \
  58.         STR_NL(fut),                                       \
  59.     {                                                   \
  60.         {                                               \
  61.             enable,                                     \
  62.                 0                                       \
  63.         }                                               \
  64.     }                                                   \
  65.        
  66.  
  67. /**
  68.  *  Initialize the contents of a #JTEST_TEST_t struct.
  69.  */
  70. #define JTEST_TEST_INIT(test_fn, fut, enable)              \
  71.     JTEST_TEST_DEFINE_STRUCT(test_fn) = {                  \
  72.         JTEST_TEST_STRUCT_INIT(test_fn, fut, enable)       \
  73.     }
  74.  
  75. /* Test Definition Macro */
  76. /*--------------------------------------------------------------------------------*/
  77.  
  78. /**
  79.  *  Define a #JTEST_TEST_t object and a test function.
  80.  */
  81. #define _JTEST_DEFINE_TEST(test_fn, fut, enable)           \
  82.     JTEST_TEST_FN_PROTOTYPE(test_fn);                      \
  83.     JTEST_TEST_INIT(test_fn, fut, enable);                 \
  84.     JTEST_TEST_FN_PROTOTYPE(test_fn) /* Notice the lacking semicolon */
  85.  
  86. /**
  87.  *  Declare a #JTEST_TEST_t object and a test function prototype.
  88.  */
  89. #define JTEST_DECLARE_TEST(test_fn)                                     \
  90.     JTEST_TEST_FN_PROTOTYPE(test_fn);                                   \
  91.     JTEST_TEST_DECLARE_STRUCT(test_fn) /* Note the lacking semicolon */
  92.  
  93. /*--------------------------------------------------------------------------------*/
  94. /* Macros with optional arguments */
  95. /*--------------------------------------------------------------------------------*/
  96.  
  97. /* Top-level Interface */
  98. #define JTEST_DEFINE_TEST(...)                             \
  99.     JTEST_DEFINE_TEST_(PP_NARG(__VA_ARGS__), ##__VA_ARGS__)
  100.  
  101. /* Dispatch Macro*/
  102. #define JTEST_DEFINE_TEST_(N, ...)                         \
  103.     SPLICE(JTEST_DEFINE_TEST_, N)(__VA_ARGS__)
  104.  
  105. /* Default Arguments */
  106. #define JTEST_DEFINE_TEST_DEFAULT_FUT /* Blank */
  107. #define JTEST_DEFINE_TEST_DEFAULT_ENABLE                   \
  108.     JTEST_TRUE                                 /* Tests enabled by
  109.                                                 * default. */
  110.  
  111. /* Dispatch Cases*/
  112. #define JTEST_DEFINE_TEST_1(_1)                            \
  113.     _JTEST_DEFINE_TEST(                                    \
  114.         _1,                                                \
  115.         JTEST_DEFINE_TEST_DEFAULT_FUT,                     \
  116.         JTEST_DEFINE_TEST_DEFAULT_ENABLE                   \
  117.         )
  118.  
  119. #define JTEST_DEFINE_TEST_2(_1, _2)                        \
  120.     _JTEST_DEFINE_TEST(                                    \
  121.         _1,                                                \
  122.         _2,                                                \
  123.         JTEST_DEFINE_TEST_DEFAULT_ENABLE                   \
  124.         )
  125.  
  126. #define JTEST_DEFINE_TEST_3(_1, _2, _3)                    \
  127.     _JTEST_DEFINE_TEST(                                    \
  128.         _1,                                                \
  129.         _2,                                                \
  130.         _3                                                 \
  131.         )
  132.  
  133. #endif /* _JTEST_TEST_DEFINE_H_ */
  134.