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