113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com// 3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3113481Sgiacomo.travaglini@arm.com 3213481Sgiacomo.travaglini@arm.com// Google Test - The Google C++ Testing Framework 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This file tests the universal value printer. 3513481Sgiacomo.travaglini@arm.com 3613481Sgiacomo.travaglini@arm.com#include "gtest/gtest-printers.h" 3713481Sgiacomo.travaglini@arm.com 3813481Sgiacomo.travaglini@arm.com#include <ctype.h> 3913481Sgiacomo.travaglini@arm.com#include <limits.h> 4013481Sgiacomo.travaglini@arm.com#include <string.h> 4113481Sgiacomo.travaglini@arm.com#include <algorithm> 4213481Sgiacomo.travaglini@arm.com#include <deque> 4313481Sgiacomo.travaglini@arm.com#include <list> 4413481Sgiacomo.travaglini@arm.com#include <map> 4513481Sgiacomo.travaglini@arm.com#include <set> 4613481Sgiacomo.travaglini@arm.com#include <sstream> 4713481Sgiacomo.travaglini@arm.com#include <string> 4813481Sgiacomo.travaglini@arm.com#include <utility> 4913481Sgiacomo.travaglini@arm.com#include <vector> 5013481Sgiacomo.travaglini@arm.com 5113481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 5213481Sgiacomo.travaglini@arm.com 5313481Sgiacomo.travaglini@arm.com// hash_map and hash_set are available under Visual C++, or on Linux. 5413481Sgiacomo.travaglini@arm.com#if GTEST_HAS_HASH_MAP_ 5513481Sgiacomo.travaglini@arm.com# include <hash_map> // NOLINT 5613481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_HASH_MAP_ 5713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_HASH_SET_ 5813481Sgiacomo.travaglini@arm.com# include <hash_set> // NOLINT 5913481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_HASH_SET_ 6013481Sgiacomo.travaglini@arm.com 6113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FORWARD_LIST_ 6213481Sgiacomo.travaglini@arm.com# include <forward_list> // NOLINT 6313481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_FORWARD_LIST_ 6413481Sgiacomo.travaglini@arm.com 6513481Sgiacomo.travaglini@arm.com// Some user-defined types for testing the universal value printer. 6613481Sgiacomo.travaglini@arm.com 6713481Sgiacomo.travaglini@arm.com// An anonymous enum type. 6813481Sgiacomo.travaglini@arm.comenum AnonymousEnum { 6913481Sgiacomo.travaglini@arm.com kAE1 = -1, 7013481Sgiacomo.travaglini@arm.com kAE2 = 1 7113481Sgiacomo.travaglini@arm.com}; 7213481Sgiacomo.travaglini@arm.com 7313481Sgiacomo.travaglini@arm.com// An enum without a user-defined printer. 7413481Sgiacomo.travaglini@arm.comenum EnumWithoutPrinter { 7513481Sgiacomo.travaglini@arm.com kEWP1 = -2, 7613481Sgiacomo.travaglini@arm.com kEWP2 = 42 7713481Sgiacomo.travaglini@arm.com}; 7813481Sgiacomo.travaglini@arm.com 7913481Sgiacomo.travaglini@arm.com// An enum with a << operator. 8013481Sgiacomo.travaglini@arm.comenum EnumWithStreaming { 8113481Sgiacomo.travaglini@arm.com kEWS1 = 10 8213481Sgiacomo.travaglini@arm.com}; 8313481Sgiacomo.travaglini@arm.com 8413481Sgiacomo.travaglini@arm.comstd::ostream& operator<<(std::ostream& os, EnumWithStreaming e) { 8513481Sgiacomo.travaglini@arm.com return os << (e == kEWS1 ? "kEWS1" : "invalid"); 8613481Sgiacomo.travaglini@arm.com} 8713481Sgiacomo.travaglini@arm.com 8813481Sgiacomo.travaglini@arm.com// An enum with a PrintTo() function. 8913481Sgiacomo.travaglini@arm.comenum EnumWithPrintTo { 9013481Sgiacomo.travaglini@arm.com kEWPT1 = 1 9113481Sgiacomo.travaglini@arm.com}; 9213481Sgiacomo.travaglini@arm.com 9313481Sgiacomo.travaglini@arm.comvoid PrintTo(EnumWithPrintTo e, std::ostream* os) { 9413481Sgiacomo.travaglini@arm.com *os << (e == kEWPT1 ? "kEWPT1" : "invalid"); 9513481Sgiacomo.travaglini@arm.com} 9613481Sgiacomo.travaglini@arm.com 9713481Sgiacomo.travaglini@arm.com// A class implicitly convertible to BiggestInt. 9813481Sgiacomo.travaglini@arm.comclass BiggestIntConvertible { 9913481Sgiacomo.travaglini@arm.com public: 10013481Sgiacomo.travaglini@arm.com operator ::testing::internal::BiggestInt() const { return 42; } 10113481Sgiacomo.travaglini@arm.com}; 10213481Sgiacomo.travaglini@arm.com 10313481Sgiacomo.travaglini@arm.com// A user-defined unprintable class template in the global namespace. 10413481Sgiacomo.travaglini@arm.comtemplate <typename T> 10513481Sgiacomo.travaglini@arm.comclass UnprintableTemplateInGlobal { 10613481Sgiacomo.travaglini@arm.com public: 10713481Sgiacomo.travaglini@arm.com UnprintableTemplateInGlobal() : value_() {} 10813481Sgiacomo.travaglini@arm.com private: 10913481Sgiacomo.travaglini@arm.com T value_; 11013481Sgiacomo.travaglini@arm.com}; 11113481Sgiacomo.travaglini@arm.com 11213481Sgiacomo.travaglini@arm.com// A user-defined streamable type in the global namespace. 11313481Sgiacomo.travaglini@arm.comclass StreamableInGlobal { 11413481Sgiacomo.travaglini@arm.com public: 11513481Sgiacomo.travaglini@arm.com virtual ~StreamableInGlobal() {} 11613481Sgiacomo.travaglini@arm.com}; 11713481Sgiacomo.travaglini@arm.com 11813481Sgiacomo.travaglini@arm.cominline void operator<<(::std::ostream& os, const StreamableInGlobal& /* x */) { 11913481Sgiacomo.travaglini@arm.com os << "StreamableInGlobal"; 12013481Sgiacomo.travaglini@arm.com} 12113481Sgiacomo.travaglini@arm.com 12213481Sgiacomo.travaglini@arm.comvoid operator<<(::std::ostream& os, const StreamableInGlobal* /* x */) { 12313481Sgiacomo.travaglini@arm.com os << "StreamableInGlobal*"; 12413481Sgiacomo.travaglini@arm.com} 12513481Sgiacomo.travaglini@arm.com 12613481Sgiacomo.travaglini@arm.comnamespace foo { 12713481Sgiacomo.travaglini@arm.com 12813481Sgiacomo.travaglini@arm.com// A user-defined unprintable type in a user namespace. 12913481Sgiacomo.travaglini@arm.comclass UnprintableInFoo { 13013481Sgiacomo.travaglini@arm.com public: 13113481Sgiacomo.travaglini@arm.com UnprintableInFoo() : z_(0) { memcpy(xy_, "\xEF\x12\x0\x0\x34\xAB\x0\x0", 8); } 13213481Sgiacomo.travaglini@arm.com double z() const { return z_; } 13313481Sgiacomo.travaglini@arm.com private: 13413481Sgiacomo.travaglini@arm.com char xy_[8]; 13513481Sgiacomo.travaglini@arm.com double z_; 13613481Sgiacomo.travaglini@arm.com}; 13713481Sgiacomo.travaglini@arm.com 13813481Sgiacomo.travaglini@arm.com// A user-defined printable type in a user-chosen namespace. 13913481Sgiacomo.travaglini@arm.comstruct PrintableViaPrintTo { 14013481Sgiacomo.travaglini@arm.com PrintableViaPrintTo() : value() {} 14113481Sgiacomo.travaglini@arm.com int value; 14213481Sgiacomo.travaglini@arm.com}; 14313481Sgiacomo.travaglini@arm.com 14413481Sgiacomo.travaglini@arm.comvoid PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) { 14513481Sgiacomo.travaglini@arm.com *os << "PrintableViaPrintTo: " << x.value; 14613481Sgiacomo.travaglini@arm.com} 14713481Sgiacomo.travaglini@arm.com 14813481Sgiacomo.travaglini@arm.com// A type with a user-defined << for printing its pointer. 14913481Sgiacomo.travaglini@arm.comstruct PointerPrintable { 15013481Sgiacomo.travaglini@arm.com}; 15113481Sgiacomo.travaglini@arm.com 15213481Sgiacomo.travaglini@arm.com::std::ostream& operator<<(::std::ostream& os, 15313481Sgiacomo.travaglini@arm.com const PointerPrintable* /* x */) { 15413481Sgiacomo.travaglini@arm.com return os << "PointerPrintable*"; 15513481Sgiacomo.travaglini@arm.com} 15613481Sgiacomo.travaglini@arm.com 15713481Sgiacomo.travaglini@arm.com// A user-defined printable class template in a user-chosen namespace. 15813481Sgiacomo.travaglini@arm.comtemplate <typename T> 15913481Sgiacomo.travaglini@arm.comclass PrintableViaPrintToTemplate { 16013481Sgiacomo.travaglini@arm.com public: 16113481Sgiacomo.travaglini@arm.com explicit PrintableViaPrintToTemplate(const T& a_value) : value_(a_value) {} 16213481Sgiacomo.travaglini@arm.com 16313481Sgiacomo.travaglini@arm.com const T& value() const { return value_; } 16413481Sgiacomo.travaglini@arm.com private: 16513481Sgiacomo.travaglini@arm.com T value_; 16613481Sgiacomo.travaglini@arm.com}; 16713481Sgiacomo.travaglini@arm.com 16813481Sgiacomo.travaglini@arm.comtemplate <typename T> 16913481Sgiacomo.travaglini@arm.comvoid PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) { 17013481Sgiacomo.travaglini@arm.com *os << "PrintableViaPrintToTemplate: " << x.value(); 17113481Sgiacomo.travaglini@arm.com} 17213481Sgiacomo.travaglini@arm.com 17313481Sgiacomo.travaglini@arm.com// A user-defined streamable class template in a user namespace. 17413481Sgiacomo.travaglini@arm.comtemplate <typename T> 17513481Sgiacomo.travaglini@arm.comclass StreamableTemplateInFoo { 17613481Sgiacomo.travaglini@arm.com public: 17713481Sgiacomo.travaglini@arm.com StreamableTemplateInFoo() : value_() {} 17813481Sgiacomo.travaglini@arm.com 17913481Sgiacomo.travaglini@arm.com const T& value() const { return value_; } 18013481Sgiacomo.travaglini@arm.com private: 18113481Sgiacomo.travaglini@arm.com T value_; 18213481Sgiacomo.travaglini@arm.com}; 18313481Sgiacomo.travaglini@arm.com 18413481Sgiacomo.travaglini@arm.comtemplate <typename T> 18513481Sgiacomo.travaglini@arm.cominline ::std::ostream& operator<<(::std::ostream& os, 18613481Sgiacomo.travaglini@arm.com const StreamableTemplateInFoo<T>& x) { 18713481Sgiacomo.travaglini@arm.com return os << "StreamableTemplateInFoo: " << x.value(); 18813481Sgiacomo.travaglini@arm.com} 18913481Sgiacomo.travaglini@arm.com 19013481Sgiacomo.travaglini@arm.com} // namespace foo 19113481Sgiacomo.travaglini@arm.com 19213481Sgiacomo.travaglini@arm.comnamespace testing { 19313481Sgiacomo.travaglini@arm.comnamespace gtest_printers_test { 19413481Sgiacomo.travaglini@arm.com 19513481Sgiacomo.travaglini@arm.comusing ::std::deque; 19613481Sgiacomo.travaglini@arm.comusing ::std::list; 19713481Sgiacomo.travaglini@arm.comusing ::std::make_pair; 19813481Sgiacomo.travaglini@arm.comusing ::std::map; 19913481Sgiacomo.travaglini@arm.comusing ::std::multimap; 20013481Sgiacomo.travaglini@arm.comusing ::std::multiset; 20113481Sgiacomo.travaglini@arm.comusing ::std::pair; 20213481Sgiacomo.travaglini@arm.comusing ::std::set; 20313481Sgiacomo.travaglini@arm.comusing ::std::vector; 20413481Sgiacomo.travaglini@arm.comusing ::testing::PrintToString; 20513481Sgiacomo.travaglini@arm.comusing ::testing::internal::FormatForComparisonFailureMessage; 20613481Sgiacomo.travaglini@arm.comusing ::testing::internal::ImplicitCast_; 20713481Sgiacomo.travaglini@arm.comusing ::testing::internal::NativeArray; 20813481Sgiacomo.travaglini@arm.comusing ::testing::internal::RE; 20913481Sgiacomo.travaglini@arm.comusing ::testing::internal::RelationToSourceReference; 21013481Sgiacomo.travaglini@arm.comusing ::testing::internal::Strings; 21113481Sgiacomo.travaglini@arm.comusing ::testing::internal::UniversalPrint; 21213481Sgiacomo.travaglini@arm.comusing ::testing::internal::UniversalPrinter; 21313481Sgiacomo.travaglini@arm.comusing ::testing::internal::UniversalTersePrint; 21413481Sgiacomo.travaglini@arm.comusing ::testing::internal::UniversalTersePrintTupleFieldsToStrings; 21513481Sgiacomo.travaglini@arm.comusing ::testing::internal::string; 21613481Sgiacomo.travaglini@arm.com 21713481Sgiacomo.travaglini@arm.com// The hash_* classes are not part of the C++ standard. STLport 21813481Sgiacomo.travaglini@arm.com// defines them in namespace std. MSVC defines them in ::stdext. GCC 21913481Sgiacomo.travaglini@arm.com// defines them in ::. 22013481Sgiacomo.travaglini@arm.com#ifdef _STLP_HASH_MAP // We got <hash_map> from STLport. 22113481Sgiacomo.travaglini@arm.comusing ::std::hash_map; 22213481Sgiacomo.travaglini@arm.comusing ::std::hash_set; 22313481Sgiacomo.travaglini@arm.comusing ::std::hash_multimap; 22413481Sgiacomo.travaglini@arm.comusing ::std::hash_multiset; 22513481Sgiacomo.travaglini@arm.com#elif _MSC_VER 22613481Sgiacomo.travaglini@arm.comusing ::stdext::hash_map; 22713481Sgiacomo.travaglini@arm.comusing ::stdext::hash_set; 22813481Sgiacomo.travaglini@arm.comusing ::stdext::hash_multimap; 22913481Sgiacomo.travaglini@arm.comusing ::stdext::hash_multiset; 23013481Sgiacomo.travaglini@arm.com#endif 23113481Sgiacomo.travaglini@arm.com 23213481Sgiacomo.travaglini@arm.com// Prints a value to a string using the universal value printer. This 23313481Sgiacomo.travaglini@arm.com// is a helper for testing UniversalPrinter<T>::Print() for various types. 23413481Sgiacomo.travaglini@arm.comtemplate <typename T> 23513481Sgiacomo.travaglini@arm.comstring Print(const T& value) { 23613481Sgiacomo.travaglini@arm.com ::std::stringstream ss; 23713481Sgiacomo.travaglini@arm.com UniversalPrinter<T>::Print(value, &ss); 23813481Sgiacomo.travaglini@arm.com return ss.str(); 23913481Sgiacomo.travaglini@arm.com} 24013481Sgiacomo.travaglini@arm.com 24113481Sgiacomo.travaglini@arm.com// Prints a value passed by reference to a string, using the universal 24213481Sgiacomo.travaglini@arm.com// value printer. This is a helper for testing 24313481Sgiacomo.travaglini@arm.com// UniversalPrinter<T&>::Print() for various types. 24413481Sgiacomo.travaglini@arm.comtemplate <typename T> 24513481Sgiacomo.travaglini@arm.comstring PrintByRef(const T& value) { 24613481Sgiacomo.travaglini@arm.com ::std::stringstream ss; 24713481Sgiacomo.travaglini@arm.com UniversalPrinter<T&>::Print(value, &ss); 24813481Sgiacomo.travaglini@arm.com return ss.str(); 24913481Sgiacomo.travaglini@arm.com} 25013481Sgiacomo.travaglini@arm.com 25113481Sgiacomo.travaglini@arm.com// Tests printing various enum types. 25213481Sgiacomo.travaglini@arm.com 25313481Sgiacomo.travaglini@arm.comTEST(PrintEnumTest, AnonymousEnum) { 25413481Sgiacomo.travaglini@arm.com EXPECT_EQ("-1", Print(kAE1)); 25513481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", Print(kAE2)); 25613481Sgiacomo.travaglini@arm.com} 25713481Sgiacomo.travaglini@arm.com 25813481Sgiacomo.travaglini@arm.comTEST(PrintEnumTest, EnumWithoutPrinter) { 25913481Sgiacomo.travaglini@arm.com EXPECT_EQ("-2", Print(kEWP1)); 26013481Sgiacomo.travaglini@arm.com EXPECT_EQ("42", Print(kEWP2)); 26113481Sgiacomo.travaglini@arm.com} 26213481Sgiacomo.travaglini@arm.com 26313481Sgiacomo.travaglini@arm.comTEST(PrintEnumTest, EnumWithStreaming) { 26413481Sgiacomo.travaglini@arm.com EXPECT_EQ("kEWS1", Print(kEWS1)); 26513481Sgiacomo.travaglini@arm.com EXPECT_EQ("invalid", Print(static_cast<EnumWithStreaming>(0))); 26613481Sgiacomo.travaglini@arm.com} 26713481Sgiacomo.travaglini@arm.com 26813481Sgiacomo.travaglini@arm.comTEST(PrintEnumTest, EnumWithPrintTo) { 26913481Sgiacomo.travaglini@arm.com EXPECT_EQ("kEWPT1", Print(kEWPT1)); 27013481Sgiacomo.travaglini@arm.com EXPECT_EQ("invalid", Print(static_cast<EnumWithPrintTo>(0))); 27113481Sgiacomo.travaglini@arm.com} 27213481Sgiacomo.travaglini@arm.com 27313481Sgiacomo.travaglini@arm.com// Tests printing a class implicitly convertible to BiggestInt. 27413481Sgiacomo.travaglini@arm.com 27513481Sgiacomo.travaglini@arm.comTEST(PrintClassTest, BiggestIntConvertible) { 27613481Sgiacomo.travaglini@arm.com EXPECT_EQ("42", Print(BiggestIntConvertible())); 27713481Sgiacomo.travaglini@arm.com} 27813481Sgiacomo.travaglini@arm.com 27913481Sgiacomo.travaglini@arm.com// Tests printing various char types. 28013481Sgiacomo.travaglini@arm.com 28113481Sgiacomo.travaglini@arm.com// char. 28213481Sgiacomo.travaglini@arm.comTEST(PrintCharTest, PlainChar) { 28313481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\0'", Print('\0')); 28413481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\'' (39, 0x27)", Print('\'')); 28513481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\"' (34, 0x22)", Print('"')); 28613481Sgiacomo.travaglini@arm.com EXPECT_EQ("'?' (63, 0x3F)", Print('?')); 28713481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\\\' (92, 0x5C)", Print('\\')); 28813481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\a' (7)", Print('\a')); 28913481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\b' (8)", Print('\b')); 29013481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\f' (12, 0xC)", Print('\f')); 29113481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\n' (10, 0xA)", Print('\n')); 29213481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\r' (13, 0xD)", Print('\r')); 29313481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\t' (9)", Print('\t')); 29413481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\v' (11, 0xB)", Print('\v')); 29513481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\x7F' (127)", Print('\x7F')); 29613481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\xFF' (255)", Print('\xFF')); 29713481Sgiacomo.travaglini@arm.com EXPECT_EQ("' ' (32, 0x20)", Print(' ')); 29813481Sgiacomo.travaglini@arm.com EXPECT_EQ("'a' (97, 0x61)", Print('a')); 29913481Sgiacomo.travaglini@arm.com} 30013481Sgiacomo.travaglini@arm.com 30113481Sgiacomo.travaglini@arm.com// signed char. 30213481Sgiacomo.travaglini@arm.comTEST(PrintCharTest, SignedChar) { 30313481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\0'", Print(static_cast<signed char>('\0'))); 30413481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\xCE' (-50)", 30513481Sgiacomo.travaglini@arm.com Print(static_cast<signed char>(-50))); 30613481Sgiacomo.travaglini@arm.com} 30713481Sgiacomo.travaglini@arm.com 30813481Sgiacomo.travaglini@arm.com// unsigned char. 30913481Sgiacomo.travaglini@arm.comTEST(PrintCharTest, UnsignedChar) { 31013481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\0'", Print(static_cast<unsigned char>('\0'))); 31113481Sgiacomo.travaglini@arm.com EXPECT_EQ("'b' (98, 0x62)", 31213481Sgiacomo.travaglini@arm.com Print(static_cast<unsigned char>('b'))); 31313481Sgiacomo.travaglini@arm.com} 31413481Sgiacomo.travaglini@arm.com 31513481Sgiacomo.travaglini@arm.com// Tests printing other simple, built-in types. 31613481Sgiacomo.travaglini@arm.com 31713481Sgiacomo.travaglini@arm.com// bool. 31813481Sgiacomo.travaglini@arm.comTEST(PrintBuiltInTypeTest, Bool) { 31913481Sgiacomo.travaglini@arm.com EXPECT_EQ("false", Print(false)); 32013481Sgiacomo.travaglini@arm.com EXPECT_EQ("true", Print(true)); 32113481Sgiacomo.travaglini@arm.com} 32213481Sgiacomo.travaglini@arm.com 32313481Sgiacomo.travaglini@arm.com// wchar_t. 32413481Sgiacomo.travaglini@arm.comTEST(PrintBuiltInTypeTest, Wchar_t) { 32513481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\0'", Print(L'\0')); 32613481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\'' (39, 0x27)", Print(L'\'')); 32713481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\"' (34, 0x22)", Print(L'"')); 32813481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'?' (63, 0x3F)", Print(L'?')); 32913481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\\\' (92, 0x5C)", Print(L'\\')); 33013481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\a' (7)", Print(L'\a')); 33113481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\b' (8)", Print(L'\b')); 33213481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\f' (12, 0xC)", Print(L'\f')); 33313481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\n' (10, 0xA)", Print(L'\n')); 33413481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\r' (13, 0xD)", Print(L'\r')); 33513481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\t' (9)", Print(L'\t')); 33613481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\v' (11, 0xB)", Print(L'\v')); 33713481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\x7F' (127)", Print(L'\x7F')); 33813481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\xFF' (255)", Print(L'\xFF')); 33913481Sgiacomo.travaglini@arm.com EXPECT_EQ("L' ' (32, 0x20)", Print(L' ')); 34013481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'a' (97, 0x61)", Print(L'a')); 34113481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\x576' (1398)", Print(static_cast<wchar_t>(0x576))); 34213481Sgiacomo.travaglini@arm.com EXPECT_EQ("L'\\xC74D' (51021)", Print(static_cast<wchar_t>(0xC74D))); 34313481Sgiacomo.travaglini@arm.com} 34413481Sgiacomo.travaglini@arm.com 34513481Sgiacomo.travaglini@arm.com// Test that Int64 provides more storage than wchar_t. 34613481Sgiacomo.travaglini@arm.comTEST(PrintTypeSizeTest, Wchar_t) { 34713481Sgiacomo.travaglini@arm.com EXPECT_LT(sizeof(wchar_t), sizeof(testing::internal::Int64)); 34813481Sgiacomo.travaglini@arm.com} 34913481Sgiacomo.travaglini@arm.com 35013481Sgiacomo.travaglini@arm.com// Various integer types. 35113481Sgiacomo.travaglini@arm.comTEST(PrintBuiltInTypeTest, Integer) { 35213481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\xFF' (255)", Print(static_cast<unsigned char>(255))); // uint8 35313481Sgiacomo.travaglini@arm.com EXPECT_EQ("'\\x80' (-128)", Print(static_cast<signed char>(-128))); // int8 35413481Sgiacomo.travaglini@arm.com EXPECT_EQ("65535", Print(USHRT_MAX)); // uint16 35513481Sgiacomo.travaglini@arm.com EXPECT_EQ("-32768", Print(SHRT_MIN)); // int16 35613481Sgiacomo.travaglini@arm.com EXPECT_EQ("4294967295", Print(UINT_MAX)); // uint32 35713481Sgiacomo.travaglini@arm.com EXPECT_EQ("-2147483648", Print(INT_MIN)); // int32 35813481Sgiacomo.travaglini@arm.com EXPECT_EQ("18446744073709551615", 35913481Sgiacomo.travaglini@arm.com Print(static_cast<testing::internal::UInt64>(-1))); // uint64 36013481Sgiacomo.travaglini@arm.com EXPECT_EQ("-9223372036854775808", 36113481Sgiacomo.travaglini@arm.com Print(static_cast<testing::internal::Int64>(1) << 63)); // int64 36213481Sgiacomo.travaglini@arm.com} 36313481Sgiacomo.travaglini@arm.com 36413481Sgiacomo.travaglini@arm.com// Size types. 36513481Sgiacomo.travaglini@arm.comTEST(PrintBuiltInTypeTest, Size_t) { 36613481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", Print(sizeof('a'))); // size_t. 36713481Sgiacomo.travaglini@arm.com#if !GTEST_OS_WINDOWS 36813481Sgiacomo.travaglini@arm.com // Windows has no ssize_t type. 36913481Sgiacomo.travaglini@arm.com EXPECT_EQ("-2", Print(static_cast<ssize_t>(-2))); // ssize_t. 37013481Sgiacomo.travaglini@arm.com#endif // !GTEST_OS_WINDOWS 37113481Sgiacomo.travaglini@arm.com} 37213481Sgiacomo.travaglini@arm.com 37313481Sgiacomo.travaglini@arm.com// Floating-points. 37413481Sgiacomo.travaglini@arm.comTEST(PrintBuiltInTypeTest, FloatingPoints) { 37513481Sgiacomo.travaglini@arm.com EXPECT_EQ("1.5", Print(1.5f)); // float 37613481Sgiacomo.travaglini@arm.com EXPECT_EQ("-2.5", Print(-2.5)); // double 37713481Sgiacomo.travaglini@arm.com} 37813481Sgiacomo.travaglini@arm.com 37913481Sgiacomo.travaglini@arm.com// Since ::std::stringstream::operator<<(const void *) formats the pointer 38013481Sgiacomo.travaglini@arm.com// output differently with different compilers, we have to create the expected 38113481Sgiacomo.travaglini@arm.com// output first and use it as our expectation. 38213481Sgiacomo.travaglini@arm.comstatic string PrintPointer(const void *p) { 38313481Sgiacomo.travaglini@arm.com ::std::stringstream expected_result_stream; 38413481Sgiacomo.travaglini@arm.com expected_result_stream << p; 38513481Sgiacomo.travaglini@arm.com return expected_result_stream.str(); 38613481Sgiacomo.travaglini@arm.com} 38713481Sgiacomo.travaglini@arm.com 38813481Sgiacomo.travaglini@arm.com// Tests printing C strings. 38913481Sgiacomo.travaglini@arm.com 39013481Sgiacomo.travaglini@arm.com// const char*. 39113481Sgiacomo.travaglini@arm.comTEST(PrintCStringTest, Const) { 39213481Sgiacomo.travaglini@arm.com const char* p = "World"; 39313481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p) + " pointing to \"World\"", Print(p)); 39413481Sgiacomo.travaglini@arm.com} 39513481Sgiacomo.travaglini@arm.com 39613481Sgiacomo.travaglini@arm.com// char*. 39713481Sgiacomo.travaglini@arm.comTEST(PrintCStringTest, NonConst) { 39813481Sgiacomo.travaglini@arm.com char p[] = "Hi"; 39913481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p) + " pointing to \"Hi\"", 40013481Sgiacomo.travaglini@arm.com Print(static_cast<char*>(p))); 40113481Sgiacomo.travaglini@arm.com} 40213481Sgiacomo.travaglini@arm.com 40313481Sgiacomo.travaglini@arm.com// NULL C string. 40413481Sgiacomo.travaglini@arm.comTEST(PrintCStringTest, Null) { 40513481Sgiacomo.travaglini@arm.com const char* p = NULL; 40613481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 40713481Sgiacomo.travaglini@arm.com} 40813481Sgiacomo.travaglini@arm.com 40913481Sgiacomo.travaglini@arm.com// Tests that C strings are escaped properly. 41013481Sgiacomo.travaglini@arm.comTEST(PrintCStringTest, EscapesProperly) { 41113481Sgiacomo.travaglini@arm.com const char* p = "'\"?\\\a\b\f\n\r\t\v\x7F\xFF a"; 41213481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p) + " pointing to \"'\\\"?\\\\\\a\\b\\f" 41313481Sgiacomo.travaglini@arm.com "\\n\\r\\t\\v\\x7F\\xFF a\"", 41413481Sgiacomo.travaglini@arm.com Print(p)); 41513481Sgiacomo.travaglini@arm.com} 41613481Sgiacomo.travaglini@arm.com 41713481Sgiacomo.travaglini@arm.com// MSVC compiler can be configured to define whar_t as a typedef 41813481Sgiacomo.travaglini@arm.com// of unsigned short. Defining an overload for const wchar_t* in that case 41913481Sgiacomo.travaglini@arm.com// would cause pointers to unsigned shorts be printed as wide strings, 42013481Sgiacomo.travaglini@arm.com// possibly accessing more memory than intended and causing invalid 42113481Sgiacomo.travaglini@arm.com// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when 42213481Sgiacomo.travaglini@arm.com// wchar_t is implemented as a native type. 42313481Sgiacomo.travaglini@arm.com#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) 42413481Sgiacomo.travaglini@arm.com 42513481Sgiacomo.travaglini@arm.com// const wchar_t*. 42613481Sgiacomo.travaglini@arm.comTEST(PrintWideCStringTest, Const) { 42713481Sgiacomo.travaglini@arm.com const wchar_t* p = L"World"; 42813481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p) + " pointing to L\"World\"", Print(p)); 42913481Sgiacomo.travaglini@arm.com} 43013481Sgiacomo.travaglini@arm.com 43113481Sgiacomo.travaglini@arm.com// wchar_t*. 43213481Sgiacomo.travaglini@arm.comTEST(PrintWideCStringTest, NonConst) { 43313481Sgiacomo.travaglini@arm.com wchar_t p[] = L"Hi"; 43413481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p) + " pointing to L\"Hi\"", 43513481Sgiacomo.travaglini@arm.com Print(static_cast<wchar_t*>(p))); 43613481Sgiacomo.travaglini@arm.com} 43713481Sgiacomo.travaglini@arm.com 43813481Sgiacomo.travaglini@arm.com// NULL wide C string. 43913481Sgiacomo.travaglini@arm.comTEST(PrintWideCStringTest, Null) { 44013481Sgiacomo.travaglini@arm.com const wchar_t* p = NULL; 44113481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 44213481Sgiacomo.travaglini@arm.com} 44313481Sgiacomo.travaglini@arm.com 44413481Sgiacomo.travaglini@arm.com// Tests that wide C strings are escaped properly. 44513481Sgiacomo.travaglini@arm.comTEST(PrintWideCStringTest, EscapesProperly) { 44613481Sgiacomo.travaglini@arm.com const wchar_t s[] = {'\'', '"', '?', '\\', '\a', '\b', '\f', '\n', '\r', 44713481Sgiacomo.travaglini@arm.com '\t', '\v', 0xD3, 0x576, 0x8D3, 0xC74D, ' ', 'a', '\0'}; 44813481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(s) + " pointing to L\"'\\\"?\\\\\\a\\b\\f" 44913481Sgiacomo.travaglini@arm.com "\\n\\r\\t\\v\\xD3\\x576\\x8D3\\xC74D a\"", 45013481Sgiacomo.travaglini@arm.com Print(static_cast<const wchar_t*>(s))); 45113481Sgiacomo.travaglini@arm.com} 45213481Sgiacomo.travaglini@arm.com#endif // native wchar_t 45313481Sgiacomo.travaglini@arm.com 45413481Sgiacomo.travaglini@arm.com// Tests printing pointers to other char types. 45513481Sgiacomo.travaglini@arm.com 45613481Sgiacomo.travaglini@arm.com// signed char*. 45713481Sgiacomo.travaglini@arm.comTEST(PrintCharPointerTest, SignedChar) { 45813481Sgiacomo.travaglini@arm.com signed char* p = reinterpret_cast<signed char*>(0x1234); 45913481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 46013481Sgiacomo.travaglini@arm.com p = NULL; 46113481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 46213481Sgiacomo.travaglini@arm.com} 46313481Sgiacomo.travaglini@arm.com 46413481Sgiacomo.travaglini@arm.com// const signed char*. 46513481Sgiacomo.travaglini@arm.comTEST(PrintCharPointerTest, ConstSignedChar) { 46613481Sgiacomo.travaglini@arm.com signed char* p = reinterpret_cast<signed char*>(0x1234); 46713481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 46813481Sgiacomo.travaglini@arm.com p = NULL; 46913481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 47013481Sgiacomo.travaglini@arm.com} 47113481Sgiacomo.travaglini@arm.com 47213481Sgiacomo.travaglini@arm.com// unsigned char*. 47313481Sgiacomo.travaglini@arm.comTEST(PrintCharPointerTest, UnsignedChar) { 47413481Sgiacomo.travaglini@arm.com unsigned char* p = reinterpret_cast<unsigned char*>(0x1234); 47513481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 47613481Sgiacomo.travaglini@arm.com p = NULL; 47713481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 47813481Sgiacomo.travaglini@arm.com} 47913481Sgiacomo.travaglini@arm.com 48013481Sgiacomo.travaglini@arm.com// const unsigned char*. 48113481Sgiacomo.travaglini@arm.comTEST(PrintCharPointerTest, ConstUnsignedChar) { 48213481Sgiacomo.travaglini@arm.com const unsigned char* p = reinterpret_cast<const unsigned char*>(0x1234); 48313481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 48413481Sgiacomo.travaglini@arm.com p = NULL; 48513481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 48613481Sgiacomo.travaglini@arm.com} 48713481Sgiacomo.travaglini@arm.com 48813481Sgiacomo.travaglini@arm.com// Tests printing pointers to simple, built-in types. 48913481Sgiacomo.travaglini@arm.com 49013481Sgiacomo.travaglini@arm.com// bool*. 49113481Sgiacomo.travaglini@arm.comTEST(PrintPointerToBuiltInTypeTest, Bool) { 49213481Sgiacomo.travaglini@arm.com bool* p = reinterpret_cast<bool*>(0xABCD); 49313481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 49413481Sgiacomo.travaglini@arm.com p = NULL; 49513481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 49613481Sgiacomo.travaglini@arm.com} 49713481Sgiacomo.travaglini@arm.com 49813481Sgiacomo.travaglini@arm.com// void*. 49913481Sgiacomo.travaglini@arm.comTEST(PrintPointerToBuiltInTypeTest, Void) { 50013481Sgiacomo.travaglini@arm.com void* p = reinterpret_cast<void*>(0xABCD); 50113481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 50213481Sgiacomo.travaglini@arm.com p = NULL; 50313481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 50413481Sgiacomo.travaglini@arm.com} 50513481Sgiacomo.travaglini@arm.com 50613481Sgiacomo.travaglini@arm.com// const void*. 50713481Sgiacomo.travaglini@arm.comTEST(PrintPointerToBuiltInTypeTest, ConstVoid) { 50813481Sgiacomo.travaglini@arm.com const void* p = reinterpret_cast<const void*>(0xABCD); 50913481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 51013481Sgiacomo.travaglini@arm.com p = NULL; 51113481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 51213481Sgiacomo.travaglini@arm.com} 51313481Sgiacomo.travaglini@arm.com 51413481Sgiacomo.travaglini@arm.com// Tests printing pointers to pointers. 51513481Sgiacomo.travaglini@arm.comTEST(PrintPointerToPointerTest, IntPointerPointer) { 51613481Sgiacomo.travaglini@arm.com int** p = reinterpret_cast<int**>(0xABCD); 51713481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(p), Print(p)); 51813481Sgiacomo.travaglini@arm.com p = NULL; 51913481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 52013481Sgiacomo.travaglini@arm.com} 52113481Sgiacomo.travaglini@arm.com 52213481Sgiacomo.travaglini@arm.com// Tests printing (non-member) function pointers. 52313481Sgiacomo.travaglini@arm.com 52413481Sgiacomo.travaglini@arm.comvoid MyFunction(int /* n */) {} 52513481Sgiacomo.travaglini@arm.com 52613481Sgiacomo.travaglini@arm.comTEST(PrintPointerTest, NonMemberFunctionPointer) { 52713481Sgiacomo.travaglini@arm.com // We cannot directly cast &MyFunction to const void* because the 52813481Sgiacomo.travaglini@arm.com // standard disallows casting between pointers to functions and 52913481Sgiacomo.travaglini@arm.com // pointers to objects, and some compilers (e.g. GCC 3.4) enforce 53013481Sgiacomo.travaglini@arm.com // this limitation. 53113481Sgiacomo.travaglini@arm.com EXPECT_EQ( 53213481Sgiacomo.travaglini@arm.com PrintPointer(reinterpret_cast<const void*>( 53313481Sgiacomo.travaglini@arm.com reinterpret_cast<internal::BiggestInt>(&MyFunction))), 53413481Sgiacomo.travaglini@arm.com Print(&MyFunction)); 53513481Sgiacomo.travaglini@arm.com int (*p)(bool) = NULL; // NOLINT 53613481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", Print(p)); 53713481Sgiacomo.travaglini@arm.com} 53813481Sgiacomo.travaglini@arm.com 53913481Sgiacomo.travaglini@arm.com// An assertion predicate determining whether a one string is a prefix for 54013481Sgiacomo.travaglini@arm.com// another. 54113481Sgiacomo.travaglini@arm.comtemplate <typename StringType> 54213481Sgiacomo.travaglini@arm.comAssertionResult HasPrefix(const StringType& str, const StringType& prefix) { 54313481Sgiacomo.travaglini@arm.com if (str.find(prefix, 0) == 0) 54413481Sgiacomo.travaglini@arm.com return AssertionSuccess(); 54513481Sgiacomo.travaglini@arm.com 54613481Sgiacomo.travaglini@arm.com const bool is_wide_string = sizeof(prefix[0]) > 1; 54713481Sgiacomo.travaglini@arm.com const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; 54813481Sgiacomo.travaglini@arm.com return AssertionFailure() 54913481Sgiacomo.travaglini@arm.com << begin_string_quote << prefix << "\" is not a prefix of " 55013481Sgiacomo.travaglini@arm.com << begin_string_quote << str << "\"\n"; 55113481Sgiacomo.travaglini@arm.com} 55213481Sgiacomo.travaglini@arm.com 55313481Sgiacomo.travaglini@arm.com// Tests printing member variable pointers. Although they are called 55413481Sgiacomo.travaglini@arm.com// pointers, they don't point to a location in the address space. 55513481Sgiacomo.travaglini@arm.com// Their representation is implementation-defined. Thus they will be 55613481Sgiacomo.travaglini@arm.com// printed as raw bytes. 55713481Sgiacomo.travaglini@arm.com 55813481Sgiacomo.travaglini@arm.comstruct Foo { 55913481Sgiacomo.travaglini@arm.com public: 56013481Sgiacomo.travaglini@arm.com virtual ~Foo() {} 56113481Sgiacomo.travaglini@arm.com int MyMethod(char x) { return x + 1; } 56213481Sgiacomo.travaglini@arm.com virtual char MyVirtualMethod(int /* n */) { return 'a'; } 56313481Sgiacomo.travaglini@arm.com 56413481Sgiacomo.travaglini@arm.com int value; 56513481Sgiacomo.travaglini@arm.com}; 56613481Sgiacomo.travaglini@arm.com 56713481Sgiacomo.travaglini@arm.comTEST(PrintPointerTest, MemberVariablePointer) { 56813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(HasPrefix(Print(&Foo::value), 56913481Sgiacomo.travaglini@arm.com Print(sizeof(&Foo::value)) + "-byte object ")); 57013481Sgiacomo.travaglini@arm.com int (Foo::*p) = NULL; // NOLINT 57113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(HasPrefix(Print(p), 57213481Sgiacomo.travaglini@arm.com Print(sizeof(p)) + "-byte object ")); 57313481Sgiacomo.travaglini@arm.com} 57413481Sgiacomo.travaglini@arm.com 57513481Sgiacomo.travaglini@arm.com// Tests printing member function pointers. Although they are called 57613481Sgiacomo.travaglini@arm.com// pointers, they don't point to a location in the address space. 57713481Sgiacomo.travaglini@arm.com// Their representation is implementation-defined. Thus they will be 57813481Sgiacomo.travaglini@arm.com// printed as raw bytes. 57913481Sgiacomo.travaglini@arm.comTEST(PrintPointerTest, MemberFunctionPointer) { 58013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(HasPrefix(Print(&Foo::MyMethod), 58113481Sgiacomo.travaglini@arm.com Print(sizeof(&Foo::MyMethod)) + "-byte object ")); 58213481Sgiacomo.travaglini@arm.com EXPECT_TRUE( 58313481Sgiacomo.travaglini@arm.com HasPrefix(Print(&Foo::MyVirtualMethod), 58413481Sgiacomo.travaglini@arm.com Print(sizeof((&Foo::MyVirtualMethod))) + "-byte object ")); 58513481Sgiacomo.travaglini@arm.com int (Foo::*p)(char) = NULL; // NOLINT 58613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(HasPrefix(Print(p), 58713481Sgiacomo.travaglini@arm.com Print(sizeof(p)) + "-byte object ")); 58813481Sgiacomo.travaglini@arm.com} 58913481Sgiacomo.travaglini@arm.com 59013481Sgiacomo.travaglini@arm.com// Tests printing C arrays. 59113481Sgiacomo.travaglini@arm.com 59213481Sgiacomo.travaglini@arm.com// The difference between this and Print() is that it ensures that the 59313481Sgiacomo.travaglini@arm.com// argument is a reference to an array. 59413481Sgiacomo.travaglini@arm.comtemplate <typename T, size_t N> 59513481Sgiacomo.travaglini@arm.comstring PrintArrayHelper(T (&a)[N]) { 59613481Sgiacomo.travaglini@arm.com return Print(a); 59713481Sgiacomo.travaglini@arm.com} 59813481Sgiacomo.travaglini@arm.com 59913481Sgiacomo.travaglini@arm.com// One-dimensional array. 60013481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, OneDimensionalArray) { 60113481Sgiacomo.travaglini@arm.com int a[5] = { 1, 2, 3, 4, 5 }; 60213481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 1, 2, 3, 4, 5 }", PrintArrayHelper(a)); 60313481Sgiacomo.travaglini@arm.com} 60413481Sgiacomo.travaglini@arm.com 60513481Sgiacomo.travaglini@arm.com// Two-dimensional array. 60613481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, TwoDimensionalArray) { 60713481Sgiacomo.travaglini@arm.com int a[2][5] = { 60813481Sgiacomo.travaglini@arm.com { 1, 2, 3, 4, 5 }, 60913481Sgiacomo.travaglini@arm.com { 6, 7, 8, 9, 0 } 61013481Sgiacomo.travaglini@arm.com }; 61113481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 0 } }", PrintArrayHelper(a)); 61213481Sgiacomo.travaglini@arm.com} 61313481Sgiacomo.travaglini@arm.com 61413481Sgiacomo.travaglini@arm.com// Array of const elements. 61513481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, ConstArray) { 61613481Sgiacomo.travaglini@arm.com const bool a[1] = { false }; 61713481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ false }", PrintArrayHelper(a)); 61813481Sgiacomo.travaglini@arm.com} 61913481Sgiacomo.travaglini@arm.com 62013481Sgiacomo.travaglini@arm.com// char array without terminating NUL. 62113481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, CharArrayWithNoTerminatingNul) { 62213481Sgiacomo.travaglini@arm.com // Array a contains '\0' in the middle and doesn't end with '\0'. 62313481Sgiacomo.travaglini@arm.com char a[] = { 'H', '\0', 'i' }; 62413481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a)); 62513481Sgiacomo.travaglini@arm.com} 62613481Sgiacomo.travaglini@arm.com 62713481Sgiacomo.travaglini@arm.com// const char array with terminating NUL. 62813481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, ConstCharArrayWithTerminatingNul) { 62913481Sgiacomo.travaglini@arm.com const char a[] = "\0Hi"; 63013481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"\\0Hi\"", PrintArrayHelper(a)); 63113481Sgiacomo.travaglini@arm.com} 63213481Sgiacomo.travaglini@arm.com 63313481Sgiacomo.travaglini@arm.com// const wchar_t array without terminating NUL. 63413481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, WCharArrayWithNoTerminatingNul) { 63513481Sgiacomo.travaglini@arm.com // Array a contains '\0' in the middle and doesn't end with '\0'. 63613481Sgiacomo.travaglini@arm.com const wchar_t a[] = { L'H', L'\0', L'i' }; 63713481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a)); 63813481Sgiacomo.travaglini@arm.com} 63913481Sgiacomo.travaglini@arm.com 64013481Sgiacomo.travaglini@arm.com// wchar_t array with terminating NUL. 64113481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, WConstCharArrayWithTerminatingNul) { 64213481Sgiacomo.travaglini@arm.com const wchar_t a[] = L"\0Hi"; 64313481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"\\0Hi\"", PrintArrayHelper(a)); 64413481Sgiacomo.travaglini@arm.com} 64513481Sgiacomo.travaglini@arm.com 64613481Sgiacomo.travaglini@arm.com// Array of objects. 64713481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, ObjectArray) { 64813481Sgiacomo.travaglini@arm.com string a[3] = { "Hi", "Hello", "Ni hao" }; 64913481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ \"Hi\", \"Hello\", \"Ni hao\" }", PrintArrayHelper(a)); 65013481Sgiacomo.travaglini@arm.com} 65113481Sgiacomo.travaglini@arm.com 65213481Sgiacomo.travaglini@arm.com// Array with many elements. 65313481Sgiacomo.travaglini@arm.comTEST(PrintArrayTest, BigArray) { 65413481Sgiacomo.travaglini@arm.com int a[100] = { 1, 2, 3 }; 65513481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0, 0, 0, 0, 0 }", 65613481Sgiacomo.travaglini@arm.com PrintArrayHelper(a)); 65713481Sgiacomo.travaglini@arm.com} 65813481Sgiacomo.travaglini@arm.com 65913481Sgiacomo.travaglini@arm.com// Tests printing ::string and ::std::string. 66013481Sgiacomo.travaglini@arm.com 66113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_STRING 66213481Sgiacomo.travaglini@arm.com// ::string. 66313481Sgiacomo.travaglini@arm.comTEST(PrintStringTest, StringInGlobalNamespace) { 66413481Sgiacomo.travaglini@arm.com const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a"; 66513481Sgiacomo.travaglini@arm.com const ::string str(s, sizeof(s)); 66613481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"", 66713481Sgiacomo.travaglini@arm.com Print(str)); 66813481Sgiacomo.travaglini@arm.com} 66913481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_GLOBAL_STRING 67013481Sgiacomo.travaglini@arm.com 67113481Sgiacomo.travaglini@arm.com// ::std::string. 67213481Sgiacomo.travaglini@arm.comTEST(PrintStringTest, StringInStdNamespace) { 67313481Sgiacomo.travaglini@arm.com const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a"; 67413481Sgiacomo.travaglini@arm.com const ::std::string str(s, sizeof(s)); 67513481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"", 67613481Sgiacomo.travaglini@arm.com Print(str)); 67713481Sgiacomo.travaglini@arm.com} 67813481Sgiacomo.travaglini@arm.com 67913481Sgiacomo.travaglini@arm.comTEST(PrintStringTest, StringAmbiguousHex) { 68013481Sgiacomo.travaglini@arm.com // "\x6BANANA" is ambiguous, it can be interpreted as starting with either of: 68113481Sgiacomo.travaglini@arm.com // '\x6', '\x6B', or '\x6BA'. 68213481Sgiacomo.travaglini@arm.com 68313481Sgiacomo.travaglini@arm.com // a hex escaping sequence following by a decimal digit 68413481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"0\\x12\" \"3\"", Print(::std::string("0\x12" "3"))); 68513481Sgiacomo.travaglini@arm.com // a hex escaping sequence following by a hex digit (lower-case) 68613481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"mm\\x6\" \"bananas\"", Print(::std::string("mm\x6" "bananas"))); 68713481Sgiacomo.travaglini@arm.com // a hex escaping sequence following by a hex digit (upper-case) 68813481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"NOM\\x6\" \"BANANA\"", Print(::std::string("NOM\x6" "BANANA"))); 68913481Sgiacomo.travaglini@arm.com // a hex escaping sequence following by a non-xdigit 69013481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"!\\x5-!\"", Print(::std::string("!\x5-!"))); 69113481Sgiacomo.travaglini@arm.com} 69213481Sgiacomo.travaglini@arm.com 69313481Sgiacomo.travaglini@arm.com// Tests printing ::wstring and ::std::wstring. 69413481Sgiacomo.travaglini@arm.com 69513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_WSTRING 69613481Sgiacomo.travaglini@arm.com// ::wstring. 69713481Sgiacomo.travaglini@arm.comTEST(PrintWideStringTest, StringInGlobalNamespace) { 69813481Sgiacomo.travaglini@arm.com const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a"; 69913481Sgiacomo.travaglini@arm.com const ::wstring str(s, sizeof(s)/sizeof(wchar_t)); 70013481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v" 70113481Sgiacomo.travaglini@arm.com "\\xD3\\x576\\x8D3\\xC74D a\\0\"", 70213481Sgiacomo.travaglini@arm.com Print(str)); 70313481Sgiacomo.travaglini@arm.com} 70413481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_GLOBAL_WSTRING 70513481Sgiacomo.travaglini@arm.com 70613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_WSTRING 70713481Sgiacomo.travaglini@arm.com// ::std::wstring. 70813481Sgiacomo.travaglini@arm.comTEST(PrintWideStringTest, StringInStdNamespace) { 70913481Sgiacomo.travaglini@arm.com const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a"; 71013481Sgiacomo.travaglini@arm.com const ::std::wstring str(s, sizeof(s)/sizeof(wchar_t)); 71113481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v" 71213481Sgiacomo.travaglini@arm.com "\\xD3\\x576\\x8D3\\xC74D a\\0\"", 71313481Sgiacomo.travaglini@arm.com Print(str)); 71413481Sgiacomo.travaglini@arm.com} 71513481Sgiacomo.travaglini@arm.com 71613481Sgiacomo.travaglini@arm.comTEST(PrintWideStringTest, StringAmbiguousHex) { 71713481Sgiacomo.travaglini@arm.com // same for wide strings. 71813481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"0\\x12\" L\"3\"", Print(::std::wstring(L"0\x12" L"3"))); 71913481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"mm\\x6\" L\"bananas\"", 72013481Sgiacomo.travaglini@arm.com Print(::std::wstring(L"mm\x6" L"bananas"))); 72113481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"NOM\\x6\" L\"BANANA\"", 72213481Sgiacomo.travaglini@arm.com Print(::std::wstring(L"NOM\x6" L"BANANA"))); 72313481Sgiacomo.travaglini@arm.com EXPECT_EQ("L\"!\\x5-!\"", Print(::std::wstring(L"!\x5-!"))); 72413481Sgiacomo.travaglini@arm.com} 72513481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_WSTRING 72613481Sgiacomo.travaglini@arm.com 72713481Sgiacomo.travaglini@arm.com// Tests printing types that support generic streaming (i.e. streaming 72813481Sgiacomo.travaglini@arm.com// to std::basic_ostream<Char, CharTraits> for any valid Char and 72913481Sgiacomo.travaglini@arm.com// CharTraits types). 73013481Sgiacomo.travaglini@arm.com 73113481Sgiacomo.travaglini@arm.com// Tests printing a non-template type that supports generic streaming. 73213481Sgiacomo.travaglini@arm.com 73313481Sgiacomo.travaglini@arm.comclass AllowsGenericStreaming {}; 73413481Sgiacomo.travaglini@arm.com 73513481Sgiacomo.travaglini@arm.comtemplate <typename Char, typename CharTraits> 73613481Sgiacomo.travaglini@arm.comstd::basic_ostream<Char, CharTraits>& operator<<( 73713481Sgiacomo.travaglini@arm.com std::basic_ostream<Char, CharTraits>& os, 73813481Sgiacomo.travaglini@arm.com const AllowsGenericStreaming& /* a */) { 73913481Sgiacomo.travaglini@arm.com return os << "AllowsGenericStreaming"; 74013481Sgiacomo.travaglini@arm.com} 74113481Sgiacomo.travaglini@arm.com 74213481Sgiacomo.travaglini@arm.comTEST(PrintTypeWithGenericStreamingTest, NonTemplateType) { 74313481Sgiacomo.travaglini@arm.com AllowsGenericStreaming a; 74413481Sgiacomo.travaglini@arm.com EXPECT_EQ("AllowsGenericStreaming", Print(a)); 74513481Sgiacomo.travaglini@arm.com} 74613481Sgiacomo.travaglini@arm.com 74713481Sgiacomo.travaglini@arm.com// Tests printing a template type that supports generic streaming. 74813481Sgiacomo.travaglini@arm.com 74913481Sgiacomo.travaglini@arm.comtemplate <typename T> 75013481Sgiacomo.travaglini@arm.comclass AllowsGenericStreamingTemplate {}; 75113481Sgiacomo.travaglini@arm.com 75213481Sgiacomo.travaglini@arm.comtemplate <typename Char, typename CharTraits, typename T> 75313481Sgiacomo.travaglini@arm.comstd::basic_ostream<Char, CharTraits>& operator<<( 75413481Sgiacomo.travaglini@arm.com std::basic_ostream<Char, CharTraits>& os, 75513481Sgiacomo.travaglini@arm.com const AllowsGenericStreamingTemplate<T>& /* a */) { 75613481Sgiacomo.travaglini@arm.com return os << "AllowsGenericStreamingTemplate"; 75713481Sgiacomo.travaglini@arm.com} 75813481Sgiacomo.travaglini@arm.com 75913481Sgiacomo.travaglini@arm.comTEST(PrintTypeWithGenericStreamingTest, TemplateType) { 76013481Sgiacomo.travaglini@arm.com AllowsGenericStreamingTemplate<int> a; 76113481Sgiacomo.travaglini@arm.com EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a)); 76213481Sgiacomo.travaglini@arm.com} 76313481Sgiacomo.travaglini@arm.com 76413481Sgiacomo.travaglini@arm.com// Tests printing a type that supports generic streaming and can be 76513481Sgiacomo.travaglini@arm.com// implicitly converted to another printable type. 76613481Sgiacomo.travaglini@arm.com 76713481Sgiacomo.travaglini@arm.comtemplate <typename T> 76813481Sgiacomo.travaglini@arm.comclass AllowsGenericStreamingAndImplicitConversionTemplate { 76913481Sgiacomo.travaglini@arm.com public: 77013481Sgiacomo.travaglini@arm.com operator bool() const { return false; } 77113481Sgiacomo.travaglini@arm.com}; 77213481Sgiacomo.travaglini@arm.com 77313481Sgiacomo.travaglini@arm.comtemplate <typename Char, typename CharTraits, typename T> 77413481Sgiacomo.travaglini@arm.comstd::basic_ostream<Char, CharTraits>& operator<<( 77513481Sgiacomo.travaglini@arm.com std::basic_ostream<Char, CharTraits>& os, 77613481Sgiacomo.travaglini@arm.com const AllowsGenericStreamingAndImplicitConversionTemplate<T>& /* a */) { 77713481Sgiacomo.travaglini@arm.com return os << "AllowsGenericStreamingAndImplicitConversionTemplate"; 77813481Sgiacomo.travaglini@arm.com} 77913481Sgiacomo.travaglini@arm.com 78013481Sgiacomo.travaglini@arm.comTEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) { 78113481Sgiacomo.travaglini@arm.com AllowsGenericStreamingAndImplicitConversionTemplate<int> a; 78213481Sgiacomo.travaglini@arm.com EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a)); 78313481Sgiacomo.travaglini@arm.com} 78413481Sgiacomo.travaglini@arm.com 78513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STRING_PIECE_ 78613481Sgiacomo.travaglini@arm.com 78713481Sgiacomo.travaglini@arm.com// Tests printing StringPiece. 78813481Sgiacomo.travaglini@arm.com 78913481Sgiacomo.travaglini@arm.comTEST(PrintStringPieceTest, SimpleStringPiece) { 79013481Sgiacomo.travaglini@arm.com const StringPiece sp = "Hello"; 79113481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"Hello\"", Print(sp)); 79213481Sgiacomo.travaglini@arm.com} 79313481Sgiacomo.travaglini@arm.com 79413481Sgiacomo.travaglini@arm.comTEST(PrintStringPieceTest, UnprintableCharacters) { 79513481Sgiacomo.travaglini@arm.com const char str[] = "NUL (\0) and \r\t"; 79613481Sgiacomo.travaglini@arm.com const StringPiece sp(str, sizeof(str) - 1); 79713481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"NUL (\\0) and \\r\\t\"", Print(sp)); 79813481Sgiacomo.travaglini@arm.com} 79913481Sgiacomo.travaglini@arm.com 80013481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STRING_PIECE_ 80113481Sgiacomo.travaglini@arm.com 80213481Sgiacomo.travaglini@arm.com// Tests printing STL containers. 80313481Sgiacomo.travaglini@arm.com 80413481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, EmptyDeque) { 80513481Sgiacomo.travaglini@arm.com deque<char> empty; 80613481Sgiacomo.travaglini@arm.com EXPECT_EQ("{}", Print(empty)); 80713481Sgiacomo.travaglini@arm.com} 80813481Sgiacomo.travaglini@arm.com 80913481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, NonEmptyDeque) { 81013481Sgiacomo.travaglini@arm.com deque<int> non_empty; 81113481Sgiacomo.travaglini@arm.com non_empty.push_back(1); 81213481Sgiacomo.travaglini@arm.com non_empty.push_back(3); 81313481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 1, 3 }", Print(non_empty)); 81413481Sgiacomo.travaglini@arm.com} 81513481Sgiacomo.travaglini@arm.com 81613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_HASH_MAP_ 81713481Sgiacomo.travaglini@arm.com 81813481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, OneElementHashMap) { 81913481Sgiacomo.travaglini@arm.com hash_map<int, char> map1; 82013481Sgiacomo.travaglini@arm.com map1[1] = 'a'; 82113481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ (1, 'a' (97, 0x61)) }", Print(map1)); 82213481Sgiacomo.travaglini@arm.com} 82313481Sgiacomo.travaglini@arm.com 82413481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, HashMultiMap) { 82513481Sgiacomo.travaglini@arm.com hash_multimap<int, bool> map1; 82613481Sgiacomo.travaglini@arm.com map1.insert(make_pair(5, true)); 82713481Sgiacomo.travaglini@arm.com map1.insert(make_pair(5, false)); 82813481Sgiacomo.travaglini@arm.com 82913481Sgiacomo.travaglini@arm.com // Elements of hash_multimap can be printed in any order. 83013481Sgiacomo.travaglini@arm.com const string result = Print(map1); 83113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(result == "{ (5, true), (5, false) }" || 83213481Sgiacomo.travaglini@arm.com result == "{ (5, false), (5, true) }") 83313481Sgiacomo.travaglini@arm.com << " where Print(map1) returns \"" << result << "\"."; 83413481Sgiacomo.travaglini@arm.com} 83513481Sgiacomo.travaglini@arm.com 83613481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_HASH_MAP_ 83713481Sgiacomo.travaglini@arm.com 83813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_HASH_SET_ 83913481Sgiacomo.travaglini@arm.com 84013481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, HashSet) { 84113481Sgiacomo.travaglini@arm.com hash_set<string> set1; 84213481Sgiacomo.travaglini@arm.com set1.insert("hello"); 84313481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ \"hello\" }", Print(set1)); 84413481Sgiacomo.travaglini@arm.com} 84513481Sgiacomo.travaglini@arm.com 84613481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, HashMultiSet) { 84713481Sgiacomo.travaglini@arm.com const int kSize = 5; 84813481Sgiacomo.travaglini@arm.com int a[kSize] = { 1, 1, 2, 5, 1 }; 84913481Sgiacomo.travaglini@arm.com hash_multiset<int> set1(a, a + kSize); 85013481Sgiacomo.travaglini@arm.com 85113481Sgiacomo.travaglini@arm.com // Elements of hash_multiset can be printed in any order. 85213481Sgiacomo.travaglini@arm.com const string result = Print(set1); 85313481Sgiacomo.travaglini@arm.com const string expected_pattern = "{ d, d, d, d, d }"; // d means a digit. 85413481Sgiacomo.travaglini@arm.com 85513481Sgiacomo.travaglini@arm.com // Verifies the result matches the expected pattern; also extracts 85613481Sgiacomo.travaglini@arm.com // the numbers in the result. 85713481Sgiacomo.travaglini@arm.com ASSERT_EQ(expected_pattern.length(), result.length()); 85813481Sgiacomo.travaglini@arm.com std::vector<int> numbers; 85913481Sgiacomo.travaglini@arm.com for (size_t i = 0; i != result.length(); i++) { 86013481Sgiacomo.travaglini@arm.com if (expected_pattern[i] == 'd') { 86113481Sgiacomo.travaglini@arm.com ASSERT_NE(isdigit(static_cast<unsigned char>(result[i])), 0); 86213481Sgiacomo.travaglini@arm.com numbers.push_back(result[i] - '0'); 86313481Sgiacomo.travaglini@arm.com } else { 86413481Sgiacomo.travaglini@arm.com EXPECT_EQ(expected_pattern[i], result[i]) << " where result is " 86513481Sgiacomo.travaglini@arm.com << result; 86613481Sgiacomo.travaglini@arm.com } 86713481Sgiacomo.travaglini@arm.com } 86813481Sgiacomo.travaglini@arm.com 86913481Sgiacomo.travaglini@arm.com // Makes sure the result contains the right numbers. 87013481Sgiacomo.travaglini@arm.com std::sort(numbers.begin(), numbers.end()); 87113481Sgiacomo.travaglini@arm.com std::sort(a, a + kSize); 87213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(std::equal(a, a + kSize, numbers.begin())); 87313481Sgiacomo.travaglini@arm.com} 87413481Sgiacomo.travaglini@arm.com 87513481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_HASH_SET_ 87613481Sgiacomo.travaglini@arm.com 87713481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, List) { 87813481Sgiacomo.travaglini@arm.com const string a[] = { 87913481Sgiacomo.travaglini@arm.com "hello", 88013481Sgiacomo.travaglini@arm.com "world" 88113481Sgiacomo.travaglini@arm.com }; 88213481Sgiacomo.travaglini@arm.com const list<string> strings(a, a + 2); 88313481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ \"hello\", \"world\" }", Print(strings)); 88413481Sgiacomo.travaglini@arm.com} 88513481Sgiacomo.travaglini@arm.com 88613481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, Map) { 88713481Sgiacomo.travaglini@arm.com map<int, bool> map1; 88813481Sgiacomo.travaglini@arm.com map1[1] = true; 88913481Sgiacomo.travaglini@arm.com map1[5] = false; 89013481Sgiacomo.travaglini@arm.com map1[3] = true; 89113481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ (1, true), (3, true), (5, false) }", Print(map1)); 89213481Sgiacomo.travaglini@arm.com} 89313481Sgiacomo.travaglini@arm.com 89413481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, MultiMap) { 89513481Sgiacomo.travaglini@arm.com multimap<bool, int> map1; 89613481Sgiacomo.travaglini@arm.com // The make_pair template function would deduce the type as 89713481Sgiacomo.travaglini@arm.com // pair<bool, int> here, and since the key part in a multimap has to 89813481Sgiacomo.travaglini@arm.com // be constant, without a templated ctor in the pair class (as in 89913481Sgiacomo.travaglini@arm.com // libCstd on Solaris), make_pair call would fail to compile as no 90013481Sgiacomo.travaglini@arm.com // implicit conversion is found. Thus explicit typename is used 90113481Sgiacomo.travaglini@arm.com // here instead. 90213481Sgiacomo.travaglini@arm.com map1.insert(pair<const bool, int>(true, 0)); 90313481Sgiacomo.travaglini@arm.com map1.insert(pair<const bool, int>(true, 1)); 90413481Sgiacomo.travaglini@arm.com map1.insert(pair<const bool, int>(false, 2)); 90513481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ (false, 2), (true, 0), (true, 1) }", Print(map1)); 90613481Sgiacomo.travaglini@arm.com} 90713481Sgiacomo.travaglini@arm.com 90813481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, Set) { 90913481Sgiacomo.travaglini@arm.com const unsigned int a[] = { 3, 0, 5 }; 91013481Sgiacomo.travaglini@arm.com set<unsigned int> set1(a, a + 3); 91113481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 0, 3, 5 }", Print(set1)); 91213481Sgiacomo.travaglini@arm.com} 91313481Sgiacomo.travaglini@arm.com 91413481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, MultiSet) { 91513481Sgiacomo.travaglini@arm.com const int a[] = { 1, 1, 2, 5, 1 }; 91613481Sgiacomo.travaglini@arm.com multiset<int> set1(a, a + 5); 91713481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 1, 1, 1, 2, 5 }", Print(set1)); 91813481Sgiacomo.travaglini@arm.com} 91913481Sgiacomo.travaglini@arm.com 92013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FORWARD_LIST_ 92113481Sgiacomo.travaglini@arm.com// <slist> is available on Linux in the google3 mode, but not on 92213481Sgiacomo.travaglini@arm.com// Windows or Mac OS X. 92313481Sgiacomo.travaglini@arm.com 92413481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, SinglyLinkedList) { 92513481Sgiacomo.travaglini@arm.com int a[] = { 9, 2, 8 }; 92613481Sgiacomo.travaglini@arm.com const std::forward_list<int> ints(a, a + 3); 92713481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 9, 2, 8 }", Print(ints)); 92813481Sgiacomo.travaglini@arm.com} 92913481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_FORWARD_LIST_ 93013481Sgiacomo.travaglini@arm.com 93113481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, Pair) { 93213481Sgiacomo.travaglini@arm.com pair<const bool, int> p(true, 5); 93313481Sgiacomo.travaglini@arm.com EXPECT_EQ("(true, 5)", Print(p)); 93413481Sgiacomo.travaglini@arm.com} 93513481Sgiacomo.travaglini@arm.com 93613481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, Vector) { 93713481Sgiacomo.travaglini@arm.com vector<int> v; 93813481Sgiacomo.travaglini@arm.com v.push_back(1); 93913481Sgiacomo.travaglini@arm.com v.push_back(2); 94013481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 1, 2 }", Print(v)); 94113481Sgiacomo.travaglini@arm.com} 94213481Sgiacomo.travaglini@arm.com 94313481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, LongSequence) { 94413481Sgiacomo.travaglini@arm.com const int a[100] = { 1, 2, 3 }; 94513481Sgiacomo.travaglini@arm.com const vector<int> v(a, a + 100); 94613481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, " 94713481Sgiacomo.travaglini@arm.com "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... }", Print(v)); 94813481Sgiacomo.travaglini@arm.com} 94913481Sgiacomo.travaglini@arm.com 95013481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, NestedContainer) { 95113481Sgiacomo.travaglini@arm.com const int a1[] = { 1, 2 }; 95213481Sgiacomo.travaglini@arm.com const int a2[] = { 3, 4, 5 }; 95313481Sgiacomo.travaglini@arm.com const list<int> l1(a1, a1 + 2); 95413481Sgiacomo.travaglini@arm.com const list<int> l2(a2, a2 + 3); 95513481Sgiacomo.travaglini@arm.com 95613481Sgiacomo.travaglini@arm.com vector<list<int> > v; 95713481Sgiacomo.travaglini@arm.com v.push_back(l1); 95813481Sgiacomo.travaglini@arm.com v.push_back(l2); 95913481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ { 1, 2 }, { 3, 4, 5 } }", Print(v)); 96013481Sgiacomo.travaglini@arm.com} 96113481Sgiacomo.travaglini@arm.com 96213481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, OneDimensionalNativeArray) { 96313481Sgiacomo.travaglini@arm.com const int a[3] = { 1, 2, 3 }; 96413481Sgiacomo.travaglini@arm.com NativeArray<int> b(a, 3, RelationToSourceReference()); 96513481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ 1, 2, 3 }", Print(b)); 96613481Sgiacomo.travaglini@arm.com} 96713481Sgiacomo.travaglini@arm.com 96813481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, TwoDimensionalNativeArray) { 96913481Sgiacomo.travaglini@arm.com const int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; 97013481Sgiacomo.travaglini@arm.com NativeArray<int[3]> b(a, 2, RelationToSourceReference()); 97113481Sgiacomo.travaglini@arm.com EXPECT_EQ("{ { 1, 2, 3 }, { 4, 5, 6 } }", Print(b)); 97213481Sgiacomo.travaglini@arm.com} 97313481Sgiacomo.travaglini@arm.com 97413481Sgiacomo.travaglini@arm.com// Tests that a class named iterator isn't treated as a container. 97513481Sgiacomo.travaglini@arm.com 97613481Sgiacomo.travaglini@arm.comstruct iterator { 97713481Sgiacomo.travaglini@arm.com char x; 97813481Sgiacomo.travaglini@arm.com}; 97913481Sgiacomo.travaglini@arm.com 98013481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, Iterator) { 98113481Sgiacomo.travaglini@arm.com iterator it = {}; 98213481Sgiacomo.travaglini@arm.com EXPECT_EQ("1-byte object <00>", Print(it)); 98313481Sgiacomo.travaglini@arm.com} 98413481Sgiacomo.travaglini@arm.com 98513481Sgiacomo.travaglini@arm.com// Tests that a class named const_iterator isn't treated as a container. 98613481Sgiacomo.travaglini@arm.com 98713481Sgiacomo.travaglini@arm.comstruct const_iterator { 98813481Sgiacomo.travaglini@arm.com char x; 98913481Sgiacomo.travaglini@arm.com}; 99013481Sgiacomo.travaglini@arm.com 99113481Sgiacomo.travaglini@arm.comTEST(PrintStlContainerTest, ConstIterator) { 99213481Sgiacomo.travaglini@arm.com const_iterator it = {}; 99313481Sgiacomo.travaglini@arm.com EXPECT_EQ("1-byte object <00>", Print(it)); 99413481Sgiacomo.travaglini@arm.com} 99513481Sgiacomo.travaglini@arm.com 99613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_TR1_TUPLE 99713481Sgiacomo.travaglini@arm.com// Tests printing ::std::tr1::tuples. 99813481Sgiacomo.travaglini@arm.com 99913481Sgiacomo.travaglini@arm.com// Tuples of various arities. 100013481Sgiacomo.travaglini@arm.comTEST(PrintTr1TupleTest, VariousSizes) { 100113481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<> t0; 100213481Sgiacomo.travaglini@arm.com EXPECT_EQ("()", Print(t0)); 100313481Sgiacomo.travaglini@arm.com 100413481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<int> t1(5); 100513481Sgiacomo.travaglini@arm.com EXPECT_EQ("(5)", Print(t1)); 100613481Sgiacomo.travaglini@arm.com 100713481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<char, bool> t2('a', true); 100813481Sgiacomo.travaglini@arm.com EXPECT_EQ("('a' (97, 0x61), true)", Print(t2)); 100913481Sgiacomo.travaglini@arm.com 101013481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, int, int> t3(false, 2, 3); 101113481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3)", Print(t3)); 101213481Sgiacomo.travaglini@arm.com 101313481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, int, int, int> t4(false, 2, 3, 4); 101413481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4)", Print(t4)); 101513481Sgiacomo.travaglini@arm.com 101613481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, int, int, int, bool> t5(false, 2, 3, 4, true); 101713481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true)", Print(t5)); 101813481Sgiacomo.travaglini@arm.com 101913481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, int, int, int, bool, int> t6(false, 2, 3, 4, true, 6); 102013481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6)", Print(t6)); 102113481Sgiacomo.travaglini@arm.com 102213481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, int, int, int, bool, int, int> t7( 102313481Sgiacomo.travaglini@arm.com false, 2, 3, 4, true, 6, 7); 102413481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6, 7)", Print(t7)); 102513481Sgiacomo.travaglini@arm.com 102613481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, int, int, int, bool, int, int, bool> t8( 102713481Sgiacomo.travaglini@arm.com false, 2, 3, 4, true, 6, 7, true); 102813481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true)", Print(t8)); 102913481Sgiacomo.travaglini@arm.com 103013481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, int, int, int, bool, int, int, bool, int> t9( 103113481Sgiacomo.travaglini@arm.com false, 2, 3, 4, true, 6, 7, true, 9); 103213481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true, 9)", Print(t9)); 103313481Sgiacomo.travaglini@arm.com 103413481Sgiacomo.travaglini@arm.com const char* const str = "8"; 103513481Sgiacomo.travaglini@arm.com // VC++ 2010's implementation of tuple of C++0x is deficient, requiring 103613481Sgiacomo.travaglini@arm.com // an explicit type cast of NULL to be used. 103713481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<bool, char, short, testing::internal::Int32, // NOLINT 103813481Sgiacomo.travaglini@arm.com testing::internal::Int64, float, double, const char*, void*, string> 103913481Sgiacomo.travaglini@arm.com t10(false, 'a', 3, 4, 5, 1.5F, -2.5, str, 104013481Sgiacomo.travaglini@arm.com ImplicitCast_<void*>(NULL), "10"); 104113481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) + 104213481Sgiacomo.travaglini@arm.com " pointing to \"8\", NULL, \"10\")", 104313481Sgiacomo.travaglini@arm.com Print(t10)); 104413481Sgiacomo.travaglini@arm.com} 104513481Sgiacomo.travaglini@arm.com 104613481Sgiacomo.travaglini@arm.com// Nested tuples. 104713481Sgiacomo.travaglini@arm.comTEST(PrintTr1TupleTest, NestedTuple) { 104813481Sgiacomo.travaglini@arm.com ::std::tr1::tuple< ::std::tr1::tuple<int, bool>, char> nested( 104913481Sgiacomo.travaglini@arm.com ::std::tr1::make_tuple(5, true), 'a'); 105013481Sgiacomo.travaglini@arm.com EXPECT_EQ("((5, true), 'a' (97, 0x61))", Print(nested)); 105113481Sgiacomo.travaglini@arm.com} 105213481Sgiacomo.travaglini@arm.com 105313481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_TR1_TUPLE 105413481Sgiacomo.travaglini@arm.com 105513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_TUPLE_ 105613481Sgiacomo.travaglini@arm.com// Tests printing ::std::tuples. 105713481Sgiacomo.travaglini@arm.com 105813481Sgiacomo.travaglini@arm.com// Tuples of various arities. 105913481Sgiacomo.travaglini@arm.comTEST(PrintStdTupleTest, VariousSizes) { 106013481Sgiacomo.travaglini@arm.com ::std::tuple<> t0; 106113481Sgiacomo.travaglini@arm.com EXPECT_EQ("()", Print(t0)); 106213481Sgiacomo.travaglini@arm.com 106313481Sgiacomo.travaglini@arm.com ::std::tuple<int> t1(5); 106413481Sgiacomo.travaglini@arm.com EXPECT_EQ("(5)", Print(t1)); 106513481Sgiacomo.travaglini@arm.com 106613481Sgiacomo.travaglini@arm.com ::std::tuple<char, bool> t2('a', true); 106713481Sgiacomo.travaglini@arm.com EXPECT_EQ("('a' (97, 0x61), true)", Print(t2)); 106813481Sgiacomo.travaglini@arm.com 106913481Sgiacomo.travaglini@arm.com ::std::tuple<bool, int, int> t3(false, 2, 3); 107013481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3)", Print(t3)); 107113481Sgiacomo.travaglini@arm.com 107213481Sgiacomo.travaglini@arm.com ::std::tuple<bool, int, int, int> t4(false, 2, 3, 4); 107313481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4)", Print(t4)); 107413481Sgiacomo.travaglini@arm.com 107513481Sgiacomo.travaglini@arm.com ::std::tuple<bool, int, int, int, bool> t5(false, 2, 3, 4, true); 107613481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true)", Print(t5)); 107713481Sgiacomo.travaglini@arm.com 107813481Sgiacomo.travaglini@arm.com ::std::tuple<bool, int, int, int, bool, int> t6(false, 2, 3, 4, true, 6); 107913481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6)", Print(t6)); 108013481Sgiacomo.travaglini@arm.com 108113481Sgiacomo.travaglini@arm.com ::std::tuple<bool, int, int, int, bool, int, int> t7( 108213481Sgiacomo.travaglini@arm.com false, 2, 3, 4, true, 6, 7); 108313481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6, 7)", Print(t7)); 108413481Sgiacomo.travaglini@arm.com 108513481Sgiacomo.travaglini@arm.com ::std::tuple<bool, int, int, int, bool, int, int, bool> t8( 108613481Sgiacomo.travaglini@arm.com false, 2, 3, 4, true, 6, 7, true); 108713481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true)", Print(t8)); 108813481Sgiacomo.travaglini@arm.com 108913481Sgiacomo.travaglini@arm.com ::std::tuple<bool, int, int, int, bool, int, int, bool, int> t9( 109013481Sgiacomo.travaglini@arm.com false, 2, 3, 4, true, 6, 7, true, 9); 109113481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true, 9)", Print(t9)); 109213481Sgiacomo.travaglini@arm.com 109313481Sgiacomo.travaglini@arm.com const char* const str = "8"; 109413481Sgiacomo.travaglini@arm.com // VC++ 2010's implementation of tuple of C++0x is deficient, requiring 109513481Sgiacomo.travaglini@arm.com // an explicit type cast of NULL to be used. 109613481Sgiacomo.travaglini@arm.com ::std::tuple<bool, char, short, testing::internal::Int32, // NOLINT 109713481Sgiacomo.travaglini@arm.com testing::internal::Int64, float, double, const char*, void*, string> 109813481Sgiacomo.travaglini@arm.com t10(false, 'a', 3, 4, 5, 1.5F, -2.5, str, 109913481Sgiacomo.travaglini@arm.com ImplicitCast_<void*>(NULL), "10"); 110013481Sgiacomo.travaglini@arm.com EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) + 110113481Sgiacomo.travaglini@arm.com " pointing to \"8\", NULL, \"10\")", 110213481Sgiacomo.travaglini@arm.com Print(t10)); 110313481Sgiacomo.travaglini@arm.com} 110413481Sgiacomo.travaglini@arm.com 110513481Sgiacomo.travaglini@arm.com// Nested tuples. 110613481Sgiacomo.travaglini@arm.comTEST(PrintStdTupleTest, NestedTuple) { 110713481Sgiacomo.travaglini@arm.com ::std::tuple< ::std::tuple<int, bool>, char> nested( 110813481Sgiacomo.travaglini@arm.com ::std::make_tuple(5, true), 'a'); 110913481Sgiacomo.travaglini@arm.com EXPECT_EQ("((5, true), 'a' (97, 0x61))", Print(nested)); 111013481Sgiacomo.travaglini@arm.com} 111113481Sgiacomo.travaglini@arm.com 111213481Sgiacomo.travaglini@arm.com#endif // GTEST_LANG_CXX11 111313481Sgiacomo.travaglini@arm.com 111413481Sgiacomo.travaglini@arm.com// Tests printing user-defined unprintable types. 111513481Sgiacomo.travaglini@arm.com 111613481Sgiacomo.travaglini@arm.com// Unprintable types in the global namespace. 111713481Sgiacomo.travaglini@arm.comTEST(PrintUnprintableTypeTest, InGlobalNamespace) { 111813481Sgiacomo.travaglini@arm.com EXPECT_EQ("1-byte object <00>", 111913481Sgiacomo.travaglini@arm.com Print(UnprintableTemplateInGlobal<char>())); 112013481Sgiacomo.travaglini@arm.com} 112113481Sgiacomo.travaglini@arm.com 112213481Sgiacomo.travaglini@arm.com// Unprintable types in a user namespace. 112313481Sgiacomo.travaglini@arm.comTEST(PrintUnprintableTypeTest, InUserNamespace) { 112413481Sgiacomo.travaglini@arm.com EXPECT_EQ("16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>", 112513481Sgiacomo.travaglini@arm.com Print(::foo::UnprintableInFoo())); 112613481Sgiacomo.travaglini@arm.com} 112713481Sgiacomo.travaglini@arm.com 112813481Sgiacomo.travaglini@arm.com// Unprintable types are that too big to be printed completely. 112913481Sgiacomo.travaglini@arm.com 113013481Sgiacomo.travaglini@arm.comstruct Big { 113113481Sgiacomo.travaglini@arm.com Big() { memset(array, 0, sizeof(array)); } 113213481Sgiacomo.travaglini@arm.com char array[257]; 113313481Sgiacomo.travaglini@arm.com}; 113413481Sgiacomo.travaglini@arm.com 113513481Sgiacomo.travaglini@arm.comTEST(PrintUnpritableTypeTest, BigObject) { 113613481Sgiacomo.travaglini@arm.com EXPECT_EQ("257-byte object <00-00 00-00 00-00 00-00 00-00 00-00 " 113713481Sgiacomo.travaglini@arm.com "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 " 113813481Sgiacomo.travaglini@arm.com "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 " 113913481Sgiacomo.travaglini@arm.com "00-00 00-00 00-00 00-00 00-00 00-00 ... 00-00 00-00 00-00 " 114013481Sgiacomo.travaglini@arm.com "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 " 114113481Sgiacomo.travaglini@arm.com "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 " 114213481Sgiacomo.travaglini@arm.com "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00>", 114313481Sgiacomo.travaglini@arm.com Print(Big())); 114413481Sgiacomo.travaglini@arm.com} 114513481Sgiacomo.travaglini@arm.com 114613481Sgiacomo.travaglini@arm.com// Tests printing user-defined streamable types. 114713481Sgiacomo.travaglini@arm.com 114813481Sgiacomo.travaglini@arm.com// Streamable types in the global namespace. 114913481Sgiacomo.travaglini@arm.comTEST(PrintStreamableTypeTest, InGlobalNamespace) { 115013481Sgiacomo.travaglini@arm.com StreamableInGlobal x; 115113481Sgiacomo.travaglini@arm.com EXPECT_EQ("StreamableInGlobal", Print(x)); 115213481Sgiacomo.travaglini@arm.com EXPECT_EQ("StreamableInGlobal*", Print(&x)); 115313481Sgiacomo.travaglini@arm.com} 115413481Sgiacomo.travaglini@arm.com 115513481Sgiacomo.travaglini@arm.com// Printable template types in a user namespace. 115613481Sgiacomo.travaglini@arm.comTEST(PrintStreamableTypeTest, TemplateTypeInUserNamespace) { 115713481Sgiacomo.travaglini@arm.com EXPECT_EQ("StreamableTemplateInFoo: 0", 115813481Sgiacomo.travaglini@arm.com Print(::foo::StreamableTemplateInFoo<int>())); 115913481Sgiacomo.travaglini@arm.com} 116013481Sgiacomo.travaglini@arm.com 116113481Sgiacomo.travaglini@arm.com// Tests printing user-defined types that have a PrintTo() function. 116213481Sgiacomo.travaglini@arm.comTEST(PrintPrintableTypeTest, InUserNamespace) { 116313481Sgiacomo.travaglini@arm.com EXPECT_EQ("PrintableViaPrintTo: 0", 116413481Sgiacomo.travaglini@arm.com Print(::foo::PrintableViaPrintTo())); 116513481Sgiacomo.travaglini@arm.com} 116613481Sgiacomo.travaglini@arm.com 116713481Sgiacomo.travaglini@arm.com// Tests printing a pointer to a user-defined type that has a << 116813481Sgiacomo.travaglini@arm.com// operator for its pointer. 116913481Sgiacomo.travaglini@arm.comTEST(PrintPrintableTypeTest, PointerInUserNamespace) { 117013481Sgiacomo.travaglini@arm.com ::foo::PointerPrintable x; 117113481Sgiacomo.travaglini@arm.com EXPECT_EQ("PointerPrintable*", Print(&x)); 117213481Sgiacomo.travaglini@arm.com} 117313481Sgiacomo.travaglini@arm.com 117413481Sgiacomo.travaglini@arm.com// Tests printing user-defined class template that have a PrintTo() function. 117513481Sgiacomo.travaglini@arm.comTEST(PrintPrintableTypeTest, TemplateInUserNamespace) { 117613481Sgiacomo.travaglini@arm.com EXPECT_EQ("PrintableViaPrintToTemplate: 5", 117713481Sgiacomo.travaglini@arm.com Print(::foo::PrintableViaPrintToTemplate<int>(5))); 117813481Sgiacomo.travaglini@arm.com} 117913481Sgiacomo.travaglini@arm.com 118013481Sgiacomo.travaglini@arm.com// Tests that the universal printer prints both the address and the 118113481Sgiacomo.travaglini@arm.com// value of a reference. 118213481Sgiacomo.travaglini@arm.comTEST(PrintReferenceTest, PrintsAddressAndValue) { 118313481Sgiacomo.travaglini@arm.com int n = 5; 118413481Sgiacomo.travaglini@arm.com EXPECT_EQ("@" + PrintPointer(&n) + " 5", PrintByRef(n)); 118513481Sgiacomo.travaglini@arm.com 118613481Sgiacomo.travaglini@arm.com int a[2][3] = { 118713481Sgiacomo.travaglini@arm.com { 0, 1, 2 }, 118813481Sgiacomo.travaglini@arm.com { 3, 4, 5 } 118913481Sgiacomo.travaglini@arm.com }; 119013481Sgiacomo.travaglini@arm.com EXPECT_EQ("@" + PrintPointer(a) + " { { 0, 1, 2 }, { 3, 4, 5 } }", 119113481Sgiacomo.travaglini@arm.com PrintByRef(a)); 119213481Sgiacomo.travaglini@arm.com 119313481Sgiacomo.travaglini@arm.com const ::foo::UnprintableInFoo x; 119413481Sgiacomo.travaglini@arm.com EXPECT_EQ("@" + PrintPointer(&x) + " 16-byte object " 119513481Sgiacomo.travaglini@arm.com "<EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>", 119613481Sgiacomo.travaglini@arm.com PrintByRef(x)); 119713481Sgiacomo.travaglini@arm.com} 119813481Sgiacomo.travaglini@arm.com 119913481Sgiacomo.travaglini@arm.com// Tests that the universal printer prints a function pointer passed by 120013481Sgiacomo.travaglini@arm.com// reference. 120113481Sgiacomo.travaglini@arm.comTEST(PrintReferenceTest, HandlesFunctionPointer) { 120213481Sgiacomo.travaglini@arm.com void (*fp)(int n) = &MyFunction; 120313481Sgiacomo.travaglini@arm.com const string fp_pointer_string = 120413481Sgiacomo.travaglini@arm.com PrintPointer(reinterpret_cast<const void*>(&fp)); 120513481Sgiacomo.travaglini@arm.com // We cannot directly cast &MyFunction to const void* because the 120613481Sgiacomo.travaglini@arm.com // standard disallows casting between pointers to functions and 120713481Sgiacomo.travaglini@arm.com // pointers to objects, and some compilers (e.g. GCC 3.4) enforce 120813481Sgiacomo.travaglini@arm.com // this limitation. 120913481Sgiacomo.travaglini@arm.com const string fp_string = PrintPointer(reinterpret_cast<const void*>( 121013481Sgiacomo.travaglini@arm.com reinterpret_cast<internal::BiggestInt>(fp))); 121113481Sgiacomo.travaglini@arm.com EXPECT_EQ("@" + fp_pointer_string + " " + fp_string, 121213481Sgiacomo.travaglini@arm.com PrintByRef(fp)); 121313481Sgiacomo.travaglini@arm.com} 121413481Sgiacomo.travaglini@arm.com 121513481Sgiacomo.travaglini@arm.com// Tests that the universal printer prints a member function pointer 121613481Sgiacomo.travaglini@arm.com// passed by reference. 121713481Sgiacomo.travaglini@arm.comTEST(PrintReferenceTest, HandlesMemberFunctionPointer) { 121813481Sgiacomo.travaglini@arm.com int (Foo::*p)(char ch) = &Foo::MyMethod; 121913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(HasPrefix( 122013481Sgiacomo.travaglini@arm.com PrintByRef(p), 122113481Sgiacomo.travaglini@arm.com "@" + PrintPointer(reinterpret_cast<const void*>(&p)) + " " + 122213481Sgiacomo.travaglini@arm.com Print(sizeof(p)) + "-byte object ")); 122313481Sgiacomo.travaglini@arm.com 122413481Sgiacomo.travaglini@arm.com char (Foo::*p2)(int n) = &Foo::MyVirtualMethod; 122513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(HasPrefix( 122613481Sgiacomo.travaglini@arm.com PrintByRef(p2), 122713481Sgiacomo.travaglini@arm.com "@" + PrintPointer(reinterpret_cast<const void*>(&p2)) + " " + 122813481Sgiacomo.travaglini@arm.com Print(sizeof(p2)) + "-byte object ")); 122913481Sgiacomo.travaglini@arm.com} 123013481Sgiacomo.travaglini@arm.com 123113481Sgiacomo.travaglini@arm.com// Tests that the universal printer prints a member variable pointer 123213481Sgiacomo.travaglini@arm.com// passed by reference. 123313481Sgiacomo.travaglini@arm.comTEST(PrintReferenceTest, HandlesMemberVariablePointer) { 123413481Sgiacomo.travaglini@arm.com int (Foo::*p) = &Foo::value; // NOLINT 123513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(HasPrefix( 123613481Sgiacomo.travaglini@arm.com PrintByRef(p), 123713481Sgiacomo.travaglini@arm.com "@" + PrintPointer(&p) + " " + Print(sizeof(p)) + "-byte object ")); 123813481Sgiacomo.travaglini@arm.com} 123913481Sgiacomo.travaglini@arm.com 124013481Sgiacomo.travaglini@arm.com// Tests that FormatForComparisonFailureMessage(), which is used to print 124113481Sgiacomo.travaglini@arm.com// an operand in a comparison assertion (e.g. ASSERT_EQ) when the assertion 124213481Sgiacomo.travaglini@arm.com// fails, formats the operand in the desired way. 124313481Sgiacomo.travaglini@arm.com 124413481Sgiacomo.travaglini@arm.com// scalar 124513481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForScalar) { 124613481Sgiacomo.travaglini@arm.com EXPECT_STREQ("123", 124713481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(123, 124).c_str()); 124813481Sgiacomo.travaglini@arm.com} 124913481Sgiacomo.travaglini@arm.com 125013481Sgiacomo.travaglini@arm.com// non-char pointer 125113481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForNonCharPointer) { 125213481Sgiacomo.travaglini@arm.com int n = 0; 125313481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(&n), 125413481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(&n, &n).c_str()); 125513481Sgiacomo.travaglini@arm.com} 125613481Sgiacomo.travaglini@arm.com 125713481Sgiacomo.travaglini@arm.com// non-char array 125813481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, FormatsNonCharArrayAsPointer) { 125913481Sgiacomo.travaglini@arm.com // In expression 'array == x', 'array' is compared by pointer. 126013481Sgiacomo.travaglini@arm.com // Therefore we want to print an array operand as a pointer. 126113481Sgiacomo.travaglini@arm.com int n[] = { 1, 2, 3 }; 126213481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(n), 126313481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(n, n).c_str()); 126413481Sgiacomo.travaglini@arm.com} 126513481Sgiacomo.travaglini@arm.com 126613481Sgiacomo.travaglini@arm.com// Tests formatting a char pointer when it's compared with another pointer. 126713481Sgiacomo.travaglini@arm.com// In this case we want to print it as a raw pointer, as the comparision is by 126813481Sgiacomo.travaglini@arm.com// pointer. 126913481Sgiacomo.travaglini@arm.com 127013481Sgiacomo.travaglini@arm.com// char pointer vs pointer 127113481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsPointer) { 127213481Sgiacomo.travaglini@arm.com // In expression 'p == x', where 'p' and 'x' are (const or not) char 127313481Sgiacomo.travaglini@arm.com // pointers, the operands are compared by pointer. Therefore we 127413481Sgiacomo.travaglini@arm.com // want to print 'p' as a pointer instead of a C string (we don't 127513481Sgiacomo.travaglini@arm.com // even know if it's supposed to point to a valid C string). 127613481Sgiacomo.travaglini@arm.com 127713481Sgiacomo.travaglini@arm.com // const char* 127813481Sgiacomo.travaglini@arm.com const char* s = "hello"; 127913481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(s), 128013481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(s, s).c_str()); 128113481Sgiacomo.travaglini@arm.com 128213481Sgiacomo.travaglini@arm.com // char* 128313481Sgiacomo.travaglini@arm.com char ch = 'a'; 128413481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(&ch), 128513481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(&ch, &ch).c_str()); 128613481Sgiacomo.travaglini@arm.com} 128713481Sgiacomo.travaglini@arm.com 128813481Sgiacomo.travaglini@arm.com// wchar_t pointer vs pointer 128913481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsPointer) { 129013481Sgiacomo.travaglini@arm.com // In expression 'p == x', where 'p' and 'x' are (const or not) char 129113481Sgiacomo.travaglini@arm.com // pointers, the operands are compared by pointer. Therefore we 129213481Sgiacomo.travaglini@arm.com // want to print 'p' as a pointer instead of a wide C string (we don't 129313481Sgiacomo.travaglini@arm.com // even know if it's supposed to point to a valid wide C string). 129413481Sgiacomo.travaglini@arm.com 129513481Sgiacomo.travaglini@arm.com // const wchar_t* 129613481Sgiacomo.travaglini@arm.com const wchar_t* s = L"hello"; 129713481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(s), 129813481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(s, s).c_str()); 129913481Sgiacomo.travaglini@arm.com 130013481Sgiacomo.travaglini@arm.com // wchar_t* 130113481Sgiacomo.travaglini@arm.com wchar_t ch = L'a'; 130213481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(&ch), 130313481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(&ch, &ch).c_str()); 130413481Sgiacomo.travaglini@arm.com} 130513481Sgiacomo.travaglini@arm.com 130613481Sgiacomo.travaglini@arm.com// Tests formatting a char pointer when it's compared to a string object. 130713481Sgiacomo.travaglini@arm.com// In this case we want to print the char pointer as a C string. 130813481Sgiacomo.travaglini@arm.com 130913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_STRING 131013481Sgiacomo.travaglini@arm.com// char pointer vs ::string 131113481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsString) { 131213481Sgiacomo.travaglini@arm.com const char* s = "hello \"world"; 131313481Sgiacomo.travaglini@arm.com EXPECT_STREQ("\"hello \\\"world\"", // The string content should be escaped. 131413481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(s, ::string()).c_str()); 131513481Sgiacomo.travaglini@arm.com 131613481Sgiacomo.travaglini@arm.com // char* 131713481Sgiacomo.travaglini@arm.com char str[] = "hi\1"; 131813481Sgiacomo.travaglini@arm.com char* p = str; 131913481Sgiacomo.travaglini@arm.com EXPECT_STREQ("\"hi\\x1\"", // The string content should be escaped. 132013481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(p, ::string()).c_str()); 132113481Sgiacomo.travaglini@arm.com} 132213481Sgiacomo.travaglini@arm.com#endif 132313481Sgiacomo.travaglini@arm.com 132413481Sgiacomo.travaglini@arm.com// char pointer vs std::string 132513481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsStdString) { 132613481Sgiacomo.travaglini@arm.com const char* s = "hello \"world"; 132713481Sgiacomo.travaglini@arm.com EXPECT_STREQ("\"hello \\\"world\"", // The string content should be escaped. 132813481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(s, ::std::string()).c_str()); 132913481Sgiacomo.travaglini@arm.com 133013481Sgiacomo.travaglini@arm.com // char* 133113481Sgiacomo.travaglini@arm.com char str[] = "hi\1"; 133213481Sgiacomo.travaglini@arm.com char* p = str; 133313481Sgiacomo.travaglini@arm.com EXPECT_STREQ("\"hi\\x1\"", // The string content should be escaped. 133413481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(p, ::std::string()).c_str()); 133513481Sgiacomo.travaglini@arm.com} 133613481Sgiacomo.travaglini@arm.com 133713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_WSTRING 133813481Sgiacomo.travaglini@arm.com// wchar_t pointer vs ::wstring 133913481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsWString) { 134013481Sgiacomo.travaglini@arm.com const wchar_t* s = L"hi \"world"; 134113481Sgiacomo.travaglini@arm.com EXPECT_STREQ("L\"hi \\\"world\"", // The string content should be escaped. 134213481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(s, ::wstring()).c_str()); 134313481Sgiacomo.travaglini@arm.com 134413481Sgiacomo.travaglini@arm.com // wchar_t* 134513481Sgiacomo.travaglini@arm.com wchar_t str[] = L"hi\1"; 134613481Sgiacomo.travaglini@arm.com wchar_t* p = str; 134713481Sgiacomo.travaglini@arm.com EXPECT_STREQ("L\"hi\\x1\"", // The string content should be escaped. 134813481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(p, ::wstring()).c_str()); 134913481Sgiacomo.travaglini@arm.com} 135013481Sgiacomo.travaglini@arm.com#endif 135113481Sgiacomo.travaglini@arm.com 135213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_WSTRING 135313481Sgiacomo.travaglini@arm.com// wchar_t pointer vs std::wstring 135413481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsStdWString) { 135513481Sgiacomo.travaglini@arm.com const wchar_t* s = L"hi \"world"; 135613481Sgiacomo.travaglini@arm.com EXPECT_STREQ("L\"hi \\\"world\"", // The string content should be escaped. 135713481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(s, ::std::wstring()).c_str()); 135813481Sgiacomo.travaglini@arm.com 135913481Sgiacomo.travaglini@arm.com // wchar_t* 136013481Sgiacomo.travaglini@arm.com wchar_t str[] = L"hi\1"; 136113481Sgiacomo.travaglini@arm.com wchar_t* p = str; 136213481Sgiacomo.travaglini@arm.com EXPECT_STREQ("L\"hi\\x1\"", // The string content should be escaped. 136313481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(p, ::std::wstring()).c_str()); 136413481Sgiacomo.travaglini@arm.com} 136513481Sgiacomo.travaglini@arm.com#endif 136613481Sgiacomo.travaglini@arm.com 136713481Sgiacomo.travaglini@arm.com// Tests formatting a char array when it's compared with a pointer or array. 136813481Sgiacomo.travaglini@arm.com// In this case we want to print the array as a row pointer, as the comparison 136913481Sgiacomo.travaglini@arm.com// is by pointer. 137013481Sgiacomo.travaglini@arm.com 137113481Sgiacomo.travaglini@arm.com// char array vs pointer 137213481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsPointer) { 137313481Sgiacomo.travaglini@arm.com char str[] = "hi \"world\""; 137413481Sgiacomo.travaglini@arm.com char* p = NULL; 137513481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(str), 137613481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, p).c_str()); 137713481Sgiacomo.travaglini@arm.com} 137813481Sgiacomo.travaglini@arm.com 137913481Sgiacomo.travaglini@arm.com// char array vs char array 138013481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsCharArray) { 138113481Sgiacomo.travaglini@arm.com const char str[] = "hi \"world\""; 138213481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(str), 138313481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, str).c_str()); 138413481Sgiacomo.travaglini@arm.com} 138513481Sgiacomo.travaglini@arm.com 138613481Sgiacomo.travaglini@arm.com// wchar_t array vs pointer 138713481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsPointer) { 138813481Sgiacomo.travaglini@arm.com wchar_t str[] = L"hi \"world\""; 138913481Sgiacomo.travaglini@arm.com wchar_t* p = NULL; 139013481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(str), 139113481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, p).c_str()); 139213481Sgiacomo.travaglini@arm.com} 139313481Sgiacomo.travaglini@arm.com 139413481Sgiacomo.travaglini@arm.com// wchar_t array vs wchar_t array 139513481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWCharArray) { 139613481Sgiacomo.travaglini@arm.com const wchar_t str[] = L"hi \"world\""; 139713481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(str), 139813481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, str).c_str()); 139913481Sgiacomo.travaglini@arm.com} 140013481Sgiacomo.travaglini@arm.com 140113481Sgiacomo.travaglini@arm.com// Tests formatting a char array when it's compared with a string object. 140213481Sgiacomo.travaglini@arm.com// In this case we want to print the array as a C string. 140313481Sgiacomo.travaglini@arm.com 140413481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_STRING 140513481Sgiacomo.travaglini@arm.com// char array vs string 140613481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsString) { 140713481Sgiacomo.travaglini@arm.com const char str[] = "hi \"w\0rld\""; 140813481Sgiacomo.travaglini@arm.com EXPECT_STREQ("\"hi \\\"w\"", // The content should be escaped. 140913481Sgiacomo.travaglini@arm.com // Embedded NUL terminates the string. 141013481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, ::string()).c_str()); 141113481Sgiacomo.travaglini@arm.com} 141213481Sgiacomo.travaglini@arm.com#endif 141313481Sgiacomo.travaglini@arm.com 141413481Sgiacomo.travaglini@arm.com// char array vs std::string 141513481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsStdString) { 141613481Sgiacomo.travaglini@arm.com const char str[] = "hi \"world\""; 141713481Sgiacomo.travaglini@arm.com EXPECT_STREQ("\"hi \\\"world\\\"\"", // The content should be escaped. 141813481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, ::std::string()).c_str()); 141913481Sgiacomo.travaglini@arm.com} 142013481Sgiacomo.travaglini@arm.com 142113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_WSTRING 142213481Sgiacomo.travaglini@arm.com// wchar_t array vs wstring 142313481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWString) { 142413481Sgiacomo.travaglini@arm.com const wchar_t str[] = L"hi \"world\""; 142513481Sgiacomo.travaglini@arm.com EXPECT_STREQ("L\"hi \\\"world\\\"\"", // The content should be escaped. 142613481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, ::wstring()).c_str()); 142713481Sgiacomo.travaglini@arm.com} 142813481Sgiacomo.travaglini@arm.com#endif 142913481Sgiacomo.travaglini@arm.com 143013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_WSTRING 143113481Sgiacomo.travaglini@arm.com// wchar_t array vs std::wstring 143213481Sgiacomo.travaglini@arm.comTEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsStdWString) { 143313481Sgiacomo.travaglini@arm.com const wchar_t str[] = L"hi \"w\0rld\""; 143413481Sgiacomo.travaglini@arm.com EXPECT_STREQ( 143513481Sgiacomo.travaglini@arm.com "L\"hi \\\"w\"", // The content should be escaped. 143613481Sgiacomo.travaglini@arm.com // Embedded NUL terminates the string. 143713481Sgiacomo.travaglini@arm.com FormatForComparisonFailureMessage(str, ::std::wstring()).c_str()); 143813481Sgiacomo.travaglini@arm.com} 143913481Sgiacomo.travaglini@arm.com#endif 144013481Sgiacomo.travaglini@arm.com 144113481Sgiacomo.travaglini@arm.com// Useful for testing PrintToString(). We cannot use EXPECT_EQ() 144213481Sgiacomo.travaglini@arm.com// there as its implementation uses PrintToString(). The caller must 144313481Sgiacomo.travaglini@arm.com// ensure that 'value' has no side effect. 144413481Sgiacomo.travaglini@arm.com#define EXPECT_PRINT_TO_STRING_(value, expected_string) \ 144513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(PrintToString(value) == (expected_string)) \ 144613481Sgiacomo.travaglini@arm.com << " where " #value " prints as " << (PrintToString(value)) 144713481Sgiacomo.travaglini@arm.com 144813481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, WorksForScalar) { 144913481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(123, "123"); 145013481Sgiacomo.travaglini@arm.com} 145113481Sgiacomo.travaglini@arm.com 145213481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, WorksForPointerToConstChar) { 145313481Sgiacomo.travaglini@arm.com const char* p = "hello"; 145413481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(p, "\"hello\""); 145513481Sgiacomo.travaglini@arm.com} 145613481Sgiacomo.travaglini@arm.com 145713481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, WorksForPointerToNonConstChar) { 145813481Sgiacomo.travaglini@arm.com char s[] = "hello"; 145913481Sgiacomo.travaglini@arm.com char* p = s; 146013481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(p, "\"hello\""); 146113481Sgiacomo.travaglini@arm.com} 146213481Sgiacomo.travaglini@arm.com 146313481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, EscapesForPointerToConstChar) { 146413481Sgiacomo.travaglini@arm.com const char* p = "hello\n"; 146513481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(p, "\"hello\\n\""); 146613481Sgiacomo.travaglini@arm.com} 146713481Sgiacomo.travaglini@arm.com 146813481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, EscapesForPointerToNonConstChar) { 146913481Sgiacomo.travaglini@arm.com char s[] = "hello\1"; 147013481Sgiacomo.travaglini@arm.com char* p = s; 147113481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(p, "\"hello\\x1\""); 147213481Sgiacomo.travaglini@arm.com} 147313481Sgiacomo.travaglini@arm.com 147413481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, WorksForArray) { 147513481Sgiacomo.travaglini@arm.com int n[3] = { 1, 2, 3 }; 147613481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(n, "{ 1, 2, 3 }"); 147713481Sgiacomo.travaglini@arm.com} 147813481Sgiacomo.travaglini@arm.com 147913481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, WorksForCharArray) { 148013481Sgiacomo.travaglini@arm.com char s[] = "hello"; 148113481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(s, "\"hello\""); 148213481Sgiacomo.travaglini@arm.com} 148313481Sgiacomo.travaglini@arm.com 148413481Sgiacomo.travaglini@arm.comTEST(PrintToStringTest, WorksForCharArrayWithEmbeddedNul) { 148513481Sgiacomo.travaglini@arm.com const char str_with_nul[] = "hello\0 world"; 148613481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(str_with_nul, "\"hello\\0 world\""); 148713481Sgiacomo.travaglini@arm.com 148813481Sgiacomo.travaglini@arm.com char mutable_str_with_nul[] = "hello\0 world"; 148913481Sgiacomo.travaglini@arm.com EXPECT_PRINT_TO_STRING_(mutable_str_with_nul, "\"hello\\0 world\""); 149013481Sgiacomo.travaglini@arm.com} 149113481Sgiacomo.travaglini@arm.com 149213481Sgiacomo.travaglini@arm.com#undef EXPECT_PRINT_TO_STRING_ 149313481Sgiacomo.travaglini@arm.com 149413481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTest, WorksForNonReference) { 149513481Sgiacomo.travaglini@arm.com ::std::stringstream ss; 149613481Sgiacomo.travaglini@arm.com UniversalTersePrint(123, &ss); 149713481Sgiacomo.travaglini@arm.com EXPECT_EQ("123", ss.str()); 149813481Sgiacomo.travaglini@arm.com} 149913481Sgiacomo.travaglini@arm.com 150013481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTest, WorksForReference) { 150113481Sgiacomo.travaglini@arm.com const int& n = 123; 150213481Sgiacomo.travaglini@arm.com ::std::stringstream ss; 150313481Sgiacomo.travaglini@arm.com UniversalTersePrint(n, &ss); 150413481Sgiacomo.travaglini@arm.com EXPECT_EQ("123", ss.str()); 150513481Sgiacomo.travaglini@arm.com} 150613481Sgiacomo.travaglini@arm.com 150713481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTest, WorksForCString) { 150813481Sgiacomo.travaglini@arm.com const char* s1 = "abc"; 150913481Sgiacomo.travaglini@arm.com ::std::stringstream ss1; 151013481Sgiacomo.travaglini@arm.com UniversalTersePrint(s1, &ss1); 151113481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"abc\"", ss1.str()); 151213481Sgiacomo.travaglini@arm.com 151313481Sgiacomo.travaglini@arm.com char* s2 = const_cast<char*>(s1); 151413481Sgiacomo.travaglini@arm.com ::std::stringstream ss2; 151513481Sgiacomo.travaglini@arm.com UniversalTersePrint(s2, &ss2); 151613481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"abc\"", ss2.str()); 151713481Sgiacomo.travaglini@arm.com 151813481Sgiacomo.travaglini@arm.com const char* s3 = NULL; 151913481Sgiacomo.travaglini@arm.com ::std::stringstream ss3; 152013481Sgiacomo.travaglini@arm.com UniversalTersePrint(s3, &ss3); 152113481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", ss3.str()); 152213481Sgiacomo.travaglini@arm.com} 152313481Sgiacomo.travaglini@arm.com 152413481Sgiacomo.travaglini@arm.comTEST(UniversalPrintTest, WorksForNonReference) { 152513481Sgiacomo.travaglini@arm.com ::std::stringstream ss; 152613481Sgiacomo.travaglini@arm.com UniversalPrint(123, &ss); 152713481Sgiacomo.travaglini@arm.com EXPECT_EQ("123", ss.str()); 152813481Sgiacomo.travaglini@arm.com} 152913481Sgiacomo.travaglini@arm.com 153013481Sgiacomo.travaglini@arm.comTEST(UniversalPrintTest, WorksForReference) { 153113481Sgiacomo.travaglini@arm.com const int& n = 123; 153213481Sgiacomo.travaglini@arm.com ::std::stringstream ss; 153313481Sgiacomo.travaglini@arm.com UniversalPrint(n, &ss); 153413481Sgiacomo.travaglini@arm.com EXPECT_EQ("123", ss.str()); 153513481Sgiacomo.travaglini@arm.com} 153613481Sgiacomo.travaglini@arm.com 153713481Sgiacomo.travaglini@arm.comTEST(UniversalPrintTest, WorksForCString) { 153813481Sgiacomo.travaglini@arm.com const char* s1 = "abc"; 153913481Sgiacomo.travaglini@arm.com ::std::stringstream ss1; 154013481Sgiacomo.travaglini@arm.com UniversalPrint(s1, &ss1); 154113481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(s1) + " pointing to \"abc\"", string(ss1.str())); 154213481Sgiacomo.travaglini@arm.com 154313481Sgiacomo.travaglini@arm.com char* s2 = const_cast<char*>(s1); 154413481Sgiacomo.travaglini@arm.com ::std::stringstream ss2; 154513481Sgiacomo.travaglini@arm.com UniversalPrint(s2, &ss2); 154613481Sgiacomo.travaglini@arm.com EXPECT_EQ(PrintPointer(s2) + " pointing to \"abc\"", string(ss2.str())); 154713481Sgiacomo.travaglini@arm.com 154813481Sgiacomo.travaglini@arm.com const char* s3 = NULL; 154913481Sgiacomo.travaglini@arm.com ::std::stringstream ss3; 155013481Sgiacomo.travaglini@arm.com UniversalPrint(s3, &ss3); 155113481Sgiacomo.travaglini@arm.com EXPECT_EQ("NULL", ss3.str()); 155213481Sgiacomo.travaglini@arm.com} 155313481Sgiacomo.travaglini@arm.com 155413481Sgiacomo.travaglini@arm.comTEST(UniversalPrintTest, WorksForCharArray) { 155513481Sgiacomo.travaglini@arm.com const char str[] = "\"Line\0 1\"\nLine 2"; 155613481Sgiacomo.travaglini@arm.com ::std::stringstream ss1; 155713481Sgiacomo.travaglini@arm.com UniversalPrint(str, &ss1); 155813481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss1.str()); 155913481Sgiacomo.travaglini@arm.com 156013481Sgiacomo.travaglini@arm.com const char mutable_str[] = "\"Line\0 1\"\nLine 2"; 156113481Sgiacomo.travaglini@arm.com ::std::stringstream ss2; 156213481Sgiacomo.travaglini@arm.com UniversalPrint(mutable_str, &ss2); 156313481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss2.str()); 156413481Sgiacomo.travaglini@arm.com} 156513481Sgiacomo.travaglini@arm.com 156613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_TR1_TUPLE 156713481Sgiacomo.travaglini@arm.com 156813481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsEmptyTuple) { 156913481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings( 157013481Sgiacomo.travaglini@arm.com ::std::tr1::make_tuple()); 157113481Sgiacomo.travaglini@arm.com EXPECT_EQ(0u, result.size()); 157213481Sgiacomo.travaglini@arm.com} 157313481Sgiacomo.travaglini@arm.com 157413481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsOneTuple) { 157513481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings( 157613481Sgiacomo.travaglini@arm.com ::std::tr1::make_tuple(1)); 157713481Sgiacomo.travaglini@arm.com ASSERT_EQ(1u, result.size()); 157813481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", result[0]); 157913481Sgiacomo.travaglini@arm.com} 158013481Sgiacomo.travaglini@arm.com 158113481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsTwoTuple) { 158213481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings( 158313481Sgiacomo.travaglini@arm.com ::std::tr1::make_tuple(1, 'a')); 158413481Sgiacomo.travaglini@arm.com ASSERT_EQ(2u, result.size()); 158513481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", result[0]); 158613481Sgiacomo.travaglini@arm.com EXPECT_EQ("'a' (97, 0x61)", result[1]); 158713481Sgiacomo.travaglini@arm.com} 158813481Sgiacomo.travaglini@arm.com 158913481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithTr1, PrintsTersely) { 159013481Sgiacomo.travaglini@arm.com const int n = 1; 159113481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings( 159213481Sgiacomo.travaglini@arm.com ::std::tr1::tuple<const int&, const char*>(n, "a")); 159313481Sgiacomo.travaglini@arm.com ASSERT_EQ(2u, result.size()); 159413481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", result[0]); 159513481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"a\"", result[1]); 159613481Sgiacomo.travaglini@arm.com} 159713481Sgiacomo.travaglini@arm.com 159813481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_TR1_TUPLE 159913481Sgiacomo.travaglini@arm.com 160013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_TUPLE_ 160113481Sgiacomo.travaglini@arm.com 160213481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsEmptyTuple) { 160313481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings(::std::make_tuple()); 160413481Sgiacomo.travaglini@arm.com EXPECT_EQ(0u, result.size()); 160513481Sgiacomo.travaglini@arm.com} 160613481Sgiacomo.travaglini@arm.com 160713481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsOneTuple) { 160813481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings( 160913481Sgiacomo.travaglini@arm.com ::std::make_tuple(1)); 161013481Sgiacomo.travaglini@arm.com ASSERT_EQ(1u, result.size()); 161113481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", result[0]); 161213481Sgiacomo.travaglini@arm.com} 161313481Sgiacomo.travaglini@arm.com 161413481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTwoTuple) { 161513481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings( 161613481Sgiacomo.travaglini@arm.com ::std::make_tuple(1, 'a')); 161713481Sgiacomo.travaglini@arm.com ASSERT_EQ(2u, result.size()); 161813481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", result[0]); 161913481Sgiacomo.travaglini@arm.com EXPECT_EQ("'a' (97, 0x61)", result[1]); 162013481Sgiacomo.travaglini@arm.com} 162113481Sgiacomo.travaglini@arm.com 162213481Sgiacomo.travaglini@arm.comTEST(UniversalTersePrintTupleFieldsToStringsTestWithStd, PrintsTersely) { 162313481Sgiacomo.travaglini@arm.com const int n = 1; 162413481Sgiacomo.travaglini@arm.com Strings result = UniversalTersePrintTupleFieldsToStrings( 162513481Sgiacomo.travaglini@arm.com ::std::tuple<const int&, const char*>(n, "a")); 162613481Sgiacomo.travaglini@arm.com ASSERT_EQ(2u, result.size()); 162713481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", result[0]); 162813481Sgiacomo.travaglini@arm.com EXPECT_EQ("\"a\"", result[1]); 162913481Sgiacomo.travaglini@arm.com} 163013481Sgiacomo.travaglini@arm.com 163113481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_TUPLE_ 163213481Sgiacomo.travaglini@arm.com 163313481Sgiacomo.travaglini@arm.com} // namespace gtest_printers_test 163413481Sgiacomo.travaglini@arm.com} // namespace testing 163513481Sgiacomo.travaglini@arm.com 1636