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