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