summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--BUILD.bazel20
-rw-r--r--WORKSPACE7
-rw-r--r--googletest/include/gtest/gtest-printers.h28
-rw-r--r--googletest/test/gtest-printers_test.cc12
4 files changed, 67 insertions, 0 deletions
diff --git a/BUILD.bazel b/BUILD.bazel
index 7d2e9d2b..91dd3b74 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -46,6 +46,12 @@ config_setting(
values = {"cpu": "x64_windows_msvc"},
)
+config_setting(
+ name = "has_absl",
+ values = {"define": "absl=1"},
+)
+
+
# Google Test including Google Mock
cc_library(
name = "gtest",
@@ -88,6 +94,20 @@ cc_library(
"-pthread",
],
}),
+ defines = select ({
+ ":has_absl": [
+ "GTEST_HAS_ABSL=1",
+ ],
+ "//conditions:default": [],
+ }
+ ),
+ deps = select ({
+ ":has_absl": [
+ "@com_google_absl//absl/types:optional",
+ ],
+ "//conditions:default": [],
+ }
+ )
)
cc_library(
diff --git a/WORKSPACE b/WORKSPACE
index 106b824e..1d5d3886 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1 +1,8 @@
workspace(name = "com_google_googletest")
+
+# Abseil
+http_archive(
+ name = "com_google_absl",
+ urls = ["https://github.com/abseil/abseil-cpp/archive/master.zip"],
+ strip_prefix = "abseil-cpp-master",
+)
diff --git a/googletest/include/gtest/gtest-printers.h b/googletest/include/gtest/gtest-printers.h
index 38c63d25..8dcb256a 100644
--- a/googletest/include/gtest/gtest-printers.h
+++ b/googletest/include/gtest/gtest-printers.h
@@ -46,6 +46,10 @@
// 2. operator<<(ostream&, const T&) defined in either foo or the
// global namespace.
//
+// However if T is an STL-style container then it is printed element-wise
+// unless foo::PrintTo(const T&, ostream*) is defined. Note that
+// operator<<() is ignored for container types.
+//
// If none of the above is defined, it will print the debug string of
// the value if it is a protocol buffer, or print the raw bytes in the
// value otherwise.
@@ -107,6 +111,10 @@
# include <tuple>
#endif
+#if GTEST_HAS_ABSL
+#include "absl/types/optional.h"
+#endif // GTEST_HAS_ABSL
+
namespace testing {
// Definitions in the 'internal' and 'internal2' name spaces are
@@ -722,6 +730,26 @@ class UniversalPrinter {
GTEST_DISABLE_MSC_WARNINGS_POP_()
};
+#if GTEST_HAS_ABSL
+
+// Printer for absl::optional
+
+template <typename T>
+class UniversalPrinter<::absl::optional<T>> {
+ public:
+ static void Print(const ::absl::optional<T>& value, ::std::ostream* os) {
+ *os << '(';
+ if (!value) {
+ *os << "nullopt";
+ } else {
+ UniversalPrint(*value, os);
+ }
+ *os << ')';
+ }
+};
+
+#endif // GTEST_HAS_ABSL
+
// UniversalPrintArray(begin, len, os) prints an array of 'len'
// elements, starting at address 'begin'.
template <typename T>
diff --git a/googletest/test/gtest-printers_test.cc b/googletest/test/gtest-printers_test.cc
index e30ce7ef..42e19656 100644
--- a/googletest/test/gtest-printers_test.cc
+++ b/googletest/test/gtest-printers_test.cc
@@ -1765,5 +1765,17 @@ TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) {
#endif // GTEST_HAS_STD_TUPLE_
+#if GTEST_HAS_ABSL
+
+TEST(PrintOptionalTest, Basic) {
+ absl::optional<int> value;
+ EXPECT_EQ("(nullopt)", PrintToString(value));
+ value = {7};
+ EXPECT_EQ("(7)", PrintToString(value));
+ EXPECT_EQ("(1.1)", PrintToString(absl::optional<double>{1.1}));
+ EXPECT_EQ("(\"A\")", PrintToString(absl::optional<std::string>{"A"}));
+}
+#endif // GTEST_HAS_ABSL
+
} // namespace gtest_printers_test
} // namespace testing
OpenPOWER on IntegriCloud