xref: /aosp_15_r20/external/googletest/googlemock/test/gmock-internal-utils_test.cc (revision 481dde660366d6f317d242b6974ef1b20adb843c)
1*481dde66SAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
2*481dde66SAndroid Build Coastguard Worker // All rights reserved.
3*481dde66SAndroid Build Coastguard Worker //
4*481dde66SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
5*481dde66SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
6*481dde66SAndroid Build Coastguard Worker // met:
7*481dde66SAndroid Build Coastguard Worker //
8*481dde66SAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
9*481dde66SAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
10*481dde66SAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
11*481dde66SAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12*481dde66SAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
13*481dde66SAndroid Build Coastguard Worker // distribution.
14*481dde66SAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
15*481dde66SAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
16*481dde66SAndroid Build Coastguard Worker // this software without specific prior written permission.
17*481dde66SAndroid Build Coastguard Worker //
18*481dde66SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*481dde66SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*481dde66SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21*481dde66SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*481dde66SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*481dde66SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*481dde66SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*481dde66SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*481dde66SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*481dde66SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*481dde66SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*481dde66SAndroid Build Coastguard Worker 
30*481dde66SAndroid Build Coastguard Worker // Google Mock - a framework for writing C++ mock classes.
31*481dde66SAndroid Build Coastguard Worker //
32*481dde66SAndroid Build Coastguard Worker // This file tests the internal utilities.
33*481dde66SAndroid Build Coastguard Worker 
34*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/gmock-internal-utils.h"
35*481dde66SAndroid Build Coastguard Worker 
36*481dde66SAndroid Build Coastguard Worker #include <stdlib.h>
37*481dde66SAndroid Build Coastguard Worker 
38*481dde66SAndroid Build Coastguard Worker #include <cstdint>
39*481dde66SAndroid Build Coastguard Worker #include <map>
40*481dde66SAndroid Build Coastguard Worker #include <memory>
41*481dde66SAndroid Build Coastguard Worker #include <sstream>
42*481dde66SAndroid Build Coastguard Worker #include <string>
43*481dde66SAndroid Build Coastguard Worker #include <tuple>
44*481dde66SAndroid Build Coastguard Worker #include <vector>
45*481dde66SAndroid Build Coastguard Worker 
46*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock.h"
47*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/gmock-port.h"
48*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest-spi.h"
49*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest.h"
50*481dde66SAndroid Build Coastguard Worker 
51*481dde66SAndroid Build Coastguard Worker // Indicates that this translation unit is part of Google Test's
52*481dde66SAndroid Build Coastguard Worker // implementation.  It must come before gtest-internal-inl.h is
53*481dde66SAndroid Build Coastguard Worker // included, or there will be a compiler error.  This trick is to
54*481dde66SAndroid Build Coastguard Worker // prevent a user from accidentally including gtest-internal-inl.h in
55*481dde66SAndroid Build Coastguard Worker // their code.
56*481dde66SAndroid Build Coastguard Worker #define GTEST_IMPLEMENTATION_ 1
57*481dde66SAndroid Build Coastguard Worker #include "src/gtest-internal-inl.h"
58*481dde66SAndroid Build Coastguard Worker #undef GTEST_IMPLEMENTATION_
59*481dde66SAndroid Build Coastguard Worker 
60*481dde66SAndroid Build Coastguard Worker #ifdef GTEST_OS_CYGWIN
61*481dde66SAndroid Build Coastguard Worker #include <sys/types.h>  // For ssize_t. NOLINT
62*481dde66SAndroid Build Coastguard Worker #endif
63*481dde66SAndroid Build Coastguard Worker 
64*481dde66SAndroid Build Coastguard Worker namespace proto2 {
65*481dde66SAndroid Build Coastguard Worker class Message;
66*481dde66SAndroid Build Coastguard Worker }  // namespace proto2
67*481dde66SAndroid Build Coastguard Worker 
68*481dde66SAndroid Build Coastguard Worker namespace testing {
69*481dde66SAndroid Build Coastguard Worker namespace internal {
70*481dde66SAndroid Build Coastguard Worker 
71*481dde66SAndroid Build Coastguard Worker namespace {
72*481dde66SAndroid Build Coastguard Worker 
TEST(JoinAsKeyValueTupleTest,JoinsEmptyTuple)73*481dde66SAndroid Build Coastguard Worker TEST(JoinAsKeyValueTupleTest, JoinsEmptyTuple) {
74*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("", JoinAsKeyValueTuple({}, Strings()));
75*481dde66SAndroid Build Coastguard Worker }
76*481dde66SAndroid Build Coastguard Worker 
TEST(JoinAsKeyValueTupleTest,JoinsOneTuple)77*481dde66SAndroid Build Coastguard Worker TEST(JoinAsKeyValueTupleTest, JoinsOneTuple) {
78*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("(a: 1)", JoinAsKeyValueTuple({"a"}, {"1"}));
79*481dde66SAndroid Build Coastguard Worker }
80*481dde66SAndroid Build Coastguard Worker 
TEST(JoinAsKeyValueTupleTest,JoinsTwoTuple)81*481dde66SAndroid Build Coastguard Worker TEST(JoinAsKeyValueTupleTest, JoinsTwoTuple) {
82*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("(a: 1, b: 2)", JoinAsKeyValueTuple({"a", "b"}, {"1", "2"}));
83*481dde66SAndroid Build Coastguard Worker }
84*481dde66SAndroid Build Coastguard Worker 
TEST(JoinAsKeyValueTupleTest,JoinsTenTuple)85*481dde66SAndroid Build Coastguard Worker TEST(JoinAsKeyValueTupleTest, JoinsTenTuple) {
86*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(
87*481dde66SAndroid Build Coastguard Worker       "(a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10)",
88*481dde66SAndroid Build Coastguard Worker       JoinAsKeyValueTuple({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"},
89*481dde66SAndroid Build Coastguard Worker                           {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}));
90*481dde66SAndroid Build Coastguard Worker }
91*481dde66SAndroid Build Coastguard Worker 
TEST(ConvertIdentifierNameToWordsTest,WorksWhenNameContainsNoWord)92*481dde66SAndroid Build Coastguard Worker TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsNoWord) {
93*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("", ConvertIdentifierNameToWords(""));
94*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("", ConvertIdentifierNameToWords("_"));
95*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("", ConvertIdentifierNameToWords("__"));
96*481dde66SAndroid Build Coastguard Worker }
97*481dde66SAndroid Build Coastguard Worker 
TEST(ConvertIdentifierNameToWordsTest,WorksWhenNameContainsDigits)98*481dde66SAndroid Build Coastguard Worker TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsDigits) {
99*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("1", ConvertIdentifierNameToWords("_1"));
100*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("2", ConvertIdentifierNameToWords("2_"));
101*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("34", ConvertIdentifierNameToWords("_34_"));
102*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("34 56", ConvertIdentifierNameToWords("_34_56"));
103*481dde66SAndroid Build Coastguard Worker }
104*481dde66SAndroid Build Coastguard Worker 
TEST(ConvertIdentifierNameToWordsTest,WorksWhenNameContainsCamelCaseWords)105*481dde66SAndroid Build Coastguard Worker TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContainsCamelCaseWords) {
106*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("a big word", ConvertIdentifierNameToWords("ABigWord"));
107*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("FooBar"));
108*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo", ConvertIdentifierNameToWords("Foo_"));
109*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_Foo_Bar_"));
110*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_Foo__And_Bar"));
111*481dde66SAndroid Build Coastguard Worker }
112*481dde66SAndroid Build Coastguard Worker 
TEST(ConvertIdentifierNameToWordsTest,WorksWhenNameContains_SeparatedWords)113*481dde66SAndroid Build Coastguard Worker TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameContains_SeparatedWords) {
114*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("foo_bar"));
115*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo", ConvertIdentifierNameToWords("_foo_"));
116*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo bar", ConvertIdentifierNameToWords("_foo_bar_"));
117*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo and bar", ConvertIdentifierNameToWords("_foo__and_bar"));
118*481dde66SAndroid Build Coastguard Worker }
119*481dde66SAndroid Build Coastguard Worker 
TEST(ConvertIdentifierNameToWordsTest,WorksWhenNameIsMixture)120*481dde66SAndroid Build Coastguard Worker TEST(ConvertIdentifierNameToWordsTest, WorksWhenNameIsMixture) {
121*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("foo bar 123", ConvertIdentifierNameToWords("Foo_bar123"));
122*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("chapter 11 section 1",
123*481dde66SAndroid Build Coastguard Worker             ConvertIdentifierNameToWords("_Chapter11Section_1_"));
124*481dde66SAndroid Build Coastguard Worker }
125*481dde66SAndroid Build Coastguard Worker 
TEST(GetRawPointerTest,WorksForSmartPointers)126*481dde66SAndroid Build Coastguard Worker TEST(GetRawPointerTest, WorksForSmartPointers) {
127*481dde66SAndroid Build Coastguard Worker   const char* const raw_p1 = new const char('a');  // NOLINT
128*481dde66SAndroid Build Coastguard Worker   const std::unique_ptr<const char> p1(raw_p1);
129*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(raw_p1, GetRawPointer(p1));
130*481dde66SAndroid Build Coastguard Worker   double* const raw_p2 = new double(2.5);  // NOLINT
131*481dde66SAndroid Build Coastguard Worker   const std::shared_ptr<double> p2(raw_p2);
132*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(raw_p2, GetRawPointer(p2));
133*481dde66SAndroid Build Coastguard Worker }
134*481dde66SAndroid Build Coastguard Worker 
TEST(GetRawPointerTest,WorksForRawPointers)135*481dde66SAndroid Build Coastguard Worker TEST(GetRawPointerTest, WorksForRawPointers) {
136*481dde66SAndroid Build Coastguard Worker   int* p = nullptr;
137*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(nullptr == GetRawPointer(p));
138*481dde66SAndroid Build Coastguard Worker   int n = 1;
139*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(&n, GetRawPointer(&n));
140*481dde66SAndroid Build Coastguard Worker }
141*481dde66SAndroid Build Coastguard Worker 
TEST(GetRawPointerTest,WorksForStdReferenceWrapper)142*481dde66SAndroid Build Coastguard Worker TEST(GetRawPointerTest, WorksForStdReferenceWrapper) {
143*481dde66SAndroid Build Coastguard Worker   int n = 1;
144*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(&n, GetRawPointer(std::ref(n)));
145*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(&n, GetRawPointer(std::cref(n)));
146*481dde66SAndroid Build Coastguard Worker }
147*481dde66SAndroid Build Coastguard Worker 
148*481dde66SAndroid Build Coastguard Worker // Tests KindOf<T>.
149*481dde66SAndroid Build Coastguard Worker 
150*481dde66SAndroid Build Coastguard Worker class Base {};
151*481dde66SAndroid Build Coastguard Worker class Derived : public Base {};
152*481dde66SAndroid Build Coastguard Worker 
TEST(KindOfTest,Bool)153*481dde66SAndroid Build Coastguard Worker TEST(KindOfTest, Bool) {
154*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kBool, GMOCK_KIND_OF_(bool));  // NOLINT
155*481dde66SAndroid Build Coastguard Worker }
156*481dde66SAndroid Build Coastguard Worker 
TEST(KindOfTest,Integer)157*481dde66SAndroid Build Coastguard Worker TEST(KindOfTest, Integer) {
158*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(char));                // NOLINT
159*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(signed char));         // NOLINT
160*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned char));       // NOLINT
161*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(short));               // NOLINT
162*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned short));      // NOLINT
163*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(int));                 // NOLINT
164*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned int));        // NOLINT
165*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long));                // NOLINT
166*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long));       // NOLINT
167*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(long long));           // NOLINT
168*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(unsigned long long));  // NOLINT
169*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(wchar_t));             // NOLINT
170*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(size_t));              // NOLINT
171*481dde66SAndroid Build Coastguard Worker #if defined(GTEST_OS_LINUX) || defined(GTEST_OS_MAC) || defined(GTEST_OS_CYGWIN)
172*481dde66SAndroid Build Coastguard Worker   // ssize_t is not defined on Windows and possibly some other OSes.
173*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kInteger, GMOCK_KIND_OF_(ssize_t));  // NOLINT
174*481dde66SAndroid Build Coastguard Worker #endif
175*481dde66SAndroid Build Coastguard Worker }
176*481dde66SAndroid Build Coastguard Worker 
TEST(KindOfTest,FloatingPoint)177*481dde66SAndroid Build Coastguard Worker TEST(KindOfTest, FloatingPoint) {
178*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(float));        // NOLINT
179*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(double));       // NOLINT
180*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kFloatingPoint, GMOCK_KIND_OF_(long double));  // NOLINT
181*481dde66SAndroid Build Coastguard Worker }
182*481dde66SAndroid Build Coastguard Worker 
TEST(KindOfTest,Other)183*481dde66SAndroid Build Coastguard Worker TEST(KindOfTest, Other) {
184*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kOther, GMOCK_KIND_OF_(void*));   // NOLINT
185*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kOther, GMOCK_KIND_OF_(char**));  // NOLINT
186*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(kOther, GMOCK_KIND_OF_(Base));    // NOLINT
187*481dde66SAndroid Build Coastguard Worker }
188*481dde66SAndroid Build Coastguard Worker 
189*481dde66SAndroid Build Coastguard Worker // Tests LosslessArithmeticConvertible<T, U>.
190*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,BoolToBool)191*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, BoolToBool) {
192*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<bool, bool>::value));
193*481dde66SAndroid Build Coastguard Worker }
194*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,BoolToInteger)195*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, BoolToInteger) {
196*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<bool, char>::value));
197*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<bool, int>::value));
198*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(
199*481dde66SAndroid Build Coastguard Worker       (LosslessArithmeticConvertible<bool, unsigned long>::value));  // NOLINT
200*481dde66SAndroid Build Coastguard Worker }
201*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,BoolToFloatingPoint)202*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, BoolToFloatingPoint) {
203*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<bool, float>::value));
204*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<bool, double>::value));
205*481dde66SAndroid Build Coastguard Worker }
206*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,IntegerToBool)207*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, IntegerToBool) {
208*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<unsigned char, bool>::value));
209*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<int, bool>::value));
210*481dde66SAndroid Build Coastguard Worker }
211*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,IntegerToInteger)212*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, IntegerToInteger) {
213*481dde66SAndroid Build Coastguard Worker   // Unsigned => larger signed is fine.
214*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<unsigned char, int>::value));
215*481dde66SAndroid Build Coastguard Worker 
216*481dde66SAndroid Build Coastguard Worker   // Unsigned => larger unsigned is fine.
217*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<unsigned short,
218*481dde66SAndroid Build Coastguard Worker                                              uint64_t>::value));  // NOLINT
219*481dde66SAndroid Build Coastguard Worker 
220*481dde66SAndroid Build Coastguard Worker   // Signed => unsigned is not fine.
221*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(
222*481dde66SAndroid Build Coastguard Worker       (LosslessArithmeticConvertible<short, uint64_t>::value));  // NOLINT
223*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<signed char,
224*481dde66SAndroid Build Coastguard Worker                                               unsigned int>::value));  // NOLINT
225*481dde66SAndroid Build Coastguard Worker 
226*481dde66SAndroid Build Coastguard Worker   // Same size and same signedness: fine too.
227*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(
228*481dde66SAndroid Build Coastguard Worker       (LosslessArithmeticConvertible<unsigned char, unsigned char>::value));
229*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<int, int>::value));
230*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<wchar_t, wchar_t>::value));
231*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<unsigned long,
232*481dde66SAndroid Build Coastguard Worker                                              unsigned long>::value));  // NOLINT
233*481dde66SAndroid Build Coastguard Worker 
234*481dde66SAndroid Build Coastguard Worker   // Same size, different signedness: not fine.
235*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(
236*481dde66SAndroid Build Coastguard Worker       (LosslessArithmeticConvertible<unsigned char, signed char>::value));
237*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<int, unsigned int>::value));
238*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<uint64_t, int64_t>::value));
239*481dde66SAndroid Build Coastguard Worker 
240*481dde66SAndroid Build Coastguard Worker   // Larger size => smaller size is not fine.
241*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<long, char>::value));  // NOLINT
242*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<int, signed char>::value));
243*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<int64_t, unsigned int>::value));
244*481dde66SAndroid Build Coastguard Worker }
245*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,IntegerToFloatingPoint)246*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, IntegerToFloatingPoint) {
247*481dde66SAndroid Build Coastguard Worker   // Integers cannot be losslessly converted to floating-points, as
248*481dde66SAndroid Build Coastguard Worker   // the format of the latter is implementation-defined.
249*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<char, float>::value));
250*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<int, double>::value));
251*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(
252*481dde66SAndroid Build Coastguard Worker       (LosslessArithmeticConvertible<short, long double>::value));  // NOLINT
253*481dde66SAndroid Build Coastguard Worker }
254*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,FloatingPointToBool)255*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, FloatingPointToBool) {
256*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<float, bool>::value));
257*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<double, bool>::value));
258*481dde66SAndroid Build Coastguard Worker }
259*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,FloatingPointToInteger)260*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, FloatingPointToInteger) {
261*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<float, long>::value));  // NOLINT
262*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<double, int64_t>::value));
263*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<long double, int>::value));
264*481dde66SAndroid Build Coastguard Worker }
265*481dde66SAndroid Build Coastguard Worker 
TEST(LosslessArithmeticConvertibleTest,FloatingPointToFloatingPoint)266*481dde66SAndroid Build Coastguard Worker TEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {
267*481dde66SAndroid Build Coastguard Worker   // Smaller size => larger size is fine.
268*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<float, double>::value));
269*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<float, long double>::value));
270*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<double, long double>::value));
271*481dde66SAndroid Build Coastguard Worker 
272*481dde66SAndroid Build Coastguard Worker   // Same size: fine.
273*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<float, float>::value));
274*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((LosslessArithmeticConvertible<double, double>::value));
275*481dde66SAndroid Build Coastguard Worker 
276*481dde66SAndroid Build Coastguard Worker   // Larger size => smaller size is not fine.
277*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));
278*481dde66SAndroid Build Coastguard Worker   GTEST_INTENTIONAL_CONST_COND_PUSH_()
279*481dde66SAndroid Build Coastguard Worker   if (sizeof(double) == sizeof(long double)) {  // NOLINT
280*481dde66SAndroid Build Coastguard Worker     GTEST_INTENTIONAL_CONST_COND_POP_()
281*481dde66SAndroid Build Coastguard Worker     // In some implementations (e.g. MSVC), double and long double
282*481dde66SAndroid Build Coastguard Worker     // have the same size.
283*481dde66SAndroid Build Coastguard Worker     EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));
284*481dde66SAndroid Build Coastguard Worker   } else {
285*481dde66SAndroid Build Coastguard Worker     EXPECT_FALSE((LosslessArithmeticConvertible<long double, double>::value));
286*481dde66SAndroid Build Coastguard Worker   }
287*481dde66SAndroid Build Coastguard Worker }
288*481dde66SAndroid Build Coastguard Worker 
289*481dde66SAndroid Build Coastguard Worker // Tests the TupleMatches() template function.
290*481dde66SAndroid Build Coastguard Worker 
TEST(TupleMatchesTest,WorksForSize0)291*481dde66SAndroid Build Coastguard Worker TEST(TupleMatchesTest, WorksForSize0) {
292*481dde66SAndroid Build Coastguard Worker   std::tuple<> matchers;
293*481dde66SAndroid Build Coastguard Worker   std::tuple<> values;
294*481dde66SAndroid Build Coastguard Worker 
295*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(TupleMatches(matchers, values));
296*481dde66SAndroid Build Coastguard Worker }
297*481dde66SAndroid Build Coastguard Worker 
TEST(TupleMatchesTest,WorksForSize1)298*481dde66SAndroid Build Coastguard Worker TEST(TupleMatchesTest, WorksForSize1) {
299*481dde66SAndroid Build Coastguard Worker   std::tuple<Matcher<int>> matchers(Eq(1));
300*481dde66SAndroid Build Coastguard Worker   std::tuple<int> values1(1), values2(2);
301*481dde66SAndroid Build Coastguard Worker 
302*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(TupleMatches(matchers, values1));
303*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(TupleMatches(matchers, values2));
304*481dde66SAndroid Build Coastguard Worker }
305*481dde66SAndroid Build Coastguard Worker 
TEST(TupleMatchesTest,WorksForSize2)306*481dde66SAndroid Build Coastguard Worker TEST(TupleMatchesTest, WorksForSize2) {
307*481dde66SAndroid Build Coastguard Worker   std::tuple<Matcher<int>, Matcher<char>> matchers(Eq(1), Eq('a'));
308*481dde66SAndroid Build Coastguard Worker   std::tuple<int, char> values1(1, 'a'), values2(1, 'b'), values3(2, 'a'),
309*481dde66SAndroid Build Coastguard Worker       values4(2, 'b');
310*481dde66SAndroid Build Coastguard Worker 
311*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(TupleMatches(matchers, values1));
312*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(TupleMatches(matchers, values2));
313*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(TupleMatches(matchers, values3));
314*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(TupleMatches(matchers, values4));
315*481dde66SAndroid Build Coastguard Worker }
316*481dde66SAndroid Build Coastguard Worker 
TEST(TupleMatchesTest,WorksForSize5)317*481dde66SAndroid Build Coastguard Worker TEST(TupleMatchesTest, WorksForSize5) {
318*481dde66SAndroid Build Coastguard Worker   std::tuple<Matcher<int>, Matcher<char>, Matcher<bool>,
319*481dde66SAndroid Build Coastguard Worker              Matcher<long>,  // NOLINT
320*481dde66SAndroid Build Coastguard Worker              Matcher<std::string>>
321*481dde66SAndroid Build Coastguard Worker       matchers(Eq(1), Eq('a'), Eq(true), Eq(2L), Eq("hi"));
322*481dde66SAndroid Build Coastguard Worker   std::tuple<int, char, bool, long, std::string>  // NOLINT
323*481dde66SAndroid Build Coastguard Worker       values1(1, 'a', true, 2L, "hi"), values2(1, 'a', true, 2L, "hello"),
324*481dde66SAndroid Build Coastguard Worker       values3(2, 'a', true, 2L, "hi");
325*481dde66SAndroid Build Coastguard Worker 
326*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(TupleMatches(matchers, values1));
327*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(TupleMatches(matchers, values2));
328*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(TupleMatches(matchers, values3));
329*481dde66SAndroid Build Coastguard Worker }
330*481dde66SAndroid Build Coastguard Worker 
331*481dde66SAndroid Build Coastguard Worker // Tests that Assert(true, ...) succeeds.
TEST(AssertTest,SucceedsOnTrue)332*481dde66SAndroid Build Coastguard Worker TEST(AssertTest, SucceedsOnTrue) {
333*481dde66SAndroid Build Coastguard Worker   Assert(true, __FILE__, __LINE__, "This should succeed.");
334*481dde66SAndroid Build Coastguard Worker   Assert(true, __FILE__, __LINE__);  // This should succeed too.
335*481dde66SAndroid Build Coastguard Worker }
336*481dde66SAndroid Build Coastguard Worker 
337*481dde66SAndroid Build Coastguard Worker // Tests that Assert(false, ...) generates a fatal failure.
TEST(AssertTest,FailsFatallyOnFalse)338*481dde66SAndroid Build Coastguard Worker TEST(AssertTest, FailsFatallyOnFalse) {
339*481dde66SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(
340*481dde66SAndroid Build Coastguard Worker       { Assert(false, __FILE__, __LINE__, "This should fail."); }, "");
341*481dde66SAndroid Build Coastguard Worker 
342*481dde66SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED({ Assert(false, __FILE__, __LINE__); }, "");
343*481dde66SAndroid Build Coastguard Worker }
344*481dde66SAndroid Build Coastguard Worker 
345*481dde66SAndroid Build Coastguard Worker // Tests that Expect(true, ...) succeeds.
TEST(ExpectTest,SucceedsOnTrue)346*481dde66SAndroid Build Coastguard Worker TEST(ExpectTest, SucceedsOnTrue) {
347*481dde66SAndroid Build Coastguard Worker   Expect(true, __FILE__, __LINE__, "This should succeed.");
348*481dde66SAndroid Build Coastguard Worker   Expect(true, __FILE__, __LINE__);  // This should succeed too.
349*481dde66SAndroid Build Coastguard Worker }
350*481dde66SAndroid Build Coastguard Worker 
351*481dde66SAndroid Build Coastguard Worker // Tests that Expect(false, ...) generates a non-fatal failure.
TEST(ExpectTest,FailsNonfatallyOnFalse)352*481dde66SAndroid Build Coastguard Worker TEST(ExpectTest, FailsNonfatallyOnFalse) {
353*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
354*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
355*481dde66SAndroid Build Coastguard Worker         Expect(false, __FILE__, __LINE__, "This should fail.");
356*481dde66SAndroid Build Coastguard Worker       },
357*481dde66SAndroid Build Coastguard Worker       "This should fail");
358*481dde66SAndroid Build Coastguard Worker 
359*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
360*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
361*481dde66SAndroid Build Coastguard Worker         Expect(false, __FILE__, __LINE__);
362*481dde66SAndroid Build Coastguard Worker       },
363*481dde66SAndroid Build Coastguard Worker       "Expectation failed");
364*481dde66SAndroid Build Coastguard Worker }
365*481dde66SAndroid Build Coastguard Worker 
366*481dde66SAndroid Build Coastguard Worker // Tests LogIsVisible().
367*481dde66SAndroid Build Coastguard Worker 
368*481dde66SAndroid Build Coastguard Worker class LogIsVisibleTest : public ::testing::Test {
369*481dde66SAndroid Build Coastguard Worker  protected:
SetUp()370*481dde66SAndroid Build Coastguard Worker   void SetUp() override { original_verbose_ = GMOCK_FLAG_GET(verbose); }
371*481dde66SAndroid Build Coastguard Worker 
TearDown()372*481dde66SAndroid Build Coastguard Worker   void TearDown() override { GMOCK_FLAG_SET(verbose, original_verbose_); }
373*481dde66SAndroid Build Coastguard Worker 
374*481dde66SAndroid Build Coastguard Worker   std::string original_verbose_;
375*481dde66SAndroid Build Coastguard Worker };
376*481dde66SAndroid Build Coastguard Worker 
TEST_F(LogIsVisibleTest,AlwaysReturnsTrueIfVerbosityIsInfo)377*481dde66SAndroid Build Coastguard Worker TEST_F(LogIsVisibleTest, AlwaysReturnsTrueIfVerbosityIsInfo) {
378*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kInfoVerbosity);
379*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(LogIsVisible(kInfo));
380*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(LogIsVisible(kWarning));
381*481dde66SAndroid Build Coastguard Worker }
382*481dde66SAndroid Build Coastguard Worker 
TEST_F(LogIsVisibleTest,AlwaysReturnsFalseIfVerbosityIsError)383*481dde66SAndroid Build Coastguard Worker TEST_F(LogIsVisibleTest, AlwaysReturnsFalseIfVerbosityIsError) {
384*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kErrorVerbosity);
385*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(LogIsVisible(kInfo));
386*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(LogIsVisible(kWarning));
387*481dde66SAndroid Build Coastguard Worker }
388*481dde66SAndroid Build Coastguard Worker 
TEST_F(LogIsVisibleTest,WorksWhenVerbosityIsWarning)389*481dde66SAndroid Build Coastguard Worker TEST_F(LogIsVisibleTest, WorksWhenVerbosityIsWarning) {
390*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kWarningVerbosity);
391*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(LogIsVisible(kInfo));
392*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(LogIsVisible(kWarning));
393*481dde66SAndroid Build Coastguard Worker }
394*481dde66SAndroid Build Coastguard Worker 
395*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_STREAM_REDIRECTION
396*481dde66SAndroid Build Coastguard Worker 
397*481dde66SAndroid Build Coastguard Worker // Tests the Log() function.
398*481dde66SAndroid Build Coastguard Worker 
399*481dde66SAndroid Build Coastguard Worker // Verifies that Log() behaves correctly for the given verbosity level
400*481dde66SAndroid Build Coastguard Worker // and log severity.
TestLogWithSeverity(const std::string & verbosity,LogSeverity severity,bool should_print)401*481dde66SAndroid Build Coastguard Worker void TestLogWithSeverity(const std::string& verbosity, LogSeverity severity,
402*481dde66SAndroid Build Coastguard Worker                          bool should_print) {
403*481dde66SAndroid Build Coastguard Worker   const std::string old_flag = GMOCK_FLAG_GET(verbose);
404*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, verbosity);
405*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
406*481dde66SAndroid Build Coastguard Worker   Log(severity, "Test log.\n", 0);
407*481dde66SAndroid Build Coastguard Worker   if (should_print) {
408*481dde66SAndroid Build Coastguard Worker     EXPECT_THAT(
409*481dde66SAndroid Build Coastguard Worker         GetCapturedStdout().c_str(),
410*481dde66SAndroid Build Coastguard Worker         ContainsRegex(severity == kWarning
411*481dde66SAndroid Build Coastguard Worker                           ? "^\nGMOCK WARNING:\nTest log\\.\nStack trace:\n"
412*481dde66SAndroid Build Coastguard Worker                           : "^\nTest log\\.\nStack trace:\n"));
413*481dde66SAndroid Build Coastguard Worker   } else {
414*481dde66SAndroid Build Coastguard Worker     EXPECT_STREQ("", GetCapturedStdout().c_str());
415*481dde66SAndroid Build Coastguard Worker   }
416*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, old_flag);
417*481dde66SAndroid Build Coastguard Worker }
418*481dde66SAndroid Build Coastguard Worker 
419*481dde66SAndroid Build Coastguard Worker // Tests that when the stack_frames_to_skip parameter is negative,
420*481dde66SAndroid Build Coastguard Worker // Log() doesn't include the stack trace in the output.
TEST(LogTest,NoStackTraceWhenStackFramesToSkipIsNegative)421*481dde66SAndroid Build Coastguard Worker TEST(LogTest, NoStackTraceWhenStackFramesToSkipIsNegative) {
422*481dde66SAndroid Build Coastguard Worker   const std::string saved_flag = GMOCK_FLAG_GET(verbose);
423*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kInfoVerbosity);
424*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
425*481dde66SAndroid Build Coastguard Worker   Log(kInfo, "Test log.\n", -1);
426*481dde66SAndroid Build Coastguard Worker   EXPECT_STREQ("\nTest log.\n", GetCapturedStdout().c_str());
427*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, saved_flag);
428*481dde66SAndroid Build Coastguard Worker }
429*481dde66SAndroid Build Coastguard Worker 
430*481dde66SAndroid Build Coastguard Worker struct MockStackTraceGetter : testing::internal::OsStackTraceGetterInterface {
CurrentStackTracetesting::internal::__anon2e4f57c40111::MockStackTraceGetter431*481dde66SAndroid Build Coastguard Worker   std::string CurrentStackTrace(int max_depth, int skip_count) override {
432*481dde66SAndroid Build Coastguard Worker     return (testing::Message() << max_depth << "::" << skip_count << "\n")
433*481dde66SAndroid Build Coastguard Worker         .GetString();
434*481dde66SAndroid Build Coastguard Worker   }
UponLeavingGTesttesting::internal::__anon2e4f57c40111::MockStackTraceGetter435*481dde66SAndroid Build Coastguard Worker   void UponLeavingGTest() override {}
436*481dde66SAndroid Build Coastguard Worker };
437*481dde66SAndroid Build Coastguard Worker 
438*481dde66SAndroid Build Coastguard Worker // Tests that in opt mode, a positive stack_frames_to_skip argument is
439*481dde66SAndroid Build Coastguard Worker // treated as 0.
TEST(LogTest,NoSkippingStackFrameInOptMode)440*481dde66SAndroid Build Coastguard Worker TEST(LogTest, NoSkippingStackFrameInOptMode) {
441*481dde66SAndroid Build Coastguard Worker   MockStackTraceGetter* mock_os_stack_trace_getter = new MockStackTraceGetter;
442*481dde66SAndroid Build Coastguard Worker   GetUnitTestImpl()->set_os_stack_trace_getter(mock_os_stack_trace_getter);
443*481dde66SAndroid Build Coastguard Worker 
444*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
445*481dde66SAndroid Build Coastguard Worker   Log(kWarning, "Test log.\n", 100);
446*481dde66SAndroid Build Coastguard Worker   const std::string log = GetCapturedStdout();
447*481dde66SAndroid Build Coastguard Worker 
448*481dde66SAndroid Build Coastguard Worker   std::string expected_trace =
449*481dde66SAndroid Build Coastguard Worker       (testing::Message() << GTEST_FLAG_GET(stack_trace_depth) << "::")
450*481dde66SAndroid Build Coastguard Worker           .GetString();
451*481dde66SAndroid Build Coastguard Worker   std::string expected_message =
452*481dde66SAndroid Build Coastguard Worker       "\nGMOCK WARNING:\n"
453*481dde66SAndroid Build Coastguard Worker       "Test log.\n"
454*481dde66SAndroid Build Coastguard Worker       "Stack trace:\n" +
455*481dde66SAndroid Build Coastguard Worker       expected_trace;
456*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(log, HasSubstr(expected_message));
457*481dde66SAndroid Build Coastguard Worker   int skip_count = atoi(log.substr(expected_message.size()).c_str());
458*481dde66SAndroid Build Coastguard Worker 
459*481dde66SAndroid Build Coastguard Worker #if defined(NDEBUG)
460*481dde66SAndroid Build Coastguard Worker   // In opt mode, no stack frame should be skipped.
461*481dde66SAndroid Build Coastguard Worker   const int expected_skip_count = 0;
462*481dde66SAndroid Build Coastguard Worker #else
463*481dde66SAndroid Build Coastguard Worker   // In dbg mode, the stack frames should be skipped.
464*481dde66SAndroid Build Coastguard Worker   const int expected_skip_count = 100;
465*481dde66SAndroid Build Coastguard Worker #endif
466*481dde66SAndroid Build Coastguard Worker 
467*481dde66SAndroid Build Coastguard Worker   // Note that each inner implementation layer will +1 the number to remove
468*481dde66SAndroid Build Coastguard Worker   // itself from the trace. This means that the value is a little higher than
469*481dde66SAndroid Build Coastguard Worker   // expected, but close enough.
470*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(skip_count,
471*481dde66SAndroid Build Coastguard Worker               AllOf(Ge(expected_skip_count), Le(expected_skip_count + 10)));
472*481dde66SAndroid Build Coastguard Worker 
473*481dde66SAndroid Build Coastguard Worker   // Restores the default OS stack trace getter.
474*481dde66SAndroid Build Coastguard Worker   GetUnitTestImpl()->set_os_stack_trace_getter(nullptr);
475*481dde66SAndroid Build Coastguard Worker }
476*481dde66SAndroid Build Coastguard Worker 
477*481dde66SAndroid Build Coastguard Worker // Tests that all logs are printed when the value of the
478*481dde66SAndroid Build Coastguard Worker // --gmock_verbose flag is "info".
TEST(LogTest,AllLogsArePrintedWhenVerbosityIsInfo)479*481dde66SAndroid Build Coastguard Worker TEST(LogTest, AllLogsArePrintedWhenVerbosityIsInfo) {
480*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity(kInfoVerbosity, kInfo, true);
481*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity(kInfoVerbosity, kWarning, true);
482*481dde66SAndroid Build Coastguard Worker }
483*481dde66SAndroid Build Coastguard Worker 
484*481dde66SAndroid Build Coastguard Worker // Tests that only warnings are printed when the value of the
485*481dde66SAndroid Build Coastguard Worker // --gmock_verbose flag is "warning".
TEST(LogTest,OnlyWarningsArePrintedWhenVerbosityIsWarning)486*481dde66SAndroid Build Coastguard Worker TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsWarning) {
487*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity(kWarningVerbosity, kInfo, false);
488*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity(kWarningVerbosity, kWarning, true);
489*481dde66SAndroid Build Coastguard Worker }
490*481dde66SAndroid Build Coastguard Worker 
491*481dde66SAndroid Build Coastguard Worker // Tests that no logs are printed when the value of the
492*481dde66SAndroid Build Coastguard Worker // --gmock_verbose flag is "error".
TEST(LogTest,NoLogsArePrintedWhenVerbosityIsError)493*481dde66SAndroid Build Coastguard Worker TEST(LogTest, NoLogsArePrintedWhenVerbosityIsError) {
494*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity(kErrorVerbosity, kInfo, false);
495*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity(kErrorVerbosity, kWarning, false);
496*481dde66SAndroid Build Coastguard Worker }
497*481dde66SAndroid Build Coastguard Worker 
498*481dde66SAndroid Build Coastguard Worker // Tests that only warnings are printed when the value of the
499*481dde66SAndroid Build Coastguard Worker // --gmock_verbose flag is invalid.
TEST(LogTest,OnlyWarningsArePrintedWhenVerbosityIsInvalid)500*481dde66SAndroid Build Coastguard Worker TEST(LogTest, OnlyWarningsArePrintedWhenVerbosityIsInvalid) {
501*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity("invalid", kInfo, false);
502*481dde66SAndroid Build Coastguard Worker   TestLogWithSeverity("invalid", kWarning, true);
503*481dde66SAndroid Build Coastguard Worker }
504*481dde66SAndroid Build Coastguard Worker 
505*481dde66SAndroid Build Coastguard Worker // Verifies that Log() behaves correctly for the given verbosity level
506*481dde66SAndroid Build Coastguard Worker // and log severity.
GrabOutput(void (* logger)(),const char * verbosity)507*481dde66SAndroid Build Coastguard Worker std::string GrabOutput(void (*logger)(), const char* verbosity) {
508*481dde66SAndroid Build Coastguard Worker   const std::string saved_flag = GMOCK_FLAG_GET(verbose);
509*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, verbosity);
510*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
511*481dde66SAndroid Build Coastguard Worker   logger();
512*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, saved_flag);
513*481dde66SAndroid Build Coastguard Worker   return GetCapturedStdout();
514*481dde66SAndroid Build Coastguard Worker }
515*481dde66SAndroid Build Coastguard Worker 
516*481dde66SAndroid Build Coastguard Worker class DummyMock {
517*481dde66SAndroid Build Coastguard Worker  public:
518*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD0(TestMethod, void());
519*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(TestMethodArg, void(int dummy));
520*481dde66SAndroid Build Coastguard Worker };
521*481dde66SAndroid Build Coastguard Worker 
ExpectCallLogger()522*481dde66SAndroid Build Coastguard Worker void ExpectCallLogger() {
523*481dde66SAndroid Build Coastguard Worker   DummyMock mock;
524*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(mock, TestMethod());
525*481dde66SAndroid Build Coastguard Worker   mock.TestMethod();
526*481dde66SAndroid Build Coastguard Worker }
527*481dde66SAndroid Build Coastguard Worker 
528*481dde66SAndroid Build Coastguard Worker // Verifies that EXPECT_CALL logs if the --gmock_verbose flag is set to "info".
TEST(ExpectCallTest,LogsWhenVerbosityIsInfo)529*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, LogsWhenVerbosityIsInfo) {
530*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(std::string(GrabOutput(ExpectCallLogger, kInfoVerbosity)),
531*481dde66SAndroid Build Coastguard Worker               HasSubstr("EXPECT_CALL(mock, TestMethod())"));
532*481dde66SAndroid Build Coastguard Worker }
533*481dde66SAndroid Build Coastguard Worker 
534*481dde66SAndroid Build Coastguard Worker // Verifies that EXPECT_CALL doesn't log
535*481dde66SAndroid Build Coastguard Worker // if the --gmock_verbose flag is set to "warning".
TEST(ExpectCallTest,DoesNotLogWhenVerbosityIsWarning)536*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsWarning) {
537*481dde66SAndroid Build Coastguard Worker   EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kWarningVerbosity).c_str());
538*481dde66SAndroid Build Coastguard Worker }
539*481dde66SAndroid Build Coastguard Worker 
540*481dde66SAndroid Build Coastguard Worker // Verifies that EXPECT_CALL doesn't log
541*481dde66SAndroid Build Coastguard Worker // if the --gmock_verbose flag is set to "error".
TEST(ExpectCallTest,DoesNotLogWhenVerbosityIsError)542*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, DoesNotLogWhenVerbosityIsError) {
543*481dde66SAndroid Build Coastguard Worker   EXPECT_STREQ("", GrabOutput(ExpectCallLogger, kErrorVerbosity).c_str());
544*481dde66SAndroid Build Coastguard Worker }
545*481dde66SAndroid Build Coastguard Worker 
OnCallLogger()546*481dde66SAndroid Build Coastguard Worker void OnCallLogger() {
547*481dde66SAndroid Build Coastguard Worker   DummyMock mock;
548*481dde66SAndroid Build Coastguard Worker   ON_CALL(mock, TestMethod());
549*481dde66SAndroid Build Coastguard Worker }
550*481dde66SAndroid Build Coastguard Worker 
551*481dde66SAndroid Build Coastguard Worker // Verifies that ON_CALL logs if the --gmock_verbose flag is set to "info".
TEST(OnCallTest,LogsWhenVerbosityIsInfo)552*481dde66SAndroid Build Coastguard Worker TEST(OnCallTest, LogsWhenVerbosityIsInfo) {
553*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(std::string(GrabOutput(OnCallLogger, kInfoVerbosity)),
554*481dde66SAndroid Build Coastguard Worker               HasSubstr("ON_CALL(mock, TestMethod())"));
555*481dde66SAndroid Build Coastguard Worker }
556*481dde66SAndroid Build Coastguard Worker 
557*481dde66SAndroid Build Coastguard Worker // Verifies that ON_CALL doesn't log
558*481dde66SAndroid Build Coastguard Worker // if the --gmock_verbose flag is set to "warning".
TEST(OnCallTest,DoesNotLogWhenVerbosityIsWarning)559*481dde66SAndroid Build Coastguard Worker TEST(OnCallTest, DoesNotLogWhenVerbosityIsWarning) {
560*481dde66SAndroid Build Coastguard Worker   EXPECT_STREQ("", GrabOutput(OnCallLogger, kWarningVerbosity).c_str());
561*481dde66SAndroid Build Coastguard Worker }
562*481dde66SAndroid Build Coastguard Worker 
563*481dde66SAndroid Build Coastguard Worker // Verifies that ON_CALL doesn't log if
564*481dde66SAndroid Build Coastguard Worker // the --gmock_verbose flag is set to "error".
TEST(OnCallTest,DoesNotLogWhenVerbosityIsError)565*481dde66SAndroid Build Coastguard Worker TEST(OnCallTest, DoesNotLogWhenVerbosityIsError) {
566*481dde66SAndroid Build Coastguard Worker   EXPECT_STREQ("", GrabOutput(OnCallLogger, kErrorVerbosity).c_str());
567*481dde66SAndroid Build Coastguard Worker }
568*481dde66SAndroid Build Coastguard Worker 
OnCallAnyArgumentLogger()569*481dde66SAndroid Build Coastguard Worker void OnCallAnyArgumentLogger() {
570*481dde66SAndroid Build Coastguard Worker   DummyMock mock;
571*481dde66SAndroid Build Coastguard Worker   ON_CALL(mock, TestMethodArg(_));
572*481dde66SAndroid Build Coastguard Worker }
573*481dde66SAndroid Build Coastguard Worker 
574*481dde66SAndroid Build Coastguard Worker // Verifies that ON_CALL prints provided _ argument.
TEST(OnCallTest,LogsAnythingArgument)575*481dde66SAndroid Build Coastguard Worker TEST(OnCallTest, LogsAnythingArgument) {
576*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(std::string(GrabOutput(OnCallAnyArgumentLogger, kInfoVerbosity)),
577*481dde66SAndroid Build Coastguard Worker               HasSubstr("ON_CALL(mock, TestMethodArg(_)"));
578*481dde66SAndroid Build Coastguard Worker }
579*481dde66SAndroid Build Coastguard Worker 
580*481dde66SAndroid Build Coastguard Worker #endif  // GTEST_HAS_STREAM_REDIRECTION
581*481dde66SAndroid Build Coastguard Worker 
582*481dde66SAndroid Build Coastguard Worker // Tests StlContainerView.
583*481dde66SAndroid Build Coastguard Worker 
TEST(StlContainerViewTest,WorksForStlContainer)584*481dde66SAndroid Build Coastguard Worker TEST(StlContainerViewTest, WorksForStlContainer) {
585*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<std::vector<int>,
586*481dde66SAndroid Build Coastguard Worker                      StlContainerView<std::vector<int>>::type>();
587*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<const std::vector<double>&,
588*481dde66SAndroid Build Coastguard Worker                      StlContainerView<std::vector<double>>::const_reference>();
589*481dde66SAndroid Build Coastguard Worker 
590*481dde66SAndroid Build Coastguard Worker   typedef std::vector<char> Chars;
591*481dde66SAndroid Build Coastguard Worker   Chars v1;
592*481dde66SAndroid Build Coastguard Worker   const Chars& v2(StlContainerView<Chars>::ConstReference(v1));
593*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(&v1, &v2);
594*481dde66SAndroid Build Coastguard Worker 
595*481dde66SAndroid Build Coastguard Worker   v1.push_back('a');
596*481dde66SAndroid Build Coastguard Worker   Chars v3 = StlContainerView<Chars>::Copy(v1);
597*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(v3, Eq(v3));
598*481dde66SAndroid Build Coastguard Worker }
599*481dde66SAndroid Build Coastguard Worker 
TEST(StlContainerViewTest,WorksForStaticNativeArray)600*481dde66SAndroid Build Coastguard Worker TEST(StlContainerViewTest, WorksForStaticNativeArray) {
601*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<NativeArray<int>, StlContainerView<int[3]>::type>();
602*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<NativeArray<double>,
603*481dde66SAndroid Build Coastguard Worker                      StlContainerView<const double[4]>::type>();
604*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<NativeArray<char[3]>,
605*481dde66SAndroid Build Coastguard Worker                      StlContainerView<const char[2][3]>::type>();
606*481dde66SAndroid Build Coastguard Worker 
607*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<const NativeArray<int>,
608*481dde66SAndroid Build Coastguard Worker                      StlContainerView<int[2]>::const_reference>();
609*481dde66SAndroid Build Coastguard Worker 
610*481dde66SAndroid Build Coastguard Worker   int a1[3] = {0, 1, 2};
611*481dde66SAndroid Build Coastguard Worker   NativeArray<int> a2 = StlContainerView<int[3]>::ConstReference(a1);
612*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(3U, a2.size());
613*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(a1, a2.begin());
614*481dde66SAndroid Build Coastguard Worker 
615*481dde66SAndroid Build Coastguard Worker   const NativeArray<int> a3 = StlContainerView<int[3]>::Copy(a1);
616*481dde66SAndroid Build Coastguard Worker   ASSERT_EQ(3U, a3.size());
617*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, a3.begin()[0]);
618*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, a3.begin()[1]);
619*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, a3.begin()[2]);
620*481dde66SAndroid Build Coastguard Worker 
621*481dde66SAndroid Build Coastguard Worker   // Makes sure a1 and a3 aren't aliases.
622*481dde66SAndroid Build Coastguard Worker   a1[0] = 3;
623*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, a3.begin()[0]);
624*481dde66SAndroid Build Coastguard Worker }
625*481dde66SAndroid Build Coastguard Worker 
TEST(StlContainerViewTest,WorksForDynamicNativeArray)626*481dde66SAndroid Build Coastguard Worker TEST(StlContainerViewTest, WorksForDynamicNativeArray) {
627*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<NativeArray<int>,
628*481dde66SAndroid Build Coastguard Worker                      StlContainerView<std::tuple<const int*, size_t>>::type>();
629*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<
630*481dde66SAndroid Build Coastguard Worker       NativeArray<double>,
631*481dde66SAndroid Build Coastguard Worker       StlContainerView<std::tuple<std::shared_ptr<double>, int>>::type>();
632*481dde66SAndroid Build Coastguard Worker 
633*481dde66SAndroid Build Coastguard Worker   StaticAssertTypeEq<
634*481dde66SAndroid Build Coastguard Worker       const NativeArray<int>,
635*481dde66SAndroid Build Coastguard Worker       StlContainerView<std::tuple<const int*, int>>::const_reference>();
636*481dde66SAndroid Build Coastguard Worker 
637*481dde66SAndroid Build Coastguard Worker   int a1[3] = {0, 1, 2};
638*481dde66SAndroid Build Coastguard Worker   const int* const p1 = a1;
639*481dde66SAndroid Build Coastguard Worker   NativeArray<int> a2 =
640*481dde66SAndroid Build Coastguard Worker       StlContainerView<std::tuple<const int*, int>>::ConstReference(
641*481dde66SAndroid Build Coastguard Worker           std::make_tuple(p1, 3));
642*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(3U, a2.size());
643*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(a1, a2.begin());
644*481dde66SAndroid Build Coastguard Worker 
645*481dde66SAndroid Build Coastguard Worker   const NativeArray<int> a3 = StlContainerView<std::tuple<int*, size_t>>::Copy(
646*481dde66SAndroid Build Coastguard Worker       std::make_tuple(static_cast<int*>(a1), 3));
647*481dde66SAndroid Build Coastguard Worker   ASSERT_EQ(3U, a3.size());
648*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, a3.begin()[0]);
649*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, a3.begin()[1]);
650*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, a3.begin()[2]);
651*481dde66SAndroid Build Coastguard Worker 
652*481dde66SAndroid Build Coastguard Worker   // Makes sure a1 and a3 aren't aliases.
653*481dde66SAndroid Build Coastguard Worker   a1[0] = 3;
654*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, a3.begin()[0]);
655*481dde66SAndroid Build Coastguard Worker }
656*481dde66SAndroid Build Coastguard Worker 
657*481dde66SAndroid Build Coastguard Worker // Tests the Function template struct.
658*481dde66SAndroid Build Coastguard Worker 
TEST(FunctionTest,Nullary)659*481dde66SAndroid Build Coastguard Worker TEST(FunctionTest, Nullary) {
660*481dde66SAndroid Build Coastguard Worker   typedef Function<int()> F;  // NOLINT
661*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0u, F::ArgumentCount);
662*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<int, F::Result>::value));
663*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentTuple>::value));
664*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<std::tuple<>, F::ArgumentMatcherTuple>::value));
665*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<void(), F::MakeResultVoid>::value));
666*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<IgnoredValue(), F::MakeResultIgnoredValue>::value));
667*481dde66SAndroid Build Coastguard Worker }
668*481dde66SAndroid Build Coastguard Worker 
TEST(FunctionTest,Unary)669*481dde66SAndroid Build Coastguard Worker TEST(FunctionTest, Unary) {
670*481dde66SAndroid Build Coastguard Worker   typedef Function<int(bool)> F;  // NOLINT
671*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1u, F::ArgumentCount);
672*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<int, F::Result>::value));
673*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
674*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<std::tuple<bool>, F::ArgumentTuple>::value));
675*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((
676*481dde66SAndroid Build Coastguard Worker       std::is_same<std::tuple<Matcher<bool>>, F::ArgumentMatcherTuple>::value));
677*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<void(bool), F::MakeResultVoid>::value));  // NOLINT
678*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<IgnoredValue(bool),                       // NOLINT
679*481dde66SAndroid Build Coastguard Worker                             F::MakeResultIgnoredValue>::value));
680*481dde66SAndroid Build Coastguard Worker }
681*481dde66SAndroid Build Coastguard Worker 
TEST(FunctionTest,Binary)682*481dde66SAndroid Build Coastguard Worker TEST(FunctionTest, Binary) {
683*481dde66SAndroid Build Coastguard Worker   typedef Function<int(bool, const long&)> F;  // NOLINT
684*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2u, F::ArgumentCount);
685*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<int, F::Result>::value));
686*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
687*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<const long&, F::Arg<1>::type>::value));  // NOLINT
688*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<std::tuple<bool, const long&>,           // NOLINT
689*481dde66SAndroid Build Coastguard Worker                             F::ArgumentTuple>::value));
690*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(
691*481dde66SAndroid Build Coastguard Worker       (std::is_same<std::tuple<Matcher<bool>, Matcher<const long&>>,  // NOLINT
692*481dde66SAndroid Build Coastguard Worker                     F::ArgumentMatcherTuple>::value));
693*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<void(bool, const long&),  // NOLINT
694*481dde66SAndroid Build Coastguard Worker                             F::MakeResultVoid>::value));
695*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<IgnoredValue(bool, const long&),  // NOLINT
696*481dde66SAndroid Build Coastguard Worker                             F::MakeResultIgnoredValue>::value));
697*481dde66SAndroid Build Coastguard Worker }
698*481dde66SAndroid Build Coastguard Worker 
TEST(FunctionTest,LongArgumentList)699*481dde66SAndroid Build Coastguard Worker TEST(FunctionTest, LongArgumentList) {
700*481dde66SAndroid Build Coastguard Worker   typedef Function<char(bool, int, char*, int&, const long&)> F;  // NOLINT
701*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(5u, F::ArgumentCount);
702*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<char, F::Result>::value));
703*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<bool, F::Arg<0>::type>::value));
704*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<int, F::Arg<1>::type>::value));
705*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<char*, F::Arg<2>::type>::value));
706*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<int&, F::Arg<3>::type>::value));
707*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<const long&, F::Arg<4>::type>::value));  // NOLINT
708*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(
709*481dde66SAndroid Build Coastguard Worker       (std::is_same<std::tuple<bool, int, char*, int&, const long&>,  // NOLINT
710*481dde66SAndroid Build Coastguard Worker                     F::ArgumentTuple>::value));
711*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(
712*481dde66SAndroid Build Coastguard Worker       (std::is_same<
713*481dde66SAndroid Build Coastguard Worker           std::tuple<Matcher<bool>, Matcher<int>, Matcher<char*>, Matcher<int&>,
714*481dde66SAndroid Build Coastguard Worker                      Matcher<const long&>>,  // NOLINT
715*481dde66SAndroid Build Coastguard Worker           F::ArgumentMatcherTuple>::value));
716*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(
717*481dde66SAndroid Build Coastguard Worker       (std::is_same<void(bool, int, char*, int&, const long&),  // NOLINT
718*481dde66SAndroid Build Coastguard Worker                     F::MakeResultVoid>::value));
719*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE((
720*481dde66SAndroid Build Coastguard Worker       std::is_same<IgnoredValue(bool, int, char*, int&, const long&),  // NOLINT
721*481dde66SAndroid Build Coastguard Worker                    F::MakeResultIgnoredValue>::value));
722*481dde66SAndroid Build Coastguard Worker }
723*481dde66SAndroid Build Coastguard Worker 
TEST(Base64Unescape,InvalidString)724*481dde66SAndroid Build Coastguard Worker TEST(Base64Unescape, InvalidString) {
725*481dde66SAndroid Build Coastguard Worker   std::string unescaped;
726*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(Base64Unescape("(invalid)", &unescaped));
727*481dde66SAndroid Build Coastguard Worker }
728*481dde66SAndroid Build Coastguard Worker 
TEST(Base64Unescape,ShortString)729*481dde66SAndroid Build Coastguard Worker TEST(Base64Unescape, ShortString) {
730*481dde66SAndroid Build Coastguard Worker   std::string unescaped;
731*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQh", &unescaped));
732*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("Hello world!", unescaped);
733*481dde66SAndroid Build Coastguard Worker }
734*481dde66SAndroid Build Coastguard Worker 
TEST(Base64Unescape,ShortStringWithPadding)735*481dde66SAndroid Build Coastguard Worker TEST(Base64Unescape, ShortStringWithPadding) {
736*481dde66SAndroid Build Coastguard Worker   std::string unescaped;
737*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQ=", &unescaped));
738*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("Hello world", unescaped);
739*481dde66SAndroid Build Coastguard Worker }
740*481dde66SAndroid Build Coastguard Worker 
TEST(Base64Unescape,ShortStringWithoutPadding)741*481dde66SAndroid Build Coastguard Worker TEST(Base64Unescape, ShortStringWithoutPadding) {
742*481dde66SAndroid Build Coastguard Worker   std::string unescaped;
743*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(Base64Unescape("SGVsbG8gd29ybGQ", &unescaped));
744*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("Hello world", unescaped);
745*481dde66SAndroid Build Coastguard Worker }
746*481dde66SAndroid Build Coastguard Worker 
TEST(Base64Unescape,LongStringWithWhiteSpaces)747*481dde66SAndroid Build Coastguard Worker TEST(Base64Unescape, LongStringWithWhiteSpaces) {
748*481dde66SAndroid Build Coastguard Worker   std::string escaped =
749*481dde66SAndroid Build Coastguard Worker       R"(TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
750*481dde66SAndroid Build Coastguard Worker   IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
751*481dde66SAndroid Build Coastguard Worker   dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
752*481dde66SAndroid Build Coastguard Worker   dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
753*481dde66SAndroid Build Coastguard Worker   ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=)";
754*481dde66SAndroid Build Coastguard Worker   std::string expected =
755*481dde66SAndroid Build Coastguard Worker       "Man is distinguished, not only by his reason, but by this singular "
756*481dde66SAndroid Build Coastguard Worker       "passion from other animals, which is a lust of the mind, that by a "
757*481dde66SAndroid Build Coastguard Worker       "perseverance of delight in the continued and indefatigable generation "
758*481dde66SAndroid Build Coastguard Worker       "of knowledge, exceeds the short vehemence of any carnal pleasure.";
759*481dde66SAndroid Build Coastguard Worker   std::string unescaped;
760*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(Base64Unescape(escaped, &unescaped));
761*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(expected, unescaped);
762*481dde66SAndroid Build Coastguard Worker }
763*481dde66SAndroid Build Coastguard Worker 
764*481dde66SAndroid Build Coastguard Worker }  // namespace
765*481dde66SAndroid Build Coastguard Worker }  // namespace internal
766*481dde66SAndroid Build Coastguard Worker }  // namespace testing
767