Go to most recent revision | 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_ */ |