|
|
|
@ -113,6 +113,7 @@ |
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_ABSL |
|
|
|
|
#include "absl/types/optional.h" |
|
|
|
|
#include "absl/strings/string_view.h" |
|
|
|
|
#endif // GTEST_HAS_ABSL
|
|
|
|
|
|
|
|
|
|
namespace testing { |
|
|
|
@ -133,7 +134,11 @@ enum TypeKind { |
|
|
|
|
kProtobuf, // a protobuf type
|
|
|
|
|
kConvertibleToInteger, // a type implicitly convertible to BiggestInt
|
|
|
|
|
// (e.g. a named or unnamed enum type)
|
|
|
|
|
kOtherType // anything else
|
|
|
|
|
#if GTEST_HAS_ABSL |
|
|
|
|
kConvertibleToStringView, // a type implicitly convertible to
|
|
|
|
|
// absl::string_view
|
|
|
|
|
#endif |
|
|
|
|
kOtherType // anything else
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
|
|
|
|
@ -146,7 +151,7 @@ class TypeWithoutFormatter { |
|
|
|
|
// This default version is called when kTypeKind is kOtherType.
|
|
|
|
|
static void PrintValue(const T& value, ::std::ostream* os) { |
|
|
|
|
PrintBytesInObjectTo(static_cast<const unsigned char*>( |
|
|
|
|
reinterpret_cast<const void *>(&value)), |
|
|
|
|
reinterpret_cast<const void*>(&value)), |
|
|
|
|
sizeof(value), os); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
@ -184,6 +189,19 @@ class TypeWithoutFormatter<T, kConvertibleToInteger> { |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_ABSL |
|
|
|
|
template <typename T> |
|
|
|
|
class TypeWithoutFormatter<T, kConvertibleToStringView> { |
|
|
|
|
public: |
|
|
|
|
// Since T has neither operator<< nor PrintTo() but can be implicitly
|
|
|
|
|
// converted to absl::string_view, we print it as a absl::string_view.
|
|
|
|
|
//
|
|
|
|
|
// Note: the implementation is further below, as it depends on
|
|
|
|
|
// internal::PrintTo symbol which is defined later in the file.
|
|
|
|
|
static void PrintValue(const T& value, ::std::ostream* os); |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// Prints the given value to the given ostream. If the value is a
|
|
|
|
|
// protocol message, its debug string is printed; if it's an enum or
|
|
|
|
|
// of a type implicitly convertible to BiggestInt, it's printed as an
|
|
|
|
@ -211,10 +229,19 @@ class TypeWithoutFormatter<T, kConvertibleToInteger> { |
|
|
|
|
template <typename Char, typename CharTraits, typename T> |
|
|
|
|
::std::basic_ostream<Char, CharTraits>& operator<<( |
|
|
|
|
::std::basic_ostream<Char, CharTraits>& os, const T& x) { |
|
|
|
|
TypeWithoutFormatter<T, |
|
|
|
|
(internal::IsAProtocolMessage<T>::value ? kProtobuf : |
|
|
|
|
internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ? |
|
|
|
|
kConvertibleToInteger : kOtherType)>::PrintValue(x, &os); |
|
|
|
|
TypeWithoutFormatter<T, (internal::IsAProtocolMessage<T>::value |
|
|
|
|
? kProtobuf |
|
|
|
|
: internal::ImplicitlyConvertible< |
|
|
|
|
const T&, internal::BiggestInt>::value |
|
|
|
|
? kConvertibleToInteger |
|
|
|
|
: |
|
|
|
|
#if GTEST_HAS_ABSL |
|
|
|
|
internal::ImplicitlyConvertible< |
|
|
|
|
const T&, absl::string_view>::value |
|
|
|
|
? kConvertibleToStringView |
|
|
|
|
: |
|
|
|
|
#endif |
|
|
|
|
kOtherType)>::PrintValue(x, &os); |
|
|
|
|
return os; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -435,7 +462,8 @@ void DefaultPrintTo(WrapPrinterType<kPrintFunctionPointer> /* dummy */, |
|
|
|
|
*os << "NULL"; |
|
|
|
|
} else { |
|
|
|
|
// T is a function type, so '*os << p' doesn't do what we want
|
|
|
|
|
// (it just prints p as bool). Cast p to const void* to print it.
|
|
|
|
|
// (it just prints p as bool). We want to print p as a const
|
|
|
|
|
// void*.
|
|
|
|
|
*os << reinterpret_cast<const void*>(p); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -464,17 +492,15 @@ void PrintTo(const T& value, ::std::ostream* os) { |
|
|
|
|
// DefaultPrintTo() is overloaded. The type of its first argument
|
|
|
|
|
// determines which version will be picked.
|
|
|
|
|
//
|
|
|
|
|
// Note that we check for recursive and other container types here, prior
|
|
|
|
|
// to we check for protocol message types in our operator<<. The rationale is:
|
|
|
|
|
// Note that we check for container types here, prior to we check
|
|
|
|
|
// for protocol message types in our operator<<. The rationale is:
|
|
|
|
|
//
|
|
|
|
|
// For protocol messages, we want to give people a chance to
|
|
|
|
|
// override Google Mock's format by defining a PrintTo() or
|
|
|
|
|
// operator<<. For STL containers, other formats can be
|
|
|
|
|
// incompatible with Google Mock's format for the container
|
|
|
|
|
// elements; therefore we check for container types here to ensure
|
|
|
|
|
// that our format is used. To prevent an infinite runtime recursion
|
|
|
|
|
// during the output of recursive container types, we check first for
|
|
|
|
|
// those.
|
|
|
|
|
// that our format is used.
|
|
|
|
|
//
|
|
|
|
|
// Note that MSVC and clang-cl do allow an implicit conversion from
|
|
|
|
|
// pointer-to-function to pointer-to-object, but clang-cl warns on it.
|
|
|
|
@ -492,8 +518,8 @@ void PrintTo(const T& value, ::std::ostream* os) { |
|
|
|
|
#else |
|
|
|
|
: !internal::ImplicitlyConvertible<T, const void*>::value |
|
|
|
|
#endif |
|
|
|
|
? kPrintFunctionPointer |
|
|
|
|
: kPrintPointer>(), |
|
|
|
|
? kPrintFunctionPointer |
|
|
|
|
: kPrintPointer>(), |
|
|
|
|
value, os); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -601,6 +627,13 @@ inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { |
|
|
|
|
} |
|
|
|
|
#endif // GTEST_HAS_STD_WSTRING
|
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_ABSL |
|
|
|
|
// Overload for absl::string_view.
|
|
|
|
|
inline void PrintTo(absl::string_view sp, ::std::ostream* os) { |
|
|
|
|
PrintTo(::std::string(sp), os); |
|
|
|
|
} |
|
|
|
|
#endif // GTEST_HAS_ABSL
|
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_ |
|
|
|
|
// Helper function for printing a tuple. T must be instantiated with
|
|
|
|
|
// a tuple type.
|
|
|
|
@ -896,7 +929,7 @@ void UniversalPrint(const T& value, ::std::ostream* os) { |
|
|
|
|
UniversalPrinter<T1>::Print(value, os); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
typedef ::std::vector<string> Strings; |
|
|
|
|
typedef ::std::vector< ::std::string> Strings; |
|
|
|
|
|
|
|
|
|
// TuplePolicy<TupleT> must provide:
|
|
|
|
|
// - tuple_size
|
|
|
|
@ -1016,6 +1049,16 @@ Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { |
|
|
|
|
|
|
|
|
|
} // namespace internal
|
|
|
|
|
|
|
|
|
|
#if GTEST_HAS_ABSL |
|
|
|
|
namespace internal2 { |
|
|
|
|
template <typename T> |
|
|
|
|
void TypeWithoutFormatter<T, kConvertibleToStringView>::PrintValue( |
|
|
|
|
const T& value, ::std::ostream* os) { |
|
|
|
|
internal::PrintTo(absl::string_view(value), os); |
|
|
|
|
} |
|
|
|
|
} // namespace internal2
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
::std::string PrintToString(const T& value) { |
|
|
|
|
::std::stringstream ss; |
|
|
|
|