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