• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 )                   \
37 boost::unit_test::make_test_case( boost::function<void ()>(test_function), \
38                                   test_name ,                              \
39                                   __FILE__, __LINE__ )
40 #define BOOST_TEST_CASE( test_function )                                   \
41 BOOST_TEST_CASE_NAME(test_function, BOOST_TEST_STRINGIZE( test_function) )
42 #define BOOST_CLASS_TEST_CASE( test_function, tc_instance )                \
43 boost::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 )      \
59 namespace suite_name {                                                  \
60 BOOST_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 )          \
95 typedef 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 )                        \
100 typedef 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()             \
127 BOOST_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 )          \
137 BOOST_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 )  \
145 struct test_name : public F { void test_method(); };                    \
146                                                                         \
147 static 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                                                                         \
160 struct BOOST_AUTO_TC_UNIQUE_ID( test_name ) {};                         \
161                                                                         \
162 BOOST_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                                                                         \
168 void test_name::test_method()                                           \
169 /**/
170 
171 #define BOOST_FIXTURE_TEST_CASE_NO_DECOR( test_name, F )                \
172 BOOST_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 ) \
231 template<typename type_name>                                            \
232 struct test_name : public F                                             \
233 { void test_method(); };                                                \
234                                                                         \
235 struct 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                                                                         \
251 BOOST_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                                                                         \
257 template<typename type_name>                                            \
258 void 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 )       \
266 BOOST_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 )            \
284 template<typename type_name>                                            \
285 void BOOST_JOIN( name, _impl )( boost::type<type_name>* );              \
286                                                                         \
287 struct name {                                                           \
288     template<typename TestType>                                         \
289     static void run( boost::type<TestType>* frwrd = 0 )                 \
290     {                                                                   \
291        BOOST_JOIN( name, _impl )( frwrd );                              \
292     }                                                                   \
293 };                                                                      \
294                                                                         \
295 template<typename type_name>                                            \
296 void BOOST_JOIN( name, _impl )( boost::type<type_name>* )               \
297 /**/
298 
299 // ************************************************************************** //
300 // **************              BOOST_GLOBAL_FIXTURE            ************** //
301 // ************************************************************************** //
302 
303 #define BOOST_GLOBAL_FIXTURE( F ) \
304 static 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 ) \
312 static 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 ) \
320 static 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 )                                       \
328 static boost::unit_test::decorator::collector_t const&                  \
329 BOOST_TEST_APPEND_UNIQUE_ID(decorator_collector) BOOST_ATTRIBUTE_UNUSED = D; \
330 /**/
331 
332 // ************************************************************************** //
333 // **************         BOOST_AUTO_TEST_CASE_FIXTURE         ************** //
334 // ************************************************************************** //
335 
336 namespace boost { namespace unit_test { namespace ut_detail {
337 
338 struct 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.
345 typedef ::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 )                       \
368 static boost::unit_test::ut_detail::auto_test_unit_registrar       \
369 BOOST_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
383 static 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
init_unit_test()387 bool init_unit_test()                   {
388 #else
389 ::boost::unit_test::test_suite*
390 init_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