| OLD | NEW |
| 1 // Copyright 2007, Google Inc. | 1 // Copyright 2007, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 private: | 70 private: |
| 71 T value_; | 71 T value_; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 // A user-defined streamable type in the global namespace. | 74 // A user-defined streamable type in the global namespace. |
| 75 class StreamableInGlobal { | 75 class StreamableInGlobal { |
| 76 public: | 76 public: |
| 77 virtual ~StreamableInGlobal() {} | 77 virtual ~StreamableInGlobal() {} |
| 78 }; | 78 }; |
| 79 | 79 |
| 80 inline void operator<<(::std::ostream& os, const StreamableInGlobal& x) { | 80 inline void operator<<(::std::ostream& os, const StreamableInGlobal& /* x */) { |
| 81 os << "StreamableInGlobal"; | 81 os << "StreamableInGlobal"; |
| 82 } | 82 } |
| 83 | 83 |
| 84 namespace foo { | 84 namespace foo { |
| 85 | 85 |
| 86 // A user-defined unprintable type in a user namespace. | 86 // A user-defined unprintable type in a user namespace. |
| 87 class UnprintableInFoo { | 87 class UnprintableInFoo { |
| 88 public: | 88 public: |
| 89 UnprintableInFoo() : x_(0x12EF), y_(0xAB34), z_(0) {} | 89 UnprintableInFoo() : x_(0x12EF), y_(0xAB34), z_(0) {} |
| 90 private: | 90 private: |
| 91 testing::internal::Int32 x_; | 91 testing::internal::Int32 x_; |
| 92 testing::internal::Int32 y_; | 92 testing::internal::Int32 y_; |
| 93 double z_; | 93 double z_; |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 // A user-defined printable type in a user-chosen namespace. | 96 // A user-defined printable type in a user-chosen namespace. |
| 97 struct PrintableViaPrintTo { | 97 struct PrintableViaPrintTo { |
| 98 PrintableViaPrintTo() : value() {} | 98 PrintableViaPrintTo() : value() {} |
| 99 int value; | 99 int value; |
| 100 }; | 100 }; |
| 101 | 101 |
| 102 void PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) { | 102 void PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) { |
| 103 *os << "PrintableViaPrintTo: " << x.value; | 103 *os << "PrintableViaPrintTo: " << x.value; |
| 104 } | 104 } |
| 105 | 105 |
| 106 // A user-defined printable class template in a user-chosen namespace. | 106 // A user-defined printable class template in a user-chosen namespace. |
| 107 template <typename T> | 107 template <typename T> |
| 108 class PrintableViaPrintToTemplate { | 108 class PrintableViaPrintToTemplate { |
| 109 public: | 109 public: |
| 110 explicit PrintableViaPrintToTemplate(const T& value) : value_(value) {} | 110 explicit PrintableViaPrintToTemplate(const T& a_value) : value_(a_value) {} |
| 111 | 111 |
| 112 const T& value() const { return value_; } | 112 const T& value() const { return value_; } |
| 113 private: | 113 private: |
| 114 T value_; | 114 T value_; |
| 115 }; | 115 }; |
| 116 | 116 |
| 117 template <typename T> | 117 template <typename T> |
| 118 void PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) { | 118 void PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) { |
| 119 *os << "PrintableViaPrintToTemplate: " << x.value(); | 119 *os << "PrintableViaPrintToTemplate: " << x.value(); |
| 120 } | 120 } |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 // Tests printing pointers to pointers. | 433 // Tests printing pointers to pointers. |
| 434 TEST(PrintPointerToPointerTest, IntPointerPointer) { | 434 TEST(PrintPointerToPointerTest, IntPointerPointer) { |
| 435 int** p = reinterpret_cast<int**>(0xABCD); | 435 int** p = reinterpret_cast<int**>(0xABCD); |
| 436 EXPECT_EQ(PrintPointer(p), Print(p)); | 436 EXPECT_EQ(PrintPointer(p), Print(p)); |
| 437 p = NULL; | 437 p = NULL; |
| 438 EXPECT_EQ("NULL", Print(p)); | 438 EXPECT_EQ("NULL", Print(p)); |
| 439 } | 439 } |
| 440 | 440 |
| 441 // Tests printing (non-member) function pointers. | 441 // Tests printing (non-member) function pointers. |
| 442 | 442 |
| 443 void MyFunction(int n) {} | 443 void MyFunction(int /* n */) {} |
| 444 | 444 |
| 445 TEST(PrintPointerTest, NonMemberFunctionPointer) { | 445 TEST(PrintPointerTest, NonMemberFunctionPointer) { |
| 446 EXPECT_EQ(PrintPointer(reinterpret_cast<const void*>(&MyFunction)), | 446 // We cannot directly cast &MyFunction to const void* because the |
| 447 Print(&MyFunction)); | 447 // standard disallows casting between pointers to functions and |
| 448 // pointers to objects, and some compilers (e.g. GCC 3.4) enforce |
| 449 // this limitation. |
| 450 EXPECT_EQ( |
| 451 PrintPointer(reinterpret_cast<const void*>( |
| 452 reinterpret_cast<internal::BiggestInt>(&MyFunction))), |
| 453 Print(&MyFunction)); |
| 448 int (*p)(bool) = NULL; // NOLINT | 454 int (*p)(bool) = NULL; // NOLINT |
| 449 EXPECT_EQ("NULL", Print(p)); | 455 EXPECT_EQ("NULL", Print(p)); |
| 450 } | 456 } |
| 451 | 457 |
| 452 // Tests printing member variable pointers. Although they are called | 458 // Tests printing member variable pointers. Although they are called |
| 453 // pointers, they don't point to a location in the address space. | 459 // pointers, they don't point to a location in the address space. |
| 454 // Their representation is implementation-defined. Thus they will be | 460 // Their representation is implementation-defined. Thus they will be |
| 455 // printed as raw bytes. | 461 // printed as raw bytes. |
| 456 | 462 |
| 457 struct Foo { | 463 struct Foo { |
| 458 public: | 464 public: |
| 459 virtual ~Foo() {} | 465 virtual ~Foo() {} |
| 460 int MyMethod(char x) { return x + 1; } | 466 int MyMethod(char x) { return x + 1; } |
| 461 virtual char MyVirtualMethod(int n) { return 'a'; } | 467 virtual char MyVirtualMethod(int /* n */) { return 'a'; } |
| 462 | 468 |
| 463 int value; | 469 int value; |
| 464 }; | 470 }; |
| 465 | 471 |
| 466 TEST(PrintPointerTest, MemberVariablePointer) { | 472 TEST(PrintPointerTest, MemberVariablePointer) { |
| 467 EXPECT_THAT(Print(&Foo::value), | 473 EXPECT_THAT(Print(&Foo::value), |
| 468 StartsWith(Print(sizeof(&Foo::value)) + "-byte object ")); | 474 StartsWith(Print(sizeof(&Foo::value)) + "-byte object ")); |
| 469 int (Foo::*p) = NULL; // NOLINT | 475 int (Foo::*p) = NULL; // NOLINT |
| 470 EXPECT_THAT(Print(p), | 476 EXPECT_THAT(Print(p), |
| 471 StartsWith(Print(sizeof(p)) + "-byte object ")); | 477 StartsWith(Print(sizeof(p)) + "-byte object ")); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 #if GTEST_HAS_GLOBAL_STRING | 553 #if GTEST_HAS_GLOBAL_STRING |
| 548 // ::string. | 554 // ::string. |
| 549 TEST(PrintStringTest, StringInGlobalNamespace) { | 555 TEST(PrintStringTest, StringInGlobalNamespace) { |
| 550 const char s[] = "'\"\?\\\a\b\f\n\0\r\t\v\x7F\xFF a"; | 556 const char s[] = "'\"\?\\\a\b\f\n\0\r\t\v\x7F\xFF a"; |
| 551 const ::string str(s, sizeof(s)); | 557 const ::string str(s, sizeof(s)); |
| 552 EXPECT_EQ("\"'\\\"\\?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"", | 558 EXPECT_EQ("\"'\\\"\\?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"", |
| 553 Print(str)); | 559 Print(str)); |
| 554 } | 560 } |
| 555 #endif // GTEST_HAS_GLOBAL_STRING | 561 #endif // GTEST_HAS_GLOBAL_STRING |
| 556 | 562 |
| 557 #if GTEST_HAS_STD_STRING | |
| 558 // ::std::string. | 563 // ::std::string. |
| 559 TEST(PrintStringTest, StringInStdNamespace) { | 564 TEST(PrintStringTest, StringInStdNamespace) { |
| 560 const char s[] = "'\"\?\\\a\b\f\n\0\r\t\v\x7F\xFF a"; | 565 const char s[] = "'\"\?\\\a\b\f\n\0\r\t\v\x7F\xFF a"; |
| 561 const ::std::string str(s, sizeof(s)); | 566 const ::std::string str(s, sizeof(s)); |
| 562 EXPECT_EQ("\"'\\\"\\?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"", | 567 EXPECT_EQ("\"'\\\"\\?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"", |
| 563 Print(str)); | 568 Print(str)); |
| 564 } | 569 } |
| 565 #endif // GTEST_HAS_STD_STRING | |
| 566 | 570 |
| 567 // Tests printing ::wstring and ::std::wstring. | 571 // Tests printing ::wstring and ::std::wstring. |
| 568 | 572 |
| 569 #if GTEST_HAS_GLOBAL_WSTRING | 573 #if GTEST_HAS_GLOBAL_WSTRING |
| 570 // ::wstring. | 574 // ::wstring. |
| 571 TEST(PrintWideStringTest, StringInGlobalNamespace) { | 575 TEST(PrintWideStringTest, StringInGlobalNamespace) { |
| 572 const wchar_t s[] = L"'\"\?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a"; | 576 const wchar_t s[] = L"'\"\?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a"; |
| 573 const ::wstring str(s, sizeof(s)/sizeof(wchar_t)); | 577 const ::wstring str(s, sizeof(s)/sizeof(wchar_t)); |
| 574 EXPECT_EQ("L\"'\\\"\\?\\\\\\a\\b\\f\\n\\0\\r\\t\\v" | 578 EXPECT_EQ("L\"'\\\"\\?\\\\\\a\\b\\f\\n\\0\\r\\t\\v" |
| 575 "\\xD3\\x576\\x8D3\\xC74D a\\0\"", | 579 "\\xD3\\x576\\x8D3\\xC74D a\\0\"", |
| (...skipping 16 matching lines...) Expand all Loading... |
| 592 // to std::basic_ostream<Char, CharTraits> for any valid Char and | 596 // to std::basic_ostream<Char, CharTraits> for any valid Char and |
| 593 // CharTraits types). | 597 // CharTraits types). |
| 594 | 598 |
| 595 // Tests printing a non-template type that supports generic streaming. | 599 // Tests printing a non-template type that supports generic streaming. |
| 596 | 600 |
| 597 class AllowsGenericStreaming {}; | 601 class AllowsGenericStreaming {}; |
| 598 | 602 |
| 599 template <typename Char, typename CharTraits> | 603 template <typename Char, typename CharTraits> |
| 600 std::basic_ostream<Char, CharTraits>& operator<<( | 604 std::basic_ostream<Char, CharTraits>& operator<<( |
| 601 std::basic_ostream<Char, CharTraits>& os, | 605 std::basic_ostream<Char, CharTraits>& os, |
| 602 const AllowsGenericStreaming& a) { | 606 const AllowsGenericStreaming& /* a */) { |
| 603 return os << "AllowsGenericStreaming"; | 607 return os << "AllowsGenericStreaming"; |
| 604 } | 608 } |
| 605 | 609 |
| 606 TEST(PrintTypeWithGenericStreamingTest, NonTemplateType) { | 610 TEST(PrintTypeWithGenericStreamingTest, NonTemplateType) { |
| 607 AllowsGenericStreaming a; | 611 AllowsGenericStreaming a; |
| 608 EXPECT_EQ("AllowsGenericStreaming", Print(a)); | 612 EXPECT_EQ("AllowsGenericStreaming", Print(a)); |
| 609 } | 613 } |
| 610 | 614 |
| 611 // Tests printing a template type that supports generic streaming. | 615 // Tests printing a template type that supports generic streaming. |
| 612 | 616 |
| 613 template <typename T> | 617 template <typename T> |
| 614 class AllowsGenericStreamingTemplate {}; | 618 class AllowsGenericStreamingTemplate {}; |
| 615 | 619 |
| 616 template <typename Char, typename CharTraits, typename T> | 620 template <typename Char, typename CharTraits, typename T> |
| 617 std::basic_ostream<Char, CharTraits>& operator<<( | 621 std::basic_ostream<Char, CharTraits>& operator<<( |
| 618 std::basic_ostream<Char, CharTraits>& os, | 622 std::basic_ostream<Char, CharTraits>& os, |
| 619 const AllowsGenericStreamingTemplate<T>& a) { | 623 const AllowsGenericStreamingTemplate<T>& /* a */) { |
| 620 return os << "AllowsGenericStreamingTemplate"; | 624 return os << "AllowsGenericStreamingTemplate"; |
| 621 } | 625 } |
| 622 | 626 |
| 623 TEST(PrintTypeWithGenericStreamingTest, TemplateType) { | 627 TEST(PrintTypeWithGenericStreamingTest, TemplateType) { |
| 624 AllowsGenericStreamingTemplate<int> a; | 628 AllowsGenericStreamingTemplate<int> a; |
| 625 EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a)); | 629 EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a)); |
| 626 } | 630 } |
| 627 | 631 |
| 628 // Tests printing a type that supports generic streaming and can be | 632 // Tests printing a type that supports generic streaming and can be |
| 629 // implicitly converted to another printable type. | 633 // implicitly converted to another printable type. |
| 630 | 634 |
| 631 template <typename T> | 635 template <typename T> |
| 632 class AllowsGenericStreamingAndImplicitConversionTemplate { | 636 class AllowsGenericStreamingAndImplicitConversionTemplate { |
| 633 public: | 637 public: |
| 634 operator bool() const { return false; } | 638 operator bool() const { return false; } |
| 635 }; | 639 }; |
| 636 | 640 |
| 637 template <typename Char, typename CharTraits, typename T> | 641 template <typename Char, typename CharTraits, typename T> |
| 638 std::basic_ostream<Char, CharTraits>& operator<<( | 642 std::basic_ostream<Char, CharTraits>& operator<<( |
| 639 std::basic_ostream<Char, CharTraits>& os, | 643 std::basic_ostream<Char, CharTraits>& os, |
| 640 const AllowsGenericStreamingAndImplicitConversionTemplate<T>& a) { | 644 const AllowsGenericStreamingAndImplicitConversionTemplate<T>& /* a */) { |
| 641 return os << "AllowsGenericStreamingAndImplicitConversionTemplate"; | 645 return os << "AllowsGenericStreamingAndImplicitConversionTemplate"; |
| 642 } | 646 } |
| 643 | 647 |
| 644 TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) { | 648 TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) { |
| 645 AllowsGenericStreamingAndImplicitConversionTemplate<int> a; | 649 AllowsGenericStreamingAndImplicitConversionTemplate<int> a; |
| 646 EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a)); | 650 EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a)); |
| 647 } | 651 } |
| 648 | 652 |
| 649 // Tests printing STL containers. | 653 // Tests printing STL containers. |
| 650 | 654 |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 966 "<EF12 0000 34AB 0000 0000 0000 0000 0000>", | 970 "<EF12 0000 34AB 0000 0000 0000 0000 0000>", |
| 967 PrintByRef(x)); | 971 PrintByRef(x)); |
| 968 } | 972 } |
| 969 | 973 |
| 970 // Tests that the universal printer prints a function pointer passed by | 974 // Tests that the universal printer prints a function pointer passed by |
| 971 // reference. | 975 // reference. |
| 972 TEST(PrintReferenceTest, HandlesFunctionPointer) { | 976 TEST(PrintReferenceTest, HandlesFunctionPointer) { |
| 973 void (*fp)(int n) = &MyFunction; | 977 void (*fp)(int n) = &MyFunction; |
| 974 const string fp_pointer_string = | 978 const string fp_pointer_string = |
| 975 PrintPointer(reinterpret_cast<const void*>(&fp)); | 979 PrintPointer(reinterpret_cast<const void*>(&fp)); |
| 976 const string fp_string = PrintPointer(reinterpret_cast<const void*>(fp)); | 980 // We cannot directly cast &MyFunction to const void* because the |
| 981 // standard disallows casting between pointers to functions and |
| 982 // pointers to objects, and some compilers (e.g. GCC 3.4) enforce |
| 983 // this limitation. |
| 984 const string fp_string = PrintPointer(reinterpret_cast<const void*>( |
| 985 reinterpret_cast<internal::BiggestInt>(fp))); |
| 977 EXPECT_EQ("@" + fp_pointer_string + " " + fp_string, | 986 EXPECT_EQ("@" + fp_pointer_string + " " + fp_string, |
| 978 PrintByRef(fp)); | 987 PrintByRef(fp)); |
| 979 } | 988 } |
| 980 | 989 |
| 981 // Tests that the universal printer prints a member function pointer | 990 // Tests that the universal printer prints a member function pointer |
| 982 // passed by reference. | 991 // passed by reference. |
| 983 TEST(PrintReferenceTest, HandlesMemberFunctionPointer) { | 992 TEST(PrintReferenceTest, HandlesMemberFunctionPointer) { |
| 984 int (Foo::*p)(char ch) = &Foo::MyMethod; | 993 int (Foo::*p)(char ch) = &Foo::MyMethod; |
| 985 EXPECT_THAT(PrintByRef(p), | 994 EXPECT_THAT(PrintByRef(p), |
| 986 StartsWith("@" + PrintPointer(reinterpret_cast<const void*>(&p)) | 995 StartsWith("@" + PrintPointer(reinterpret_cast<const void*>(&p)) |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1094 | 1103 |
| 1095 TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTersely) { | 1104 TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTersely) { |
| 1096 const int n = 1; | 1105 const int n = 1; |
| 1097 EXPECT_THAT(UniversalTersePrintTupleFieldsToStrings( | 1106 EXPECT_THAT(UniversalTersePrintTupleFieldsToStrings( |
| 1098 tuple<const int&, const char*>(n, "a")), | 1107 tuple<const int&, const char*>(n, "a")), |
| 1099 ElementsAre("1", "\"a\"")); | 1108 ElementsAre("1", "\"a\"")); |
| 1100 } | 1109 } |
| 1101 | 1110 |
| 1102 } // namespace gmock_printers_test | 1111 } // namespace gmock_printers_test |
| 1103 } // namespace testing | 1112 } // namespace testing |
| OLD | NEW |