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        : $RCSfile$
9 //
10 //  Version     : $Revision: 81247 $
11 //
12 //  Description : contains definition for all test tools in test toolbox
13 // ***************************************************************************
14 
15 #ifndef BOOST_TEST_TOOLS_INTERFACE_HPP_111712GER
16 #define BOOST_TEST_TOOLS_INTERFACE_HPP_111712GER
17 
18 // Boost.Test
19 #include <boost/test/unit_test_log.hpp>
20 #ifdef BOOST_TEST_TOOLS_DEBUGGABLE
21 #include <boost/test/debug.hpp>
22 #endif
23 
24 #include <boost/test/detail/pp_variadic.hpp>
25 
26 #ifdef BOOST_TEST_NO_OLD_TOOLS
27 #include <boost/preprocessor/seq/to_tuple.hpp>
28 
29 #include <iterator>
30 #endif // BOOST_TEST_NO_OLD_TOOLS
31 
32 #include <boost/test/detail/suppress_warnings.hpp>
33 
34 //____________________________________________________________________________//
35 
36 // ************************************************************************** //
37 // **************               BOOST_TEST_<level>             ************** //
38 // ************************************************************************** //
39 
40 #define BOOST_TEST_BUILD_ASSERTION( P )             \
41     (::boost::test_tools::assertion::seed()->*P)    \
42 /**/
43 
44 //____________________________________________________________________________//
45 
46 // Implementation based on direct predicate evaluation
47 #define BOOST_TEST_TOOL_DIRECT_IMPL( P, level, M )              \
48 do {                                                            \
49     ::boost::test_tools::assertion_result res = (P);            \
50     report_assertion(                                           \
51         res,                                                    \
52         BOOST_TEST_LAZY_MSG( M ),                               \
53         BOOST_TEST_L(__FILE__),                                 \
54         static_cast<std::size_t>(__LINE__),                     \
55         ::boost::test_tools::tt_detail::level,                  \
56         ::boost::test_tools::tt_detail::CHECK_MSG,              \
57         0 );                                                    \
58 } while( ::boost::test_tools::tt_detail::dummy_cond() )         \
59 /**/
60 
61 //____________________________________________________________________________//
62 
63 // Implementation based on expression template construction
64 #define BOOST_TEST_TOOL_ET_IMPL( P, level )                     \
65 do {                                                            \
66     BOOST_TEST_PASSPOINT();                                     \
67                                                                 \
68     ::boost::test_tools::tt_detail::                            \
69     report_assertion(                                           \
70       BOOST_TEST_BUILD_ASSERTION( P ).evaluate(),               \
71       BOOST_TEST_LAZY_MSG( BOOST_TEST_STRINGIZE( P ) ),         \
72       BOOST_TEST_L(__FILE__),                                   \
73       static_cast<std::size_t>(__LINE__),                       \
74       ::boost::test_tools::tt_detail::level,                    \
75       ::boost::test_tools::tt_detail::CHECK_BUILT_ASSERTION,    \
76       0 );                                                      \
77 } while( ::boost::test_tools::tt_detail::dummy_cond() )         \
78 /**/
79 
80 //____________________________________________________________________________//
81 
82 // Implementation based on expression template construction with extra tool arguments
83 #define BOOST_TEST_TOOL_ET_IMPL_EX( P, level, arg )             \
84 do {                                                            \
85     BOOST_TEST_PASSPOINT();                                     \
86                                                                 \
87     ::boost::test_tools::tt_detail::                            \
88     report_assertion(                                           \
89       ::boost::test_tools::tt_detail::assertion_evaluate(       \
90         BOOST_TEST_BUILD_ASSERTION( P ) )                       \
91           << arg,                                               \
92       ::boost::test_tools::tt_detail::assertion_text(           \
93           BOOST_TEST_LAZY_MSG( BOOST_TEST_STRINGIZE(P) ),       \
94           BOOST_TEST_LAZY_MSG( arg ) ),                         \
95       BOOST_TEST_L(__FILE__),                                   \
96       static_cast<std::size_t>(__LINE__),                       \
97       ::boost::test_tools::tt_detail::level,                    \
98       ::boost::test_tools::tt_detail::assertion_type()          \
99           << arg,                                               \
100       0 );                                                      \
101 } while( ::boost::test_tools::tt_detail::dummy_cond() )         \
102 /**/
103 
104 //____________________________________________________________________________//
105 
106 #ifdef BOOST_TEST_TOOLS_UNDER_DEBUGGER
107 
108 #define BOOST_TEST_TOOL_UNIV( level, P )                                    \
109     BOOST_TEST_TOOL_DIRECT_IMPL( P, level, BOOST_TEST_STRINGIZE( P ) )      \
110 /**/
111 
112 #define BOOST_TEST_TOOL_UNIV_EX( level, P, ... )                            \
113     BOOST_TEST_TOOL_UNIV( level, P )                                        \
114 /**/
115 
116 #elif defined(BOOST_TEST_TOOLS_DEBUGGABLE)
117 
118 #define BOOST_TEST_TOOL_UNIV( level, P )                                    \
119 do {                                                                        \
120     if( ::boost::debug::under_debugger() )                                  \
121         BOOST_TEST_TOOL_DIRECT_IMPL( P, level, BOOST_TEST_STRINGIZE( P ) ); \
122     else                                                                    \
123         BOOST_TEST_TOOL_ET_IMPL( P, level );                                \
124 } while( ::boost::test_tools::tt_detail::dummy_cond() )                     \
125 /**/
126 
127 #define BOOST_TEST_TOOL_UNIV_EX( level, P, ... )                            \
128     BOOST_TEST_TOOL_UNIV( level, P )                                        \
129 /**/
130 
131 #else
132 
133 #define BOOST_TEST_TOOL_UNIV( level, P )                                    \
134     BOOST_TEST_TOOL_ET_IMPL( P, level )                                     \
135 /**/
136 
137 #define BOOST_TEST_TOOL_UNIV_EX( level, P, ... )                            \
138     BOOST_TEST_TOOL_ET_IMPL_EX( P, level, __VA_ARGS__ )                     \
139 /**/
140 
141 #endif
142 
143 //____________________________________________________________________________//
144 
145 #define BOOST_TEST_WARN( ... )              BOOST_TEST_INVOKE_IF_N_ARGS(    \
146     2, BOOST_TEST_TOOL_UNIV, BOOST_TEST_TOOL_UNIV_EX, WARN, __VA_ARGS__ )   \
147 /**/
148 #define BOOST_TEST_CHECK( ... )             BOOST_TEST_INVOKE_IF_N_ARGS(    \
149     2, BOOST_TEST_TOOL_UNIV, BOOST_TEST_TOOL_UNIV_EX, CHECK, __VA_ARGS__ )  \
150 /**/
151 #define BOOST_TEST_REQUIRE( ... )           BOOST_TEST_INVOKE_IF_N_ARGS(    \
152     2, BOOST_TEST_TOOL_UNIV, BOOST_TEST_TOOL_UNIV_EX, REQUIRE, __VA_ARGS__ )\
153 /**/
154 
155 #define BOOST_TEST( ... )                   BOOST_TEST_INVOKE_IF_N_ARGS(    \
156     2, BOOST_TEST_TOOL_UNIV, BOOST_TEST_TOOL_UNIV_EX, CHECK, __VA_ARGS__ )  \
157 /**/
158 
159 //____________________________________________________________________________//
160 
161 #define BOOST_TEST_ERROR( M )               BOOST_CHECK_MESSAGE( false, M )
162 #define BOOST_TEST_FAIL( M )                BOOST_REQUIRE_MESSAGE( false, M )
163 
164 //____________________________________________________________________________//
165 
166 #define BOOST_TEST_IS_DEFINED( symb ) ::boost::test_tools::tt_detail::is_defined_impl( symb, BOOST_STRINGIZE(= symb) )
167 
168 //____________________________________________________________________________//
169 
170 #ifdef BOOST_TEST_NO_OLD_TOOLS
171 
172 #ifdef BOOST_TEST_TOOLS_UNDER_DEBUGGER
173 
174 #define BOOST_CHECK_THROW_IMPL(S, E, TL, Ppassed, Mpassed, Pcaught, Mcaught)\
175 do { try {                                                                  \
176     S;                                                                      \
177     BOOST_TEST_TOOL_DIRECT_IMPL( Ppassed, TL, Mpassed );                    \
178 } catch( E ) {                                                              \
179     BOOST_TEST_TOOL_DIRECT_IMPL( Pcaught, TL, Mcaught );                    \
180 }} while( ::boost::test_tools::tt_detail::dummy_cond() )                    \
181 /**/
182 
183 #elif defined(BOOST_TEST_TOOLS_DEBUGGABLE)
184 
185 #define BOOST_CHECK_THROW_IMPL(S, E, TL, Ppassed, Mpassed, Pcaught, Mcaught)\
186 do { try {                                                                  \
187     if( ::boost::debug::under_debugger() )                                  \
188         BOOST_TEST_PASSPOINT();                                             \
189     S;                                                                      \
190     BOOST_TEST_TOOL_DIRECT_IMPL( Ppassed, TL, Mpassed );                    \
191 } catch( E ) {                                                              \
192     BOOST_TEST_TOOL_DIRECT_IMPL( Pcaught, TL, Mcaught );                    \
193 }} while( ::boost::test_tools::tt_detail::dummy_cond() )                    \
194 /**/
195 
196 #else
197 
198 #define BOOST_CHECK_THROW_IMPL(S, E, TL, Ppassed, Mpassed, Pcaught, Mcaught)\
199 do { try {                                                                  \
200     BOOST_TEST_PASSPOINT();                                                 \
201     S;                                                                      \
202     BOOST_TEST_TOOL_DIRECT_IMPL( Ppassed, TL, Mpassed );                    \
203 } catch( E ) {                                                              \
204     BOOST_TEST_TOOL_DIRECT_IMPL( Pcaught, TL, Mcaught );                    \
205 }} while( ::boost::test_tools::tt_detail::dummy_cond() )                    \
206 /**/
207 
208 #endif
209 
210 //____________________________________________________________________________//
211 
212 #define BOOST_WARN_THROW( S, E )                                            \
213     BOOST_CHECK_THROW_IMPL(S, E const&, WARN,                               \
214             false, "exception " BOOST_STRINGIZE(E) " is expected",          \
215             true , "exception " BOOST_STRINGIZE(E) " is caught" )           \
216 /**/
217 #define BOOST_CHECK_THROW( S, E )                                           \
218     BOOST_CHECK_THROW_IMPL(S, E const&, CHECK,                              \
219             false, "exception " BOOST_STRINGIZE(E) " is expected",          \
220             true , "exception " BOOST_STRINGIZE(E) " is caught" )           \
221 /**/
222 #define BOOST_REQUIRE_THROW( S, E )                                         \
223     BOOST_CHECK_THROW_IMPL(S, E const&, REQUIRE,                            \
224             false, "exception " BOOST_STRINGIZE(E) " is expected",          \
225             true , "exception " BOOST_STRINGIZE(E) " is caught" )           \
226 /**/
227 
228 //____________________________________________________________________________//
229 
230 #define BOOST_WARN_EXCEPTION( S, E, P )                                     \
231     BOOST_CHECK_THROW_IMPL(S, E const& ex, WARN,                            \
232             false, "exception " BOOST_STRINGIZE(E) " is expected",          \
233             P(ex), "incorrect exception " BOOST_STRINGIZE(E) " is caught" ) \
234 /**/
235 #define BOOST_CHECK_EXCEPTION( S, E, P )                                    \
236     BOOST_CHECK_THROW_IMPL(S, E const& ex, CHECK,                           \
237             false, "exception " BOOST_STRINGIZE(E) " is expected",          \
238             P(ex), "incorrect exception " BOOST_STRINGIZE(E) " is caught" ) \
239 /**/
240 #define BOOST_REQUIRE_EXCEPTION( S, E, P )                                  \
241     BOOST_CHECK_THROW_IMPL(S, E const& ex, REQUIRE,                         \
242             false, "exception " BOOST_STRINGIZE(E) " is expected",          \
243             P(ex), "incorrect exception " BOOST_STRINGIZE(E) " is caught" ) \
244 /**/
245 
246 //____________________________________________________________________________//
247 
248 #define BOOST_WARN_NO_THROW( S )                                            \
249     BOOST_CHECK_THROW_IMPL(S, ..., WARN,                                    \
250             true , "no exceptions thrown by " BOOST_STRINGIZE( S ),         \
251             false, "exception thrown by " BOOST_STRINGIZE( S ) )            \
252 /**/
253 #define BOOST_CHECK_NO_THROW( S )                                           \
254     BOOST_CHECK_THROW_IMPL(S, ..., CHECK,                                   \
255             true , "no exceptions thrown by " BOOST_STRINGIZE( S ),         \
256             false, "exception thrown by " BOOST_STRINGIZE( S ) )            \
257 /**/
258 #define BOOST_REQUIRE_NO_THROW( S )                                         \
259     BOOST_CHECK_THROW_IMPL(S, ..., REQUIRE,                                 \
260             true , "no exceptions thrown by " BOOST_STRINGIZE( S ),         \
261             false, "exception thrown by " BOOST_STRINGIZE( S ) )            \
262 /**/
263 
264 //____________________________________________________________________________//
265 
266 #define BOOST_WARN_MESSAGE( P, M )          BOOST_TEST_TOOL_DIRECT_IMPL( P, WARN, M )
267 #define BOOST_CHECK_MESSAGE( P, M )         BOOST_TEST_TOOL_DIRECT_IMPL( P, CHECK, M )
268 #define BOOST_REQUIRE_MESSAGE( P, M )       BOOST_TEST_TOOL_DIRECT_IMPL( P, REQUIRE, M )
269 
270 //____________________________________________________________________________//
271 
272 ////////////////////////////////////////////////////////////////////////////////
273 /////////////////////////////   DEPRECATED TOOLS   /////////////////////////////
274 
275 #define BOOST_WARN( P )                     BOOST_TEST_WARN( P )
276 #define BOOST_CHECK( P )                    BOOST_TEST_CHECK( P )
277 #define BOOST_REQUIRE( P )                  BOOST_TEST_REQUIRE( P )
278 
279 //____________________________________________________________________________//
280 
281 #define BOOST_ERROR( M )                    BOOST_TEST_ERROR( M )
282 #define BOOST_FAIL( M )                     BOOST_TEST_FAIL( M )
283 
284 //____________________________________________________________________________//
285 
286 #define BOOST_WARN_EQUAL( L, R )            BOOST_TEST_WARN( L == R )
287 #define BOOST_CHECK_EQUAL( L, R )           BOOST_TEST_CHECK( L == R )
288 #define BOOST_REQUIRE_EQUAL( L, R )         BOOST_TEST_REQUIRE( L == R )
289 
290 #define BOOST_WARN_NE( L, R )               BOOST_TEST_WARN( L != R )
291 #define BOOST_CHECK_NE( L, R )              BOOST_TEST_CHECK( L != R )
292 #define BOOST_REQUIRE_NE( L, R )            BOOST_TEST_REQUIRE( L != R )
293 
294 #define BOOST_WARN_LT( L, R )               BOOST_TEST_WARN( L < R )
295 #define BOOST_CHECK_LT( L, R )              BOOST_TEST_CHECK( L < R )
296 #define BOOST_REQUIRE_LT( L, R )            BOOST_TEST_REQUIRE( L < R )
297 
298 #define BOOST_WARN_LE( L, R )               BOOST_TEST_WARN( L <= R )
299 #define BOOST_CHECK_LE( L, R )              BOOST_TEST_CHECK( L <= R )
300 #define BOOST_REQUIRE_LE( L, R )            BOOST_TEST_REQUIRE( L <= R )
301 
302 #define BOOST_WARN_GT( L, R )               BOOST_TEST_WARN( L > R )
303 #define BOOST_CHECK_GT( L, R )              BOOST_TEST_CHECK( L > R )
304 #define BOOST_REQUIRE_GT( L, R )            BOOST_TEST_REQUIRE( L > R )
305 
306 #define BOOST_WARN_GE( L, R )               BOOST_TEST_WARN( L >= R )
307 #define BOOST_CHECK_GE( L, R )              BOOST_TEST_CHECK( L >= R )
308 #define BOOST_REQUIRE_GE( L, R )            BOOST_TEST_REQUIRE( L >= R )
309 
310 //____________________________________________________________________________//
311 
312 #define BOOST_WARN_CLOSE( L, R, T )         BOOST_TEST_WARN( L == R, T % ::boost::test_tools::tolerance() )
313 #define BOOST_CHECK_CLOSE( L, R, T )        BOOST_TEST_CHECK( L == R, T % ::boost::test_tools::tolerance() )
314 #define BOOST_REQUIRE_CLOSE( L, R, T )      BOOST_TEST_REQUIRE( L == R, T % ::boost::test_tools::tolerance() )
315 
316 #define BOOST_WARN_CLOSE_FRACTION(L, R, T)  BOOST_TEST_WARN( L == R, ::boost::test_tools::tolerance( T ) )
317 #define BOOST_CHECK_CLOSE_FRACTION(L, R, T) BOOST_TEST_CHECK( L == R, ::boost::test_tools::tolerance( T ) )
318 #define BOOST_REQUIRE_CLOSE_FRACTION(L,R,T) BOOST_TEST_REQUIRE( L == R, ::boost::test_tools::tolerance( T ) )
319 
320 #define BOOST_WARN_SMALL( FPV, T )          BOOST_TEST_WARN( FPV == 0., ::boost::test_tools::tolerance( T ) )
321 #define BOOST_CHECK_SMALL( FPV, T )         BOOST_TEST_CHECK( FPV == 0., ::boost::test_tools::tolerance( T ) )
322 #define BOOST_REQUIRE_SMALL( FPV, T )       BOOST_TEST_REQUIRE( FPV == 0., ::boost::test_tools::tolerance( T ) )
323 
324 //____________________________________________________________________________//
325 
326 #define BOOST_WARN_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )              \
327     BOOST_TEST_WARN( ::boost::test_tools::tt_detail::make_it_pair(L_begin, L_end) ==\
328                      ::boost::test_tools::tt_detail::make_it_pair(R_begin, R_end),  \
329                      ::boost::test_tools::per_element() )                           \
330 /**/
331 
332 #define BOOST_CHECK_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )              \
333     BOOST_TEST_CHECK( ::boost::test_tools::tt_detail::make_it_pair(L_begin, L_end) ==\
334                       ::boost::test_tools::tt_detail::make_it_pair(R_begin, R_end),  \
335                       ::boost::test_tools::per_element() )                           \
336 /**/
337 
338 #define BOOST_REQUIRE_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )              \
339     BOOST_TEST_REQUIRE( ::boost::test_tools::tt_detail::make_it_pair(L_begin, L_end) ==\
340                         ::boost::test_tools::tt_detail::make_it_pair(R_begin, R_end),  \
341                         ::boost::test_tools::per_element() )                           \
342 /**/
343 
344 //____________________________________________________________________________//
345 
346 #define BOOST_WARN_BITWISE_EQUAL( L, R )    BOOST_TEST_WARN( L == R, ::boost::test_tools::bitwise() )
347 #define BOOST_CHECK_BITWISE_EQUAL( L, R )   BOOST_TEST_CHECK( L == R, ::boost::test_tools::bitwise() )
348 #define BOOST_REQUIRE_BITWISE_EQUAL( L, R ) BOOST_TEST_REQUIRE( L == R, ::boost::test_tools::bitwise() )
349 
350 //____________________________________________________________________________//
351 
352 #define BOOST_WARN_PREDICATE( P, ARGS )     BOOST_TEST_WARN( P BOOST_PP_SEQ_TO_TUPLE(ARGS) )
353 #define BOOST_CHECK_PREDICATE( P, ARGS )    BOOST_TEST_CHECK( P BOOST_PP_SEQ_TO_TUPLE(ARGS) )
354 #define BOOST_REQUIRE_PREDICATE( P, ARGS )  BOOST_TEST_REQUIRE( P BOOST_PP_SEQ_TO_TUPLE(ARGS) )
355 
356 //____________________________________________________________________________//
357 
358 #define BOOST_IS_DEFINED( symb ) ::boost::test_tools::tt_detail::is_defined_impl( #symb, BOOST_STRINGIZE(= symb) )
359 
360 //____________________________________________________________________________//
361 
362 #endif // BOOST_TEST_NO_OLD_TOOLS
363 
364 #include <boost/test/detail/enable_warnings.hpp>
365 
366 #endif // BOOST_TEST_TOOLS_INTERFACE_HPP_111712GER
367