summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--googletest/include/gtest/gtest-printers.h23
-rw-r--r--googletest/test/googletest-printers-test.cc34
2 files changed, 57 insertions, 0 deletions
diff --git a/googletest/include/gtest/gtest-printers.h b/googletest/include/gtest/gtest-printers.h
index cd094949..aa9ca48c 100644
--- a/googletest/include/gtest/gtest-printers.h
+++ b/googletest/include/gtest/gtest-printers.h
@@ -113,6 +113,11 @@
#include "gtest/internal/gtest-internal.h"
#include "gtest/internal/gtest-port.h"
+#if GTEST_HAS_RTTI
+#include <typeindex>
+#include <typeinfo>
+#endif // GTEST_HAS_RTTI
+
namespace testing {
// Definitions in the internal* namespaces are subject to change without notice.
@@ -650,6 +655,24 @@ void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
*os << ')';
}
+template <typename T>
+void PrintWithNameTo(const T& value, ::std::ostream* os) {
+ internal::PrintTo<T>(value, os);
+ *os << " (\"" << value.name() << "\")";
+}
+
+#if GTEST_HAS_RTTI
+
+inline void PrintTo(const ::std::type_info& value, ::std::ostream* os) {
+ internal::PrintWithNameTo(value, os);
+}
+
+inline void PrintTo(const ::std::type_index& value, ::std::ostream* os) {
+ internal::PrintWithNameTo(value, os);
+}
+
+#endif // GTEST_HAS_RTTI
+
// Implements printing a non-reference type T by letting the compiler
// pick the right overload of PrintTo() for T.
template <typename T>
diff --git a/googletest/test/googletest-printers-test.cc b/googletest/test/googletest-printers-test.cc
index 8247d4e1..1d35c549 100644
--- a/googletest/test/googletest-printers-test.cc
+++ b/googletest/test/googletest-printers-test.cc
@@ -1589,6 +1589,40 @@ TEST(PrintToStringTest, WorksForCharArrayWithEmbeddedNul) {
"\n As Text: \"From ä — ẑ\"");
}
+#if GTEST_HAS_RTTI
+TEST(PrintToStringTest, IncludesNameWithTypeInfoAndTypeIndex) {
+ // The following lambda tests that both the printed string for the specified
+ // `typeid`, and the one for its `std::type_index` contain the string returned
+ // by its `name()` member function.
+ const auto TestTypeId = [](const ::std::type_info& id) {
+ const auto name = id.name();
+ const auto contains_name = [name](const ::std::string& str) {
+ return str.find(name) != ::std::string::npos;
+ };
+ EXPECT_TRUE(contains_name(PrintToString(id)));
+ EXPECT_TRUE(contains_name(PrintToString(::std::type_index{id})));
+ };
+
+ TestTypeId(typeid(void));
+ TestTypeId(typeid(int));
+ TestTypeId(typeid(const volatile int*));
+
+ struct Base {
+ virtual ~Base() = default;
+ };
+ struct Derived : Base {};
+
+ TestTypeId(typeid(Base));
+ TestTypeId(typeid(Derived));
+
+ Derived derived;
+ Base& base = derived;
+
+ TestTypeId(typeid(base));
+ TestTypeId(typeid(derived));
+}
+#endif // GTEST_HAS_RTTI
+
TEST(IsValidUTF8Test, IllFormedUTF8) {
// The following test strings are ill-formed UTF-8 and are printed
// as hex only (or ASCII, in case of ASCII bytes) because IsValidUTF8() is
OpenPOWER on IntegriCloud