From 2fe9ce60640762f27294ae60c6b508a5bfb72f2b Mon Sep 17 00:00:00 2001 From: Sam McCall Date: Wed, 21 Aug 2019 11:37:06 +0000 Subject: [PATCH] [gtest] Fix printing of StringRef and SmallString in assert messages. Summary: These are detected by gtest as containers, and so previously printed as e.g. { '.' (46, 0x2E), 's' (115, 0x73), 'e' (101, 0x65), 'c' (99, 0x63), '0' (48, 0x30) }, gtest itself overloads PrintTo for std::string and friends, we use the same mechanism. Reviewers: labath Subscribers: dexonsmith, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D66520 llvm-svn: 369518 --- llvm/unittests/ADT/SmallStringTest.cpp | 10 +++++++- llvm/unittests/ADT/StringRefTest.cpp | 6 +++++ .../include/gtest/internal/custom/gtest-printers.h | 29 ++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/llvm/unittests/ADT/SmallStringTest.cpp b/llvm/unittests/ADT/SmallStringTest.cpp index 6868381..686215f 100644 --- a/llvm/unittests/ADT/SmallStringTest.cpp +++ b/llvm/unittests/ADT/SmallStringTest.cpp @@ -169,7 +169,7 @@ TEST_F(SmallStringTest, Realloc) { EXPECT_EQ("abcdyyy", theString.slice(0, 7)); } -TEST(StringRefTest, Comparisons) { +TEST_F(SmallStringTest, Comparisons) { EXPECT_EQ(-1, SmallString<10>("aab").compare("aad")); EXPECT_EQ( 0, SmallString<10>("aab").compare("aab")); EXPECT_EQ( 1, SmallString<10>("aab").compare("aaa")); @@ -203,4 +203,12 @@ TEST(StringRefTest, Comparisons) { EXPECT_EQ( 1, SmallString<10>("V8_q0").compare_numeric("V1_q0")); } +// Check gtest prints SmallString as a string instead of a container of chars. +// The code is in utils/unittest/googletest/internal/custom/gtest-printers.h +TEST_F(SmallStringTest, GTestPrinter) { + EXPECT_EQ(R"("foo")", ::testing::PrintToString(SmallString<1>("foo"))); + const SmallVectorImpl &ErasedSmallString = SmallString<1>("foo"); + EXPECT_EQ(R"("foo")", ::testing::PrintToString(ErasedSmallString)); } + +} // namespace diff --git a/llvm/unittests/ADT/StringRefTest.cpp b/llvm/unittests/ADT/StringRefTest.cpp index a45e83c..f341cf4 100644 --- a/llvm/unittests/ADT/StringRefTest.cpp +++ b/llvm/unittests/ADT/StringRefTest.cpp @@ -1055,6 +1055,12 @@ TEST(StringRefTest, StringLiteral) { EXPECT_EQ(StringRef("Bar"), Strings[1]); } +// Check gtest prints StringRef as a string instead of a container of chars. +// The code is in utils/unittest/googletest/internal/custom/gtest-printers.h +TEST(StringRefTest, GTestPrinter) { + EXPECT_EQ(R"("foo")", ::testing::PrintToString(StringRef("foo"))); +} + static_assert(is_trivially_copyable::value, "trivially copyable"); } // end anonymous namespace diff --git a/llvm/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h b/llvm/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h index 60c1ea0..da2b418 100644 --- a/llvm/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h +++ b/llvm/utils/unittest/googletest/include/gtest/internal/custom/gtest-printers.h @@ -39,4 +39,33 @@ #ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ +#include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringRef.h" +#include + +namespace llvm { + +// Printing of llvm String types. +// gtest sees these as containers of char (they have nested iterator types), +// so their operator<< is never considered unless we provide PrintTo(). +// PrintStringTo provides quotes and escaping, at the cost of a copy. + +inline void PrintTo(llvm::StringRef S, std::ostream *OS) { + *OS << ::testing::PrintToString(S.str()); +} +// We need both SmallString and SmallVectorImpl overloads: +// - the SmallString template is needed as overload resolution will +// instantiate generic PrintTo rather than do derived-to-base conversion +// - but SmallVectorImpl is sometimes the actual static type, in code +// that erases the small size +template +inline void PrintTo(const SmallString &S, std::ostream *OS) { + *OS << ::testing::PrintToString(std::string(S.data(), S.size())); +} +inline void PrintTo(const SmallVectorImpl &S, std::ostream *OS) { + *OS << ::testing::PrintToString(std::string(S.data(), S.size())); +} + +} // namespace llvm + #endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ -- 2.7.4