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