summaryrefslogtreecommitdiffstats
path: root/googletest
diff options
context:
space:
mode:
authorKrystian Kuzniarek <krystian.kuzniarek@gmail.com>2020-03-07 16:03:50 (GMT)
committerKrystian Kuzniarek <krystian.kuzniarek@gmail.com>2020-05-29 11:59:42 (GMT)
commit843267f0f1482b470fe14201edfda2c64b68232a (patch)
treea94980e564c8bc25800839864009609df5a6be52 /googletest
parent95b0ea2cf5046465f448f01efa7c4b764a62a4bb (diff)
downloadgoogletest-843267f0f1482b470fe14201edfda2c64b68232a.zip
googletest-843267f0f1482b470fe14201edfda2c64b68232a.tar.gz
googletest-843267f0f1482b470fe14201edfda2c64b68232a.tar.bz2
specialize UniversalPrinter<> for std::any (without support for RTTI)
Diffstat (limited to 'googletest')
-rw-r--r--googletest/include/gtest/gtest-printers.h20
-rw-r--r--googletest/include/gtest/internal/gtest-port.h30
-rw-r--r--googletest/test/googletest-printers-test.cc21
3 files changed, 71 insertions, 0 deletions
diff --git a/googletest/include/gtest/gtest-printers.h b/googletest/include/gtest/gtest-printers.h
index 4260e4f..67c87f4 100644
--- a/googletest/include/gtest/gtest-printers.h
+++ b/googletest/include/gtest/gtest-printers.h
@@ -679,6 +679,26 @@ class UniversalPrinter {
GTEST_DISABLE_MSC_WARNINGS_POP_()
};
+#if GTEST_INTERNAL_HAS_ANY
+
+// Printer for std::any / absl::any
+
+template <>
+class UniversalPrinter<Any> {
+ public:
+ static void Print(const Any& value, ::std::ostream* os) {
+ if (value.has_value())
+ *os << "'any' type with value of type " << GetTypeName();
+ else
+ *os << "'any' type with no value";
+ }
+
+ private:
+ static std::string GetTypeName() { return "the element type"; }
+};
+
+#endif // GTEST_INTERNAL_HAS_ANY
+
#if GTEST_INTERNAL_HAS_OPTIONAL
// Printer for std::optional / absl::optional
diff --git a/googletest/include/gtest/internal/gtest-port.h b/googletest/include/gtest/internal/gtest-port.h
index 377c77f..75e00cc 100644
--- a/googletest/include/gtest/internal/gtest-port.h
+++ b/googletest/include/gtest/internal/gtest-port.h
@@ -199,6 +199,8 @@
// suppressed (constant conditional).
// GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127
// is suppressed.
+// GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or
+// UniversalPrinter<absl::any> specializations.
// GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional> or
// UniversalPrinter<absl::optional> specializations.
// GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or
@@ -2228,6 +2230,34 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);
#endif // !defined(GTEST_INTERNAL_DEPRECATED)
#if GTEST_HAS_ABSL
+// Always use absl::any for UniversalPrinter<> specializations if googletest
+// is built with absl support.
+# define GTEST_INTERNAL_HAS_ANY 1
+#include "absl/types/any.h"
+namespace testing {
+namespace internal {
+using Any = ::absl::any;
+} // namespace internal
+} // namespace testing
+#else
+# ifdef __has_include
+# if __has_include(<any>) && __cplusplus >= 201703L
+// Otherwise for C++17 and higher use std::any for UniversalPrinter<>
+// specializations.
+# define GTEST_INTERNAL_HAS_ANY 1
+#include <any>
+namespace testing {
+namespace internal {
+using Any = ::std::any;
+} // namespace internal
+} // namespace testing
+// The case where absl is configured NOT to alias std::any is not
+// supported.
+# endif // __has_include(<any>) && __cplusplus >= 201703L
+# endif // __has_include
+#endif // GTEST_HAS_ABSL
+
+#if GTEST_HAS_ABSL
// Always use absl::optional for UniversalPrinter<> specializations if googletest
// is built with absl support.
# define GTEST_INTERNAL_HAS_OPTIONAL 1
diff --git a/googletest/test/googletest-printers-test.cc b/googletest/test/googletest-printers-test.cc
index d71c187..3305035 100644
--- a/googletest/test/googletest-printers-test.cc
+++ b/googletest/test/googletest-printers-test.cc
@@ -1531,6 +1531,27 @@ TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) {
EXPECT_EQ("\"a\"", result[1]);
}
+#if GTEST_INTERNAL_HAS_ANY
+TEST(PrintAnyTest, Empty) {
+ internal::Any any;
+ EXPECT_EQ("'any' type with no value", PrintToString(any));
+}
+
+TEST(PrintAnyTest, NonEmpty) {
+ internal::Any any;
+ constexpr int val1 = 10;
+ const std::string val2 = "content";
+
+ any = val1;
+ EXPECT_EQ("'any' type with value of type the element type",
+ PrintToString(any));
+
+ any = val2;
+ EXPECT_EQ("'any' type with value of type the element type",
+ PrintToString(any));
+}
+#endif // GTEST_INTERNAL_HAS_ANY
+
#if GTEST_INTERNAL_HAS_OPTIONAL
TEST(PrintOptionalTest, Basic) {
internal::Optional<int> value;