|
|
|
@ -254,6 +254,103 @@ void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { |
|
|
|
|
namespace testing { |
|
|
|
|
namespace internal { |
|
|
|
|
|
|
|
|
|
// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
|
|
|
|
|
// value of type ToPrint that is an operand of a comparison assertion
|
|
|
|
|
// (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in
|
|
|
|
|
// the comparison, and is used to help determine the best way to
|
|
|
|
|
// format the value. In particular, when the value is a C string
|
|
|
|
|
// (char pointer) and the other operand is an STL string object, we
|
|
|
|
|
// want to format the C string as a string, since we know it is
|
|
|
|
|
// compared by value with the string object. If the value is a char
|
|
|
|
|
// pointer but the other operand is not an STL string object, we don't
|
|
|
|
|
// know whether the pointer is supposed to point to a NUL-terminated
|
|
|
|
|
// string, and thus want to print it as a pointer to be safe.
|
|
|
|
|
//
|
|
|
|
|
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
|
|
|
|
|
|
|
|
|
// The default case.
|
|
|
|
|
template <typename ToPrint, typename OtherOperand> |
|
|
|
|
class FormatForComparison { |
|
|
|
|
public: |
|
|
|
|
static ::std::string Format(const ToPrint& value) { |
|
|
|
|
return ::testing::PrintToString(value); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Array.
|
|
|
|
|
template <typename ToPrint, size_t N, typename OtherOperand> |
|
|
|
|
class FormatForComparison<ToPrint[N], OtherOperand> { |
|
|
|
|
public: |
|
|
|
|
static ::std::string Format(const ToPrint* value) { |
|
|
|
|
return FormatForComparison<const ToPrint*, OtherOperand>::Format(value); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// By default, print C string as pointers to be safe, as we don't know
|
|
|
|
|
// whether they actually point to a NUL-terminated string.
|
|
|
|
|
|
|
|
|
|
#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \ |
|
|
|
|
template <typename OtherOperand> \
|
|
|
|
|
class FormatForComparison<CharType*, OtherOperand> { \
|
|
|
|
|
public: \
|
|
|
|
|
static ::std::string Format(CharType* value) { \
|
|
|
|
|
return ::testing::PrintToString(static_cast<const void*>(value)); \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char); |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char); |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t); |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); |
|
|
|
|
|
|
|
|
|
#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ |
|
|
|
|
|
|
|
|
|
// If a C string is compared with an STL string object, we know it's meant
|
|
|
|
|
// to point to a NUL-terminated string, and thus can print it as a string.
|
|
|
|
|
|
|
|
|
|
#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \ |
|
|
|
|
template <> \
|
|
|
|
|
class FormatForComparison<CharType*, OtherStringType> { \
|
|
|
|
|
public: \
|
|
|
|
|
static ::std::string Format(CharType* value) { \
|
|
|
|
|
return ::testing::PrintToString(value); \
|
|
|
|
|
} \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string); |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string); |
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_GLOBAL_STRING |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string); |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_GLOBAL_WSTRING |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring); |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_STD_WSTRING |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring); |
|
|
|
|
GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_ |
|
|
|
|
|
|
|
|
|
// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
|
|
|
|
|
// operand to be used in a failure message. The type (but not value)
|
|
|
|
|
// of the other operand may affect the format. This allows us to
|
|
|
|
|
// print a char* as a raw pointer when it is compared against another
|
|
|
|
|
// char* or void*, and print it as a C string when it is compared
|
|
|
|
|
// against an std::string object, for example.
|
|
|
|
|
//
|
|
|
|
|
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
|
|
|
|
template <typename T1, typename T2> |
|
|
|
|
std::string FormatForComparisonFailureMessage( |
|
|
|
|
const T1& value, const T2& /* other_operand */) { |
|
|
|
|
return FormatForComparison<T1, T2>::Format(value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
|
|
|
|
|
// value to the given ostream. The caller must ensure that
|
|
|
|
|
// 'ostream_ptr' is not NULL, or the behavior is undefined.
|
|
|
|
|