Subversion Repositories CharLCD

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 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
 
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_ */