boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc
Go to the documentation of this file.
1 // Copyright 2007, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 
31 // Google Test - The Google C++ Testing and Mocking Framework
32 //
33 // This file tests the universal value printer.
34 
35 #include <ctype.h>
36 #include <string.h>
37 #include <algorithm>
38 #include <cstdint>
39 #include <deque>
40 #include <forward_list>
41 #include <limits>
42 #include <list>
43 #include <map>
44 #include <set>
45 #include <sstream>
46 #include <string>
47 #include <unordered_map>
48 #include <unordered_set>
49 #include <utility>
50 #include <vector>
51 
52 #include "gtest/gtest-printers.h"
53 #include "gtest/gtest.h"
54 
55 // Some user-defined types for testing the universal value printer.
56 
57 // An anonymous enum type.
59  kAE1 = -1,
60  kAE2 = 1
61 };
62 
63 // An enum without a user-defined printer.
65  kEWP1 = -2,
66  kEWP2 = 42
67 };
68 
69 // An enum with a << operator.
71  kEWS1 = 10
72 };
73 
74 std::ostream& operator<<(std::ostream& os, EnumWithStreaming e) {
75  return os << (e == kEWS1 ? "kEWS1" : "invalid");
76 }
77 
78 // An enum with a PrintTo() function.
80  kEWPT1 = 1
81 };
82 
83 void PrintTo(EnumWithPrintTo e, std::ostream* os) {
84  *os << (e == kEWPT1 ? "kEWPT1" : "invalid");
85 }
86 
87 // A class implicitly convertible to BiggestInt.
89  public:
91 };
92 
93 // A parent class with two child classes. The parent and one of the kids have
94 // stream operators.
95 class ParentClass {};
98 static void operator<<(std::ostream& os, const ParentClass&) {
99  os << "ParentClass";
100 }
101 static void operator<<(std::ostream& os, const ChildClassWithStreamOperator&) {
102  os << "ChildClassWithStreamOperator";
103 }
104 
105 // A user-defined unprintable class template in the global namespace.
106 template <typename T>
108  public:
110  private:
111  T value_;
112 };
113 
114 // A user-defined streamable type in the global namespace.
115 class StreamableInGlobal {
116  public:
117  virtual ~StreamableInGlobal() {}
118 };
119 
120 inline void operator<<(::std::ostream& os, const StreamableInGlobal& /* x */) {
121  os << "StreamableInGlobal";
122 }
123 
124 void operator<<(::std::ostream& os, const StreamableInGlobal* /* x */) {
125  os << "StreamableInGlobal*";
126 }
127 
128 namespace foo {
129 
130 // A user-defined unprintable type in a user namespace.
131 class UnprintableInFoo {
132  public:
133  UnprintableInFoo() : z_(0) { memcpy(xy_, "\xEF\x12\x0\x0\x34\xAB\x0\x0", 8); }
134  double z() const { return z_; }
135  private:
136  char xy_[8];
137  double z_;
138 };
139 
140 // A user-defined printable type in a user-chosen namespace.
141 struct PrintableViaPrintTo {
143  int value;
144 };
145 
146 void PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) {
147  *os << "PrintableViaPrintTo: " << x.value;
148 }
149 
150 // A type with a user-defined << for printing its pointer.
151 struct PointerPrintable {
152 };
153 
154 ::std::ostream& operator<<(::std::ostream& os,
155  const PointerPrintable* /* x */) {
156  return os << "PointerPrintable*";
157 }
158 
159 // A user-defined printable class template in a user-chosen namespace.
160 template <typename T>
161 class PrintableViaPrintToTemplate {
162  public:
163  explicit PrintableViaPrintToTemplate(const T& a_value) : value_(a_value) {}
164 
165  const T& value() const { return value_; }
166  private:
167  T value_;
168 };
169 
170 template <typename T>
171 void PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) {
172  *os << "PrintableViaPrintToTemplate: " << x.value();
173 }
174 
175 // A user-defined streamable class template in a user namespace.
176 template <typename T>
177 class StreamableTemplateInFoo {
178  public:
180 
181  const T& value() const { return value_; }
182  private:
183  T value_;
184 };
185 
186 template <typename T>
187 inline ::std::ostream& operator<<(::std::ostream& os,
188  const StreamableTemplateInFoo<T>& x) {
189  return os << "StreamableTemplateInFoo: " << x.value();
190 }
191 
192 // A user-defined streamable type in a user namespace whose operator<< is
193 // templated on the type of the output stream.
195 
196 template <typename OutputStream>
197 OutputStream& operator<<(OutputStream& os,
198  const TemplatedStreamableInFoo& /*ts*/) {
199  os << "TemplatedStreamableInFoo";
200  return os;
201 }
202 
203 // A user-defined streamable but recursivly-defined container type in
204 // a user namespace, it mimics therefore std::filesystem::path or
205 // boost::filesystem::path.
206 class PathLike {
207  public:
208  struct iterator {
210 
211  iterator& operator++();
212  PathLike& operator*();
213  };
214 
215  using value_type = char;
217 
218  PathLike() {}
219 
220  iterator begin() const { return iterator(); }
221  iterator end() const { return iterator(); }
222 
223  friend ::std::ostream& operator<<(::std::ostream& os, const PathLike&) {
224  return os << "Streamable-PathLike";
225  }
226 };
227 
228 } // namespace foo
229 
230 namespace testing {
231 namespace gtest_printers_test {
232 
233 using ::std::deque;
234 using ::std::list;
235 using ::std::make_pair;
237 using ::std::multimap;
238 using ::std::multiset;
241 using ::std::vector;
245 using ::testing::internal::NativeArray;
246 using ::testing::internal::RelationToSourceReference;
249 using ::testing::internal::UniversalPrinter;
252 
253 // Prints a value to a string using the universal value printer. This
254 // is a helper for testing UniversalPrinter<T>::Print() for various types.
255 template <typename T>
256 std::string Print(const T& value) {
257  ::std::stringstream ss;
259  return ss.str();
260 }
261 
262 // Prints a value passed by reference to a string, using the universal
263 // value printer. This is a helper for testing
264 // UniversalPrinter<T&>::Print() for various types.
265 template <typename T>
266 std::string PrintByRef(const T& value) {
267  ::std::stringstream ss;
269  return ss.str();
270 }
271 
272 // Tests printing various enum types.
273 
274 TEST(PrintEnumTest, AnonymousEnum) {
275  EXPECT_EQ("-1", Print(kAE1));
276  EXPECT_EQ("1", Print(kAE2));
277 }
278 
279 TEST(PrintEnumTest, EnumWithoutPrinter) {
280  EXPECT_EQ("-2", Print(kEWP1));
281  EXPECT_EQ("42", Print(kEWP2));
282 }
283 
284 TEST(PrintEnumTest, EnumWithStreaming) {
285  EXPECT_EQ("kEWS1", Print(kEWS1));
286  EXPECT_EQ("invalid", Print(static_cast<EnumWithStreaming>(0)));
287 }
288 
289 TEST(PrintEnumTest, EnumWithPrintTo) {
290  EXPECT_EQ("kEWPT1", Print(kEWPT1));
291  EXPECT_EQ("invalid", Print(static_cast<EnumWithPrintTo>(0)));
292 }
293 
294 // Tests printing a class implicitly convertible to BiggestInt.
295 
296 TEST(PrintClassTest, BiggestIntConvertible) {
298 }
299 
300 // Tests printing various char types.
301 
302 // char.
303 TEST(PrintCharTest, PlainChar) {
304  EXPECT_EQ("'\\0'", Print('\0'));
305  EXPECT_EQ("'\\'' (39, 0x27)", Print('\''));
306  EXPECT_EQ("'\"' (34, 0x22)", Print('"'));
307  EXPECT_EQ("'?' (63, 0x3F)", Print('?'));
308  EXPECT_EQ("'\\\\' (92, 0x5C)", Print('\\'));
309  EXPECT_EQ("'\\a' (7)", Print('\a'));
310  EXPECT_EQ("'\\b' (8)", Print('\b'));
311  EXPECT_EQ("'\\f' (12, 0xC)", Print('\f'));
312  EXPECT_EQ("'\\n' (10, 0xA)", Print('\n'));
313  EXPECT_EQ("'\\r' (13, 0xD)", Print('\r'));
314  EXPECT_EQ("'\\t' (9)", Print('\t'));
315  EXPECT_EQ("'\\v' (11, 0xB)", Print('\v'));
316  EXPECT_EQ("'\\x7F' (127)", Print('\x7F'));
317  EXPECT_EQ("'\\xFF' (255)", Print('\xFF'));
318  EXPECT_EQ("' ' (32, 0x20)", Print(' '));
319  EXPECT_EQ("'a' (97, 0x61)", Print('a'));
320 }
321 
322 // signed char.
323 TEST(PrintCharTest, SignedChar) {
324  EXPECT_EQ("'\\0'", Print(static_cast<signed char>('\0')));
325  EXPECT_EQ("'\\xCE' (-50)",
326  Print(static_cast<signed char>(-50)));
327 }
328 
329 // unsigned char.
330 TEST(PrintCharTest, UnsignedChar) {
331  EXPECT_EQ("'\\0'", Print(static_cast<unsigned char>('\0')));
332  EXPECT_EQ("'b' (98, 0x62)",
333  Print(static_cast<unsigned char>('b')));
334 }
335 
336 TEST(PrintCharTest, Char16) {
337  EXPECT_EQ("U+0041", Print(u'A'));
338 }
339 
340 TEST(PrintCharTest, Char32) {
341  EXPECT_EQ("U+0041", Print(U'A'));
342 }
343 
344 #ifdef __cpp_char8_t
345 TEST(PrintCharTest, Char8) {
346  EXPECT_EQ("U+0041", Print(u8'A'));
347 }
348 #endif
349 
350 // Tests printing other simple, built-in types.
351 
352 // bool.
353 TEST(PrintBuiltInTypeTest, Bool) {
354  EXPECT_EQ("false", Print(false));
355  EXPECT_EQ("true", Print(true));
356 }
357 
358 // wchar_t.
359 TEST(PrintBuiltInTypeTest, Wchar_t) {
360  EXPECT_EQ("L'\\0'", Print(L'\0'));
361  EXPECT_EQ("L'\\'' (39, 0x27)", Print(L'\''));
362  EXPECT_EQ("L'\"' (34, 0x22)", Print(L'"'));
363  EXPECT_EQ("L'?' (63, 0x3F)", Print(L'?'));
364  EXPECT_EQ("L'\\\\' (92, 0x5C)", Print(L'\\'));
365  EXPECT_EQ("L'\\a' (7)", Print(L'\a'));
366  EXPECT_EQ("L'\\b' (8)", Print(L'\b'));
367  EXPECT_EQ("L'\\f' (12, 0xC)", Print(L'\f'));
368  EXPECT_EQ("L'\\n' (10, 0xA)", Print(L'\n'));
369  EXPECT_EQ("L'\\r' (13, 0xD)", Print(L'\r'));
370  EXPECT_EQ("L'\\t' (9)", Print(L'\t'));
371  EXPECT_EQ("L'\\v' (11, 0xB)", Print(L'\v'));
372  EXPECT_EQ("L'\\x7F' (127)", Print(L'\x7F'));
373  EXPECT_EQ("L'\\xFF' (255)", Print(L'\xFF'));
374  EXPECT_EQ("L' ' (32, 0x20)", Print(L' '));
375  EXPECT_EQ("L'a' (97, 0x61)", Print(L'a'));
376  EXPECT_EQ("L'\\x576' (1398)", Print(static_cast<wchar_t>(0x576)));
377  EXPECT_EQ("L'\\xC74D' (51021)", Print(static_cast<wchar_t>(0xC74D)));
378 }
379 
380 // Test that int64_t provides more storage than wchar_t.
381 TEST(PrintTypeSizeTest, Wchar_t) {
382  EXPECT_LT(sizeof(wchar_t), sizeof(int64_t));
383 }
384 
385 // Various integer types.
386 TEST(PrintBuiltInTypeTest, Integer) {
387  EXPECT_EQ("'\\xFF' (255)", Print(static_cast<unsigned char>(255))); // uint8
388  EXPECT_EQ("'\\x80' (-128)", Print(static_cast<signed char>(-128))); // int8
389  EXPECT_EQ("65535", Print(std::numeric_limits<uint16_t>::max())); // uint16
390  EXPECT_EQ("-32768", Print(std::numeric_limits<int16_t>::min())); // int16
391  EXPECT_EQ("4294967295",
393  EXPECT_EQ("-2147483648",
395  EXPECT_EQ("18446744073709551615",
397  EXPECT_EQ("-9223372036854775808",
399 #ifdef __cpp_char8_t
400  EXPECT_EQ("U+0000",
402  EXPECT_EQ("U+00FF",
404 #endif
405  EXPECT_EQ("U+0000",
407  EXPECT_EQ("U+FFFF",
409  EXPECT_EQ("U+0000",
411  EXPECT_EQ("U+FFFFFFFF",
413 }
414 
415 // Size types.
416 TEST(PrintBuiltInTypeTest, Size_t) {
417  EXPECT_EQ("1", Print(sizeof('a'))); // size_t.
418 #if !GTEST_OS_WINDOWS
419  // Windows has no ssize_t type.
420  EXPECT_EQ("-2", Print(static_cast<ssize_t>(-2))); // ssize_t.
421 #endif // !GTEST_OS_WINDOWS
422 }
423 
424 // Floating-points.
425 TEST(PrintBuiltInTypeTest, FloatingPoints) {
426  EXPECT_EQ("1.5", Print(1.5f)); // float
427  EXPECT_EQ("-2.5", Print(-2.5)); // double
428 }
429 
430 // Since ::std::stringstream::operator<<(const void *) formats the pointer
431 // output differently with different compilers, we have to create the expected
432 // output first and use it as our expectation.
433 static std::string PrintPointer(const void* p) {
434  ::std::stringstream expected_result_stream;
435  expected_result_stream << p;
436  return expected_result_stream.str();
437 }
438 
439 // Tests printing C strings.
440 
441 // const char*.
442 TEST(PrintCStringTest, Const) {
443  const char* p = "World";
444  EXPECT_EQ(PrintPointer(p) + " pointing to \"World\"", Print(p));
445 }
446 
447 // char*.
448 TEST(PrintCStringTest, NonConst) {
449  char p[] = "Hi";
450  EXPECT_EQ(PrintPointer(p) + " pointing to \"Hi\"",
451  Print(static_cast<char*>(p)));
452 }
453 
454 // NULL C string.
455 TEST(PrintCStringTest, Null) {
456  const char* p = nullptr;
457  EXPECT_EQ("NULL", Print(p));
458 }
459 
460 // Tests that C strings are escaped properly.
461 TEST(PrintCStringTest, EscapesProperly) {
462  const char* p = "'\"?\\\a\b\f\n\r\t\v\x7F\xFF a";
463  EXPECT_EQ(PrintPointer(p) + " pointing to \"'\\\"?\\\\\\a\\b\\f"
464  "\\n\\r\\t\\v\\x7F\\xFF a\"",
465  Print(p));
466 }
467 
468 // MSVC compiler can be configured to define whar_t as a typedef
469 // of unsigned short. Defining an overload for const wchar_t* in that case
470 // would cause pointers to unsigned shorts be printed as wide strings,
471 // possibly accessing more memory than intended and causing invalid
472 // memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
473 // wchar_t is implemented as a native type.
474 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
475 
476 // const wchar_t*.
477 TEST(PrintWideCStringTest, Const) {
478  const wchar_t* p = L"World";
479  EXPECT_EQ(PrintPointer(p) + " pointing to L\"World\"", Print(p));
480 }
481 
482 // wchar_t*.
483 TEST(PrintWideCStringTest, NonConst) {
484  wchar_t p[] = L"Hi";
485  EXPECT_EQ(PrintPointer(p) + " pointing to L\"Hi\"",
486  Print(static_cast<wchar_t*>(p)));
487 }
488 
489 // NULL wide C string.
490 TEST(PrintWideCStringTest, Null) {
491  const wchar_t* p = nullptr;
492  EXPECT_EQ("NULL", Print(p));
493 }
494 
495 // Tests that wide C strings are escaped properly.
496 TEST(PrintWideCStringTest, EscapesProperly) {
497  const wchar_t s[] = {'\'', '"', '?', '\\', '\a', '\b', '\f', '\n', '\r',
498  '\t', '\v', 0xD3, 0x576, 0x8D3, 0xC74D, ' ', 'a', '\0'};
499  EXPECT_EQ(PrintPointer(s) + " pointing to L\"'\\\"?\\\\\\a\\b\\f"
500  "\\n\\r\\t\\v\\xD3\\x576\\x8D3\\xC74D a\"",
501  Print(static_cast<const wchar_t*>(s)));
502 }
503 #endif // native wchar_t
504 
505 // Tests printing pointers to other char types.
506 
507 // signed char*.
508 TEST(PrintCharPointerTest, SignedChar) {
509  signed char* p = reinterpret_cast<signed char*>(0x1234);
510  EXPECT_EQ(PrintPointer(p), Print(p));
511  p = nullptr;
512  EXPECT_EQ("NULL", Print(p));
513 }
514 
515 // const signed char*.
516 TEST(PrintCharPointerTest, ConstSignedChar) {
517  signed char* p = reinterpret_cast<signed char*>(0x1234);
518  EXPECT_EQ(PrintPointer(p), Print(p));
519  p = nullptr;
520  EXPECT_EQ("NULL", Print(p));
521 }
522 
523 // unsigned char*.
524 TEST(PrintCharPointerTest, UnsignedChar) {
525  unsigned char* p = reinterpret_cast<unsigned char*>(0x1234);
526  EXPECT_EQ(PrintPointer(p), Print(p));
527  p = nullptr;
528  EXPECT_EQ("NULL", Print(p));
529 }
530 
531 // const unsigned char*.
532 TEST(PrintCharPointerTest, ConstUnsignedChar) {
533  const unsigned char* p = reinterpret_cast<const unsigned char*>(0x1234);
534  EXPECT_EQ(PrintPointer(p), Print(p));
535  p = nullptr;
536  EXPECT_EQ("NULL", Print(p));
537 }
538 
539 #ifdef __cpp_char8_t
540 // char8_t*
541 TEST(PrintCharPointerTest, Char8) {
542  char8_t* p = reinterpret_cast<char8_t*>(0x1234);
543  EXPECT_EQ(PrintPointer(p), Print(p));
544  p = nullptr;
545  EXPECT_EQ("NULL", Print(p));
546 }
547 
548 // const char8_t*
549 TEST(PrintCharPointerTest, ConstChar8) {
550  const char8_t* p = reinterpret_cast<const char8_t*>(0x1234);
551  EXPECT_EQ(PrintPointer(p), Print(p));
552  p = nullptr;
553  EXPECT_EQ("NULL", Print(p));
554 }
555 #endif
556 
557 // char16_t*
558 TEST(PrintCharPointerTest, Char16) {
559  char16_t* p = reinterpret_cast<char16_t*>(0x1234);
560  EXPECT_EQ(PrintPointer(p), Print(p));
561  p = nullptr;
562  EXPECT_EQ("NULL", Print(p));
563 }
564 
565 // const char16_t*
566 TEST(PrintCharPointerTest, ConstChar16) {
567  const char16_t* p = reinterpret_cast<const char16_t*>(0x1234);
568  EXPECT_EQ(PrintPointer(p), Print(p));
569  p = nullptr;
570  EXPECT_EQ("NULL", Print(p));
571 }
572 
573 // char32_t*
574 TEST(PrintCharPointerTest, Char32) {
575  char32_t* p = reinterpret_cast<char32_t*>(0x1234);
576  EXPECT_EQ(PrintPointer(p), Print(p));
577  p = nullptr;
578  EXPECT_EQ("NULL", Print(p));
579 }
580 
581 // const char32_t*
582 TEST(PrintCharPointerTest, ConstChar32) {
583  const char32_t* p = reinterpret_cast<const char32_t*>(0x1234);
584  EXPECT_EQ(PrintPointer(p), Print(p));
585  p = nullptr;
586  EXPECT_EQ("NULL", Print(p));
587 }
588 
589 // Tests printing pointers to simple, built-in types.
590 
591 // bool*.
592 TEST(PrintPointerToBuiltInTypeTest, Bool) {
593  bool* p = reinterpret_cast<bool*>(0xABCD);
594  EXPECT_EQ(PrintPointer(p), Print(p));
595  p = nullptr;
596  EXPECT_EQ("NULL", Print(p));
597 }
598 
599 // void*.
600 TEST(PrintPointerToBuiltInTypeTest, Void) {
601  void* p = reinterpret_cast<void*>(0xABCD);
602  EXPECT_EQ(PrintPointer(p), Print(p));
603  p = nullptr;
604  EXPECT_EQ("NULL", Print(p));
605 }
606 
607 // const void*.
608 TEST(PrintPointerToBuiltInTypeTest, ConstVoid) {
609  const void* p = reinterpret_cast<const void*>(0xABCD);
610  EXPECT_EQ(PrintPointer(p), Print(p));
611  p = nullptr;
612  EXPECT_EQ("NULL", Print(p));
613 }
614 
615 // Tests printing pointers to pointers.
616 TEST(PrintPointerToPointerTest, IntPointerPointer) {
617  int** p = reinterpret_cast<int**>(0xABCD);
618  EXPECT_EQ(PrintPointer(p), Print(p));
619  p = nullptr;
620  EXPECT_EQ("NULL", Print(p));
621 }
622 
623 // Tests printing (non-member) function pointers.
624 
625 void MyFunction(int /* n */) {}
626 
627 TEST(PrintPointerTest, NonMemberFunctionPointer) {
628  // We cannot directly cast &MyFunction to const void* because the
629  // standard disallows casting between pointers to functions and
630  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
631  // this limitation.
632  EXPECT_EQ(
633  PrintPointer(reinterpret_cast<const void*>(
634  reinterpret_cast<internal::BiggestInt>(&MyFunction))),
635  Print(&MyFunction));
636  int (*p)(bool) = NULL; // NOLINT
637  EXPECT_EQ("NULL", Print(p));
638 }
639 
640 // An assertion predicate determining whether a one string is a prefix for
641 // another.
642 template <typename StringType>
643 AssertionResult HasPrefix(const StringType& str, const StringType& prefix) {
644  if (str.find(prefix, 0) == 0)
645  return AssertionSuccess();
646 
647  const bool is_wide_string = sizeof(prefix[0]) > 1;
648  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
649  return AssertionFailure()
650  << begin_string_quote << prefix << "\" is not a prefix of "
651  << begin_string_quote << str << "\"\n";
652 }
653 
654 // Tests printing member variable pointers. Although they are called
655 // pointers, they don't point to a location in the address space.
656 // Their representation is implementation-defined. Thus they will be
657 // printed as raw bytes.
658 
659 struct Foo {
660  public:
661  virtual ~Foo() {}
662  int MyMethod(char x) { return x + 1; }
663  virtual char MyVirtualMethod(int /* n */) { return 'a'; }
664 
665  int value;
666 };
667 
668 TEST(PrintPointerTest, MemberVariablePointer) {
670  Print(sizeof(&Foo::value)) + "-byte object "));
671  int Foo::*p = NULL; // NOLINT
673  Print(sizeof(p)) + "-byte object "));
674 }
675 
676 // Tests printing member function pointers. Although they are called
677 // pointers, they don't point to a location in the address space.
678 // Their representation is implementation-defined. Thus they will be
679 // printed as raw bytes.
680 TEST(PrintPointerTest, MemberFunctionPointer) {
682  Print(sizeof(&Foo::MyMethod)) + "-byte object "));
683  EXPECT_TRUE(
685  Print(sizeof((&Foo::MyVirtualMethod))) + "-byte object "));
686  int (Foo::*p)(char) = NULL; // NOLINT
688  Print(sizeof(p)) + "-byte object "));
689 }
690 
691 // Tests printing C arrays.
692 
693 // The difference between this and Print() is that it ensures that the
694 // argument is a reference to an array.
695 template <typename T, size_t N>
697  return Print(a);
698 }
699 
700 // One-dimensional array.
701 TEST(PrintArrayTest, OneDimensionalArray) {
702  int a[5] = { 1, 2, 3, 4, 5 };
703  EXPECT_EQ("{ 1, 2, 3, 4, 5 }", PrintArrayHelper(a));
704 }
705 
706 // Two-dimensional array.
707 TEST(PrintArrayTest, TwoDimensionalArray) {
708  int a[2][5] = {
709  { 1, 2, 3, 4, 5 },
710  { 6, 7, 8, 9, 0 }
711  };
712  EXPECT_EQ("{ { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 0 } }", PrintArrayHelper(a));
713 }
714 
715 // Array of const elements.
716 TEST(PrintArrayTest, ConstArray) {
717  const bool a[1] = { false };
718  EXPECT_EQ("{ false }", PrintArrayHelper(a));
719 }
720 
721 // char array without terminating NUL.
722 TEST(PrintArrayTest, CharArrayWithNoTerminatingNul) {
723  // Array a contains '\0' in the middle and doesn't end with '\0'.
724  char a[] = { 'H', '\0', 'i' };
725  EXPECT_EQ("\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
726 }
727 
728 // const char array with terminating NUL.
729 TEST(PrintArrayTest, ConstCharArrayWithTerminatingNul) {
730  const char a[] = "\0Hi";
731  EXPECT_EQ("\"\\0Hi\"", PrintArrayHelper(a));
732 }
733 
734 // const wchar_t array without terminating NUL.
735 TEST(PrintArrayTest, WCharArrayWithNoTerminatingNul) {
736  // Array a contains '\0' in the middle and doesn't end with '\0'.
737  const wchar_t a[] = { L'H', L'\0', L'i' };
738  EXPECT_EQ("L\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
739 }
740 
741 // wchar_t array with terminating NUL.
742 TEST(PrintArrayTest, WConstCharArrayWithTerminatingNul) {
743  const wchar_t a[] = L"\0Hi";
744  EXPECT_EQ("L\"\\0Hi\"", PrintArrayHelper(a));
745 }
746 
747 #ifdef __cpp_char8_t
748 // char8_t array.
749 TEST(PrintArrayTest, Char8Array) {
750  const char8_t a[] = u8"Hello, world!";
751  EXPECT_EQ(
752  "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+0077, "
753  "U+006F, U+0072, U+006C, U+0064, U+0021, U+0000 }",
754  PrintArrayHelper(a));
755 }
756 #endif
757 
758 // char16_t array.
759 #ifdef _MSC_VER
760 // TODO(b/173029407): Figure out why this doesn't work under MSVC.
761 TEST(PrintArrayTest, DISABLED_Char16Array) {
762 #else
763 TEST(PrintArrayTest, Char16Array) {
764 #endif
765  const char16_t a[] = u"Hello, 世界";
766  EXPECT_EQ(
767  "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, "
768  "U+754C, U+0000 }",
770 }
771 
772 // char32_t array.
773 #ifdef _MSC_VER
774 // TODO(b/173029407): Figure out why this doesn't work under MSVC.
775 TEST(PrintArrayTest, DISABLED_Char32Array) {
776 #else
777 TEST(PrintArrayTest, Char32Array) {
778 #endif
779  const char32_t a[] = U"Hello, 世界";
780  EXPECT_EQ(
781  "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, "
782  "U+754C, U+0000 }",
784 }
785 
786 // Array of objects.
787 TEST(PrintArrayTest, ObjectArray) {
788  std::string a[3] = {"Hi", "Hello", "Ni hao"};
789  EXPECT_EQ("{ \"Hi\", \"Hello\", \"Ni hao\" }", PrintArrayHelper(a));
790 }
791 
792 // Array with many elements.
793 TEST(PrintArrayTest, BigArray) {
794  int a[100] = { 1, 2, 3 };
795  EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0, 0, 0, 0, 0 }",
796  PrintArrayHelper(a));
797 }
798 
799 // Tests printing ::string and ::std::string.
800 
801 // ::std::string.
802 TEST(PrintStringTest, StringInStdNamespace) {
803  const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a";
804  const ::std::string str(s, sizeof(s));
805  EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"",
806  Print(str));
807 }
808 
809 TEST(PrintStringTest, StringAmbiguousHex) {
810  // "\x6BANANA" is ambiguous, it can be interpreted as starting with either of:
811  // '\x6', '\x6B', or '\x6BA'.
812 
813  // a hex escaping sequence following by a decimal digit
814  EXPECT_EQ("\"0\\x12\" \"3\"", Print(::std::string("0\x12" "3")));
815  // a hex escaping sequence following by a hex digit (lower-case)
816  EXPECT_EQ("\"mm\\x6\" \"bananas\"", Print(::std::string("mm\x6" "bananas")));
817  // a hex escaping sequence following by a hex digit (upper-case)
818  EXPECT_EQ("\"NOM\\x6\" \"BANANA\"", Print(::std::string("NOM\x6" "BANANA")));
819  // a hex escaping sequence following by a non-xdigit
820  EXPECT_EQ("\"!\\x5-!\"", Print(::std::string("!\x5-!")));
821 }
822 
823 // Tests printing ::std::wstring.
824 #if GTEST_HAS_STD_WSTRING
825 // ::std::wstring.
826 TEST(PrintWideStringTest, StringInStdNamespace) {
827  const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a";
828  const ::std::wstring str(s, sizeof(s)/sizeof(wchar_t));
829  EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v"
830  "\\xD3\\x576\\x8D3\\xC74D a\\0\"",
831  Print(str));
832 }
833 
834 TEST(PrintWideStringTest, StringAmbiguousHex) {
835  // same for wide strings.
836  EXPECT_EQ("L\"0\\x12\" L\"3\"", Print(::std::wstring(L"0\x12" L"3")));
837  EXPECT_EQ("L\"mm\\x6\" L\"bananas\"",
838  Print(::std::wstring(L"mm\x6" L"bananas")));
839  EXPECT_EQ("L\"NOM\\x6\" L\"BANANA\"",
840  Print(::std::wstring(L"NOM\x6" L"BANANA")));
841  EXPECT_EQ("L\"!\\x5-!\"", Print(::std::wstring(L"!\x5-!")));
842 }
843 #endif // GTEST_HAS_STD_WSTRING
844 
845 #ifdef __cpp_char8_t
846 TEST(PrintStringTest, U8String) {
847  std::u8string str = u8"Hello, world!";
848  EXPECT_EQ(str, str); // Verify EXPECT_EQ compiles with this type.
849  EXPECT_EQ(
850  "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+0077, "
851  "U+006F, U+0072, U+006C, U+0064, U+0021 }",
852  Print(str));
853 }
854 #endif
855 
856 #ifdef _MSC_VER
857 // TODO(b/173029407): Figure out why this doesn't work under MSVC.
858 TEST(PrintStringTest, DISABLED_U16String) {
859 #else
860 TEST(PrintStringTest, U16String) {
861 #endif
862  std::u16string str = u"Hello, 世界";
863  EXPECT_EQ(str, str); // Verify EXPECT_EQ compiles with this type.
864  EXPECT_EQ(
865  "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, "
866  "U+754C }",
867  Print(str));
868 }
869 
870 #ifdef _MSC_VER
871 // TODO(b/173029407): Figure out why this doesn't work under MSVC.
872 TEST(PrintStringTest, DISABLED_U32String) {
873 #else
874 TEST(PrintStringTest, U32String) {
875 #endif
876  std::u32string str = U"Hello, 世界";
877  EXPECT_EQ(str, str); // Verify EXPECT_EQ compiles with this type.
878  EXPECT_EQ(
879  "{ U+0048, U+0065, U+006C, U+006C, U+006F, U+002C, U+0020, U+4E16, "
880  "U+754C }",
881  Print(str));
882 }
883 
884 // Tests printing types that support generic streaming (i.e. streaming
885 // to std::basic_ostream<Char, CharTraits> for any valid Char and
886 // CharTraits types).
887 
888 // Tests printing a non-template type that supports generic streaming.
889 
890 class AllowsGenericStreaming {};
891 
892 template <typename Char, typename CharTraits>
893 std::basic_ostream<Char, CharTraits>& operator<<(
894  std::basic_ostream<Char, CharTraits>& os,
895  const AllowsGenericStreaming& /* a */) {
896  return os << "AllowsGenericStreaming";
897 }
898 
899 TEST(PrintTypeWithGenericStreamingTest, NonTemplateType) {
900  AllowsGenericStreaming a;
901  EXPECT_EQ("AllowsGenericStreaming", Print(a));
902 }
903 
904 // Tests printing a template type that supports generic streaming.
905 
906 template <typename T>
907 class AllowsGenericStreamingTemplate {};
908 
909 template <typename Char, typename CharTraits, typename T>
910 std::basic_ostream<Char, CharTraits>& operator<<(
911  std::basic_ostream<Char, CharTraits>& os,
912  const AllowsGenericStreamingTemplate<T>& /* a */) {
913  return os << "AllowsGenericStreamingTemplate";
914 }
915 
916 TEST(PrintTypeWithGenericStreamingTest, TemplateType) {
917  AllowsGenericStreamingTemplate<int> a;
918  EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a));
919 }
920 
921 // Tests printing a type that supports generic streaming and can be
922 // implicitly converted to another printable type.
923 
924 template <typename T>
925 class AllowsGenericStreamingAndImplicitConversionTemplate {
926  public:
927  operator bool() const { return false; }
928 };
929 
930 template <typename Char, typename CharTraits, typename T>
931 std::basic_ostream<Char, CharTraits>& operator<<(
932  std::basic_ostream<Char, CharTraits>& os,
933  const AllowsGenericStreamingAndImplicitConversionTemplate<T>& /* a */) {
934  return os << "AllowsGenericStreamingAndImplicitConversionTemplate";
935 }
936 
937 TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {
938  AllowsGenericStreamingAndImplicitConversionTemplate<int> a;
939  EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a));
940 }
941 
942 #if GTEST_INTERNAL_HAS_STRING_VIEW
943 
944 // Tests printing internal::StringView.
945 
946 TEST(PrintStringViewTest, SimpleStringView) {
947  const internal::StringView sp = "Hello";
948  EXPECT_EQ("\"Hello\"", Print(sp));
949 }
950 
951 TEST(PrintStringViewTest, UnprintableCharacters) {
952  const char str[] = "NUL (\0) and \r\t";
953  const internal::StringView sp(str, sizeof(str) - 1);
954  EXPECT_EQ("\"NUL (\\0) and \\r\\t\"", Print(sp));
955 }
956 
957 #endif // GTEST_INTERNAL_HAS_STRING_VIEW
958 
959 // Tests printing STL containers.
960 
961 TEST(PrintStlContainerTest, EmptyDeque) {
962  deque<char> empty;
963  EXPECT_EQ("{}", Print(empty));
964 }
965 
966 TEST(PrintStlContainerTest, NonEmptyDeque) {
967  deque<int> non_empty;
968  non_empty.push_back(1);
969  non_empty.push_back(3);
970  EXPECT_EQ("{ 1, 3 }", Print(non_empty));
971 }
972 
973 
974 TEST(PrintStlContainerTest, OneElementHashMap) {
975  ::std::unordered_map<int, char> map1;
976  map1[1] = 'a';
977  EXPECT_EQ("{ (1, 'a' (97, 0x61)) }", Print(map1));
978 }
979 
980 TEST(PrintStlContainerTest, HashMultiMap) {
981  ::std::unordered_multimap<int, bool> map1;
982  map1.insert(make_pair(5, true));
983  map1.insert(make_pair(5, false));
984 
985  // Elements of hash_multimap can be printed in any order.
986  const std::string result = Print(map1);
987  EXPECT_TRUE(result == "{ (5, true), (5, false) }" ||
988  result == "{ (5, false), (5, true) }")
989  << " where Print(map1) returns \"" << result << "\".";
990 }
991 
992 
993 
994 TEST(PrintStlContainerTest, HashSet) {
995  ::std::unordered_set<int> set1;
996  set1.insert(1);
997  EXPECT_EQ("{ 1 }", Print(set1));
998 }
999 
1000 TEST(PrintStlContainerTest, HashMultiSet) {
1001  const int kSize = 5;
1002  int a[kSize] = { 1, 1, 2, 5, 1 };
1003  ::std::unordered_multiset<int> set1(a, a + kSize);
1004 
1005  // Elements of hash_multiset can be printed in any order.
1006  const std::string result = Print(set1);
1007  const std::string expected_pattern = "{ d, d, d, d, d }"; // d means a digit.
1008 
1009  // Verifies the result matches the expected pattern; also extracts
1010  // the numbers in the result.
1011  ASSERT_EQ(expected_pattern.length(), result.length());
1012  std::vector<int> numbers;
1013  for (size_t i = 0; i != result.length(); i++) {
1014  if (expected_pattern[i] == 'd') {
1015  ASSERT_NE(isdigit(static_cast<unsigned char>(result[i])), 0);
1016  numbers.push_back(result[i] - '0');
1017  } else {
1018  EXPECT_EQ(expected_pattern[i], result[i]) << " where result is "
1019  << result;
1020  }
1021  }
1022 
1023  // Makes sure the result contains the right numbers.
1024  std::sort(numbers.begin(), numbers.end());
1025  std::sort(a, a + kSize);
1026  EXPECT_TRUE(std::equal(a, a + kSize, numbers.begin()));
1027 }
1028 
1029 
1030 TEST(PrintStlContainerTest, List) {
1031  const std::string a[] = {"hello", "world"};
1032  const list<std::string> strings(a, a + 2);
1033  EXPECT_EQ("{ \"hello\", \"world\" }", Print(strings));
1034 }
1035 
1036 TEST(PrintStlContainerTest, Map) {
1037  map<int, bool> map1;
1038  map1[1] = true;
1039  map1[5] = false;
1040  map1[3] = true;
1041  EXPECT_EQ("{ (1, true), (3, true), (5, false) }", Print(map1));
1042 }
1043 
1044 TEST(PrintStlContainerTest, MultiMap) {
1045  multimap<bool, int> map1;
1046  // The make_pair template function would deduce the type as
1047  // pair<bool, int> here, and since the key part in a multimap has to
1048  // be constant, without a templated ctor in the pair class (as in
1049  // libCstd on Solaris), make_pair call would fail to compile as no
1050  // implicit conversion is found. Thus explicit typename is used
1051  // here instead.
1052  map1.insert(pair<const bool, int>(true, 0));
1053  map1.insert(pair<const bool, int>(true, 1));
1054  map1.insert(pair<const bool, int>(false, 2));
1055  EXPECT_EQ("{ (false, 2), (true, 0), (true, 1) }", Print(map1));
1056 }
1057 
1058 TEST(PrintStlContainerTest, Set) {
1059  const unsigned int a[] = { 3, 0, 5 };
1060  set<unsigned int> set1(a, a + 3);
1061  EXPECT_EQ("{ 0, 3, 5 }", Print(set1));
1062 }
1063 
1064 TEST(PrintStlContainerTest, MultiSet) {
1065  const int a[] = { 1, 1, 2, 5, 1 };
1066  multiset<int> set1(a, a + 5);
1067  EXPECT_EQ("{ 1, 1, 1, 2, 5 }", Print(set1));
1068 }
1069 
1070 
1071 TEST(PrintStlContainerTest, SinglyLinkedList) {
1072  int a[] = { 9, 2, 8 };
1073  const std::forward_list<int> ints(a, a + 3);
1074  EXPECT_EQ("{ 9, 2, 8 }", Print(ints));
1075 }
1076 
1077 TEST(PrintStlContainerTest, Pair) {
1078  pair<const bool, int> p(true, 5);
1079  EXPECT_EQ("(true, 5)", Print(p));
1080 }
1081 
1082 TEST(PrintStlContainerTest, Vector) {
1083  vector<int> v;
1084  v.push_back(1);
1085  v.push_back(2);
1086  EXPECT_EQ("{ 1, 2 }", Print(v));
1087 }
1088 
1089 TEST(PrintStlContainerTest, LongSequence) {
1090  const int a[100] = { 1, 2, 3 };
1091  const vector<int> v(a, a + 100);
1092  EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
1093  "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... }", Print(v));
1094 }
1095 
1096 TEST(PrintStlContainerTest, NestedContainer) {
1097  const int a1[] = { 1, 2 };
1098  const int a2[] = { 3, 4, 5 };
1099  const list<int> l1(a1, a1 + 2);
1100  const list<int> l2(a2, a2 + 3);
1101 
1102  vector<list<int> > v;
1103  v.push_back(l1);
1104  v.push_back(l2);
1105  EXPECT_EQ("{ { 1, 2 }, { 3, 4, 5 } }", Print(v));
1106 }
1107 
1108 TEST(PrintStlContainerTest, OneDimensionalNativeArray) {
1109  const int a[3] = { 1, 2, 3 };
1110  NativeArray<int> b(a, 3, RelationToSourceReference());
1111  EXPECT_EQ("{ 1, 2, 3 }", Print(b));
1112 }
1113 
1114 TEST(PrintStlContainerTest, TwoDimensionalNativeArray) {
1115  const int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
1116  NativeArray<int[3]> b(a, 2, RelationToSourceReference());
1117  EXPECT_EQ("{ { 1, 2, 3 }, { 4, 5, 6 } }", Print(b));
1118 }
1119 
1120 // Tests that a class named iterator isn't treated as a container.
1121 
1122 struct iterator {
1123  char x;
1124 };
1125 
1126 TEST(PrintStlContainerTest, Iterator) {
1127  iterator it = {};
1128  EXPECT_EQ("1-byte object <00>", Print(it));
1129 }
1130 
1131 // Tests that a class named const_iterator isn't treated as a container.
1132 
1133 struct const_iterator {
1134  char x;
1135 };
1136 
1137 TEST(PrintStlContainerTest, ConstIterator) {
1138  const_iterator it = {};
1139  EXPECT_EQ("1-byte object <00>", Print(it));
1140 }
1141 
1142 // Tests printing ::std::tuples.
1143 
1144 // Tuples of various arities.
1145 TEST(PrintStdTupleTest, VariousSizes) {
1146  ::std::tuple<> t0;
1147  EXPECT_EQ("()", Print(t0));
1148 
1149  ::std::tuple<int> t1(5);
1150  EXPECT_EQ("(5)", Print(t1));
1151 
1152  ::std::tuple<char, bool> t2('a', true);
1153  EXPECT_EQ("('a' (97, 0x61), true)", Print(t2));
1154 
1155  ::std::tuple<bool, int, int> t3(false, 2, 3);
1156  EXPECT_EQ("(false, 2, 3)", Print(t3));
1157 
1158  ::std::tuple<bool, int, int, int> t4(false, 2, 3, 4);
1159  EXPECT_EQ("(false, 2, 3, 4)", Print(t4));
1160 
1161  const char* const str = "8";
1162  ::std::tuple<bool, char, short, int32_t, int64_t, float, double, // NOLINT
1163  const char*, void*, std::string>
1164  t10(false, 'a', static_cast<short>(3), 4, 5, 1.5F, -2.5, str, // NOLINT
1165  nullptr, "10");
1166  EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) +
1167  " pointing to \"8\", NULL, \"10\")",
1168  Print(t10));
1169 }
1170 
1171 // Nested tuples.
1172 TEST(PrintStdTupleTest, NestedTuple) {
1173  ::std::tuple< ::std::tuple<int, bool>, char> nested(
1174  ::std::make_tuple(5, true), 'a');
1175  EXPECT_EQ("((5, true), 'a' (97, 0x61))", Print(nested));
1176 }
1177 
1178 TEST(PrintNullptrT, Basic) {
1179  EXPECT_EQ("(nullptr)", Print(nullptr));
1180 }
1181 
1182 TEST(PrintReferenceWrapper, Printable) {
1183  int x = 5;
1184  EXPECT_EQ("@" + PrintPointer(&x) + " 5", Print(std::ref(x)));
1185  EXPECT_EQ("@" + PrintPointer(&x) + " 5", Print(std::cref(x)));
1186 }
1187 
1188 TEST(PrintReferenceWrapper, Unprintable) {
1190  EXPECT_EQ(
1191  "@" + PrintPointer(&up) +
1192  " 16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
1193  Print(std::ref(up)));
1194  EXPECT_EQ(
1195  "@" + PrintPointer(&up) +
1196  " 16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
1197  Print(std::cref(up)));
1198 }
1199 
1200 // Tests printing user-defined unprintable types.
1201 
1202 // Unprintable types in the global namespace.
1203 TEST(PrintUnprintableTypeTest, InGlobalNamespace) {
1204  EXPECT_EQ("1-byte object <00>",
1206 }
1207 
1208 // Unprintable types in a user namespace.
1209 TEST(PrintUnprintableTypeTest, InUserNamespace) {
1210  EXPECT_EQ("16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
1212 }
1213 
1214 // Unprintable types are that too big to be printed completely.
1215 
1216 struct Big {
1217  Big() { memset(array, 0, sizeof(array)); }
1218  char array[257];
1219 };
1220 
1221 TEST(PrintUnpritableTypeTest, BigObject) {
1222  EXPECT_EQ("257-byte object <00-00 00-00 00-00 00-00 00-00 00-00 "
1223  "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
1224  "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
1225  "00-00 00-00 00-00 00-00 00-00 00-00 ... 00-00 00-00 00-00 "
1226  "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
1227  "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
1228  "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00>",
1229  Print(Big()));
1230 }
1231 
1232 // Tests printing user-defined streamable types.
1233 
1234 // Streamable types in the global namespace.
1235 TEST(PrintStreamableTypeTest, InGlobalNamespace) {
1237  EXPECT_EQ("StreamableInGlobal", Print(x));
1238  EXPECT_EQ("StreamableInGlobal*", Print(&x));
1239 }
1240 
1241 // Printable template types in a user namespace.
1242 TEST(PrintStreamableTypeTest, TemplateTypeInUserNamespace) {
1243  EXPECT_EQ("StreamableTemplateInFoo: 0",
1245 }
1246 
1247 TEST(PrintStreamableTypeTest, TypeInUserNamespaceWithTemplatedStreamOperator) {
1248  EXPECT_EQ("TemplatedStreamableInFoo",
1250 }
1251 
1252 TEST(PrintStreamableTypeTest, SubclassUsesSuperclassStreamOperator) {
1253  ParentClass parent;
1254  ChildClassWithStreamOperator child_stream;
1255  ChildClassWithoutStreamOperator child_no_stream;
1256  EXPECT_EQ("ParentClass", Print(parent));
1257  EXPECT_EQ("ChildClassWithStreamOperator", Print(child_stream));
1258  EXPECT_EQ("ParentClass", Print(child_no_stream));
1259 }
1260 
1261 // Tests printing a user-defined recursive container type that has a <<
1262 // operator.
1263 TEST(PrintStreamableTypeTest, PathLikeInUserNamespace) {
1265  EXPECT_EQ("Streamable-PathLike", Print(x));
1266  const ::foo::PathLike cx;
1267  EXPECT_EQ("Streamable-PathLike", Print(cx));
1268 }
1269 
1270 // Tests printing user-defined types that have a PrintTo() function.
1271 TEST(PrintPrintableTypeTest, InUserNamespace) {
1272  EXPECT_EQ("PrintableViaPrintTo: 0",
1274 }
1275 
1276 // Tests printing a pointer to a user-defined type that has a <<
1277 // operator for its pointer.
1278 TEST(PrintPrintableTypeTest, PointerInUserNamespace) {
1280  EXPECT_EQ("PointerPrintable*", Print(&x));
1281 }
1282 
1283 // Tests printing user-defined class template that have a PrintTo() function.
1284 TEST(PrintPrintableTypeTest, TemplateInUserNamespace) {
1285  EXPECT_EQ("PrintableViaPrintToTemplate: 5",
1287 }
1288 
1289 // Tests that the universal printer prints both the address and the
1290 // value of a reference.
1291 TEST(PrintReferenceTest, PrintsAddressAndValue) {
1292  int n = 5;
1293  EXPECT_EQ("@" + PrintPointer(&n) + " 5", PrintByRef(n));
1294 
1295  int a[2][3] = {
1296  { 0, 1, 2 },
1297  { 3, 4, 5 }
1298  };
1299  EXPECT_EQ("@" + PrintPointer(a) + " { { 0, 1, 2 }, { 3, 4, 5 } }",
1300  PrintByRef(a));
1301 
1302  const ::foo::UnprintableInFoo x;
1303  EXPECT_EQ("@" + PrintPointer(&x) + " 16-byte object "
1304  "<EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
1305  PrintByRef(x));
1306 }
1307 
1308 // Tests that the universal printer prints a function pointer passed by
1309 // reference.
1310 TEST(PrintReferenceTest, HandlesFunctionPointer) {
1311  void (*fp)(int n) = &MyFunction;
1312  const std::string fp_pointer_string =
1313  PrintPointer(reinterpret_cast<const void*>(&fp));
1314  // We cannot directly cast &MyFunction to const void* because the
1315  // standard disallows casting between pointers to functions and
1316  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
1317  // this limitation.
1318  const std::string fp_string = PrintPointer(reinterpret_cast<const void*>(
1319  reinterpret_cast<internal::BiggestInt>(fp)));
1320  EXPECT_EQ("@" + fp_pointer_string + " " + fp_string,
1321  PrintByRef(fp));
1322 }
1323 
1324 // Tests that the universal printer prints a member function pointer
1325 // passed by reference.
1326 TEST(PrintReferenceTest, HandlesMemberFunctionPointer) {
1327  int (Foo::*p)(char ch) = &Foo::MyMethod;
1329  PrintByRef(p),
1330  "@" + PrintPointer(reinterpret_cast<const void*>(&p)) + " " +
1331  Print(sizeof(p)) + "-byte object "));
1332 
1333  char (Foo::*p2)(int n) = &Foo::MyVirtualMethod;
1335  PrintByRef(p2),
1336  "@" + PrintPointer(reinterpret_cast<const void*>(&p2)) + " " +
1337  Print(sizeof(p2)) + "-byte object "));
1338 }
1339 
1340 // Tests that the universal printer prints a member variable pointer
1341 // passed by reference.
1342 TEST(PrintReferenceTest, HandlesMemberVariablePointer) {
1343  int Foo::*p = &Foo::value; // NOLINT
1345  PrintByRef(p),
1346  "@" + PrintPointer(&p) + " " + Print(sizeof(p)) + "-byte object "));
1347 }
1348 
1349 // Tests that FormatForComparisonFailureMessage(), which is used to print
1350 // an operand in a comparison assertion (e.g. ASSERT_EQ) when the assertion
1351 // fails, formats the operand in the desired way.
1352 
1353 // scalar
1354 TEST(FormatForComparisonFailureMessageTest, WorksForScalar) {
1355  EXPECT_STREQ("123",
1357 }
1358 
1359 // non-char pointer
1360 TEST(FormatForComparisonFailureMessageTest, WorksForNonCharPointer) {
1361  int n = 0;
1362  EXPECT_EQ(PrintPointer(&n),
1364 }
1365 
1366 // non-char array
1367 TEST(FormatForComparisonFailureMessageTest, FormatsNonCharArrayAsPointer) {
1368  // In expression 'array == x', 'array' is compared by pointer.
1369  // Therefore we want to print an array operand as a pointer.
1370  int n[] = { 1, 2, 3 };
1373 }
1374 
1375 // Tests formatting a char pointer when it's compared with another pointer.
1376 // In this case we want to print it as a raw pointer, as the comparison is by
1377 // pointer.
1378 
1379 // char pointer vs pointer
1380 TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsPointer) {
1381  // In expression 'p == x', where 'p' and 'x' are (const or not) char
1382  // pointers, the operands are compared by pointer. Therefore we
1383  // want to print 'p' as a pointer instead of a C string (we don't
1384  // even know if it's supposed to point to a valid C string).
1385 
1386  // const char*
1387  const char* s = "hello";
1390 
1391  // char*
1392  char ch = 'a';
1395 }
1396 
1397 // wchar_t pointer vs pointer
1398 TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsPointer) {
1399  // In expression 'p == x', where 'p' and 'x' are (const or not) char
1400  // pointers, the operands are compared by pointer. Therefore we
1401  // want to print 'p' as a pointer instead of a wide C string (we don't
1402  // even know if it's supposed to point to a valid wide C string).
1403 
1404  // const wchar_t*
1405  const wchar_t* s = L"hello";
1408 
1409  // wchar_t*
1410  wchar_t ch = L'a';
1413 }
1414 
1415 // Tests formatting a char pointer when it's compared to a string object.
1416 // In this case we want to print the char pointer as a C string.
1417 
1418 // char pointer vs std::string
1419 TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsStdString) {
1420  const char* s = "hello \"world";
1421  EXPECT_STREQ("\"hello \\\"world\"", // The string content should be escaped.
1423 
1424  // char*
1425  char str[] = "hi\1";
1426  char* p = str;
1427  EXPECT_STREQ("\"hi\\x1\"", // The string content should be escaped.
1429 }
1430 
1431 #if GTEST_HAS_STD_WSTRING
1432 // wchar_t pointer vs std::wstring
1433 TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsStdWString) {
1434  const wchar_t* s = L"hi \"world";
1435  EXPECT_STREQ("L\"hi \\\"world\"", // The string content should be escaped.
1437 
1438  // wchar_t*
1439  wchar_t str[] = L"hi\1";
1440  wchar_t* p = str;
1441  EXPECT_STREQ("L\"hi\\x1\"", // The string content should be escaped.
1443 }
1444 #endif
1445 
1446 // Tests formatting a char array when it's compared with a pointer or array.
1447 // In this case we want to print the array as a row pointer, as the comparison
1448 // is by pointer.
1449 
1450 // char array vs pointer
1451 TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsPointer) {
1452  char str[] = "hi \"world\"";
1453  char* p = nullptr;
1456 }
1457 
1458 // char array vs char array
1459 TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsCharArray) {
1460  const char str[] = "hi \"world\"";
1463 }
1464 
1465 // wchar_t array vs pointer
1466 TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsPointer) {
1467  wchar_t str[] = L"hi \"world\"";
1468  wchar_t* p = nullptr;
1471 }
1472 
1473 // wchar_t array vs wchar_t array
1474 TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWCharArray) {
1475  const wchar_t str[] = L"hi \"world\"";
1478 }
1479 
1480 // Tests formatting a char array when it's compared with a string object.
1481 // In this case we want to print the array as a C string.
1482 
1483 // char array vs std::string
1484 TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsStdString) {
1485  const char str[] = "hi \"world\"";
1486  EXPECT_STREQ("\"hi \\\"world\\\"\"", // The content should be escaped.
1488 }
1489 
1490 #if GTEST_HAS_STD_WSTRING
1491 // wchar_t array vs std::wstring
1492 TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsStdWString) {
1493  const wchar_t str[] = L"hi \"w\0rld\"";
1494  EXPECT_STREQ(
1495  "L\"hi \\\"w\"", // The content should be escaped.
1496  // Embedded NUL terminates the string.
1498 }
1499 #endif
1500 
1501 // Useful for testing PrintToString(). We cannot use EXPECT_EQ()
1502 // there as its implementation uses PrintToString(). The caller must
1503 // ensure that 'value' has no side effect.
1504 #define EXPECT_PRINT_TO_STRING_(value, expected_string) \
1505  EXPECT_TRUE(PrintToString(value) == (expected_string)) \
1506  << " where " #value " prints as " << (PrintToString(value))
1507 
1508 TEST(PrintToStringTest, WorksForScalar) {
1509  EXPECT_PRINT_TO_STRING_(123, "123");
1510 }
1511 
1512 TEST(PrintToStringTest, WorksForPointerToConstChar) {
1513  const char* p = "hello";
1514  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
1515 }
1516 
1517 TEST(PrintToStringTest, WorksForPointerToNonConstChar) {
1518  char s[] = "hello";
1519  char* p = s;
1520  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
1521 }
1522 
1523 TEST(PrintToStringTest, EscapesForPointerToConstChar) {
1524  const char* p = "hello\n";
1525  EXPECT_PRINT_TO_STRING_(p, "\"hello\\n\"");
1526 }
1527 
1528 TEST(PrintToStringTest, EscapesForPointerToNonConstChar) {
1529  char s[] = "hello\1";
1530  char* p = s;
1531  EXPECT_PRINT_TO_STRING_(p, "\"hello\\x1\"");
1532 }
1533 
1534 TEST(PrintToStringTest, WorksForArray) {
1535  int n[3] = { 1, 2, 3 };
1536  EXPECT_PRINT_TO_STRING_(n, "{ 1, 2, 3 }");
1537 }
1538 
1539 TEST(PrintToStringTest, WorksForCharArray) {
1540  char s[] = "hello";
1541  EXPECT_PRINT_TO_STRING_(s, "\"hello\"");
1542 }
1543 
1544 TEST(PrintToStringTest, WorksForCharArrayWithEmbeddedNul) {
1545  const char str_with_nul[] = "hello\0 world";
1546  EXPECT_PRINT_TO_STRING_(str_with_nul, "\"hello\\0 world\"");
1547 
1548  char mutable_str_with_nul[] = "hello\0 world";
1549  EXPECT_PRINT_TO_STRING_(mutable_str_with_nul, "\"hello\\0 world\"");
1550 }
1551 
1552  TEST(PrintToStringTest, ContainsNonLatin) {
1553  // Sanity test with valid UTF-8. Prints both in hex and as text.
1554  std::string non_ascii_str = ::std::string("오전 4:30");
1555  EXPECT_PRINT_TO_STRING_(non_ascii_str,
1556  "\"\\xEC\\x98\\xA4\\xEC\\xA0\\x84 4:30\"\n"
1557  " As Text: \"오전 4:30\"");
1558  non_ascii_str = ::std::string("From ä — ẑ");
1559  EXPECT_PRINT_TO_STRING_(non_ascii_str,
1560  "\"From \\xC3\\xA4 \\xE2\\x80\\x94 \\xE1\\xBA\\x91\""
1561  "\n As Text: \"From ä — ẑ\"");
1562 }
1563 
1564 TEST(IsValidUTF8Test, IllFormedUTF8) {
1565  // The following test strings are ill-formed UTF-8 and are printed
1566  // as hex only (or ASCII, in case of ASCII bytes) because IsValidUTF8() is
1567  // expected to fail, thus output does not contain "As Text:".
1568 
1569  static const char *const kTestdata[][2] = {
1570  // 2-byte lead byte followed by a single-byte character.
1571  {"\xC3\x74", "\"\\xC3t\""},
1572  // Valid 2-byte character followed by an orphan trail byte.
1573  {"\xC3\x84\xA4", "\"\\xC3\\x84\\xA4\""},
1574  // Lead byte without trail byte.
1575  {"abc\xC3", "\"abc\\xC3\""},
1576  // 3-byte lead byte, single-byte character, orphan trail byte.
1577  {"x\xE2\x70\x94", "\"x\\xE2p\\x94\""},
1578  // Truncated 3-byte character.
1579  {"\xE2\x80", "\"\\xE2\\x80\""},
1580  // Truncated 3-byte character followed by valid 2-byte char.
1581  {"\xE2\x80\xC3\x84", "\"\\xE2\\x80\\xC3\\x84\""},
1582  // Truncated 3-byte character followed by a single-byte character.
1583  {"\xE2\x80\x7A", "\"\\xE2\\x80z\""},
1584  // 3-byte lead byte followed by valid 3-byte character.
1585  {"\xE2\xE2\x80\x94", "\"\\xE2\\xE2\\x80\\x94\""},
1586  // 4-byte lead byte followed by valid 3-byte character.
1587  {"\xF0\xE2\x80\x94", "\"\\xF0\\xE2\\x80\\x94\""},
1588  // Truncated 4-byte character.
1589  {"\xF0\xE2\x80", "\"\\xF0\\xE2\\x80\""},
1590  // Invalid UTF-8 byte sequences embedded in other chars.
1591  {"abc\xE2\x80\x94\xC3\x74xyc", "\"abc\\xE2\\x80\\x94\\xC3txyc\""},
1592  {"abc\xC3\x84\xE2\x80\xC3\x84xyz",
1593  "\"abc\\xC3\\x84\\xE2\\x80\\xC3\\x84xyz\""},
1594  // Non-shortest UTF-8 byte sequences are also ill-formed.
1595  // The classics: xC0, xC1 lead byte.
1596  {"\xC0\x80", "\"\\xC0\\x80\""},
1597  {"\xC1\x81", "\"\\xC1\\x81\""},
1598  // Non-shortest sequences.
1599  {"\xE0\x80\x80", "\"\\xE0\\x80\\x80\""},
1600  {"\xf0\x80\x80\x80", "\"\\xF0\\x80\\x80\\x80\""},
1601  // Last valid code point before surrogate range, should be printed as text,
1602  // too.
1603  {"\xED\x9F\xBF", "\"\\xED\\x9F\\xBF\"\n As Text: \"퟿\""},
1604  // Start of surrogate lead. Surrogates are not printed as text.
1605  {"\xED\xA0\x80", "\"\\xED\\xA0\\x80\""},
1606  // Last non-private surrogate lead.
1607  {"\xED\xAD\xBF", "\"\\xED\\xAD\\xBF\""},
1608  // First private-use surrogate lead.
1609  {"\xED\xAE\x80", "\"\\xED\\xAE\\x80\""},
1610  // Last private-use surrogate lead.
1611  {"\xED\xAF\xBF", "\"\\xED\\xAF\\xBF\""},
1612  // Mid-point of surrogate trail.
1613  {"\xED\xB3\xBF", "\"\\xED\\xB3\\xBF\""},
1614  // First valid code point after surrogate range, should be printed as text,
1615  // too.
1616  {"\xEE\x80\x80", "\"\\xEE\\x80\\x80\"\n As Text: \"\""}
1617  };
1618 
1619  for (int i = 0; i < int(sizeof(kTestdata)/sizeof(kTestdata[0])); ++i) {
1620  EXPECT_PRINT_TO_STRING_(kTestdata[i][0], kTestdata[i][1]);
1621  }
1622 }
1623 
1624 #undef EXPECT_PRINT_TO_STRING_
1625 
1626 TEST(UniversalTersePrintTest, WorksForNonReference) {
1627  ::std::stringstream ss;
1628  UniversalTersePrint(123, &ss);
1629  EXPECT_EQ("123", ss.str());
1630 }
1631 
1632 TEST(UniversalTersePrintTest, WorksForReference) {
1633  const int& n = 123;
1634  ::std::stringstream ss;
1635  UniversalTersePrint(n, &ss);
1636  EXPECT_EQ("123", ss.str());
1637 }
1638 
1639 TEST(UniversalTersePrintTest, WorksForCString) {
1640  const char* s1 = "abc";
1641  ::std::stringstream ss1;
1642  UniversalTersePrint(s1, &ss1);
1643  EXPECT_EQ("\"abc\"", ss1.str());
1644 
1645  char* s2 = const_cast<char*>(s1);
1646  ::std::stringstream ss2;
1647  UniversalTersePrint(s2, &ss2);
1648  EXPECT_EQ("\"abc\"", ss2.str());
1649 
1650  const char* s3 = nullptr;
1651  ::std::stringstream ss3;
1652  UniversalTersePrint(s3, &ss3);
1653  EXPECT_EQ("NULL", ss3.str());
1654 }
1655 
1656 TEST(UniversalPrintTest, WorksForNonReference) {
1657  ::std::stringstream ss;
1658  UniversalPrint(123, &ss);
1659  EXPECT_EQ("123", ss.str());
1660 }
1661 
1662 TEST(UniversalPrintTest, WorksForReference) {
1663  const int& n = 123;
1664  ::std::stringstream ss;
1665  UniversalPrint(n, &ss);
1666  EXPECT_EQ("123", ss.str());
1667 }
1668 
1669 TEST(UniversalPrintTest, WorksForCString) {
1670  const char* s1 = "abc";
1671  ::std::stringstream ss1;
1672  UniversalPrint(s1, &ss1);
1673  EXPECT_EQ(PrintPointer(s1) + " pointing to \"abc\"", std::string(ss1.str()));
1674 
1675  char* s2 = const_cast<char*>(s1);
1676  ::std::stringstream ss2;
1677  UniversalPrint(s2, &ss2);
1678  EXPECT_EQ(PrintPointer(s2) + " pointing to \"abc\"", std::string(ss2.str()));
1679 
1680  const char* s3 = nullptr;
1681  ::std::stringstream ss3;
1682  UniversalPrint(s3, &ss3);
1683  EXPECT_EQ("NULL", ss3.str());
1684 }
1685 
1686 TEST(UniversalPrintTest, WorksForCharArray) {
1687  const char str[] = "\"Line\0 1\"\nLine 2";
1688  ::std::stringstream ss1;
1689  UniversalPrint(str, &ss1);
1690  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss1.str());
1691 
1692  const char mutable_str[] = "\"Line\0 1\"\nLine 2";
1693  ::std::stringstream ss2;
1694  UniversalPrint(mutable_str, &ss2);
1695  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss2.str());
1696 }
1697 
1698 TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsEmptyTuple) {
1700  EXPECT_EQ(0u, result.size());
1701 }
1702 
1703 TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsOneTuple) {
1705  ::std::make_tuple(1));
1706  ASSERT_EQ(1u, result.size());
1707  EXPECT_EQ("1", result[0]);
1708 }
1709 
1710 TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTwoTuple) {
1712  ::std::make_tuple(1, 'a'));
1713  ASSERT_EQ(2u, result.size());
1714  EXPECT_EQ("1", result[0]);
1715  EXPECT_EQ("'a' (97, 0x61)", result[1]);
1716 }
1717 
1718 TEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) {
1719  const int n = 1;
1721  ::std::tuple<const int&, const char*>(n, "a"));
1722  ASSERT_EQ(2u, result.size());
1723  EXPECT_EQ("1", result[0]);
1724  EXPECT_EQ("\"a\"", result[1]);
1725 }
1726 
1727 #if GTEST_INTERNAL_HAS_ANY
1728 class PrintAnyTest : public ::testing::Test {
1729  protected:
1730  template <typename T>
1731  static std::string ExpectedTypeName() {
1732 #if GTEST_HAS_RTTI
1733  return internal::GetTypeName<T>();
1734 #else
1735  return "<unknown_type>";
1736 #endif // GTEST_HAS_RTTI
1737  }
1738 };
1739 
1740 TEST_F(PrintAnyTest, Empty) {
1741  internal::Any any;
1742  EXPECT_EQ("no value", PrintToString(any));
1743 }
1744 
1745 TEST_F(PrintAnyTest, NonEmpty) {
1746  internal::Any any;
1747  constexpr int val1 = 10;
1748  const std::string val2 = "content";
1749 
1750  any = val1;
1751  EXPECT_EQ("value of type " + ExpectedTypeName<int>(), PrintToString(any));
1752 
1753  any = val2;
1754  EXPECT_EQ("value of type " + ExpectedTypeName<std::string>(),
1755  PrintToString(any));
1756 }
1757 #endif // GTEST_INTERNAL_HAS_ANY
1758 
1759 #if GTEST_INTERNAL_HAS_OPTIONAL
1760 TEST(PrintOptionalTest, Basic) {
1761  internal::Optional<int> value;
1762  EXPECT_EQ("(nullopt)", PrintToString(value));
1763  value = {7};
1764  EXPECT_EQ("(7)", PrintToString(value));
1765  EXPECT_EQ("(1.1)", PrintToString(internal::Optional<double>{1.1}));
1766  EXPECT_EQ("(\"A\")", PrintToString(internal::Optional<std::string>{"A"}));
1767 }
1768 #endif // GTEST_INTERNAL_HAS_OPTIONAL
1769 
1770 #if GTEST_INTERNAL_HAS_VARIANT
1771 struct NonPrintable {
1772  unsigned char contents = 17;
1773 };
1774 
1775 TEST(PrintOneofTest, Basic) {
1776  using Type = internal::Variant<int, StreamableInGlobal, NonPrintable>;
1777  EXPECT_EQ("('int(index = 0)' with value 7)", PrintToString(Type(7)));
1778  EXPECT_EQ("('StreamableInGlobal(index = 1)' with value StreamableInGlobal)",
1780  EXPECT_EQ(
1781  "('testing::gtest_printers_test::NonPrintable(index = 2)' with value "
1782  "1-byte object <11>)",
1783  PrintToString(Type(NonPrintable{})));
1784 }
1785 #endif // GTEST_INTERNAL_HAS_VARIANT
1786 namespace {
1787 class string_ref;
1788 
1792 class string_ptr {
1793  public:
1794  string_ptr(const char* data, size_t size) : data_(data), size_(size) {}
1795 
1796  string_ptr& operator++() noexcept {
1797  data_ += size_;
1798  return *this;
1799  }
1800 
1801  string_ref operator*() const noexcept;
1802 
1803  private:
1804  const char* data_;
1805  size_t size_;
1806 };
1807 
1811 class string_ref {
1812  public:
1813  string_ref(const char* data, size_t size) : data_(data), size_(size) {}
1814 
1815  string_ptr operator&() const noexcept { return {data_, size_}; } // NOLINT
1816 
1817  bool operator==(const char* s) const noexcept {
1818  if (size_ > 0 && data_[size_ - 1] != 0) {
1819  return std::string(data_, size_) == std::string(s);
1820  } else {
1821  return std::string(data_) == std::string(s);
1822  }
1823  }
1824 
1825  private:
1826  const char* data_;
1827  size_t size_;
1828 };
1829 
1830 string_ref string_ptr::operator*() const noexcept { return {data_, size_}; }
1831 
1832 TEST(string_ref, compare) {
1833  const char* s = "alex\0davidjohn\0";
1834  string_ptr ptr(s, 5);
1835  EXPECT_EQ(*ptr, "alex");
1836  EXPECT_TRUE(*ptr == "alex");
1837  ++ptr;
1838  EXPECT_EQ(*ptr, "david");
1839  EXPECT_TRUE(*ptr == "david");
1840  ++ptr;
1841  EXPECT_EQ(*ptr, "john");
1842 }
1843 
1844 } // namespace
1845 
1846 } // namespace gtest_printers_test
1847 } // namespace testing
xds_interop_client.str
str
Definition: xds_interop_client.py:487
testing::TEST_F
TEST_F(TestInfoTest, Names)
Definition: bloaty/third_party/googletest/googletest/test/gtest_unittest.cc:5305
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
Any
struct Any Any
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:633
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
Type
struct Type Type
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:673
testing
Definition: aws_request_signer_test.cc:25
testing::gtest_printers_test::PrintByRef
std::string PrintByRef(const T &value)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:243
testing::AssertionFailure
AssertionResult AssertionFailure()
Definition: bloaty/third_party/googletest/googletest/src/gtest.cc:1028
grpc::testing::val1
const char val1[]
Definition: client_context_test_peer_test.cc:34
ASSERT_NE
#define ASSERT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2060
foo::PrintableViaPrintToTemplate::PrintableViaPrintToTemplate
PrintableViaPrintToTemplate(const T &a_value)
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:163
regen-readme.it
it
Definition: regen-readme.py:15
foo::PrintTo
void PrintTo(const PrintableViaPrintTo &x, ::std::ostream *os)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:133
grpc_event_engine::experimental::slice_detail::operator==
bool operator==(const BaseSlice &a, const BaseSlice &b)
Definition: include/grpc/event_engine/slice.h:117
const
#define const
Definition: bloaty/third_party/zlib/zconf.h:230
bool
bool
Definition: setup_once.h:312
Map
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:451
foo::PathLike::PathLike
PathLike()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:218
memset
return memset(p, 0, total)
Bool
Definition: bloaty/third_party/googletest/googletest/test/gtest_pred_impl_unittest.cc:56
foo::UnprintableInFoo::UnprintableInFoo
UnprintableInFoo()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:133
foo::StreamableTemplateInFoo::value_
T value_
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:170
std::tr1::make_tuple
tuple make_tuple()
Definition: cares/cares/test/gmock-1.8.0/gtest/gtest.h:1619
EnumWithStreaming
EnumWithStreaming
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:69
testing::gtest_printers_test::Print
std::string Print(const T &value)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:233
string.h
kAE1
@ kAE1
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:59
ChildClassWithStreamOperator
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:96
foo::PathLike::iterator::value_type
PathLike value_type
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:209
testing::internal::FormatForComparisonFailureMessage
std::string FormatForComparisonFailureMessage(const T1 &value, const T2 &)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-printers.h:377
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
u
OPENSSL_EXPORT pem_password_cb void * u
Definition: pem.h:351
foo::PathLike::iterator
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:184
foo
Definition: bloaty/third_party/googletest/googletest/test/googletest-output-test_.cc:546
absl::FormatConversionChar::s
@ s
testing::gtest_printers_test::Foo::~Foo
virtual ~Foo()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:661
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
foo::PathLike::iterator::operator++
iterator & operator++()
data_
const char * data_
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:1804
xds_manager.p
p
Definition: xds_manager.py:60
testing::gtest_printers_test::Big::Big
Big()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:1217
testing::gtest_printers_test::PrintArrayHelper
std::string PrintArrayHelper(T(&a)[N])
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:593
iterator
const typedef MCPhysReg * iterator
Definition: MCRegisterInfo.h:27
map
zval * map
Definition: php/ext/google/protobuf/encode_decode.c:480
AnonymousEnum
AnonymousEnum
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:57
testing::Const
const T & Const(const T &x)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:11004
foo::PrintableViaPrintToTemplate
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:148
foo::UnprintableInFoo
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:118
UnprintableTemplateInGlobal
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:94
T
#define T(upbtypeconst, upbtype, ctype, default_value)
testing::Test
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:402
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
foo::UnprintableInFoo::z
double z() const
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:134
StreamableInGlobal::~StreamableInGlobal
virtual ~StreamableInGlobal()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:117
ParentClass
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:95
foo::PrintableViaPrintToTemplate::value_
T value_
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:154
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
BiggestIntConvertible
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:87
ssize_t
intptr_t ssize_t
Definition: win.h:27
a2
T::first_type a2
Definition: abseil-cpp/absl/container/internal/hash_function_defaults_test.cc:307
xds_interop_client.int
int
Definition: xds_interop_client.py:113
testing::internal::UniversalTersePrint
void UniversalTersePrint(const T &value, ::std::ostream *os)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-printers.h:856
array
Definition: undname.c:101
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
Foo
Definition: abseil-cpp/absl/debugging/symbolize_test.cc:65
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
t0
static int64_t t0
Definition: bloaty/third_party/re2/util/benchmark.cc:44
Type
Definition: bloaty/third_party/protobuf/src/google/protobuf/type.pb.h:182
absl::inlined_vector_internal::ConstIterator
ConstPointer< A > ConstIterator
Definition: abseil-cpp/absl/container/internal/inlined_vector.h:66
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
UnprintableTemplateInGlobal::UnprintableTemplateInGlobal
UnprintableTemplateInGlobal()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:109
grpc::testing::val2
const char val2[]
Definition: client_context_test_peer_test.cc:35
foo::TemplatedStreamableInFoo
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:194
foo::PathLike::begin
iterator begin() const
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:220
ref
unsigned ref
Definition: cxa_demangle.cpp:4909
testing::gtest_printers_test::MyFunction
void MyFunction(int)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:522
operator<<
std::ostream & operator<<(std::ostream &os, EnumWithStreaming e)
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:74
size_
size_t size_
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:1805
foo::operator<<
::std::ostream & operator<<(::std::ostream &os, const PointerPrintable *)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:141
testing::internal::wstring
::std::wstring wstring
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:887
foo::UnprintableInFoo::z_
double z_
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:124
testing::AssertionSuccess
AssertionResult AssertionSuccess()
Definition: bloaty/third_party/googletest/googletest/src/gtest.cc:1023
x
int x
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3610
google::protobuf.internal::StringType
StringType
Definition: bloaty/third_party/protobuf/src/google/protobuf/generated_message_table_driven_lite.h:53
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
foo::PrintableViaPrintTo::PrintableViaPrintTo
PrintableViaPrintTo()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:142
a1
T::first_type a1
Definition: abseil-cpp/absl/container/internal/hash_function_defaults_test.cc:305
min
#define min(a, b)
Definition: qsort.h:83
foo::PrintableViaPrintToTemplate::value
const T & value() const
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:165
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
testing::gtest_printers_test::const_iterator::x
char x
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:953
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
PrintTo
void PrintTo(EnumWithPrintTo e, std::ostream *os)
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:83
Empty
Definition: abseil-cpp/absl/container/internal/compressed_tuple_test.cc:33
testing::Pair
internal::PairMatcher< FirstMatcher, SecondMatcher > Pair(FirstMatcher first_matcher, SecondMatcher second_matcher)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:9152
re2::operator++
static void operator++(Engine &e, int unused)
Definition: bloaty/third_party/re2/re2/testing/tester.h:39
nested
static int nested
Definition: test-callback-stack.c:39
google_benchmark.example.empty
def empty(state)
Definition: example.py:31
testing::gtest_printers_test::HasPrefix
AssertionResult HasPrefix(const StringType &str, const StringType &prefix)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:540
foo::PrintableViaPrintTo
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:128
value
const char * value
Definition: hpack_parser_table.cc:165
EXPECT_STREQ
#define EXPECT_STREQ(s1, s2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2095
foo::PathLike::end
iterator end() const
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:221
testing::internal::BiggestInt
long long BiggestInt
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:1907
contents
string_view contents
Definition: elf.cc:597
foo::StreamableTemplateInFoo
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:164
foo::PathLike::value_type
char value_type
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:191
grpc_core::operator*
Duration operator*(Duration lhs, double rhs)
Definition: src/core/lib/gprpp/time.h:257
testing::gtest_printers_test::iterator::x
char x
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:942
N
#define N
Definition: sync_test.cc:37
EXPECT_PRINT_TO_STRING_
#define EXPECT_PRINT_TO_STRING_(value, expected_string)
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:1504
kEWS1
@ kEWS1
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:71
kEWP1
@ kEWP1
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:65
kAE2
@ kAE2
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:60
L
lua_State * L
Definition: upb/upb/bindings/lua/main.c:35
foo::StreamableTemplateInFoo::StreamableTemplateInFoo
StreamableTemplateInFoo()
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:179
EXPECT_LT
#define EXPECT_LT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2032
EnumWithoutPrinter
EnumWithoutPrinter
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:63
foo::StreamableTemplateInFoo::value
const T & value() const
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:181
prefix
static const char prefix[]
Definition: head_of_line_blocking.cc:28
cpp.gmock_class.set
set
Definition: bloaty/third_party/googletest/googlemock/scripts/generator/cpp/gmock_class.py:44
testing::gtest_printers_test::Foo::value
int value
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:562
foo::PathLike
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:182
foo::PathLike::iterator::operator*
PathLike & operator*()
foo::PrintableViaPrintTo::value
int value
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:130
foo::PathLike::operator<<
friend ::std::ostream & operator<<(::std::ostream &os, const PathLike &)
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:223
absl::inlined_vector_internal::Iterator
Pointer< A > Iterator
Definition: abseil-cpp/absl/container/internal/inlined_vector.h:64
grpc_core::StatusIntProperty::kSize
@ kSize
context sensitive size associated with the error
testing::internal::Strings
::std::vector< ::std::string > Strings
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-printers.h:872
testing::gtest_printers_test::operator<<
std::basic_ostream< Char, CharTraits > & operator<<(std::basic_ostream< Char, CharTraits > &os, const AllowsGenericStreaming &)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:712
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
testing::internal::UniversalTersePrintTupleFieldsToStrings
Strings UniversalTersePrintTupleFieldsToStrings(const Tuple &value)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-printers.h:894
testing::gtest_printers_test::Foo::MyVirtualMethod
virtual char MyVirtualMethod(int)
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:663
StreamableInGlobal
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:102
testing::gtest_printers_test::PrintPointer
static std::string PrintPointer(const void *p)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:380
testing::internal::ImplicitCast_
To ImplicitCast_(To x)
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:1058
ch
char ch
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3621
UnprintableTemplateInGlobal::value_
T value_
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:98
testing::internal::UniversalPrint
void UniversalPrint(const T &value, ::std::ostream *os)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-printers.h:865
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
EnumWithPrintTo
EnumWithPrintTo
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:78
compare
Definition: benchmark/tools/compare.py:1
int32_t
signed int int32_t
Definition: stdint-msvc2008.h:77
Vector
std::vector< T > Vector(size_t count)
Definition: abseil-cpp/absl/hash/hash_benchmark.cc:112
t1
Table t1
Definition: abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc:185
testing::gtest_printers_test::Foo::MyMethod
int MyMethod(char x)
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:662
testing::gtest_printers_test::TEST
TEST(PrintEnumTest, AnonymousEnum)
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:251
pair
std::pair< std::string, std::string > pair
Definition: abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc:78
kEWP2
@ kEWP2
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:66
foo::UnprintableInFoo::xy_
char xy_[8]
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:123
kEWPT1
@ kEWPT1
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:80
absl::operator&
constexpr uint128 operator&(uint128 lhs, uint128 rhs)
Definition: abseil-cpp/absl/numeric/int128.h:866
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
foo::PointerPrintable
Definition: bloaty/third_party/googletest/googletest/test/googletest-printers-test.cc:138
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056
ChildClassWithoutStreamOperator
Definition: boringssl-with-bazel/src/third_party/googletest/test/googletest-printers-test.cc:97
testing::PrintToString
::std::string PrintToString(const T &value)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-printers.h:915


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:42