diff options
author | dmauro <dmauro@google.com> | 2020-06-04 23:34:01 (GMT) |
---|---|---|
committer | Gennadiy Rozental <rogeeff@google.com> | 2020-06-05 07:57:06 (GMT) |
commit | 4fe018038f87675c083d0cfb6a6b57c274fb1753 (patch) | |
tree | 0ac2ea8e9754465fb849893770065f6a40a46a61 /googletest | |
parent | 07d4a6e93de43ab47f5a5a3994009f53360e06c8 (diff) | |
download | googletest-4fe018038f87675c083d0cfb6a6b57c274fb1753.zip googletest-4fe018038f87675c083d0cfb6a6b57c274fb1753.tar.gz googletest-4fe018038f87675c083d0cfb6a6b57c274fb1753.tar.bz2 |
Googletest export
Adds support for printing the types char8_t, char16_t, and char32_t
This changes prints these types as Unicode code points. It is possible
that there is a better way of printing these types, but that change is
more complex, and the format in which Googletest prints these types is
subject to change if someone implements a better way of printing them.
This fixes the C++20 build, which removed support for printing these types.
https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2
Fixes #2854
PiperOrigin-RevId: 314826912
Diffstat (limited to 'googletest')
-rw-r--r-- | googletest/include/gtest/gtest-printers.h | 26 | ||||
-rw-r--r-- | googletest/src/gtest-printers.cc | 5 | ||||
-rw-r--r-- | googletest/test/googletest-printers-test.cc | 86 |
3 files changed, 117 insertions, 0 deletions
diff --git a/googletest/include/gtest/gtest-printers.h b/googletest/include/gtest/gtest-printers.h index 5123d69..c74894b 100644 --- a/googletest/include/gtest/gtest-printers.h +++ b/googletest/include/gtest/gtest-printers.h @@ -360,6 +360,14 @@ GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); +#ifdef __cpp_char8_t +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char8_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char8_t); +#endif +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char16_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char16_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char32_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char32_t); #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ @@ -377,6 +385,14 @@ GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string); +#ifdef __cpp_char8_t +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char8_t, ::std::u8string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char8_t, ::std::u8string); +#endif +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char16_t, ::std::u16string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char16_t, ::std::u16string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char32_t, ::std::u32string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char32_t, ::std::u32string); #if GTEST_HAS_STD_WSTRING GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring); @@ -453,6 +469,16 @@ inline void PrintTo(bool x, ::std::ostream* os) { // is implemented as an unsigned type. GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); +GTEST_API_ void PrintTo(char32_t c, ::std::ostream* os); +inline void PrintTo(char16_t c, ::std::ostream* os) { + PrintTo(ImplicitCast_<char32_t>(c), os); +} +#ifdef __cpp_char8_t +inline void PrintTo(char8_t c, ::std::ostream* os) { + PrintTo(ImplicitCast_<char32_t>(c), os); +} +#endif + // Overloads for C strings. GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); inline void PrintTo(char* s, ::std::ostream* os) { diff --git a/googletest/src/gtest-printers.cc b/googletest/src/gtest-printers.cc index 4e1ccad..ce1b2af 100644 --- a/googletest/src/gtest-printers.cc +++ b/googletest/src/gtest-printers.cc @@ -251,6 +251,11 @@ void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo<wchar_t>(wc, os); } +void PrintTo(char32_t c, ::std::ostream* os) { + *os << std::hex << "U+" << std::uppercase << std::setfill('0') << std::setw(4) + << c; +} + // Prints the given array of characters to the ostream. CharType must be either // char or wchar_t. // The array starts at begin, the length is len, it may include '\0' characters diff --git a/googletest/test/googletest-printers-test.cc b/googletest/test/googletest-printers-test.cc index 05c4183..b0c52ef 100644 --- a/googletest/test/googletest-printers-test.cc +++ b/googletest/test/googletest-printers-test.cc @@ -310,6 +310,20 @@ TEST(PrintCharTest, UnsignedChar) { Print(static_cast<unsigned char>('b'))); } +TEST(PrintCharTest, Char16) { + EXPECT_EQ("U+0041", Print(u'A')); +} + +TEST(PrintCharTest, Char32) { + EXPECT_EQ("U+0041", Print(U'A')); +} + +#ifdef __cpp_char8_t +TEST(PrintCharTest, Char8) { + EXPECT_EQ("U+0041", Print(u8'A')); +} +#endif + // Tests printing other simple, built-in types. // bool. @@ -359,6 +373,20 @@ TEST(PrintBuiltInTypeTest, Integer) { Print(std::numeric_limits<uint64_t>::max())); // uint64 EXPECT_EQ("-9223372036854775808", Print(std::numeric_limits<int64_t>::min())); // int64 +#ifdef __cpp_char8_t + EXPECT_EQ("U+0000", + Print(std::numeric_limits<char8_t>::min())); // char8_t + EXPECT_EQ("U+00FF", + Print(std::numeric_limits<char8_t>::max())); // char8_t +#endif + EXPECT_EQ("U+0000", + Print(std::numeric_limits<char16_t>::min())); // char16_t + EXPECT_EQ("U+FFFF", + Print(std::numeric_limits<char16_t>::max())); // char16_t + EXPECT_EQ("U+0000", + Print(std::numeric_limits<char32_t>::min())); // char32_t + EXPECT_EQ("U+FFFFFFFF", + Print(std::numeric_limits<char32_t>::max())); // char32_t } // Size types. @@ -643,6 +671,35 @@ TEST(PrintArrayTest, WConstCharArrayWithTerminatingNul) { EXPECT_EQ("L\"\\0Hi\"", PrintArrayHelper(a)); } +#ifdef __cpp_char8_t +// char8_t array. +TEST(PrintArrayTest, Char8Array) { + const char8_t a[] = u8"Hello, world!"; + EXPECT_EQ( + "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+0077, " + "U+006F, U+0072, U+006C, U+0064, U+0021, U+0000 }", + PrintArrayHelper(a)); +} +#endif + +// char16_t array. +TEST(PrintArrayTest, Char16Array) { + const char16_t a[] = u"Hello, 世界"; + EXPECT_EQ( + "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, " + "U+754C, U+0000 }", + PrintArrayHelper(a)); +} + +// char32_t array. +TEST(PrintArrayTest, Char32Array) { + const char32_t a[] = U"Hello, 世界"; + EXPECT_EQ( + "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, " + "U+754C, U+0000 }", + PrintArrayHelper(a)); +} + // Array of objects. TEST(PrintArrayTest, ObjectArray) { std::string a[3] = {"Hi", "Hello", "Ni hao"}; @@ -702,6 +759,35 @@ TEST(PrintWideStringTest, StringAmbiguousHex) { } #endif // GTEST_HAS_STD_WSTRING +#ifdef __cpp_char8_t +TEST(PrintStringTest, U8String) { + std::u8string str = u8"Hello, world!"; + EXPECT_EQ(str, str); // Verify EXPECT_EQ compiles with this type. + EXPECT_EQ( + "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+0077, " + "U+006F, U+0072, U+006C, U+0064, U+0021 }", + Print(str)); +} +#endif + +TEST(PrintStringTest, U16String) { + std::u16string str = u"Hello, 世界"; + EXPECT_EQ(str, str); // Verify EXPECT_EQ compiles with this type. + EXPECT_EQ( + "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, " + "U+754C }", + Print(str)); +} + +TEST(PrintStringTest, U32String) { + std::u32string str = U"Hello, 世界"; + EXPECT_EQ(str, str); // Verify EXPECT_EQ compiles with this type. + EXPECT_EQ( + "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, " + "U+754C }", + Print(str)); +} + // Tests printing types that support generic streaming (i.e. streaming // to std::basic_ostream<Char, CharTraits> for any valid Char and // CharTraits types). |