1// (C) Copyright Gennadiy Rozental 2001.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5
6// See http://www.boost.org/libs/test for the library home page.
7//
8/// @file
9/// @brief Defines Unit Test Framework public API
10// ***************************************************************************
11
12#ifndef BOOST_TEST_UNIT_TEST_SUITE_HPP_071894GER
13#define BOOST_TEST_UNIT_TEST_SUITE_HPP_071894GER
14
15// Boost.Test
16#include <boost/test/detail/config.hpp>
17#include <boost/test/framework.hpp>
18#include <boost/test/tree/auto_registration.hpp>
19#include <boost/test/tree/test_case_template.hpp>
20#include <boost/test/tree/global_fixture.hpp>
21
22
23#include <boost/test/detail/suppress_warnings.hpp>
24
25
26#include <boost/test/detail/pp_variadic.hpp>
27
28
29
30//____________________________________________________________________________//
31
32// ************************************************************************** //
33// ************** Non-auto (explicit) test case interface ************** //
34// ************************************************************************** //
35
36#define BOOST_TEST_CASE_NAME( test_function, test_name ) \
37boost::unit_test::make_test_case( boost::function<void ()>(test_function), \
38 test_name , \
39 __FILE__, __LINE__ )
40#define BOOST_TEST_CASE( test_function ) \
41BOOST_TEST_CASE_NAME(test_function, BOOST_TEST_STRINGIZE( test_function) )
42#define BOOST_CLASS_TEST_CASE( test_function, tc_instance ) \
43boost::unit_test::make_test_case( (test_function), \
44 BOOST_TEST_STRINGIZE( test_function ), \
45 __FILE__, __LINE__, tc_instance )
46
47// ************************************************************************** //
48// ************** BOOST_TEST_SUITE ************** //
49// ************************************************************************** //
50
51#define BOOST_TEST_SUITE( testsuite_name ) \
52( new boost::unit_test::test_suite( testsuite_name, __FILE__, __LINE__ ) )
53
54// ************************************************************************** //
55// ************** BOOST_AUTO_TEST_SUITE ************** //
56// ************************************************************************** //
57
58#define BOOST_AUTO_TEST_SUITE_WITH_DECOR( suite_name, decorators ) \
59namespace suite_name { \
60BOOST_AUTO_TU_REGISTRAR( suite_name )( \
61 BOOST_STRINGIZE( suite_name ), \
62 __FILE__, __LINE__, \
63 decorators ); \
64/**/
65
66#define BOOST_AUTO_TEST_SUITE_NO_DECOR( suite_name ) \
67 BOOST_AUTO_TEST_SUITE_WITH_DECOR( \
68 suite_name, \
69 boost::unit_test::decorator::collector_t::instance() ) \
70/**/
71
72#if BOOST_PP_VARIADICS
73#define BOOST_AUTO_TEST_SUITE( ... ) \
74 BOOST_TEST_INVOKE_IF_N_ARGS( 1, \
75 BOOST_AUTO_TEST_SUITE_NO_DECOR, \
76 BOOST_AUTO_TEST_SUITE_WITH_DECOR, \
77 __VA_ARGS__) \
78/**/
79
80#else /* BOOST_PP_VARIADICS */
81
82#define BOOST_AUTO_TEST_SUITE( suite_name ) \
83 BOOST_AUTO_TEST_SUITE_NO_DECOR( suite_name ) \
84/**/
85
86
87#endif /* BOOST_PP_VARIADICS */
88
89// ************************************************************************** //
90// ************** BOOST_FIXTURE_TEST_SUITE ************** //
91// ************************************************************************** //
92
93#define BOOST_FIXTURE_TEST_SUITE_WITH_DECOR(suite_name, F, decorators) \
94 BOOST_AUTO_TEST_SUITE_WITH_DECOR( suite_name, decorators ) \
95typedef F BOOST_AUTO_TEST_CASE_FIXTURE; \
96/**/
97
98#define BOOST_FIXTURE_TEST_SUITE_NO_DECOR( suite_name, F ) \
99 BOOST_AUTO_TEST_SUITE_NO_DECOR( suite_name ) \
100typedef F BOOST_AUTO_TEST_CASE_FIXTURE; \
101/**/
102
103#if BOOST_PP_VARIADICS
104
105#define BOOST_FIXTURE_TEST_SUITE( ... ) \
106 BOOST_TEST_INVOKE_IF_N_ARGS( 2, \
107 BOOST_FIXTURE_TEST_SUITE_NO_DECOR, \
108 BOOST_FIXTURE_TEST_SUITE_WITH_DECOR, \
109 __VA_ARGS__) \
110/**/
111
112#else /* BOOST_PP_VARIADICS */
113
114#define BOOST_FIXTURE_TEST_SUITE( suite_name, F ) \
115 BOOST_FIXTURE_TEST_SUITE_NO_DECOR( suite_name, F ) \
116/**/
117
118
119#endif /* BOOST_PP_VARIADICS */
120
121
122// ************************************************************************** //
123// ************** BOOST_AUTO_TEST_SUITE_END ************** //
124// ************************************************************************** //
125
126#define BOOST_AUTO_TEST_SUITE_END() \
127BOOST_AUTO_TU_REGISTRAR( end_suite )( 1 ); \
128} \
129/**/
130
131// ************************************************************************** //
132// ************** BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES ************** //
133// ************************************************************************** //
134
135/// @deprecated use decorator instead
136#define BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( test_name, n ) \
137BOOST_TEST_DECORATOR( * boost::unit_test::expected_failures( n ) ) \
138/**/
139
140// ************************************************************************** //
141// ************** BOOST_FIXTURE_TEST_CASE ************** //
142// ************************************************************************** //
143
144#define BOOST_FIXTURE_TEST_CASE_WITH_DECOR( test_name, F, decorators ) \
145struct test_name : public F { void test_method(); }; \
146 \
147static void BOOST_AUTO_TC_INVOKER( test_name )() \
148{ \
149 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture ctor"); \
150 test_name t; \
151 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture setup"); \
152 boost::unit_test::setup_conditional(t); \
153 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" test entry"); \
154 t.test_method(); \
155 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture teardown"); \
156 boost::unit_test::teardown_conditional(t); \
157 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture dtor"); \
158} \
159 \
160struct BOOST_AUTO_TC_UNIQUE_ID( test_name ) {}; \
161 \
162BOOST_AUTO_TU_REGISTRAR( test_name )( \
163 boost::unit_test::make_test_case( \
164 &BOOST_AUTO_TC_INVOKER( test_name ), \
165 #test_name, __FILE__, __LINE__ ), \
166 decorators ); \
167 \
168void test_name::test_method() \
169/**/
170
171#define BOOST_FIXTURE_TEST_CASE_NO_DECOR( test_name, F ) \
172BOOST_FIXTURE_TEST_CASE_WITH_DECOR( test_name, F, \
173 boost::unit_test::decorator::collector_t::instance() ) \
174/**/
175
176#if BOOST_PP_VARIADICS
177
178#define BOOST_FIXTURE_TEST_CASE( ... ) \
179 BOOST_TEST_INVOKE_IF_N_ARGS( 2, \
180 BOOST_FIXTURE_TEST_CASE_NO_DECOR, \
181 BOOST_FIXTURE_TEST_CASE_WITH_DECOR, \
182 __VA_ARGS__) \
183/**/
184
185#else /* BOOST_PP_VARIADICS */
186
187#define BOOST_FIXTURE_TEST_CASE( test_name, F ) \
188 BOOST_FIXTURE_TEST_CASE_NO_DECOR(test_name, F) \
189/**/
190
191
192#endif /* BOOST_PP_VARIADICS */
193
194// ************************************************************************** //
195// ************** BOOST_AUTO_TEST_CASE ************** //
196// ************************************************************************** //
197
198#define BOOST_AUTO_TEST_CASE_NO_DECOR( test_name ) \
199 BOOST_FIXTURE_TEST_CASE_NO_DECOR( test_name, \
200 BOOST_AUTO_TEST_CASE_FIXTURE ) \
201/**/
202
203#define BOOST_AUTO_TEST_CASE_WITH_DECOR( test_name, decorators ) \
204 BOOST_FIXTURE_TEST_CASE_WITH_DECOR( test_name, \
205 BOOST_AUTO_TEST_CASE_FIXTURE, decorators ) \
206/**/
207
208#if BOOST_PP_VARIADICS
209
210#define BOOST_AUTO_TEST_CASE( ... ) \
211 BOOST_TEST_INVOKE_IF_N_ARGS( 1, \
212 BOOST_AUTO_TEST_CASE_NO_DECOR, \
213 BOOST_AUTO_TEST_CASE_WITH_DECOR, \
214 __VA_ARGS__) \
215/**/
216
217#else /* BOOST_PP_VARIADICS */
218
219#define BOOST_AUTO_TEST_CASE( test_name ) \
220 BOOST_AUTO_TEST_CASE_NO_DECOR( test_name ) \
221/**/
222
223
224#endif /* BOOST_PP_VARIADICS */
225
226// ************************************************************************** //
227// ************** BOOST_FIXTURE_TEST_CASE_TEMPLATE ************** //
228// ************************************************************************** //
229
230#define BOOST_FIXTURE_TEST_CASE_TEMPLATE( test_name, type_name, TL, F ) \
231template<typename type_name> \
232struct test_name : public F \
233{ void test_method(); }; \
234 \
235struct BOOST_AUTO_TC_INVOKER( test_name ) { \
236 template<typename TestType> \
237 static void run( boost::type<TestType>* = 0 ) \
238 { \
239 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture ctor"); \
240 test_name<TestType> t; \
241 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture setup"); \
242 boost::unit_test::setup_conditional(t); \
243 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" test entry"); \
244 t.test_method(); \
245 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture teardown");\
246 boost::unit_test::teardown_conditional(t); \
247 BOOST_TEST_CHECKPOINT('"' << #test_name << "\" fixture dtor"); \
248 } \
249}; \
250 \
251BOOST_AUTO_TU_REGISTRAR( test_name )( \
252 boost::unit_test::ut_detail::template_test_case_gen< \
253 BOOST_AUTO_TC_INVOKER( test_name ),TL >( \
254 BOOST_STRINGIZE( test_name ), __FILE__, __LINE__ ), \
255 boost::unit_test::decorator::collector_t::instance() ); \
256 \
257template<typename type_name> \
258void test_name<type_name>::test_method() \
259/**/
260
261// ************************************************************************** //
262// ************** BOOST_AUTO_TEST_CASE_TEMPLATE ************** //
263// ************************************************************************** //
264
265#define BOOST_AUTO_TEST_CASE_TEMPLATE( test_name, type_name, TL ) \
266BOOST_FIXTURE_TEST_CASE_TEMPLATE( test_name, type_name, TL, \
267 BOOST_AUTO_TEST_CASE_FIXTURE ) \
268/**/
269
270// ************************************************************************** //
271// ************** BOOST_TEST_CASE_TEMPLATE ************** //
272// ************************************************************************** //
273
274#define BOOST_TEST_CASE_TEMPLATE( name, typelist ) \
275 boost::unit_test::ut_detail::template_test_case_gen<name,typelist>( \
276 BOOST_TEST_STRINGIZE( name ), __FILE__, __LINE__ ) \
277/**/
278
279// ************************************************************************** //
280// ************** BOOST_TEST_CASE_TEMPLATE_FUNCTION ************** //
281// ************************************************************************** //
282
283#define BOOST_TEST_CASE_TEMPLATE_FUNCTION( name, type_name ) \
284template<typename type_name> \
285void BOOST_JOIN( name, _impl )( boost::type<type_name>* ); \
286 \
287struct name { \
288 template<typename TestType> \
289 static void run( boost::type<TestType>* frwrd = 0 ) \
290 { \
291 BOOST_JOIN( name, _impl )( frwrd ); \
292 } \
293}; \
294 \
295template<typename type_name> \
296void BOOST_JOIN( name, _impl )( boost::type<type_name>* ) \
297/**/
298
299// ************************************************************************** //
300// ************** BOOST_GLOBAL_FIXTURE ************** //
301// ************************************************************************** //
302
303#define BOOST_GLOBAL_FIXTURE( F ) \
304static boost::unit_test::ut_detail::global_configuration_impl<F> BOOST_JOIN( gf_, F ) \
305/**/
306
307// ************************************************************************** //
308// ************** BOOST_TEST_GLOBAL_CONFIGURATION ************** //
309// ************************************************************************** //
310
311#define BOOST_TEST_GLOBAL_CONFIGURATION( F ) \
312static boost::unit_test::ut_detail::global_configuration_impl<F> BOOST_JOIN( gf_, F ) \
313/**/
314
315// ************************************************************************** //
316// ************** BOOST_TEST_GLOBAL_FIXTURE ************** //
317// ************************************************************************** //
318
319#define BOOST_TEST_GLOBAL_FIXTURE( F ) \
320static boost::unit_test::ut_detail::global_fixture_impl<F> BOOST_JOIN( gf_, F ) \
321/**/
322
323// ************************************************************************** //
324// ************** BOOST_TEST_DECORATOR ************** //
325// ************************************************************************** //
326
327#define BOOST_TEST_DECORATOR( D ) \
328static boost::unit_test::decorator::collector_t const& \
329BOOST_TEST_APPEND_UNIQUE_ID(decorator_collector) BOOST_ATTRIBUTE_UNUSED = D; \
330/**/
331
332// ************************************************************************** //
333// ************** BOOST_AUTO_TEST_CASE_FIXTURE ************** //
334// ************************************************************************** //
335
336namespace boost { namespace unit_test { namespace ut_detail {
337
338struct nil_t {};
339
340} // namespace ut_detail
341} // unit_test
342} // namespace boost
343
344// Intentionally is in global namespace, so that FIXTURE_TEST_SUITE can reset it in user code.
345typedef ::boost::unit_test::ut_detail::nil_t BOOST_AUTO_TEST_CASE_FIXTURE;
346
347// ************************************************************************** //
348// ************** Auto registration facility helper macros ************** //
349// ************************************************************************** //
350
351// Facility for having a unique name based on __LINE__ and __COUNTER__ (later if available)
352#if defined(__COUNTER__)
353 #define BOOST_TEST_INTERNAL_HAS_COUNTER
354#endif
355
356#if defined(BOOST_TEST_INTERNAL_HAS_COUNTER)
357 #define BOOST_TEST_APPEND_UNIQUE_ID( name ) \
358 BOOST_JOIN( BOOST_JOIN( name, __LINE__ ), __COUNTER__)
359 /**/
360#else
361 #define BOOST_TEST_APPEND_UNIQUE_ID( name ) \
362 BOOST_JOIN( name, __LINE__ )
363 /**/
364#endif
365/**/
366
367#define BOOST_AUTO_TU_REGISTRAR( test_name ) \
368static boost::unit_test::ut_detail::auto_test_unit_registrar \
369BOOST_TEST_APPEND_UNIQUE_ID( BOOST_JOIN( test_name, _registrar ) ) BOOST_ATTRIBUTE_UNUSED \
370/**/
371#define BOOST_AUTO_TC_INVOKER( test_name ) BOOST_JOIN( test_name, _invoker )
372#define BOOST_AUTO_TC_UNIQUE_ID( test_name ) BOOST_JOIN( test_name, _id )
373
374// ************************************************************************** //
375// ************** BOOST_TEST_MAIN ************** //
376// ************************************************************************** //
377
378#if defined(BOOST_TEST_MAIN)
379
380// initializing the master test suite name from the user defined macros
381// this function should be seen exactly once.
382#ifdef BOOST_TEST_MODULE
383static const boost::unit_test::framework::impl::master_test_suite_name_setter mtsetter(BOOST_TEST_STRINGIZE( BOOST_TEST_MODULE ).trim( "\"" ));
384#endif
385
386#ifdef BOOST_TEST_ALTERNATIVE_INIT_API
387bool init_unit_test() {
388#else
389::boost::unit_test::test_suite*
390init_unit_test_suite( int, char* [] ) {
391#endif
392
393#ifdef BOOST_TEST_ALTERNATIVE_INIT_API
394 return true;
395}
396#else
397 return 0;
398}
399#endif
400
401#endif
402
403//____________________________________________________________________________//
404
405#include <boost/test/detail/enable_warnings.hpp>
406
407
408#endif // BOOST_TEST_UNIT_TEST_SUITE_HPP_071894GER
409
410

source code of include/boost/test/unit_test_suite.hpp