iutest  1.17.99.14
iutest_internal.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_INTERNAL_HPP_A5BD9FBB_B57A_4C1D_B205_0ADB7798DBF9_
16 #define INCG_IRIS_IUTEST_INTERNAL_HPP_A5BD9FBB_B57A_4C1D_B205_0ADB7798DBF9_
17 
18 //======================================================================
19 // include
20 // IWYU pragma: begin_exports
21 #include "../iutest_pred.hpp"
22 #include "../iutest_package.hpp"
23 // IWYU pragma: end_exports
24 
25 // IWYU pragma: no_forward_declare iuTest_TestSuitePackage
26 // IWYU pragma: no_forward_declare iuTest_TestSuiteParentPackage
27 
28 #if defined(__clang_analyzer__)
29 # include <assert.h>
30 #endif
31 
32 //======================================================================
33 // define
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
41 
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
45 
46 #if IUTEST_HAS_TESTNAME_ALIAS
47 
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_
51 
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_
55 
56 #define IIUT_TO_NAME_STR_(name_) IUTEST_PP_TOSTRING( IIUT_TO_NAME_(name_) )
57 
58 #define IIUT_ALIAS_TESTNAME_PP_UNPAREN_(...) __VA_ARGS__
59 
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_)
63 #else
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_)
66 #endif
67 
68 #else
69 
70 #define IIUT_TO_VARNAME_(name_) name_
71 #define IIUT_TO_NAME_(name_) name_
72 #define IIUT_TO_NAME_STR_(name_) #name_
73 
74 #endif
75 
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?"); \
82  ) )
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?");
88 #else
89 # define IIUT_CHECK_TESTFIXTURE_I(testfixture_)
90 #endif
91 #define IIUT_CHECK_TESTFIXTURE_(testfixture_) IIUT_CHECK_TESTFIXTURE_I(testfixture_)
92 #define IIUT_CHECK_TESTFIXTURE(testfixture_) IIUT_CHECK_TESTFIXTURE_(IIUT_TO_VARNAME_(testfixture_))
93 
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_)
99 #else
100 # define IUTEST_TEST_STRICT_ IUTEST_TEST_
101 #endif
102 #endif
103 
104 #define IIUT_TEST_F_(macro, testfixture_, testname_) \
105  macro(testfixture_, testname_, IIUT_TO_VARNAME_(testfixture_) \
106  , ::iutest::internal::GetTypeId< IIUT_TO_VARNAME_(testfixture_) >())
107 
108 #if IUTEST_HAS_TESTFIXTURE_ALIAS_BY_TUPLE
109 
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_)
113 
114 #define IUTEST_TEST_F_(testfixture_, testname_) \
115  IIUT_TEST_F_A_(IUTEST_TEST_, testfixture_, testname_)
116 
117 #if IUTEST_HAS_IGNORE_TEST
118 
119 #define IUTEST_TEST_F_IGNORE_(testfixture_, testname_) \
120  IIUT_TEST_F_A_( IUTEST_TEST_IGNORE_, testfixture_, testname_)
121 
122 #endif
123 
124 #else
125 
126 #define IUTEST_TEST_F_(testfixture_, testname_) \
127  IIUT_TEST_F_(IUTEST_TEST_, testfixture_, testname_)
128 
129 #if IUTEST_HAS_IGNORE_TEST
130 
131 #define IUTEST_TEST_F_IGNORE_(testfixture_, testname_) \
132  IIUT_TEST_F_( IUTEST_TEST_IGNORE_, testfixture_, testname_)
133 
134 #endif
135 
136 #endif
137 
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; \
154  }; \
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()
161 
162 #if IUTEST_HAS_IGNORE_TEST
163 
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(); \
175  }; \
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()
182 
183 #endif
184 
185 #if !defined(IUTEST_NO_VARIADIC_MACROS)
186 
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__); } \
211  }; \
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__))
218 
219 #endif
220 
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_)
229 
234 #define IUTEST_ASSERT_FAILURE(msg) IUTEST_ASSERT_FAILURE_AT(msg, __FILE__, __LINE__)
235 
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)
238 #else
239 # define IUTEST_ASSERT_FAILURE_AT(msg, file, line) IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kFatalFailure)
240 #endif
241 
246 #define IUTEST_EXPECT_FAILURE(msg) IUTEST_EXPECT_FAILURE_AT(msg, __FILE__, __LINE__)
247 
248 #define IUTEST_EXPECT_FAILURE_AT(msg, file, line) IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kNonFatalFailure)
249 
254 #define IUTEST_INFORM_FAILURE(msg) IUTEST_INFORM_FAILURE_AT(msg, __FILE__, __LINE__)
255 
256 #define IUTEST_INFORM_FAILURE_AT(msg, file, line) IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kWarning)
257 
262 #define IUTEST_ASSUME_FAILURE(msg) IUTEST_ASSUME_FAILURE_AT(msg, __FILE__, __LINE__)
263 
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)
267 #else
268 # define IUTEST_ASSUME_FAILURE_AT(msg, file, line) \
269  IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kAssumeFailure)
270 #endif
271 
276 #define IUTEST_SKIP_MESSAGE(msg) IUTEST_SKIP_MESSAGE_AT(msg, __FILE__, __LINE__)
277 
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)
281 #else
282 # define IUTEST_SKIP_MESSAGE_AT(msg, file, line) \
283  IUTEST_MESSAGE_AT(file, line, msg, ::iutest::TestPartResult::kSkip)
284 #endif
285 
286 #ifndef IUTEST_MAKE_ASSERTIONRESULT_
287 # define IUTEST_MAKE_ASSERTIONRESULT_(ar) ar
288 #endif
289 
294 #define IUTEST_TEST_ASSERT_(expression, on_failure) \
295  IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
296  if( const ::iutest::AssertionResult iutest_ar = IUTEST_MAKE_ASSERTIONRESULT_(expression) ) \
297  ; \
298  else \
299  on_failure(iutest_ar.message())
300 
301 #if IUTEST_HAS_EXCEPTIONS
302 
303 #if IUTEST_HAS_CATCH_SEH_EXCEPTION_ASSERTION
304 
305 #define IIUT_SEH_THROUGH(statement) ::iutest::detail::seh_passthrough([&](){ (void)(statement); })
306 
307 #else
308 
309 #define IIUT_SEH_THROUGH(statement) (void)(statement)
310 
311 #endif
312 
317 #define IUTEST_TEST_THROW_(statement, expected_exception, on_failure) \
318  IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
319  if( const char* msg = "" ) { \
320  try { \
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& ) { \
326  } catch( ... ) { \
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__); \
330  } \
331  } else \
332  IUTEST_PP_CAT(iutest_label_throw, __LINE__): \
333  on_failure(msg)
334 
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() ) { \
342  try { \
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) ) { \
350  } else { \
351  iutest_ar << "\nExpected: " #statement " throws an exception of value\n" << ar.message(); \
352  goto IUTEST_PP_CAT(iutest_label_throw_value, __LINE__); \
353  } \
354  } catch( ... ) { \
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__); \
358  } \
359  } else \
360  IUTEST_PP_CAT(iutest_label_throw_value, __LINE__): \
361  on_failure(iutest_ar.message())
362 
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)
375 
380 #define IUTEST_TEST_ANY_THROW_(statement, on_failure) \
381  IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
382  if( ::iutest::detail::AlwaysTrue() ) { \
383  try { \
384  IIUT_SEH_THROUGH(statement); \
385  goto IUTEST_PP_CAT(iutest_label_anythrow, __LINE__); \
386  } catch( ... ) { \
387  } \
388  } else \
389  IUTEST_PP_CAT(iutest_label_anythrow, __LINE__): \
390  on_failure("\nExpected: " #statement " throws an exception.\n Actual: it doesn's throws.")
391 
396 #define IUTEST_TEST_NO_THROW_(statement, on_failure) \
397  IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
398  if( ::iutest::AssertionResult iutest_ar = ::iutest::AssertionSuccess() ) { \
399  try { \
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. \"" \
407  << e << "\""; \
408  goto IUTEST_PP_CAT(iutest_label_nothrow, __LINE__); \
409  } catch( ... ) { \
410  iutest_ar << "\nExpected: " #statement " doesn't throw an exception.\n Actual: it throws."; \
411  goto IUTEST_PP_CAT(iutest_label_nothrow, __LINE__); \
412  } \
413  } else \
414  IUTEST_PP_CAT(iutest_label_nothrow, __LINE__): \
415  on_failure(iutest_ar.message())
416 
417 #endif
418 
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_; \
423  else \
424  on_failure(::iutest::internal::GetBooleanAssertionFailureMessage( \
425  iutest_ar, text, #actual, #expected).c_str() )
426 
431 #define IUTEST_TERMINATE_ON_FAILURE(cond) do { if IUTEST_COND_UNLIKELY( !(cond) ) { \
432  IUTEST_MESSAGE(#cond, ::iutest::TestPartResult::kFatalFailure); \
433  exit(1); \
434  } } while(::iutest::detail::AlwaysFalse())
435 
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_)
448 
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_))
456 
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
465 #endif
466 
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__); \
474  } else \
475  IUTEST_PP_CAT(iutest_label_analysis_assume, __LINE__): \
476  todo
477 
478 #else
479 
480 #define IUTEST_THROUGH_ANALYSIS_ASSUME_(expr, todo) todo
481 
482 #endif
483 
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 )
492 
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 )
496 
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 )
500 
501 #define IUTEST_TEST_LE(v1, v2, on_failure) \
502  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperLE \
503  , v1, v2, on_failure )
504 
505 #define IUTEST_TEST_LT(v1, v2, on_failure) \
506  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperLT \
507  , v1, v2, on_failure )
508 
509 #define IUTEST_TEST_GE(v1, v2, on_failure) \
510  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperGE \
511  , v1, v2, on_failure )
512 
513 #define IUTEST_TEST_GT(v1, v2, on_failure) \
514  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperGT \
515  , v1, v2, on_failure )
516 
517 #define IUTEST_TEST_TRUE(expr, text, on_failure) \
518  IUTEST_TEST_BOOLEAN_( expr, text, false, true, on_failure)
519 
520 #define IUTEST_TEST_FALSE(expr, text, on_failure) \
521  IUTEST_TEST_BOOLEAN_( !(expr), text, true, false, on_failure)
522 
523 #define IUTEST_TEST_FLOAT_EQ(expected, actual, on_failure) \
524  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperFloatingPointEQ<float> \
525  , expected, actual, on_failure )
526 
527 #define IUTEST_TEST_DOUBLE_EQ(expected, actual, on_failure) \
528  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperFloatingPointEQ<double> \
529  , expected, actual, on_failure )
530 
531 #if IUTEST_HAS_LONG_DOUBLE
532 
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 )
536 
537 #endif
538 
539 #define IUTEST_TEST_COMPLEX_EQ(expected, actual, on_failure) \
540  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperFloatingPointComplexEQ \
541  , expected, actual, on_failure )
542 
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 )
546 
547 #define IUTEST_TEST_STREQ(expected, actual, on_failure) \
548  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTREQ \
549  , expected, actual, on_failure )
550 
551 #define IUTEST_TEST_STRNE(v1, v2, on_failure) \
552  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTRNE \
553  , v1, v2, on_failure )
554 
555 #define IUTEST_TEST_STRCASEEQ(expected, actual, on_failure) \
556  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTRCASEEQ \
557  , expected, actual, on_failure )
558 
559 #define IUTEST_TEST_STRCASENE(v1, v2, on_failure) \
560  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSTRCASENE \
561  , v1, v2, on_failure )
562 
563 #if defined(IUTEST_OS_WINDOWS)
564 
565 #define IUTEST_TEST_HRESULT_SUCCEEDED(hr, on_failure) \
566  IUTEST_PRED_FORMAT1_( ::iutest::internal::IsHRESULTSuccess \
567  , hr, on_failure )
568 
569 #define IUTEST_TEST_HRESULT_FAILED(hr, on_failure) \
570  IUTEST_PRED_FORMAT1_( ::iutest::internal::IsHRESULTFailure \
571  , hr, on_failure )
572 
573 #endif
574 
575 #define IUTEST_TEST_SAME(v1, v2, on_failure) \
576  IUTEST_PRED_FORMAT2_( ::iutest::internal::CmpHelperSame \
577  , v1, v2, on_failure )
578 
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 \
582  , v, on_failure ))
583 
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 \
587  , v, on_failure ))
588 
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__); \
598  } \
599  } else \
600  IUTEST_PP_CAT(iutest_label_test_no_failure_, __LINE__): \
601  on_failure("\nExpected: " #statement " doesn't generate new failure.\n Actual: it does.")
602 
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__); \
612  } \
613  } else \
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.")
616 
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. " )
621 
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 " )")
633 #else
634 # define IUTEST_TEST_COMPILEERROR(e) \
635  IUTEST_PRAGMA_MESSAGE("IUTEST_TEST_COMPILEERROR( " e " )")
636 #endif
637 
643 #if IUTEST_HAS_STATIC_ASSERT
644 # define IUTEST_TEST_STATICASSERT(e) IUTEST_TEST_COMPILEERROR(e)
645 #else
646 # define IUTEST_TEST_STATICASSERT(e) IUTEST_TEST_COMPILEERROR("static_assert")
647 #endif
652 #endif // INCG_IRIS_IUTEST_INTERNAL_HPP_A5BD9FBB_B57A_4C1D_B205_0ADB7798DBF9_