1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2007, Google Inc.
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved.
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: wan@google.com (Zhanyong Wan)
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Mock - a framework for writing C++ mock classes.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file tests the internal utilities.
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/internal/gmock-internal-utils.h"
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <stdlib.h>
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <map>
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string>
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <sstream>
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <vector>
4246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock.h"
4346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/internal/gmock-port.h"
4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h"
4546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest-spi.h"
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_CYGWIN
4846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <sys/types.h>  // For ssize_t. NOLINT
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass ProtocolMessage;
5246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
5346108a219a4b812dd8f36fee479a0340ea5963f5Ben Channamespace proto2 {
5446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass Message;
5546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}  // namespace proto2
5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace {
61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing ::std::tr1::make_tuple;
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing ::std::tr1::tuple;
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("", ConvertIdentifierNameToWords(""));
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("", ConvertIdentifierNameToWords("_"));
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("", ConvertIdentifierNameToWords("__"));
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("1", ConvertIdentifierNameToWords("_1"));
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("2", ConvertIdentifierNameToWords("2_"));
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_"));
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56"));
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord"));
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar"));
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_"));
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_"));
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar"));
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar"));
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_"));
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_"));
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar"));
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123"));
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ("chapter 11 section 1",
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            ConvertIdentifierNameToWords("_Chapter11Section_1_"));
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeOfTest, WorksForSmartPointers) {
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CompileAssertTypesEqual<const char,
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      PointeeOf<internal::linked_ptr<const char> >::type>();
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeOfTest, WorksForRawPointers) {
105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CompileAssertTypesEqual<int, PointeeOf<int*>::type>();
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CompileAssertTypesEqual<const char, PointeeOf<const char*>::type>();
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  CompileAssertTypesEqual<void, PointeeOf<void*>::type>();
108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GetRawPointerTest, WorksForSmartPointers) {
111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const char* const raw_p4 = new const char('a');  // NOLINT
112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const internal::linked_ptr<const char> p4(raw_p4);
113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(raw_p4, GetRawPointer(p4));
114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GetRawPointerTest, WorksForRawPointers) {
117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int* p = NULL;
11846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Don't use EXPECT_EQ as no NULL-testing magic on Symbian.
11946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(NULL == GetRawPointer(p));
120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int n = 1;
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(&n, GetRawPointer(&n));
122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
12446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests KindOf<T>.
12546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Base {};
127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Derived : public Base {};
128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, Bool) {
130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool));  // NOLINT
131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, Integer) {
134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char));  // NOLINT
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char));  // NOLINT
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char));  // NOLINT
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short));  // NOLINT
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short));  // NOLINT
139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int));  // NOLINT
140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int));  // NOLINT
141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long));  // NOLINT
142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long));  // NOLINT
143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t));  // NOLINT
144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(Int64));  // NOLINT
145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(UInt64));  // NOLINT
146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t));  // NOLINT
147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // ssize_t is not defined on Windows and possibly some other OSes.
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t));  // NOLINT
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, FloatingPoint) {
154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float));  // NOLINT
155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double));  // NOLINT
156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double));  // NOLINT
157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(KindOfTest, Other) {
160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*));  // NOLINT
161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**));  // NOLINT
162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base));  // NOLINT
163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests LosslessArithmeticConvertible<T, U>.
166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, BoolToBool) {
168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));
169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, BoolToInteger) {
172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));
173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));
174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(
175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      (LosslessArithmeticConvertible<bool, unsigned long>::value));  // NOLINT
176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {
179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));
180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));
181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, IntegerToBool) {
184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));
185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));
186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {
189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Unsigned => larger signed is fine.
190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));
191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Unsigned => larger unsigned is fine.
193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(
194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      (LosslessArithmeticConvertible<unsigned short, UInt64>::value)); // NOLINT
195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Signed => unsigned is not fine.
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<short, UInt64>::value)); // NOLINT
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      signed char, unsigned int>::value));  // NOLINT
200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Same size and same signedness: fine too.
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               unsigned char, unsigned char>::value));
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<
207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               unsigned long, unsigned long>::value));  // NOLINT
208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Same size, different signedness: not fine.
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<
211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                unsigned char, signed char>::value));
212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<UInt64, Int64>::value));
214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Larger size => smaller size is not fine.
216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value));  // NOLINT
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<Int64, unsigned int>::value));
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {
222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Integers cannot be losslessly converted to floating-points, as
223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // the format of the latter is implementation-defined.
224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));
226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<
227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                short, long double>::value));  // NOLINT
228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {
231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));
232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));
233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {
236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value));  // NOLINT
237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<double, Int64>::value));
238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));
239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {
242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Smaller size => larger size is fine.
243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));
244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));
245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));
246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Same size: fine.
248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));
249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));
250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Larger size => smaller size is not fine.
252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));
253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  if (sizeof(double) == sizeof(long double)) {  // NOLINT
254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // In some implementations (e.g. MSVC), double and long double
255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // have the same size.
256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  } else {
258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests the TupleMatches() template function.
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize0) {
265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<> matchers;
266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<> values;
267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(TupleMatches(matchers, values));
269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize1) {
272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<Matcher<int> > matchers(Eq(1));
273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<int> values1(1),
274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      values2(2);
275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(TupleMatches(matchers, values1));
277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(TupleMatches(matchers, values2));
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize2) {
281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<Matcher<int>, Matcher<char> > matchers(Eq(1), Eq('a'));
282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<int, char> values1(1, 'a'),
283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      values2(1, 'b'),
284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      values3(2, 'a'),
285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      values4(2, 'b');
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(TupleMatches(matchers, values1));
288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(TupleMatches(matchers, values2));
289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(TupleMatches(matchers, values3));
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(TupleMatches(matchers, values4));
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TupleMatchesTest, WorksForSize5) {
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<Matcher<int>, Matcher<char>, Matcher<bool>, Matcher<long>,  // NOLINT
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Matcher<string> >
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi"));
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tuple<int, char, bool, long, string>  // NOLINT
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      values1(1, 'a', true, 2L, "hi"),
299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      values2(1, 'a', true, 2L, "hello"),
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      values3(2, 'a', true, 2L, "hi");
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(TupleMatches(matchers, values1));
303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(TupleMatches(matchers, values2));
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(TupleMatches(matchers, values3));
305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Assert(true, ...) succeeds.
308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AssertTest, SucceedsOnTrue) {
309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Assert(true, __FILE__, __LINE__, "This should succeed.");
310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Assert(true, __FILE__, __LINE__);  // This should succeed too.
311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Assert(false, ...) generates a fatal failure.
314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AssertTest, FailsFatallyOnFalse) {
31546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Assert(false, __FILE__, __LINE__, "This should fail.");
317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
31946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Assert(false, __FILE__, __LINE__);
321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Expect(true, ...) succeeds.
325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectTest, SucceedsOnTrue) {
326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Expect(true, __FILE__, __LINE__, "This should succeed.");
327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Expect(true, __FILE__, __LINE__);  // This should succeed too.
328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Expect(false, ...) generates a non-fatal failure.
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectTest, FailsNonfatallyOnFalse) {
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Expect(false, __FILE__, __LINE__, "This should fail.");
334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "This should fail");
335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Expect(false, __FILE__, __LINE__);
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "Expectation failed");
339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests LogIsVisible().
342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass LogIsVisibleTest : public ::testing::Test {
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected:
345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void SetUp() {
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // The code needs to work when both ::string and ::std::string are
347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // defined and the flag is implemented as a
348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // testing::internal::String.  In this case, without the call to
349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // c_str(), the compiler will complain that it cannot figure out
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // whether the String flag should be converted to a ::string or an
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // ::std::string before being assigned to original_verbose_.
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    original_verbose_ = GMOCK_FLAG(verbose).c_str();
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void TearDown() { GMOCK_FLAG(verbose) = original_verbose_; }
356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  string original_verbose_;
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {
361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kInfoVerbosity;
36246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(LogIsVisible(kInfo));
36346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(LogIsVisible(kWarning));
364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kErrorVerbosity;
36846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(LogIsVisible(kInfo));
36946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(LogIsVisible(kWarning));
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kWarningVerbosity;
37446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_FALSE(LogIsVisible(kInfo));
37546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(LogIsVisible(kWarning));
376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
37846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests the Log() function.
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that Log() behaves correctly for the given verbosity level
383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and log severity.
384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid TestLogWithSeverity(const string& verbosity, LogSeverity severity,
385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                         bool should_print) {
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const string old_flag = GMOCK_FLAG(verbose);
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = verbosity;
38846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Log(severity, "Test log.\n", 0);
390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  if (should_print) {
39146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_THAT(GetCapturedStdout().c_str(),
39246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ContainsRegex(
39346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    severity == kWarning ?
39446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n" :
39546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    "^\nTest log\\.\nStack trace:\n"));
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  } else {
39746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_STREQ("", GetCapturedStdout().c_str());
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = old_flag;
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when the stack_frames_to_skip parameter is negative,
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Log() doesn't include the stack trace in the output.
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {
40546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const string saved_flag = GMOCK_FLAG(verbose);
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kInfoVerbosity;
40746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
40846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Log(kInfo, "Test log.\n", -1);
40946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str());
41046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GMOCK_FLAG(verbose) = saved_flag;
411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that in opt mode, a positive stack_frames_to_skip argument is
414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// treated as 0.
415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, NoSkippingStackFrameInOptMode) {
41646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
41746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Log(kWarning, "Test log.\n", 100);
41846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String log = GetCapturedStdout();
41946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
42046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# if defined(NDEBUG) && GTEST_GOOGLE3_MODE_
42146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // In opt mode, no stack frame should be skipped.
423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_THAT(log, ContainsRegex("\nGMOCK WARNING:\n"
424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                 "Test log\\.\n"
425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                 "Stack trace:\n"
426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                 ".+"));
42746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# else
42846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // In dbg mode, the stack frames should be skipped.
43046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("\nGMOCK WARNING:\n"
43146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               "Test log.\n"
43246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               "Stack trace:\n", log.c_str());
43346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that all logs are printed when the value of the
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is "info".
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {
43946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity(kInfoVerbosity, kInfo, true);
44046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity(kInfoVerbosity, kWarning, true);
441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that only warnings are printed when the value of the
444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is "warning".
445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {
44646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity(kWarningVerbosity, kInfo, false);
44746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity(kWarningVerbosity, kWarning, true);
448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that no logs are printed when the value of the
451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is "error".
452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {
45346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity(kErrorVerbosity, kInfo, false);
45446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity(kErrorVerbosity, kWarning, false);
455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that only warnings are printed when the value of the
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// --gmock_verbose flag is invalid.
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {
46046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity("invalid", kInfo, false);
46146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  TestLogWithSeverity("invalid", kWarning, true);
462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
46446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_STREAM_REDIRECTION
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, true_type) {
467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(true_type::value);
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, false_type) {
471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(false_type::value);
472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, is_reference) {
475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(is_reference<int>::value);
476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(is_reference<char*>::value);
477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(is_reference<const int&>::value);
478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, is_pointer) {
481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(is_pointer<int>::value);
482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(is_pointer<char&>::value);
483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(is_pointer<const int*>::value);
484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, type_equals) {
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((type_equals<int, const int>::value));
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((type_equals<int, int&>::value));
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE((type_equals<int, double>::value));
490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((type_equals<char, char>::value));
491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypeTraitsTest, remove_reference) {
494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((type_equals<char, remove_reference<char&>::type>::value));
495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((type_equals<const int,
496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               remove_reference<const int&>::type>::value));
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((type_equals<int, remove_reference<int>::type>::value));
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE((type_equals<double*, remove_reference<double*>::type>::value));
499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
50146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION
502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that Log() behaves correctly for the given verbosity level
504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and log severity.
50546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanString GrabOutput(void(*logger)(), const char* verbosity) {
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const string saved_flag = GMOCK_FLAG(verbose);
507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = verbosity;
50846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  logger();
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = saved_flag;
51146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return GetCapturedStdout();
512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass DummyMock {
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD0(TestMethod, void());
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD1(TestMethodArg, void(int dummy));
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid ExpectCallLogger() {
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  DummyMock mock;
522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(mock, TestMethod());
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  mock.TestMethod();
524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info".
527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {
528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_THAT(GrabOutput(ExpectCallLogger, kInfoVerbosity),
529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              HasSubstr("EXPECT_CALL(mock, TestMethod())"));
530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that EXPECT_CALL doesn't log
533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// if the --gmock_verbose flag is set to "warning".
534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {
53546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());
536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that EXPECT_CALL doesn't log
539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// if the --gmock_verbose flag is set to "error".
540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest,  DoesNotLogWhenVerbosityIsError) {
54146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());
542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid OnCallLogger() {
545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  DummyMock mock;
546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(mock, TestMethod());
547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info".
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, LogsWhenVerbosityIsInfo) {
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_THAT(GrabOutput(OnCallLogger, kInfoVerbosity),
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              HasSubstr("ON_CALL(mock, TestMethod())"));
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL doesn't log
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// if the --gmock_verbose flag is set to "warning".
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {
55846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL doesn't log if
562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the --gmock_verbose flag is set to "error".
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {
56446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid OnCallAnyArgumentLogger() {
568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  DummyMock mock;
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(mock, TestMethodArg(_));
570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Verifies that ON_CALL prints provided _ argument.
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, LogsAnythingArgument) {
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_THAT(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity),
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter              HasSubstr("ON_CALL(mock, TestMethodArg(_)"));
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
57846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_STREAM_REDIRECTION
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests StlContainerView.
581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StlContainerViewTest, WorksForStlContainer) {
583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<std::vector<int>,
584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<std::vector<int> >::type>();
585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<const std::vector<double>&,
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<std::vector<double> >::const_reference>();
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef std::vector<char> Chars;
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Chars v1;
590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const Chars& v2(StlContainerView<Chars>::ConstReference(v1));
591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(&v1, &v2);
592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  v1.push_back('a');
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Chars v3 = StlContainerView<Chars>::Copy(v1);
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_THAT(v3, Eq(v3));
596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StlContainerViewTest, WorksForStaticNativeArray) {
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<NativeArray<int>,
600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<int[3]>::type>();
601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<NativeArray<double>,
602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<const double[4]>::type>();
603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<NativeArray<char[3]>,
604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<const char[2][3]>::type>();
605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<const NativeArray<int>,
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<int[2]>::const_reference>();
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int a1[3] = { 0, 1, 2 };
610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);
61146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(3U, a2.size());
612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(a1, a2.begin());
613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);
61546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_EQ(3U, a3.size());
616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, a3.begin()[0]);
617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, a3.begin()[1]);
618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(2, a3.begin()[2]);
619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Makes sure a1 and a3 aren't aliases.
621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a1[0] = 3;
622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, a3.begin()[0]);
623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StlContainerViewTest, WorksForDynamicNativeArray) {
626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<NativeArray<int>,
627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<tuple<const int*, size_t> >::type>();
628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<NativeArray<double>,
629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<tuple<linked_ptr<double>, int> >::type>();
630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  StaticAssertTypeEq<const NativeArray<int>,
632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      StlContainerView<tuple<const int*, int> >::const_reference>();
633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int a1[3] = { 0, 1, 2 };
635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const int* const p1 = a1;
636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  NativeArray<int> a2 = StlContainerView<tuple<const int*, int> >::
637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ConstReference(make_tuple(p1, 3));
63846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(3U, a2.size());
639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(a1, a2.begin());
640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const NativeArray<int> a3 = StlContainerView<tuple<int*, size_t> >::
642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      Copy(make_tuple(static_cast<int*>(a1), 3));
64346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ASSERT_EQ(3U, a3.size());
644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, a3.begin()[0]);
645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, a3.begin()[1]);
646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(2, a3.begin()[2]);
647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Makes sure a1 and a3 aren't aliases.
649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a1[0] = 3;
650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, a3.begin()[0]);
651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace
654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
656