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_