24#ifndef CRITERION_INTERNAL_TEST_H_
25#define CRITERION_INTERNAL_TEST_H_
32# import <Foundation/Foundation.h>
39#define CR_IDENTIFIER_(Category, Name, Suffix) \
40 Category ## _ ## Name ## _ ## Suffix
44# define CR_LANG CR_LANG_OBJCXX
46# define CR_LANG CR_LANG_CXX
50# define CR_LANG CR_LANG_OBJC
52# define CR_LANG CR_LANG_C
57# define CR_TEST_PROTOTYPE_(Category, Name) \
58 extern "C" void CR_IDENTIFIER_(Category, Name, impl)(void)
60# define CR_TEST_PROTOTYPE_(Category, Name) \
61 void CR_IDENTIFIER_(Category, Name, impl)(void)
64#define CR_SUITE_IDENTIFIER_(Name, Suffix) \
65 suite_ ## Name ## _ ## Suffix
83# define CR_TEST_TRAMPOLINE_(Category, Name) \
84 static inline void CR_IDENTIFIER_(Category, Name, jmp)(void) { \
86 criterion_internal_test_setup(); \
87 } catch (const std::exception &e) { \
88 criterion_test_die(cr_msg_test_init_std_exception, e.what()); \
90 criterion_test_die(cr_msg_test_init_other_exception); \
93 criterion_internal_test_main((void (*)(void))CR_IDENTIFIER_(Category, Name, impl)); \
94 } catch (const std::exception &e) { \
95 criterion_test_die(cr_msg_test_main_std_exception, e.what()); \
97 criterion_test_die(cr_msg_test_main_other_exception); \
100 criterion_internal_test_teardown(); \
101 } catch (const std::exception &e) { \
102 criterion_test_die(cr_msg_test_fini_std_exception, e.what()); \
104 criterion_test_die(cr_msg_test_fini_other_exception); \
108# if defined (__OBJC__) && defined (__EXCEPTIONS)
109# define CR_TEST_TRAMPOLINE_(Category, Name) \
110 static inline void CR_IDENTIFIER_(Category, Name, jmp)(void) { \
112 criterion_internal_test_setup(); \
113 } @catch (NSException *e) { \
114 NSString *reason = [e reason]; \
115 criterion_test_die(cr_msg_test_init_std_exception, [reason UTF8String]); \
117 criterion_test_die(cr_msg_test_init_other_exception); \
120 criterion_internal_test_main((void (*)(void))CR_IDENTIFIER_(Category, Name, impl)); \
121 } @catch (NSException *e) { \
122 NSString *reason = [e reason]; \
123 criterion_test_die(cr_msg_test_main_std_exception, [reason UTF8String]); \
125 criterion_test_die(cr_msg_test_main_other_exception); \
128 criterion_internal_test_teardown(); \
129 } @catch (NSException *e) { \
130 NSString *reason = [e reason]; \
131 criterion_test_die(cr_msg_test_fini_std_exception, [reason UTF8String]); \
133 criterion_test_die(cr_msg_test_fini_other_exception); \
137# define CR_TEST_TRAMPOLINE_(Category, Name) \
138 static inline void CR_IDENTIFIER_(Category, Name, jmp)(void) { \
139 criterion_internal_test_setup(); \
140 criterion_internal_test_main((void (*)(void))CR_IDENTIFIER_(Category, Name, impl)); \
141 criterion_internal_test_teardown(); \
146#if defined (_MSC_VER)
147# define CR_COMPILER_ CR_COMP_MSVC
148#elif defined (__clang__)
149# define CR_COMPILER_ CR_COMP_CLANG
150#elif defined (__GNUC__)
151# define CR_COMPILER_ CR_COMP_GCC
153# define CR_COMPILER_ CR_COMP_UNKNOWN
156#define CR_TEST_BASE(Category, Name, ...) \
157 CR_TEST_PROTOTYPE_(Category, Name); \
158 CR_TEST_TRAMPOLINE_(Category, Name) \
159 struct criterion_test_extra_data CR_IDENTIFIER_(Category, Name, extra) = \
160 CR_EXPAND(CRITERION_MAKE_STRUCT(criterion_test_extra_data, \
161 .compiler_ = CR_COMPILER_, \
163 .kind_ = CR_TEST_NORMAL, \
164 .param_ = (struct criterion_test_params (*)(void))NULL, \
165 .identifier_ = #Category "/" #Name, \
170 struct criterion_test CR_IDENTIFIER_(Category, Name, meta) = { \
173 CR_IDENTIFIER_(Category, Name, jmp), \
174 &CR_IDENTIFIER_(Category, Name, extra) \
177 CR_SECTION_("cr_tst") \
178 struct criterion_test *CR_IDENTIFIER_(Category, Name, ptr) \
179 = &CR_IDENTIFIER_(Category, Name, meta) CR_SECTION_SUFFIX_; \
180 CR_TEST_PROTOTYPE_(Category, Name)
182#define CR_SUITE_BASE(Name, ...) \
183 struct criterion_test_extra_data CR_SUITE_IDENTIFIER_(Name, extra) = \
184 CR_EXPAND(CRITERION_MAKE_STRUCT(criterion_test_extra_data, \
189 struct criterion_suite CR_SUITE_IDENTIFIER_(Name, meta) = { \
191 &CR_SUITE_IDENTIFIER_(Name, extra), \
194 CR_SECTION_("cr_sts") \
195 struct criterion_suite *CR_SUITE_IDENTIFIER_(Name, ptr) \
196 = &CR_SUITE_IDENTIFIER_(Name, meta) CR_SECTION_SUFFIX_
199#define Test(...) CR_EXPAND(CR_TEST_BASE(__VA_ARGS__, .sentinel_ = 0))
201#define TestSuite(...) CR_EXPAND(CR_SUITE_BASE(__VA_ARGS__, .sentinel_ = 0))
static const char *const cr_msg_test_main_other_exception
static const char *const cr_msg_test_fini_std_exception
static CR_END_C_API const char *const cr_msg_test_init_std_exception
CR_API void criterion_internal_test_teardown(void)
CR_API void criterion_internal_test_main(void(*fn)(void))
CR_BEGIN_C_API CR_API void criterion_internal_test_setup(void)
static const char *const cr_msg_test_fini_other_exception
static const char *const cr_msg_test_main_std_exception
static const char *const cr_msg_test_init_other_exception