15 #ifndef INCG_IRIS_IUTEST_ASSERTION_HPP_E6AF3476_DA81_46F7_A961_ACCEF7363932_ 
   16 #define INCG_IRIS_IUTEST_ASSERTION_HPP_E6AF3476_DA81_46F7_A961_ACCEF7363932_ 
   30 typedef detail::iuStreamMessage 
Message;
 
   35 inline ::std::string StreamableToString(
const T& value)
 
   37     return (
Message() << value).GetString();
 
   45     void DefaultReportTestPartResult(
const TestPartResult& test_part_result);
 
   77     const char* 
message()
 const { 
return m_message.c_str(); }
 
   97         m_message += msg.GetString();
 
  134     ::std::string m_message;
 
  138 #if IUTEST_HAS_ASSERTION_RETURN 
  179 class AssertionHelper
 
  190         : m_part_result(file, line, message, type)
 
  199     AssertionHelper(
const char* file, 
int line, const ::std::string& message, 
TestPartResult::Type type)
 
  200         : m_part_result(file, line, message.c_str(), type)
 
  206         : 
public detail::iuCodeMessage
 
  207 #if IUTEST_USE_OWN_LIST 
  208         , 
public detail::iu_list_node<ScopedMessage>
 
  212         ScopedMessage(
const detail::iuCodeMessage& msg) 
 
  213             : detail::iuCodeMessage(msg)
 
  215             ScopedTrace::GetInstance().list.push_back(
this);
 
  219             ScopedTrace::GetInstance().list.remove(
this);
 
  226 #if IUTEST_USE_OWN_LIST 
  227         typedef detail::iu_list<ScopedMessage> msg_list;
 
  229         typedef ::std::list<ScopedMessage*> msg_list;
 
  232         static ScopedTrace& GetInstance() { 
static ScopedTrace inst; 
return inst; }
 
  238                 part_result.add_message(
"\niutest trace:");
 
  239                 for( msg_list::iterator it = list.begin(), end=list.end(); it != end; ++it )
 
  243                     part_result.add_message(
"\n");
 
  244                     part_result.add_message((*it)->make_message().c_str());
 
  250 #if defined(IUTEST_NO_PRIVATE_IN_AGGREGATE) 
  251     friend class ScopedMessage;
 
  254 #if IUTEST_HAS_ASSERTION_RETURN 
  256     template<
typename R>
struct ReturnTypedFixed;
 
  265         Fixed& operator << (T val)
 
  267             Message::operator << (val);
 
  270         template<
typename T, 
size_t SIZE>
 
  271         Fixed& operator << (
const T(&val)[SIZE])
 
  273             Message::operator << (val);
 
  276 #if IUTEST_HAS_IOMANIP 
  277         Fixed& operator << (iu_basic_iomanip val)
 
  279             Message::operator << (val);
 
  283 #if IUTEST_HAS_ASSERTION_RETURN 
  291             return ReturnTypedFixed<R>(*
this, ret);
 
  296 #if IUTEST_HAS_ASSERTION_RETURN 
  299     struct ReturnTypedFixed
 
  309     void operator = (
const Fixed& fixed)
 
  312 #if IUTEST_HAS_EXCEPTIONS && IUTEST_USE_THROW_ON_ASSERTION_FAILURE 
  314             switch( m_part_result.type() )
 
  319                 throw m_part_result.type();
 
  326 #if IUTEST_HAS_ASSERTION_RETURN 
  329     R operator = (
const ReturnTypedFixed<R>& fixed) 
 
  331         this->operator=(fixed.fixed);
 
  332         return fixed.ret.value;
 
  337     void OnFixed(
const Fixed& fixed)
 
  340         const ::std::string append_message = fixed.GetString();
 
  341         if( !append_message.empty() )
 
  343             m_part_result.add_message(
" " + append_message);
 
  345         ScopedTrace::GetInstance().append_message(m_part_result);
 
  347         if( TestEnv::GetGlobalTestPartResultReporter() != IUTEST_NULLPTR )
 
  349             TestEnv::GetGlobalTestPartResultReporter()->ReportTestPartResult(m_part_result);
 
  353             detail::DefaultReportTestPartResult(m_part_result);
 
  356         if( m_part_result.failed()
 
  401 template<
typename T1, 
typename T2>
 
  402 inline ::std::string FormatForComparisonFailureMessage(
const T1& value, 
const T2& )
 
  410 inline ::std::string GetBooleanAssertionFailureMessage(
const AssertionResult& ar
 
  411     , 
const char* expr, 
const char* actual, 
const char* expected)
 
  413     ::std::string str = 
"error: Value of: ";
 
  415     str += 
"\n  Actual: ";
 
  417     if( !detail::IsEmpty(ar.message()) )
 
  423     str += 
"\nExpected: ";
 
  431 inline AssertionResult EqFailure(
const char* expected_expression, 
const char* actual_expression
 
  432     , const ::std::string& expected, const ::std::string& actual, 
bool ignoring_case = 
false)
 
  434     iu_global_format_stringstream strm;
 
  435     strm << 
"error: Value of " << actual_expression
 
  436         << 
"\n  Actual: " << actual
 
  437         << 
"\nExpected: " << expected_expression;
 
  440         strm << 
" (ignoring case)";
 
  442     if( !detail::IsStringEqual(expected_expression, expected.c_str()) )
 
  444         strm << 
"\nWhich is: " << expected;
 
  449 template<
typename T1, 
typename T2>
 
  450 inline AssertionResult CmpHelperOpFailure(
const char* expr1, 
const char* expr2, 
const char* op
 
  451     , 
const T1& val1, 
const T2& val2)
 
  453     return AssertionFailure() << 
"error: Expected: " << expr1 << 
" " << op << 
" " << expr2
 
  454         << 
"\n  Actual: " << FormatForComparisonFailureMessage(val1, val2)
 
  455         << 
" vs " << FormatForComparisonFailureMessage(val2, val1);
 
  463 #define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_BASE_(op_name, op)    \ 
  464     template<typename T1, typename T2>                              \ 
  465     bool iuOperator##op_name(const T1& v1, const T2& v2) {          \ 
  469 #if IUTEST_HAS_CXX_HDR_VARIANT && IUTEST_HAS_VARIADIC_TEMPLATES 
  470 #define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(op_name, op)             \ 
  471     template<typename ...V1, typename ...V2>                                    \ 
  472     bool iuOperator##op_name(const ::std::variant<V1...>&& v1, const ::std::variant<V2...>& v2) {    \ 
  475     template<typename T1, typename ...V>                                        \ 
  476     bool iuOperator##op_name(const T1& v1, const ::std::variant<V...>& v2       \ 
  477         , typename detail::enable_if< !detail::is_variant<T1>::value, void>::type*& = detail::enabler::value ) {    \ 
  478         ::std::variant<V...> vv1(v1); return vv1 op v2;                         \ 
  480     template<typename ...V, typename T2>                                        \ 
  481     bool iuOperator##op_name(const ::std::variant<V...>& v1, const T2& v2       \ 
  482         , typename detail::enable_if< !detail::is_variant<T2>::value, void>::type*& = detail::enabler::value ) {    \ 
  483         ::std::variant<V...> vv2(v2); return v1 op vv2;                         \ 
  486 #define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(op_name, op) 
  489 #define IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_(op_name, op)     \ 
  490     IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_BASE_(op_name, op)    \ 
  491     IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(op_name, op) 
  493 #define IIUT_DECL_COMPARE_HELPER_I_(op_name, op, type1, type2)                  \ 
  494     inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelper##op_name(         \ 
  495             const char* expr1, const char* expr2, type1 val1, type2 val2) {     \ 
  496         if( iuOperator##op_name(val1, val2) ) { return AssertionSuccess();      \ 
  497         } else { return CmpHelperOpFailure(expr1, expr2, #op, val1, val2); }    \ 
  500 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING) 
  502 #define IIUT_DECL_COMPARE_HELPER_(op_name, op)                      \ 
  503     IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_(op_name, op)             \ 
  504     template<typename T1, typename T2>                              \ 
  505     IIUT_DECL_COMPARE_HELPER_I_(op_name, op, const T1&, const T2&)  \ 
  506     IIUT_DECL_COMPARE_HELPER_I_(op_name, op, BiggestInt, BiggestInt) 
  510 #define IIUT_DECL_COMPARE_HELPER_(op_name, op)                      \ 
  511     IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_(op_name, op)             \ 
  512     template<typename T1, typename T2>                              \ 
  513     IIUT_DECL_COMPARE_HELPER_I_(op_name, op, const T1&, const T2&) 
  517 template<
typename T1, 
typename T2>
 
  518 bool iuOperatorEQ(
const T1& v1, 
const T2& v2)
 
  520 IUTEST_PRAGMA_WARN_PUSH()
 
  521 IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()
 
  523 IUTEST_PRAGMA_WARN_POP()
 
  525 IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT_(EQ, ==)
 
  527 IIUT_DECL_COMPARE_HELPER_(NE, !=)
 
  528 IIUT_DECL_COMPARE_HELPER_(LE, <=)
 
  529 IIUT_DECL_COMPARE_HELPER_(LT, < )
 
  530 IIUT_DECL_COMPARE_HELPER_(GE, >=)
 
  531 IIUT_DECL_COMPARE_HELPER_(GT, > )
 
  534 #undef IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_ 
  535 #undef IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_BASE 
  536 #undef IIUT_DECL_COMPARE_HELPER_EXTEND_POINT_VARIANT 
  537 #undef IIUT_DECL_COMPARE_HELPER_I_ 
  538 #undef IIUT_DECL_COMPARE_HELPER_ 
  548 template<
bool IsNullLiteral>
 
  553     static AssertionResult CompareEq(
const char* expr, 
const T* val)
 
  555         if( IUTEST_NULLPTR == val )
 
  561             << 
"\n  Actual: " << val
 
  562             << 
"\nExpected: NULL";
 
  565     static AssertionResult CompareNe(
const char* expr, 
const T* val)
 
  567         if( IUTEST_NULLPTR != val )
 
  573             << 
"\n  Actual: NULL\nExpected: not NULL";
 
  581 class NullHelper<true>
 
  584     static AssertionResult CompareEq(
const char*, 
void*)
 
  588     static AssertionResult CompareNe(
const char* expr, 
void*)
 
  591             << 
"\n  Actual: NULL\nExpected: not NULL";
 
  595 template<
typename T1, 
typename T2>
 
  596 inline AssertionResult CmpHelperSame(
const char* expected_str, 
const char* actual_str
 
  597                                     , 
const T1& expected, 
const T2& actual)
 
  599     if( &expected == &actual )
 
  604     return AssertionFailure() << 
"error: Expected: &(" << expected_str << 
") == &(" << actual_str
 
  605         << 
")\n  Actual: " << FormatForComparisonFailureMessage(&expected, &actual)
 
  606         << 
" vs " << FormatForComparisonFailureMessage(&actual, &expected);
 
  609 template<
typename T1, 
typename T2>
 
  610 inline AssertionResult CmpHelperEQ(
const char* expected_str, 
const char* actual_str
 
  611     , 
const T1& expected, 
const T2& actual)
 
  613     if( iuOperatorEQ(actual, expected) )
 
  618     return EqFailure(expected_str, actual_str
 
  619         , FormatForComparisonFailureMessage(expected, actual)
 
  620         , FormatForComparisonFailureMessage(actual, expected)
 
  625 inline AssertionResult CmpHelperMemCmpEQ(
const char* expected_str, 
const char* actual_str
 
  626     , 
const T& expected, 
const T& actual)
 
  628 IUTEST_PRAGMA_WARN_PUSH()
 
  629 IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()
 
  631     if( memcmp(&actual, &expected, sizeof(T)) == 0 )
 
  636     return EqFailure(expected_str, actual_str
 
  637         , FormatForComparisonFailureMessage(expected, actual)
 
  638         , FormatForComparisonFailureMessage(actual, expected)
 
  641 IUTEST_PRAGMA_WARN_POP()
 
  645 inline AssertionResult CmpHelperMemCmpNE(
const char* expected_str, 
const char* actual_str
 
  646     , 
const T& expected, 
const T& actual)
 
  648 IUTEST_PRAGMA_WARN_PUSH()
 
  649 IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()
 
  651     if( memcmp(&actual, &expected, sizeof(T)) != 0 )
 
  656     return AssertionFailure() << 
"error: Expected: " << expected_str << 
" != " << actual_str
 
  657         << 
"\n  Actual: " << FormatForComparisonFailureMessage(expected, actual);
 
  659 IUTEST_PRAGMA_WARN_POP()
 
  662 template<
typename RawType>
 
  663 inline AssertionResult CmpHelperFloatingPointEQ(
const char* expr1, 
const char* expr2
 
  664                                                 , RawType val1, RawType val2)
 
  666     floating_point<RawType> f1(val1), f2(val2);
 
  667     if( f1.AlmostEquals(f2) )
 
  671     return EqFailure(expr1, expr2
 
  672         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(f1, f2))
 
  673         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(f2, f1)));
 
  676 template<
typename RawType>
 
  677 inline AssertionResult CmpHelperFloatingPointLE(
const char* expr1, 
const char* expr2
 
  678                                                 , RawType val1, RawType val2)
 
  684     floating_point<RawType> f1(val1), f2(val2);
 
  685     if( f1.AlmostEquals(f2) )
 
  689     return EqFailure(expr1, expr2
 
  690         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(f1, f2))
 
  691         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(f2, f1)));
 
  704 template<
bool IsNullLiteral>
 
  707 #if IUTEST_HAS_ASSERTION_NOEQUALTO_OBJECT 
  708     template<
typename T, 
bool has_equal_to_operator>
 
  711         static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T& val1, 
const T& val2)
 
  713             return CmpHelperEQ(expr1, expr2, val1, val2);
 
  717     struct CmpHelper<T, false>
 
  719         static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T& val1, 
const T& val2)
 
  721             return CmpHelperMemCmpEQ(expr1, expr2, val1, val2);
 
  727     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T& val1, 
const T& val2)
 
  729         return CmpHelper<T, detail::has_equal_to<T>::value>::Compare(expr1, expr2, val1, val2);
 
  734     template<
typename T1, 
typename T2>
 
  735     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2)
 
  737         return CmpHelperEQ(expr1, expr2, val1, val2);
 
  748 #if !defined(IUTEST_NO_SFINAE) 
  749     template<
typename T1, 
typename T2>
 
  750     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2
 
  751         , 
typename detail::enable_if< !detail::is_pointer<T2>::value, 
void>::type*& = detail::enabler::value)
 
  753         return CmpHelperEQ(expr1, expr2, val1, val2);
 
  755     template<
typename T2>
 
  756     static AssertionResult Compare(
const char* expr1, 
const char* expr2
 
  757         , detail::IsNullLiteralHelper::Object* val1, T2* val2)
 
  759         IUTEST_UNUSED_VAR(val1);
 
  760         return CmpHelperEQ(expr1, expr2, 
static_cast<T2*
>(IUTEST_NULLPTR), val2);
 
  763     template<
typename T1, 
typename T2>
 
  764     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2)
 
  766         return CmpHelperEQ(expr1, expr2, (T2)(val1), val2); 
 
  775 template<
bool IsNullLiteral>
 
  776 class AlmostEqHelper : 
public EqHelper<false>
 
  779     template<
typename T1, 
typename T2>
 
  780     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2)
 
  782         return EqHelper<false>::Compare(expr1, expr2, val1, 
static_cast<T1
>(val2));
 
  785     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const float& val1, 
const T& val2)
 
  787         return CmpHelperFloatingPointEQ<float>(expr1, expr2, val1, 
static_cast<float>(val2));
 
  790     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const double& val1, 
const T& val2)
 
  792         return CmpHelperFloatingPointEQ<double>(expr1, expr2, val1, 
static_cast<double>(val2));
 
  800 class AlmostEqHelper<true> : 
public EqHelper<true>
 
  808 template<
bool IsNullLiteral>
 
  811 #if IUTEST_HAS_ASSERTION_NOEQUALTO_OBJECT 
  812     template<
typename T, 
bool has_not_equal_to_operator>
 
  815         static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T& val1, 
const T& val2)
 
  817             return CmpHelperNE(expr1, expr2, val1, val2);
 
  821     struct CmpHelper<T, false>
 
  823         static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T& val1, 
const T& val2)
 
  825             return CmpHelperMemCmpNE(expr1, expr2, val1, val2);
 
  831     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T& val1, 
const T& val2)
 
  833         return CmpHelper<T, detail::has_not_equal_to<T>::value>::Compare(expr1, expr2, val1, val2);
 
  839     template<
typename T1, 
typename T2>
 
  840     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2)
 
  842         return CmpHelperNE(expr1, expr2, val1, val2);
 
  853 #if !defined(IUTEST_NO_SFINAE) 
  854     template<
typename T1, 
typename T2>
 
  855     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2
 
  856         , 
typename detail::enable_if< !detail::is_pointer<T2>::value, 
void>::type*& = detail::enabler::value)
 
  858         return CmpHelperNE(expr1, expr2, val1, val2);
 
  860     template<
typename T2>
 
  861     static AssertionResult Compare(
const char* expr1, 
const char* expr2
 
  862         , detail::IsNullLiteralHelper::Object* val1, T2* val2)
 
  864         IUTEST_UNUSED_VAR(val1);
 
  865         return CmpHelperNE(expr1, expr2, 
static_cast<T2*
>(IUTEST_NULLPTR), val2);
 
  868     template<
typename T1, 
typename T2>
 
  869     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2)
 
  871         return CmpHelperNE(expr1, expr2, (T2)(val1), val2); 
 
  878 #if IUTEST_HAS_NULLPTR && IUTEST_HAS_CXX_HDR_TYPE_TARITS && 0 
  885     template<
typename T1, 
typename T2, 
typename detail::enable_if<
 
  886         !detail::is_integral<T1>::value || !detail::is_pointer<T2>::value, 
void>::type*& = detail::enabler::value>
 
  887     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2)
 
  889         return backward::EqHelper<false>::Compare(expr1, expr2, val1, val2);
 
  892     static AssertionResult Compare(
const char* expr1, 
const char* expr2, ::std::nullptr_t, T* val2)
 
  894         return CmpHelperEQ(expr1, expr2, 
static_cast<T*
>(IUTEST_NULLPTR), val2);
 
  903     template<
typename T1, 
typename T2, 
typename detail::enable_if<
 
  904         !detail::is_integral<T1>::value || !detail::is_pointer<T2>::value, 
void>::type*& = detail::enabler::value>
 
  905     static AssertionResult Compare(
const char* expr1, 
const char* expr2, 
const T1& val1, 
const T2& val2)
 
  907         return backward::NeHelper<false>::Compare(expr1, expr2, val1, val2);
 
  910     static AssertionResult Compare(
const char* expr1, 
const char* expr2, ::std::nullptr_t, T* val2)
 
  912         return CmpHelperNE(expr1, expr2, 
static_cast<T*
>(IUTEST_NULLPTR), val2);
 
  918 using backward::EqHelper;
 
  919 using backward::AlmostEqHelper;
 
  920 using backward::NeHelper;
 
  924 template<
typename RawType>
 
  925 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperNearFloatingPoint(
 
  926     const char* expr1, 
const char* expr2, 
const char* absc
 
  927         , RawType val1, RawType val2, RawType abs_v)
 
  929     RawType diff = val1 > val2 ? val1 - val2 : val2 - val1;
 
  934     floating_point<RawType> f1(diff), f2(abs_v);
 
  935     if( f1.AlmostEquals(f2) )
 
  939     return AssertionFailure() << 
"error: Value of: abs(" << expr1 << 
" - " << expr2 << 
") <= " << absc
 
  940         << 
"\n  Actual: abs(" << val1 << 
" - " << val2 << 
") : " << diff
 
  941         << 
"\nExpected: " << FormatForComparisonFailureMessage(abs_v, diff);
 
  943 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ DoubleNearPredFormat(
 
  944     const char* expr1, 
const char* expr2, 
const char* absc
 
  945         , 
double val1, 
double val2, 
double abs_v)
 
  947     return CmpHelperNearFloatingPoint(expr1, expr2, absc, val1, val2, abs_v);
 
  949 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING) 
  950 template<
typename T, 
typename A>
 
  951 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperNear(
 
  952     const char* expr1, 
const char* expr2, 
const char* absc
 
  953         , 
const T& val1, 
const T& val2, 
const A& abs_v)
 
  955     T diff = val1 > val2 ? val1 - val2 : val2 - val1;
 
  960     return AssertionFailure() << 
"error: Value of: abs(" << expr1 << 
" - " << expr2 << 
") <= " << absc
 
  961         << 
"\n  Actual: abs(" << val1 << 
" - " << val2 << 
") : " << diff
 
  962         << 
"\nExpected: " << FormatForComparisonFailureMessage(abs_v, diff);
 
  965 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperNear(
 
  966     const char* expr1, 
const char* expr2, 
const char* absc
 
  967         , 
double val1, 
double val2, 
const A& abs_v)
 
  969     return CmpHelperNearFloatingPoint<double>(expr1, expr2, absc, val1, val2, 
static_cast<double>(abs_v));
 
  973 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperNear(
 
  974     const char* expr1, 
const char* expr2, 
const char* absc
 
  975         , 
float val1, 
float val2, 
const A& abs_v)
 
  977     return CmpHelperNearFloatingPoint<float>(expr1, expr2, absc, val1, val2, 
static_cast<float>(abs_v));
 
  981 namespace StrEqHelper
 
  984 #if IUTEST_HAS_NULLPTR && 0 
  985 #define IIUT_DECL_STREQ_COMPARE_HELPER_NULL_(T)   \ 
  986     inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(::std::nullptr_t, const T* val2) {     \ 
  987         return val2 == IUTEST_NULLPTR;                                                  \ 
  990 #define IIUT_DECL_STREQ_COMPARE_HELPER_NULL_(T) 
  993 #define IIUT_DECL_STREQ_COMPARE_HELPER_SV_(T)   \ 
  994     inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(detail::iu_nullable_basic_string_view<T> val1  \ 
  995         , detail::iu_nullable_basic_string_view<T> val2) {                                      \ 
  996         return val1 == val2;                                                                    \ 
  998     inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(const T* val1, const T* val2) {                \ 
  999         if( val1 == IUTEST_NULLPTR || val2 == IUTEST_NULLPTR ) { return val1 == val2; }         \ 
 1000         return Compare(detail::iu_nullable_basic_string_view<T>(val1)                           \ 
 1001             , detail::iu_nullable_basic_string_view<T>(val2));                                  \ 
 1004 #define IIUT_DECL_STREQ_COMPARE_HELPER_(T)      \ 
 1005     IIUT_DECL_STREQ_COMPARE_HELPER_SV_(T)       \ 
 1006     IIUT_DECL_STREQ_COMPARE_HELPER_NULL_(T) 
 1008 IIUT_DECL_STREQ_COMPARE_HELPER_(
char)
 
 1009 IIUT_DECL_STREQ_COMPARE_HELPER_(
wchar_t)
 
 1010 #if IUTEST_HAS_CHAR16_T 
 1011 IIUT_DECL_STREQ_COMPARE_HELPER_(char16_t)
 
 1013 #if IUTEST_HAS_CHAR32_T 
 1014 IIUT_DECL_STREQ_COMPARE_HELPER_(char32_t)
 
 1017 #undef IIUT_DECL_STREQ_COMPARE_HELPER_ 
 1018 #undef IIUT_DECL_STREQ_COMPARE_HELPER_SV_ 
 1022 template<
typename T1, 
typename T2>
 
 1023 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTREQ(
 
 1024     const char* expr1, 
const char* expr2
 
 1025     , T1 val1, T2 val2, 
typename detail::enable_if<
 
 1026         !detail::is_integral<T1>::value || !detail::is_pointer<T2>::value, 
void>::type*& = detail::enabler::value)
 
 1028     if( StrEqHelper::Compare(val1, val2) )
 
 1033     return EqFailure(expr1, expr2
 
 1034         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(val1, val2))
 
 1035         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(val2, val1)));
 
 1038 template<
typename T>
 
 1039 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTREQ(
 
 1040     const char* expr1, 
const char* expr2
 
 1041     , detail::iu_nullptr_convertible_t, T val2)
 
 1043     if( StrEqHelper::Compare(IUTEST_NULLPTR, val2) )
 
 1048     return EqFailure(expr1, expr2
 
 1049         , detail::ShowStringQuoted(FormatForComparisonFailureMessage<T, T>(IUTEST_NULLPTR, val2))
 
 1050         , detail::ShowStringQuoted(FormatForComparisonFailureMessage<T, T>(val2, IUTEST_NULLPTR)));
 
 1053 namespace StrNeHelper
 
 1056 template<
typename T1, 
typename T2>
 
 1057 inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(
const T1& val1, 
const T2& val2)
 
 1059     return !StrEqHelper::Compare(val1, val2);
 
 1064 template<
typename T1, 
typename T2>
 
 1065 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRNE(
 
 1066     const char* expr1, 
const char* expr2
 
 1067     , T1 val1, T2 val2, 
typename detail::enable_if<
 
 1068         ((!detail::is_integral<T2>::value || !detail::is_pointer<T1>::value) &&
 
 1069         (!detail::is_integral<T1>::value || !detail::is_pointer<T2>::value)), 
void>::type*& = detail::enabler::value)
 
 1071     if( StrNeHelper::Compare(val1, val2) )
 
 1076     return AssertionFailure() << 
"error: Expected: " << expr1 << 
" != " << expr2
 
 1077         << 
"\n  Actual: " << detail::ShowStringQuoted(FormatForComparisonFailureMessage(val2, val1))
 
 1078         << 
" vs " << detail::ShowStringQuoted(FormatForComparisonFailureMessage(val1, val2));
 
 1081 template<
typename T>
 
 1082 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRNE(
 
 1083     const char* expr1, 
const char* expr2
 
 1084     , detail::iu_nullptr_convertible_t, T val2)
 
 1086     if( !StrEqHelper::Compare(IUTEST_NULLPTR, val2) )
 
 1091     return AssertionFailure() << 
"error: Expected: " << expr1 << 
" != " << expr2
 
 1092         << 
"\n  Actual: " << detail::ShowStringQuoted(FormatForComparisonFailureMessage<T, T>(val2, IUTEST_NULLPTR))
 
 1093         << 
" vs " << detail::ShowStringQuoted(FormatForComparisonFailureMessage<T, T>(IUTEST_NULLPTR, val2));
 
 1096 template<
typename T>
 
 1097 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRNE(
 
 1098     const char* expr1, 
const char* expr2
 
 1099     , T val1, detail::iu_nullptr_convertible_t)
 
 1101     if( !StrEqHelper::Compare(val1, IUTEST_NULLPTR) )
 
 1106     return AssertionFailure() << 
"error: Expected: " << expr1 << 
" != " << expr2
 
 1107         << 
"\n  Actual: " << detail::ShowStringQuoted(FormatForComparisonFailureMessage<T, T>(IUTEST_NULLPTR, val1))
 
 1108         << 
" vs " << detail::ShowStringQuoted(FormatForComparisonFailureMessage<T, T>(val1, IUTEST_NULLPTR));
 
 1111 namespace StrCaseEqHelper
 
 1114 inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(
const char* val1, 
const char* val2)
 
 1116     if( val1 == IUTEST_NULLPTR || val2 == IUTEST_NULLPTR )
 
 1118         return val1 == val2;
 
 1120     return detail::iu_stricmp(val1, val2) == 0;
 
 1123 inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(
const wchar_t* val1, 
const wchar_t* val2)
 
 1125     if( val1 == IUTEST_NULLPTR || val2 == IUTEST_NULLPTR )
 
 1127         return val1 == val2;
 
 1129     return detail::iu_wcsicmp(val1, val2) == 0;
 
 1132 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1133 inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(
 
 1134     const ::std::basic_string<Elem, Traits, Ax>& val1
 
 1135         , const ::std::basic_string<Elem, Traits, Ax>& val2)
 
 1137     return Compare(val1.c_str(), val2.c_str());
 
 1139 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1140 inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(
 
 1142         , const ::std::basic_string<Elem, Traits, Ax>& val2)
 
 1144     return Compare(val1, val2.c_str());
 
 1146 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1147 inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(
 
 1148     const ::std::basic_string<Elem, Traits, Ax>& val1
 
 1151     return Compare(val1.c_str(), val2);
 
 1154 template<
typename T1, 
typename T2>
 
 1155 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ Assertion(
 
 1156     const char* expr1, 
const char* expr2
 
 1157         , 
const T1& val1, 
const T2& val2)
 
 1159     if( Compare(val1, val2) )
 
 1164     return EqFailure(expr1, expr2
 
 1165         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(val1, val2))
 
 1166         , detail::ShowStringQuoted(FormatForComparisonFailureMessage(val2, val1))
 
 1172 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASEEQ(
 
 1173     const char* expr1, 
const char* expr2
 
 1174         , 
const char* val1, 
const char* val2)
 
 1176     return StrCaseEqHelper::Assertion(expr1, expr2, val1, val2);
 
 1178 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASEEQ(
 
 1179     const char* expr1, 
const char* expr2
 
 1180         , 
const wchar_t* val1, 
const wchar_t* val2)
 
 1182     return StrCaseEqHelper::Assertion(expr1, expr2, val1, val2);
 
 1184 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1185 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASEEQ(
 
 1186     const char* expr1, 
const char* expr2
 
 1187         , const ::std::basic_string<Elem, Traits, Ax>& val1
 
 1188         , const ::std::basic_string<Elem, Traits, Ax>& val2)
 
 1190     return CmpHelperSTRCASEEQ(expr1, expr2, val1.c_str(), val2.c_str());
 
 1192 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1193 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASEEQ(
 
 1194     const char* expr1, 
const char* expr2
 
 1195         , 
const Elem* val1, const ::std::basic_string<Elem, Traits, Ax>& val2)
 
 1197     return CmpHelperSTRCASEEQ(expr1, expr2, val1, val2.c_str());
 
 1199 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1200 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASEEQ(
 
 1201     const char* expr1, 
const char* expr2
 
 1202         , const ::std::basic_string<Elem, Traits, Ax>& val1, 
const Elem* val2)
 
 1204     return CmpHelperSTRCASEEQ(expr1, expr2, val1.c_str(), val2);
 
 1207 namespace StrCaseNeHelper
 
 1210 template<
typename T1, 
typename T2>
 
 1211 inline bool IUTEST_ATTRIBUTE_UNUSED_ Compare(
const T1& val1, 
const T2& val2)
 
 1213     return !StrCaseEqHelper::Compare(val1, val2);
 
 1216 template<
typename T1, 
typename T2>
 
 1217 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ Assertion(
 
 1218     const char* expr1, 
const char* expr2
 
 1219         , 
const T1& val1, 
const T2& val2)
 
 1221     if( Compare(val1, val2) )
 
 1226     return AssertionFailure() << 
"error: Expected: " << expr1 << 
" != " << expr2 << 
" (ignoring case)" 
 1227         << 
"\n  Actual: " << detail::ShowStringQuoted(FormatForComparisonFailureMessage(val2, val1))
 
 1228         << 
" vs " << detail::ShowStringQuoted(FormatForComparisonFailureMessage(val1, val2));
 
 1233 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASENE(
 
 1234     const char* expr1, 
const char* expr2
 
 1235         , 
const char* val1, 
const char* val2)
 
 1237     return StrCaseNeHelper::Assertion(expr1, expr2, val1, val2);
 
 1239 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASENE(
 
 1240     const char* expr1, 
const char* expr2
 
 1241         , 
const wchar_t* val1, 
const wchar_t* val2)
 
 1243     return StrCaseNeHelper::Assertion(expr1, expr2, val1, val2);
 
 1245 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1246 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASENE(
 
 1247     const char* expr1, 
const char* expr2
 
 1248         , const ::std::basic_string<Elem, Traits, Ax>& val1
 
 1249         , const ::std::basic_string<Elem, Traits, Ax>& val2)
 
 1251     return CmpHelperSTRCASENE(expr1, expr2, val1.c_str(), val2.c_str());
 
 1253 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1254 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASENE(
 
 1255     const char* expr1, 
const char* expr2
 
 1257         , const ::std::basic_string<Elem, Traits, Ax>& val2)
 
 1259     return CmpHelperSTRCASENE(expr1, expr2, val1, val2.c_str());
 
 1261 template<
typename Elem, 
typename Traits, 
typename Ax>
 
 1262 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ CmpHelperSTRCASENE(
 
 1263     const char* expr1, 
const char* expr2
 
 1264         , const ::std::basic_string<Elem, Traits, Ax>& val1
 
 1267     return CmpHelperSTRCASENE(expr1, expr2, val1.c_str(), val2);
 
 1270 #if defined(IUTEST_OS_WINDOWS) 
 1272 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ IsHRESULTSuccess(
const char* expr, HRESULT hr)
 
 1279         << 
"\n  Actual: " << hr << 
": " << detail::win::GetHResultString(hr);
 
 1281 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ IsHRESULTFailure(
const char* expr, HRESULT hr)
 
 1288         << 
"\n  Actual: " << hr;
 
 1299 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ 
FloatLE(
 
 1300     const char* expr1, 
const char* expr2
 
 1301         , 
float val1, 
float val2)
 
 1303     return internal::CmpHelperFloatingPointLE<float>(expr1, expr2, val1, val2);
 
 1310 inline AssertionResult IUTEST_ATTRIBUTE_UNUSED_ 
DoubleLE(
 
 1311     const char* expr1, 
const char* expr2
 
 1312         , 
double val1, 
double val2)
 
 1314     return internal::CmpHelperFloatingPointLE<double>(expr1, expr2, val1, val2);
 
 1320 #endif // INCG_IRIS_IUTEST_ASSERTION_HPP_E6AF3476_DA81_46F7_A961_ACCEF7363932_