15 #ifndef INCG_IRIS_IUTEST_INTERNAL_HPP_A5BD9FBB_B57A_4C1D_B205_0ADB7798DBF9_
16 #define INCG_IRIS_IUTEST_INTERNAL_HPP_A5BD9FBB_B57A_4C1D_B205_0ADB7798DBF9_
21 #include "../iutest_pred.hpp"
22 #include "../iutest_package.hpp"
28 #if defined(__clang_analyzer__)
38 #define IUTEST_TEST_CLASS_NAME_(testsuite_, testname_) IIUT_TEST_CLASS_NAME_I(IIUT_TO_VARNAME_(testsuite_), IIUT_TO_VARNAME_(testname_))
39 #define IIUT_TEST_CLASS_NAME_I(testsuite_, testname_) IIUT_TEST_CLASS_NAME_I_(testsuite_, testname_)
40 #define IIUT_TEST_CLASS_NAME_I_(testsuite_, testname_) iu_##testsuite_##_x_iutest_x_##testname_##_Test
42 #define IUTEST_TEST_INSTANCE_NAME_(testsuite_, testname_) IIUT_TEST_INSTANCE_NAME_I(IIUT_TO_VARNAME_(testsuite_), IIUT_TO_VARNAME_(testname_))
43 #define IIUT_TEST_INSTANCE_NAME_I(testsuite_, testname_) IIUT_TEST_INSTANCE_NAME_I_(testsuite_, testname_)
44 #define IIUT_TEST_INSTANCE_NAME_I_(testsuite_, testname_) s_##testsuite_##_x_iutest_x_##testname_##_Instance
46 #if IUTEST_HAS_TESTNAME_ALIAS
48 #define IIUT_TO_VARNAME_(name_) IIUT_TO_VARNAME_I( (IIUT_ALIAS_TESTNAME_PP_##name_, name_, dummy_) )
49 #define IIUT_TO_VARNAME_I(tuple_) IUTEST_PP_EXPAND( IIUT_TO_VARNAME_I_ tuple_ )
50 #define IIUT_TO_VARNAME_I_(dummy, name_, ...) name_
52 #define IIUT_TO_NAME_(name_) IIUT_TO_NAME_I( (IIUT_ALIAS_TESTNAME_PP_##name_, name_, name_, dummy_) )
53 #define IIUT_TO_NAME_I(tuple_) IUTEST_PP_EXPAND( IIUT_TO_NAME_I_ tuple_ )
54 #define IIUT_TO_NAME_I_(d1_, d2_, name_, ...) name_
56 #define IIUT_TO_NAME_STR_(name_) IUTEST_PP_TOSTRING( IIUT_TO_NAME_(name_) )
58 #define IIUT_ALIAS_TESTNAME_PP_UNPAREN_(...) __VA_ARGS__
60 #if defined(_MSC_VER) && !defined(__clang__)
61 # define IUTEST_ALIAS_TESTNAME_(name_) name_
62 # define IUTEST_ALIAS_TESTNAME_F_(name_, var_) UNPAREN_(dummy, var_, name_)
64 # define IUTEST_ALIAS_TESTNAME_(name_) UNPAREN_(dummy, IUTEST_PP_CAT(iutest_japanese_var, __LINE__), name_)
65 # define IUTEST_ALIAS_TESTNAME_F_(name_, var_) UNPAREN_(dummy, var_, name_)
70 #define IIUT_TO_VARNAME_(name_) name_
71 #define IIUT_TO_NAME_(name_) name_
72 #define IIUT_TO_NAME_STR_(name_) #name_
76 #if IUTEST_HAS_IF_EXISTS
77 # define IIUT_CHECK_TESTFIXTURE_I(testfixture_) \
78 IUTEST_IF_EXISTS(testfixture_, IUTEST_IF_EXISTS(testfixture_::SetUp, \
79 IUTEST_STATIC_ASSERT_MSG( \
80 (!::iutest_type_traits::is_base_of< ::iutest::Test, testfixture_ >::value) \
81 , #testfixture_ " is fixture class, mistake the IUTEST_F?"); \
83 #elif !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)
84 # define IIUT_CHECK_TESTFIXTURE_I(testfixture_) \
85 IUTEST_STATIC_ASSERT_MSG( \
86 (! ::iutest::detail::is_useful_testfixture< void (int (testfixture_)) >::value) \
87 , #testfixture_ " is fixture class, mistake the IUTEST_F?");
89 # define IIUT_CHECK_TESTFIXTURE_I(testfixture_)
91 #define IIUT_CHECK_TESTFIXTURE_(testfixture_) IIUT_CHECK_TESTFIXTURE_I(testfixture_)
92 #define IIUT_CHECK_TESTFIXTURE(testfixture_) IIUT_CHECK_TESTFIXTURE_(IIUT_TO_VARNAME_(testfixture_))
94 #if !defined(IUTEST_TEST_STRICT_)
95 #if IUTEST_CHECK_STRICT
96 # define IUTEST_TEST_STRICT_(testsuite_, testname_, parent_class_, type_id_) \
97 IIUT_CHECK_TESTFIXTURE(testsuite_) \
98 IUTEST_TEST_(testsuite_, testname_, parent_class_, type_id_)
100 # define IUTEST_TEST_STRICT_ IUTEST_TEST_
104 #define IIUT_TEST_F_(macro, testfixture_, testname_) \
105 macro(testfixture_, testname_, IIUT_TO_VARNAME_(testfixture_) \
106 , ::iutest::internal::GetTypeId< IIUT_TO_VARNAME_(testfixture_) >())
108 #if IUTEST_HAS_TESTFIXTURE_ALIAS_BY_TUPLE
110 #define IIUT_TEST_F_A_(macro, testfixture_, testname_) \
111 IIUT_TEST_F_( macro, IUTEST_PP_IF( IUTEST_PP_IS_BEGIN_PARENS(testfixture_) \
112 , IUTEST_ALIAS_TESTNAME_F_, IUTEST_PP_EMPTY() ) testfixture_, testname_)
114 #define IUTEST_TEST_F_(testfixture_, testname_) \
115 IIUT_TEST_F_A_(IUTEST_TEST_, testfixture_, testname_)
117 #if IUTEST_HAS_IGNORE_TEST
119 #define IUTEST_TEST_F_IGNORE_(testfixture_, testname_) \
120 IIUT_TEST_F_A_( IUTEST_TEST_IGNORE_, testfixture_, testname_)
126 #define IUTEST_TEST_F_(testfixture_, testname_) \
127 IIUT_TEST_F_(IUTEST_TEST_, testfixture_, testname_)
129 #if IUTEST_HAS_IGNORE_TEST
131 #define IUTEST_TEST_F_IGNORE_(testfixture_, testname_) \
132 IIUT_TEST_F_( IUTEST_TEST_IGNORE_, testfixture_, testname_)
146 #define IUTEST_TEST_(testsuite_, testname_, parent_class_, type_id_) \
147 IUTEST_STATIC_ASSERT_MSG(sizeof(IUTEST_PP_TOSTRING(testsuite_)) > 1, "testsuite_ must not be empty"); \
148 IUTEST_STATIC_ASSERT_MSG(sizeof(IUTEST_PP_TOSTRING(testname_)) > 1, "testname_ must not be empty"); \
149 IUTEST_STATIC_ASSERT_MSG(sizeof(IUTEST_PP_TOSTRING(IIUT_TO_NAME_(testsuite_))) > 1, "testsuite alias name must not be empty"); \
150 class IUTEST_TEST_CLASS_NAME_(testsuite_, testname_) IUTEST_CXX_FINAL : public parent_class_ { \
151 IUTEST_PP_DISALLOW_COPY_AND_ASSIGN(IUTEST_TEST_CLASS_NAME_(testsuite_, testname_)); \
152 public: IUTEST_TEST_CLASS_NAME_(testsuite_, testname_)() {} \
153 protected: virtual void Body() IUTEST_CXX_OVERRIDE; \
155 ::iutest::detail::TestInstance<IUTEST_TEST_CLASS_NAME_(testsuite_, testname_)> \
156 IUTEST_TEST_INSTANCE_NAME_(testsuite_, testname_)( \
157 IUTEST_CONCAT_PACKAGE_(IIUT_TO_NAME_(testsuite_)), IIUT_TO_NAME_STR_(testname_) \
158 , type_id_, IUTEST_GET_SETUP_TESTSUITE(parent_class_, __FILE__, __LINE__) \
159 , IUTEST_GET_TEARDOWN_TESTSUITE(parent_class_, __FILE__, __LINE__)); \
160 void IUTEST_TEST_CLASS_NAME_(testsuite_, testname_)::Body()
162 #if IUTEST_HAS_IGNORE_TEST
169 #define IUTEST_TEST_IGNORE_(testsuite_, testname_, parent_class_, type_id_) \
170 class IUTEST_TEST_CLASS_NAME_(testsuite_, testname_) IUTEST_CXX_FINAL : public parent_class_ { \
171 IUTEST_PP_DISALLOW_COPY_AND_ASSIGN( IUTEST_TEST_CLASS_NAME_(testsuite_, testname_) ); \
172 public: IUTEST_TEST_CLASS_NAME_(testsuite_, testname_)() {} \
173 protected: virtual void Body() IUTEST_CXX_OVERRIDE { IUTEST_SKIP() << "ignored test..."; } \
174 template<typename T>void Body(); \
176 ::iutest::detail::TestInstance<IUTEST_TEST_CLASS_NAME_(testsuite_, testname_)> \
177 IUTEST_TEST_INSTANCE_NAME_(testsuite_, testname_)( \
178 IUTEST_CONCAT_PACKAGE_(IIUT_TO_NAME_(testsuite_)), IIUT_TO_NAME_STR_(testname_) \
179 , type_id_, IUTEST_GET_SETUP_TESTSUITE(parent_class_, __FILE__, __LINE__) \
180 , IUTEST_GET_TEARDOWN_TESTSUITE(parent_class_, __FILE__, __LINE__)); \
181 template<typename T>void IUTEST_TEST_CLASS_NAME_(testsuite_, testname_ )::Body()
185 #if !defined(IUTEST_NO_VARIADIC_MACROS)
191 #define IUTEST_PMZ_TEST_CLASS_NAME_(testsuite_, testname_) IIUT_PMZ_TEST_CLASS_NAME_I(IIUT_TO_VARNAME_(testsuite_), IIUT_TO_VARNAME_(testname_))
192 #define IIUT_PMZ_TEST_CLASS_NAME_I(testsuite_, testname_) IIUT_PMZ_TEST_CLASS_NAME_I_(testsuite_, testname_)
193 #define IIUT_PMZ_TEST_CLASS_NAME_I_(testsuite_, testname_) IUTEST_PP_CAT( IUTEST_PP_CAT(iu_##testsuite_##_x_Test_, testname_), __LINE__)
202 #define IIUT_TEST_PMZ_(testsuite_, testname_, method_, parent_class_, type_id_, ...) \
203 class IUTEST_TEST_CLASS_NAME_(testsuite_, testname_); \
204 class IUTEST_PMZ_TEST_CLASS_NAME_(testsuite_, testname_) IUTEST_CXX_FINAL : public parent_class_ { \
205 IUTEST_PP_DISALLOW_COPY_AND_ASSIGN(IUTEST_PMZ_TEST_CLASS_NAME_(testsuite_, testname_)); \
206 public: IUTEST_PMZ_TEST_CLASS_NAME_(testsuite_, testname_)() {} \
207 static ::std::string MakeTestName() { return ::iutest::detail::MakeIndexTestName( \
208 IIUT_TO_NAME_STR_(testname_), ::iutest::detail::GetTypeUniqueCounter< \
209 IUTEST_TEST_CLASS_NAME_(testsuite_, testname_)>()); } \
210 protected: virtual void Body() IUTEST_CXX_OVERRIDE { method_(__VA_ARGS__); } \
212 ::iutest::detail::TestInstance<IUTEST_PMZ_TEST_CLASS_NAME_(testsuite_, testname_)> \
213 IUTEST_PP_CAT( IUTEST_TEST_INSTANCE_NAME_(testsuite_, testname_), __LINE__)( \
214 IUTEST_CONCAT_PACKAGE_(IIUT_TO_NAME_(testsuite_)) \
215 , IUTEST_PMZ_TEST_CLASS_NAME_(testsuite_, testname_)::MakeTestName().c_str() \
216 , #__VA_ARGS__, type_id_, IUTEST_GET_SETUP_TESTSUITE(parent_class_, __FILE__, __LINE__) \
217 , IUTEST_GET_TEARDOWN_TESTSUITE(parent_class_, __FILE__, __LINE__))
225 #define IUTEST_MESSAGE_AT(file_, line_, msg_, result_type_) \
226 ::iutest::AssertionHelper(file_, line_, msg_, result_type_) = ::iutest::AssertionHelper::Fixed()
227 #define IUTEST_MESSAGE(msg_, result_type_) \
228 IUTEST_MESSAGE_AT(__FILE__, __LINE__, msg_, result_type_)
234 #define IUTEST_ASSERT_FAILURE(msg) IUTEST_ASSERT_FAILURE_AT(msg, __FILE__, __LINE__)
236 #if !defined(IUTEST_NO_VOID_RETURNS)
237 # define IUTEST_ASSERT_FAILURE_AT(msg, file, line) return IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kFatalFailure)
239 # define IUTEST_ASSERT_FAILURE_AT(msg, file, line) IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kFatalFailure)
246 #define IUTEST_EXPECT_FAILURE(msg) IUTEST_EXPECT_FAILURE_AT(msg, __FILE__, __LINE__)
248 #define IUTEST_EXPECT_FAILURE_AT(msg, file, line) IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kNonFatalFailure)
254 #define IUTEST_INFORM_FAILURE(msg) IUTEST_INFORM_FAILURE_AT(msg, __FILE__, __LINE__)
256 #define IUTEST_INFORM_FAILURE_AT(msg, file, line) IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kWarning)
262 #define IUTEST_ASSUME_FAILURE(msg) IUTEST_ASSUME_FAILURE_AT(msg, __FILE__, __LINE__)
264 #if !defined(IUTEST_NO_VOID_RETURNS)
265 # define IUTEST_ASSUME_FAILURE_AT(msg, file, line) \
266 return IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kAssumeFailure)
268 # define IUTEST_ASSUME_FAILURE_AT(msg, file, line) \
269 IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kAssumeFailure)
276 #define IUTEST_SKIP_MESSAGE(msg) IUTEST_SKIP_MESSAGE_AT(msg, __FILE__, __LINE__)
278 #if !defined(IUTEST_NO_VOID_RETURNS)
279 # define IUTEST_SKIP_MESSAGE_AT(msg, file, line) \
280 return IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kSkip)
282 # define IUTEST_SKIP_MESSAGE_AT(msg, file, line) \
283 IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kSkip)
286 #ifndef IUTEST_MAKE_ASSERTIONRESULT_
287 # define IUTEST_MAKE_ASSERTIONRESULT_(ar) ar
294 #define IUTEST_TEST_ASSERT_(expression, on_failure) \
295 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
296 if( const ::iutest::AssertionResult iutest_ar = IUTEST_MAKE_ASSERTIONRESULT_(expression) ) \
299 on_failure(iutest_ar.message())
301 #if IUTEST_HAS_EXCEPTIONS
303 #if IUTEST_HAS_CATCH_SEH_EXCEPTION_ASSERTION
305 #define IIUT_SEH_THROUGH(statement) ::iutest::detail::seh_passthrough([&](){ (void)(statement); })
309 #define IIUT_SEH_THROUGH(statement) (void)(statement)
317 #define IUTEST_TEST_THROW_(statement, expected_exception, on_failure) \
318 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
319 if( const char* msg = "" ) { \
321 IUTEST_SUPPRESS_UNREACHABLE_CODE_WARNING(IIUT_SEH_THROUGH(statement)); \
322 msg = "\nExpected: " #statement " throws an exception of type " \
323 #expected_exception ".\n Actual: it throws nothing."; \
324 goto IUTEST_PP_CAT(iutest_label_throw, __LINE__); \
325 } catch( expected_exception const& ) { \
327 msg = "\nExpected: " #statement " throws an exception of type " \
328 #expected_exception ".\n Actual: it throws a different type."; \
329 goto IUTEST_PP_CAT(iutest_label_throw, __LINE__); \
332 IUTEST_PP_CAT(iutest_label_throw, __LINE__): \
339 #define IUTEST_TEST_THROW_VALUE_(statement, expected_exception, expected_exception_value, on_failure, pred_formatter) \
340 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
341 if( ::iutest::AssertionResult iutest_ar = ::iutest::AssertionSuccess() ) { \
343 IUTEST_SUPPRESS_UNREACHABLE_CODE_WARNING(IIUT_SEH_THROUGH(statement)); \
344 iutest_ar << "\nExpected: " #statement " throws an exception of type " \
345 #expected_exception ".\n Actual: it throws nothing."; \
346 goto IUTEST_PP_CAT(iutest_label_throw_value, __LINE__); \
347 } catch( expected_exception const& e) { \
348 if( const ::iutest::AssertionResult ar \
349 = pred_formatter("e", #expected_exception_value, e, expected_exception_value) ) { \
351 iutest_ar << "\nExpected: " #statement " throws an exception of value\n" << ar.message(); \
352 goto IUTEST_PP_CAT(iutest_label_throw_value, __LINE__); \
355 iutest_ar << "\nExpected: " #statement " throws an exception of type " \
356 #expected_exception ".\n Actual: it throws a different type."; \
357 goto IUTEST_PP_CAT(iutest_label_throw_value, __LINE__); \
360 IUTEST_PP_CAT(iutest_label_throw_value, __LINE__): \
361 on_failure(iutest_ar.message())
363 #define IUTEST_TEST_THROW_VALUE_EQ_(statement, expected_exception, expected_exception_value, on_failure) \
364 IUTEST_TEST_THROW_VALUE_(statement, expected_exception, expected_exception_value, on_failure \
365 , ::iutest::internal::backward::EqHelper<IUTEST_IS_NULLLITERAL(expected_exception_value)>::Compare)
366 #define IUTEST_TEST_THROW_VALUE_NE_(statement, expected_exception, expected_exception_value, on_failure) \
367 IUTEST_TEST_THROW_VALUE_(statement, expected_exception, expected_exception_value, on_failure \
368 , ::iutest::internal::backward::NeHelper<IUTEST_IS_NULLLITERAL(expected_exception_value)>::Compare)
369 #define IUTEST_TEST_THROW_VALUE_STREQ_(statement, expected_exception, expected_exception_value, on_failure) \
370 IUTEST_TEST_THROW_VALUE_(statement, expected_exception, expected_exception_value, on_failure \
371 , ::iutest::internal::CmpHelperSTREQ)
372 #define IUTEST_TEST_THROW_VALUE_STRCASEEQ_(statement, expected_exception, expected_exception_value, on_failure) \
373 IUTEST_TEST_THROW_VALUE_(statement, expected_exception, expected_exception_value, on_failure \
374 , ::iutest::internal::CmpHelperSTRCASEEQ)
380 #define IUTEST_TEST_ANY_THROW_(statement, on_failure) \
381 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
382 if( ::iutest::detail::AlwaysTrue() ) { \
384 IIUT_SEH_THROUGH(statement); \
385 goto IUTEST_PP_CAT(iutest_label_anythrow, __LINE__); \
389 IUTEST_PP_CAT(iutest_label_anythrow, __LINE__): \
390 on_failure("\nExpected: " #statement " throws an exception.\n Actual: it doesn's throws.")
396 #define IUTEST_TEST_NO_THROW_(statement, on_failure) \
397 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
398 if( ::iutest::AssertionResult iutest_ar = ::iutest::AssertionSuccess() ) { \
400 IIUT_SEH_THROUGH(statement); \
401 } catch( const ::std::exception& e ) { \
402 iutest_ar << "\nExpected: " #statement " doesn't throw an exception.\n Actual: it throws. what is \"" \
403 << e.what() << "\""; \
404 goto IUTEST_PP_CAT(iutest_label_nothrow, __LINE__); \
405 } catch( const char *e ) { \
406 iutest_ar << "\nExpected: " #statement " doesn't throw an exception.\n Actual: it throws. \"" \
408 goto IUTEST_PP_CAT(iutest_label_nothrow, __LINE__); \
410 iutest_ar << "\nExpected: " #statement " doesn't throw an exception.\n Actual: it throws."; \
411 goto IUTEST_PP_CAT(iutest_label_nothrow, __LINE__); \
414 IUTEST_PP_CAT(iutest_label_nothrow, __LINE__): \
415 on_failure(iutest_ar.message())
419 #define IUTEST_TEST_BOOLEAN_(expression, text, actual, expected, on_failure) \
420 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
421 if( const ::iutest::AssertionResult iutest_ar = ::iutest::AssertionResult::Is(expression) ) \
422 IUTEST_ATTRIBUTE_LIKELY_; \
424 on_failure(::iutest::internal::GetBooleanAssertionFailureMessage( \
425 iutest_ar, text, #actual, #expected).c_str() )
431 #define IUTEST_TERMINATE_ON_FAILURE(cond) do { if IUTEST_COND_UNLIKELY( !(cond) ) { \
432 IUTEST_MESSAGE(#cond, ::iutest::TestPartResult::kFatalFailure); \
434 } } while(::iutest::detail::AlwaysFalse())
440 #define IIUT_SUCCEED() IUTEST_MESSAGE("Succeeded.\n", ::iutest::TestPartResult::kSuccess)
445 #define IIUT_FAIL() IUTEST_ASSERT_FAILURE("Failed.\n")
446 #define IIUT_ADD_FAILURE() IUTEST_EXPECT_FAILURE("Failed.\n")
447 #define IIUT_ADD_FAILURE_AT(file_, line_) IUTEST_EXPECT_FAILURE_AT("Failed.\n", file_, line_)
453 #define IIUT_SCOPED_MESSAGE(msg_) \
454 const ::iutest::AssertionHelper::ScopedMessage IUTEST_PP_CAT(scoped_message_, IUTEST_PP_COUNTER) = \
455 ::iutest::detail::iuCodeMessage(__FILE__, __LINE__, ::iutest::Message() << (msg_))
461 #if IUTEST_HAS_ANALYSIS_ASSUME
462 # define IUTEST_ANALYSIS_ASSUME_DELEGATE IUTEST_ANALYSIS_ASSUME
463 #elif defined(__clang_analyzer__)
464 # define IUTEST_ANALYSIS_ASSUME_DELEGATE assert
467 #if defined(IUTEST_ANALYSIS_ASSUME_DELEGATE)
468 #define IUTEST_THROUGH_ANALYSIS_ASSUME_(expr, todo) \
469 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
470 if( bool iu_b_ = true ) { \
471 IUTEST_UNUSED_VAR(iu_b_); \
472 IUTEST_ANALYSIS_ASSUME_DELEGATE(expr); \
473 goto IUTEST_PP_CAT(iutest_label_analysis_assume, __LINE__); \
475 IUTEST_PP_CAT(iutest_label_analysis_assume, __LINE__): \
480 #define IUTEST_THROUGH_ANALYSIS_ASSUME_(expr, todo) todo
489 #define IUTEST_TEST_EQ(expected, actual, on_failure) \
490 IUTEST_PRED_FORMAT2_( ::iutest::internal::backward::EqHelper<IUTEST_IS_NULLLITERAL(expected)>::Compare \
491 , expected, actual, on_failure )
493 #define IUTEST_TEST_ALMOST_EQ(expected, actual, on_failure) \
494 IUTEST_PRED_FORMAT2_( ::iutest::internal::backward::AlmostEqHelper<IUTEST_IS_NULLLITERAL(expected)>::Compare \
495 , expected, actual, on_failure )
497 #define IUTEST_TEST_NE(v1, v2, on_failure) \
498 IUTEST_PRED_FORMAT2_( ::iutest::internal::backward::NeHelper<IUTEST_IS_NULLLITERAL(v1)>::Compare \
499 , v1, v2, on_failure )
501 #define IUTEST_TEST_LE(v1, v2, on_failure) \
502 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperLE \
503 , v1, v2, on_failure )
505 #define IUTEST_TEST_LT(v1, v2, on_failure) \
506 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperLT \
507 , v1, v2, on_failure )
509 #define IUTEST_TEST_GE(v1, v2, on_failure) \
510 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperGE \
511 , v1, v2, on_failure )
513 #define IUTEST_TEST_GT(v1, v2, on_failure) \
514 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperGT \
515 , v1, v2, on_failure )
517 #define IUTEST_TEST_TRUE(expr, text, on_failure) \
518 IUTEST_TEST_BOOLEAN_( expr, text, false, true, on_failure)
520 #define IUTEST_TEST_FALSE(expr, text, on_failure) \
521 IUTEST_TEST_BOOLEAN_( !(expr), text, true, false, on_failure)
523 #define IUTEST_TEST_FLOAT_EQ(expected, actual, on_failure) \
524 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperFloatingPointEQ<float> \
525 , expected, actual, on_failure )
527 #define IUTEST_TEST_DOUBLE_EQ(expected, actual, on_failure) \
528 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperFloatingPointEQ<double> \
529 , expected, actual, on_failure )
531 #if IUTEST_HAS_LONG_DOUBLE
533 #define IUTEST_TEST_LONG_DOUBLE_EQ(expected, actual, on_failure) \
534 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperFloatingPointEQ<long double> \
535 , expected, actual, on_failure )
539 #define IUTEST_TEST_COMPLEX_EQ(expected, actual, on_failure) \
540 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperFloatingPointComplexEQ \
541 , expected, actual, on_failure )
543 #define IUTEST_TEST_NEAR(v1, v2, abs_v, on_failure) \
544 IUTEST_PRED_FORMAT3_( ::iutest::internal::CmpHelperNear \
545 , v1, v2, abs_v, on_failure )
547 #define IUTEST_TEST_STREQ(expected, actual, on_failure) \
548 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTREQ \
549 , expected, actual, on_failure )
551 #define IUTEST_TEST_STRNE(v1, v2, on_failure) \
552 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTRNE \
553 , v1, v2, on_failure )
555 #define IUTEST_TEST_STRCASEEQ(expected, actual, on_failure) \
556 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTRCASEEQ \
557 , expected, actual, on_failure )
559 #define IUTEST_TEST_STRCASENE(v1, v2, on_failure) \
560 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTRCASENE \
561 , v1, v2, on_failure )
563 #if defined(IUTEST_OS_WINDOWS)
565 #define IUTEST_TEST_HRESULT_SUCCEEDED(hr, on_failure) \
566 IUTEST_PRED_FORMAT1_( ::iutest::internal::IsHRESULTSuccess \
569 #define IUTEST_TEST_HRESULT_FAILED(hr, on_failure) \
570 IUTEST_PRED_FORMAT1_( ::iutest::internal::IsHRESULTFailure \
575 #define IUTEST_TEST_SAME(v1, v2, on_failure) \
576 IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSame \
577 , v1, v2, on_failure )
579 #define IUTEST_TEST_NULL(v, on_failure) \
580 IUTEST_THROUGH_ANALYSIS_ASSUME_(v==IUTEST_NULLPTR \
581 , IUTEST_PRED_FORMAT1_( ::iutest::internal::NullHelper<IUTEST_IS_NULLLITERAL(v)>::CompareEq \
584 #define IUTEST_TEST_NOTNULL(v, on_failure) \
585 IUTEST_THROUGH_ANALYSIS_ASSUME_(v!=IUTEST_NULLPTR \
586 , IUTEST_PRED_FORMAT1_( ::iutest::internal::NullHelper<IUTEST_IS_NULLLITERAL(v)>::CompareNe \
589 #define IUTEST_TEST_NO_FAILURE_(statement, on_failure) \
590 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
591 if( ::iutest::detail::AlwaysTrue() ) { \
592 ::iutest::detail::NewTestPartResultCheckHelper::Counter< \
593 ::iutest::detail::NewTestPartResultCheckHelper::CondGt< \
594 ::iutest::TestPartResult::kSuccess> > iutest_failure_checker; \
595 IUTEST_SUPPRESS_UNREACHABLE_CODE_WARNING( { (void)0; statement; } ) \
596 if( iutest_failure_checker.count() > 0 ) { \
597 goto IUTEST_PP_CAT(iutest_label_test_no_failure_, __LINE__); \
600 IUTEST_PP_CAT(iutest_label_test_no_failure_, __LINE__): \
601 on_failure("\nExpected: " #statement " doesn't generate new failure.\n Actual: it does.")
603 #define IUTEST_TEST_NO_FATAL_FAILURE_(statement, on_failure) \
604 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
605 if( ::iutest::detail::AlwaysTrue() ) { \
606 ::iutest::detail::NewTestPartResultCheckHelper::Counter< \
607 ::iutest::detail::NewTestPartResultCheckHelper::CondEq< \
608 ::iutest::TestPartResult::kFatalFailure> > iutest_failure_checker; \
609 IUTEST_SUPPRESS_UNREACHABLE_CODE_WARNING( { (void)0; statement; } ) \
610 if( iutest_failure_checker.count() > 0 ) { \
611 goto IUTEST_PP_CAT(iutest_label_test_no_fatalfailure_, __LINE__); \
614 IUTEST_PP_CAT(iutest_label_test_no_fatalfailure_, __LINE__): \
615 on_failure("\nExpected: " #statement " doesn't generate new fatal failure.\n Actual: it does.")
617 #define IUTEST_TEST_SKIP() \
618 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
619 if( ::iutest::detail::AlwaysTrue() ) \
620 IUTEST_SKIP_MESSAGE( ::iutest::UnitTest::SkipTest() ? "Skipped. " : "Skipped. but already failed. " )
630 #if defined(_MSC_VER) && !defined(__clang__)
631 # define IUTEST_TEST_COMPILEERROR(e) \
632 IUTEST_PRAGMA_MESSAGE(__FILE__ "(" IUTEST_PP_TOSTRING(__LINE__) "): note : " "IUTEST_TEST_COMPILEERROR( " e " )")
634 # define IUTEST_TEST_COMPILEERROR(e) \
635 IUTEST_PRAGMA_MESSAGE("IUTEST_TEST_COMPILEERROR( " e " )")
643 #if IUTEST_HAS_STATIC_ASSERT
644 # define IUTEST_TEST_STATICASSERT(e) IUTEST_TEST_COMPILEERROR(e)
646 # define IUTEST_TEST_STATICASSERT(e) IUTEST_TEST_COMPILEERROR("static_assert")