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 some commonly used argument matchers. 33f92157deSopenharmony_ci 34f92157deSopenharmony_ci// Silence warning C4244: 'initializing': conversion from 'int' to 'short', 35f92157deSopenharmony_ci// possible loss of data and C4100, unreferenced local parameter 36f92157deSopenharmony_ci#ifdef _MSC_VER 37f92157deSopenharmony_ci#pragma warning(push) 38f92157deSopenharmony_ci#pragma warning(disable : 4244) 39f92157deSopenharmony_ci#pragma warning(disable : 4100) 40f92157deSopenharmony_ci#endif 41f92157deSopenharmony_ci 42f92157deSopenharmony_ci#include <vector> 43f92157deSopenharmony_ci 44f92157deSopenharmony_ci#include "test/gmock-matchers_test.h" 45f92157deSopenharmony_ci 46f92157deSopenharmony_cinamespace testing { 47f92157deSopenharmony_cinamespace gmock_matchers_test { 48f92157deSopenharmony_cinamespace { 49f92157deSopenharmony_ci 50f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(MonotonicMatcherTest); 51f92157deSopenharmony_ci 52f92157deSopenharmony_ciTEST_P(MonotonicMatcherTestP, IsPrintable) { 53f92157deSopenharmony_ci stringstream ss; 54f92157deSopenharmony_ci ss << GreaterThan(5); 55f92157deSopenharmony_ci EXPECT_EQ("is > 5", ss.str()); 56f92157deSopenharmony_ci} 57f92157deSopenharmony_ci 58f92157deSopenharmony_ciTEST(MatchResultListenerTest, StreamingWorks) { 59f92157deSopenharmony_ci StringMatchResultListener listener; 60f92157deSopenharmony_ci listener << "hi" << 5; 61f92157deSopenharmony_ci EXPECT_EQ("hi5", listener.str()); 62f92157deSopenharmony_ci 63f92157deSopenharmony_ci listener.Clear(); 64f92157deSopenharmony_ci EXPECT_EQ("", listener.str()); 65f92157deSopenharmony_ci 66f92157deSopenharmony_ci listener << 42; 67f92157deSopenharmony_ci EXPECT_EQ("42", listener.str()); 68f92157deSopenharmony_ci 69f92157deSopenharmony_ci // Streaming shouldn't crash when the underlying ostream is NULL. 70f92157deSopenharmony_ci DummyMatchResultListener dummy; 71f92157deSopenharmony_ci dummy << "hi" << 5; 72f92157deSopenharmony_ci} 73f92157deSopenharmony_ci 74f92157deSopenharmony_ciTEST(MatchResultListenerTest, CanAccessUnderlyingStream) { 75f92157deSopenharmony_ci EXPECT_TRUE(DummyMatchResultListener().stream() == nullptr); 76f92157deSopenharmony_ci EXPECT_TRUE(StreamMatchResultListener(nullptr).stream() == nullptr); 77f92157deSopenharmony_ci 78f92157deSopenharmony_ci EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream()); 79f92157deSopenharmony_ci} 80f92157deSopenharmony_ci 81f92157deSopenharmony_ciTEST(MatchResultListenerTest, IsInterestedWorks) { 82f92157deSopenharmony_ci EXPECT_TRUE(StringMatchResultListener().IsInterested()); 83f92157deSopenharmony_ci EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested()); 84f92157deSopenharmony_ci 85f92157deSopenharmony_ci EXPECT_FALSE(DummyMatchResultListener().IsInterested()); 86f92157deSopenharmony_ci EXPECT_FALSE(StreamMatchResultListener(nullptr).IsInterested()); 87f92157deSopenharmony_ci} 88f92157deSopenharmony_ci 89f92157deSopenharmony_ci// Makes sure that the MatcherInterface<T> interface doesn't 90f92157deSopenharmony_ci// change. 91f92157deSopenharmony_ciclass EvenMatcherImpl : public MatcherInterface<int> { 92f92157deSopenharmony_ci public: 93f92157deSopenharmony_ci bool MatchAndExplain(int x, 94f92157deSopenharmony_ci MatchResultListener* /* listener */) const override { 95f92157deSopenharmony_ci return x % 2 == 0; 96f92157deSopenharmony_ci } 97f92157deSopenharmony_ci 98f92157deSopenharmony_ci void DescribeTo(ostream* os) const override { *os << "is an even number"; } 99f92157deSopenharmony_ci 100f92157deSopenharmony_ci // We deliberately don't define DescribeNegationTo() and 101f92157deSopenharmony_ci // ExplainMatchResultTo() here, to make sure the definition of these 102f92157deSopenharmony_ci // two methods is optional. 103f92157deSopenharmony_ci}; 104f92157deSopenharmony_ci 105f92157deSopenharmony_ci// Makes sure that the MatcherInterface API doesn't change. 106f92157deSopenharmony_ciTEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) { 107f92157deSopenharmony_ci EvenMatcherImpl m; 108f92157deSopenharmony_ci} 109f92157deSopenharmony_ci 110f92157deSopenharmony_ci// Tests implementing a monomorphic matcher using MatchAndExplain(). 111f92157deSopenharmony_ci 112f92157deSopenharmony_ciclass NewEvenMatcherImpl : public MatcherInterface<int> { 113f92157deSopenharmony_ci public: 114f92157deSopenharmony_ci bool MatchAndExplain(int x, MatchResultListener* listener) const override { 115f92157deSopenharmony_ci const bool match = x % 2 == 0; 116f92157deSopenharmony_ci // Verifies that we can stream to a listener directly. 117f92157deSopenharmony_ci *listener << "value % " << 2; 118f92157deSopenharmony_ci if (listener->stream() != nullptr) { 119f92157deSopenharmony_ci // Verifies that we can stream to a listener's underlying stream 120f92157deSopenharmony_ci // too. 121f92157deSopenharmony_ci *listener->stream() << " == " << (x % 2); 122f92157deSopenharmony_ci } 123f92157deSopenharmony_ci return match; 124f92157deSopenharmony_ci } 125f92157deSopenharmony_ci 126f92157deSopenharmony_ci void DescribeTo(ostream* os) const override { *os << "is an even number"; } 127f92157deSopenharmony_ci}; 128f92157deSopenharmony_ci 129f92157deSopenharmony_ciTEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) { 130f92157deSopenharmony_ci Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl); 131f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(2)); 132f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(3)); 133f92157deSopenharmony_ci EXPECT_EQ("value % 2 == 0", Explain(m, 2)); 134f92157deSopenharmony_ci EXPECT_EQ("value % 2 == 1", Explain(m, 3)); 135f92157deSopenharmony_ci} 136f92157deSopenharmony_ci 137f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(MatcherTest); 138f92157deSopenharmony_ci 139f92157deSopenharmony_ci// Tests default-constructing a matcher. 140f92157deSopenharmony_ciTEST(MatcherTest, CanBeDefaultConstructed) { Matcher<double> m; } 141f92157deSopenharmony_ci 142f92157deSopenharmony_ci// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*. 143f92157deSopenharmony_ciTEST(MatcherTest, CanBeConstructedFromMatcherInterface) { 144f92157deSopenharmony_ci const MatcherInterface<int>* impl = new EvenMatcherImpl; 145f92157deSopenharmony_ci Matcher<int> m(impl); 146f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(4)); 147f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(5)); 148f92157deSopenharmony_ci} 149f92157deSopenharmony_ci 150f92157deSopenharmony_ci// Tests that value can be used in place of Eq(value). 151f92157deSopenharmony_ciTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) { 152f92157deSopenharmony_ci Matcher<int> m1 = 5; 153f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(5)); 154f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(6)); 155f92157deSopenharmony_ci} 156f92157deSopenharmony_ci 157f92157deSopenharmony_ci// Tests that NULL can be used in place of Eq(NULL). 158f92157deSopenharmony_ciTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) { 159f92157deSopenharmony_ci Matcher<int*> m1 = nullptr; 160f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(nullptr)); 161f92157deSopenharmony_ci int n = 0; 162f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(&n)); 163f92157deSopenharmony_ci} 164f92157deSopenharmony_ci 165f92157deSopenharmony_ci// Tests that matchers can be constructed from a variable that is not properly 166f92157deSopenharmony_ci// defined. This should be illegal, but many users rely on this accidentally. 167f92157deSopenharmony_cistruct Undefined { 168f92157deSopenharmony_ci virtual ~Undefined() = 0; 169f92157deSopenharmony_ci static const int kInt = 1; 170f92157deSopenharmony_ci}; 171f92157deSopenharmony_ci 172f92157deSopenharmony_ciTEST(MatcherTest, CanBeConstructedFromUndefinedVariable) { 173f92157deSopenharmony_ci Matcher<int> m1 = Undefined::kInt; 174f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(1)); 175f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(2)); 176f92157deSopenharmony_ci} 177f92157deSopenharmony_ci 178f92157deSopenharmony_ci// Test that a matcher parameterized with an abstract class compiles. 179f92157deSopenharmony_ciTEST(MatcherTest, CanAcceptAbstractClass) { Matcher<const Undefined&> m = _; } 180f92157deSopenharmony_ci 181f92157deSopenharmony_ci// Tests that matchers are copyable. 182f92157deSopenharmony_ciTEST(MatcherTest, IsCopyable) { 183f92157deSopenharmony_ci // Tests the copy constructor. 184f92157deSopenharmony_ci Matcher<bool> m1 = Eq(false); 185f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(false)); 186f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(true)); 187f92157deSopenharmony_ci 188f92157deSopenharmony_ci // Tests the assignment operator. 189f92157deSopenharmony_ci m1 = Eq(true); 190f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(true)); 191f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(false)); 192f92157deSopenharmony_ci} 193f92157deSopenharmony_ci 194f92157deSopenharmony_ci// Tests that Matcher<T>::DescribeTo() calls 195f92157deSopenharmony_ci// MatcherInterface<T>::DescribeTo(). 196f92157deSopenharmony_ciTEST(MatcherTest, CanDescribeItself) { 197f92157deSopenharmony_ci EXPECT_EQ("is an even number", Describe(Matcher<int>(new EvenMatcherImpl))); 198f92157deSopenharmony_ci} 199f92157deSopenharmony_ci 200f92157deSopenharmony_ci// Tests Matcher<T>::MatchAndExplain(). 201f92157deSopenharmony_ciTEST_P(MatcherTestP, MatchAndExplain) { 202f92157deSopenharmony_ci Matcher<int> m = GreaterThan(0); 203f92157deSopenharmony_ci StringMatchResultListener listener1; 204f92157deSopenharmony_ci EXPECT_TRUE(m.MatchAndExplain(42, &listener1)); 205f92157deSopenharmony_ci EXPECT_EQ("which is 42 more than 0", listener1.str()); 206f92157deSopenharmony_ci 207f92157deSopenharmony_ci StringMatchResultListener listener2; 208f92157deSopenharmony_ci EXPECT_FALSE(m.MatchAndExplain(-9, &listener2)); 209f92157deSopenharmony_ci EXPECT_EQ("which is 9 less than 0", listener2.str()); 210f92157deSopenharmony_ci} 211f92157deSopenharmony_ci 212f92157deSopenharmony_ci// Tests that a C-string literal can be implicitly converted to a 213f92157deSopenharmony_ci// Matcher<std::string> or Matcher<const std::string&>. 214f92157deSopenharmony_ciTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 215f92157deSopenharmony_ci Matcher<std::string> m1 = "hi"; 216f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("hi")); 217f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("hello")); 218f92157deSopenharmony_ci 219f92157deSopenharmony_ci Matcher<const std::string&> m2 = "hi"; 220f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("hi")); 221f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("hello")); 222f92157deSopenharmony_ci} 223f92157deSopenharmony_ci 224f92157deSopenharmony_ci// Tests that a string object can be implicitly converted to a 225f92157deSopenharmony_ci// Matcher<std::string> or Matcher<const std::string&>. 226f92157deSopenharmony_ciTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) { 227f92157deSopenharmony_ci Matcher<std::string> m1 = std::string("hi"); 228f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("hi")); 229f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("hello")); 230f92157deSopenharmony_ci 231f92157deSopenharmony_ci Matcher<const std::string&> m2 = std::string("hi"); 232f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("hi")); 233f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("hello")); 234f92157deSopenharmony_ci} 235f92157deSopenharmony_ci 236f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 237f92157deSopenharmony_ci// Tests that a C-string literal can be implicitly converted to a 238f92157deSopenharmony_ci// Matcher<StringView> or Matcher<const StringView&>. 239f92157deSopenharmony_ciTEST(StringViewMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 240f92157deSopenharmony_ci Matcher<internal::StringView> m1 = "cats"; 241f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("cats")); 242f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("dogs")); 243f92157deSopenharmony_ci 244f92157deSopenharmony_ci Matcher<const internal::StringView&> m2 = "cats"; 245f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("cats")); 246f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("dogs")); 247f92157deSopenharmony_ci} 248f92157deSopenharmony_ci 249f92157deSopenharmony_ci// Tests that a std::string object can be implicitly converted to a 250f92157deSopenharmony_ci// Matcher<StringView> or Matcher<const StringView&>. 251f92157deSopenharmony_ciTEST(StringViewMatcherTest, CanBeImplicitlyConstructedFromString) { 252f92157deSopenharmony_ci Matcher<internal::StringView> m1 = std::string("cats"); 253f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("cats")); 254f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("dogs")); 255f92157deSopenharmony_ci 256f92157deSopenharmony_ci Matcher<const internal::StringView&> m2 = std::string("cats"); 257f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("cats")); 258f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("dogs")); 259f92157deSopenharmony_ci} 260f92157deSopenharmony_ci 261f92157deSopenharmony_ci// Tests that a StringView object can be implicitly converted to a 262f92157deSopenharmony_ci// Matcher<StringView> or Matcher<const StringView&>. 263f92157deSopenharmony_ciTEST(StringViewMatcherTest, CanBeImplicitlyConstructedFromStringView) { 264f92157deSopenharmony_ci Matcher<internal::StringView> m1 = internal::StringView("cats"); 265f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("cats")); 266f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("dogs")); 267f92157deSopenharmony_ci 268f92157deSopenharmony_ci Matcher<const internal::StringView&> m2 = internal::StringView("cats"); 269f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("cats")); 270f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("dogs")); 271f92157deSopenharmony_ci} 272f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 273f92157deSopenharmony_ci 274f92157deSopenharmony_ci// Tests that a std::reference_wrapper<std::string> object can be implicitly 275f92157deSopenharmony_ci// converted to a Matcher<std::string> or Matcher<const std::string&> via Eq(). 276f92157deSopenharmony_ciTEST(StringMatcherTest, 277f92157deSopenharmony_ci CanBeImplicitlyConstructedFromEqReferenceWrapperString) { 278f92157deSopenharmony_ci std::string value = "cats"; 279f92157deSopenharmony_ci Matcher<std::string> m1 = Eq(std::ref(value)); 280f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("cats")); 281f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("dogs")); 282f92157deSopenharmony_ci 283f92157deSopenharmony_ci Matcher<const std::string&> m2 = Eq(std::ref(value)); 284f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("cats")); 285f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("dogs")); 286f92157deSopenharmony_ci} 287f92157deSopenharmony_ci 288f92157deSopenharmony_ci// Tests that MakeMatcher() constructs a Matcher<T> from a 289f92157deSopenharmony_ci// MatcherInterface* without requiring the user to explicitly 290f92157deSopenharmony_ci// write the type. 291f92157deSopenharmony_ciTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { 292f92157deSopenharmony_ci const MatcherInterface<int>* dummy_impl = new EvenMatcherImpl; 293f92157deSopenharmony_ci Matcher<int> m = MakeMatcher(dummy_impl); 294f92157deSopenharmony_ci} 295f92157deSopenharmony_ci 296f92157deSopenharmony_ci// Tests that MakePolymorphicMatcher() can construct a polymorphic 297f92157deSopenharmony_ci// matcher from its implementation using the old API. 298f92157deSopenharmony_ciconst int g_bar = 1; 299f92157deSopenharmony_ciclass ReferencesBarOrIsZeroImpl { 300f92157deSopenharmony_ci public: 301f92157deSopenharmony_ci template <typename T> 302f92157deSopenharmony_ci bool MatchAndExplain(const T& x, MatchResultListener* /* listener */) const { 303f92157deSopenharmony_ci const void* p = &x; 304f92157deSopenharmony_ci return p == &g_bar || x == 0; 305f92157deSopenharmony_ci } 306f92157deSopenharmony_ci 307f92157deSopenharmony_ci void DescribeTo(ostream* os) const { *os << "g_bar or zero"; } 308f92157deSopenharmony_ci 309f92157deSopenharmony_ci void DescribeNegationTo(ostream* os) const { 310f92157deSopenharmony_ci *os << "doesn't reference g_bar and is not zero"; 311f92157deSopenharmony_ci } 312f92157deSopenharmony_ci}; 313f92157deSopenharmony_ci 314f92157deSopenharmony_ci// This function verifies that MakePolymorphicMatcher() returns a 315f92157deSopenharmony_ci// PolymorphicMatcher<T> where T is the argument's type. 316f92157deSopenharmony_ciPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() { 317f92157deSopenharmony_ci return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); 318f92157deSopenharmony_ci} 319f92157deSopenharmony_ci 320f92157deSopenharmony_ciTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) { 321f92157deSopenharmony_ci // Using a polymorphic matcher to match a reference type. 322f92157deSopenharmony_ci Matcher<const int&> m1 = ReferencesBarOrIsZero(); 323f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(0)); 324f92157deSopenharmony_ci // Verifies that the identity of a by-reference argument is preserved. 325f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(g_bar)); 326f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(1)); 327f92157deSopenharmony_ci EXPECT_EQ("g_bar or zero", Describe(m1)); 328f92157deSopenharmony_ci 329f92157deSopenharmony_ci // Using a polymorphic matcher to match a value type. 330f92157deSopenharmony_ci Matcher<double> m2 = ReferencesBarOrIsZero(); 331f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(0.0)); 332f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(0.1)); 333f92157deSopenharmony_ci EXPECT_EQ("g_bar or zero", Describe(m2)); 334f92157deSopenharmony_ci} 335f92157deSopenharmony_ci 336f92157deSopenharmony_ci// Tests implementing a polymorphic matcher using MatchAndExplain(). 337f92157deSopenharmony_ci 338f92157deSopenharmony_ciclass PolymorphicIsEvenImpl { 339f92157deSopenharmony_ci public: 340f92157deSopenharmony_ci void DescribeTo(ostream* os) const { *os << "is even"; } 341f92157deSopenharmony_ci 342f92157deSopenharmony_ci void DescribeNegationTo(ostream* os) const { *os << "is odd"; } 343f92157deSopenharmony_ci 344f92157deSopenharmony_ci template <typename T> 345f92157deSopenharmony_ci bool MatchAndExplain(const T& x, MatchResultListener* listener) const { 346f92157deSopenharmony_ci // Verifies that we can stream to the listener directly. 347f92157deSopenharmony_ci *listener << "% " << 2; 348f92157deSopenharmony_ci if (listener->stream() != nullptr) { 349f92157deSopenharmony_ci // Verifies that we can stream to the listener's underlying stream 350f92157deSopenharmony_ci // too. 351f92157deSopenharmony_ci *listener->stream() << " == " << (x % 2); 352f92157deSopenharmony_ci } 353f92157deSopenharmony_ci return (x % 2) == 0; 354f92157deSopenharmony_ci } 355f92157deSopenharmony_ci}; 356f92157deSopenharmony_ci 357f92157deSopenharmony_ciPolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() { 358f92157deSopenharmony_ci return MakePolymorphicMatcher(PolymorphicIsEvenImpl()); 359f92157deSopenharmony_ci} 360f92157deSopenharmony_ci 361f92157deSopenharmony_ciTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) { 362f92157deSopenharmony_ci // Using PolymorphicIsEven() as a Matcher<int>. 363f92157deSopenharmony_ci const Matcher<int> m1 = PolymorphicIsEven(); 364f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(42)); 365f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(43)); 366f92157deSopenharmony_ci EXPECT_EQ("is even", Describe(m1)); 367f92157deSopenharmony_ci 368f92157deSopenharmony_ci const Matcher<int> not_m1 = Not(m1); 369f92157deSopenharmony_ci EXPECT_EQ("is odd", Describe(not_m1)); 370f92157deSopenharmony_ci 371f92157deSopenharmony_ci EXPECT_EQ("% 2 == 0", Explain(m1, 42)); 372f92157deSopenharmony_ci 373f92157deSopenharmony_ci // Using PolymorphicIsEven() as a Matcher<char>. 374f92157deSopenharmony_ci const Matcher<char> m2 = PolymorphicIsEven(); 375f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches('\x42')); 376f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches('\x43')); 377f92157deSopenharmony_ci EXPECT_EQ("is even", Describe(m2)); 378f92157deSopenharmony_ci 379f92157deSopenharmony_ci const Matcher<char> not_m2 = Not(m2); 380f92157deSopenharmony_ci EXPECT_EQ("is odd", Describe(not_m2)); 381f92157deSopenharmony_ci 382f92157deSopenharmony_ci EXPECT_EQ("% 2 == 0", Explain(m2, '\x42')); 383f92157deSopenharmony_ci} 384f92157deSopenharmony_ci 385f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(MatcherCastTest); 386f92157deSopenharmony_ci 387f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher. 388f92157deSopenharmony_ciTEST_P(MatcherCastTestP, FromPolymorphicMatcher) { 389f92157deSopenharmony_ci Matcher<int16_t> m; 390f92157deSopenharmony_ci if (use_gtest_matcher_) { 391f92157deSopenharmony_ci m = MatcherCast<int16_t>(GtestGreaterThan(int64_t{5})); 392f92157deSopenharmony_ci } else { 393f92157deSopenharmony_ci m = MatcherCast<int16_t>(Gt(int64_t{5})); 394f92157deSopenharmony_ci } 395f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(6)); 396f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(4)); 397f92157deSopenharmony_ci} 398f92157deSopenharmony_ci 399f92157deSopenharmony_ci// For testing casting matchers between compatible types. 400f92157deSopenharmony_ciclass IntValue { 401f92157deSopenharmony_ci public: 402f92157deSopenharmony_ci // An int can be statically (although not implicitly) cast to a 403f92157deSopenharmony_ci // IntValue. 404f92157deSopenharmony_ci explicit IntValue(int a_value) : value_(a_value) {} 405f92157deSopenharmony_ci 406f92157deSopenharmony_ci int value() const { return value_; } 407f92157deSopenharmony_ci 408f92157deSopenharmony_ci private: 409f92157deSopenharmony_ci int value_; 410f92157deSopenharmony_ci}; 411f92157deSopenharmony_ci 412f92157deSopenharmony_ci// For testing casting matchers between compatible types. 413f92157deSopenharmony_cibool IsPositiveIntValue(const IntValue& foo) { return foo.value() > 0; } 414f92157deSopenharmony_ci 415f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T 416f92157deSopenharmony_ci// can be statically converted to U. 417f92157deSopenharmony_ciTEST(MatcherCastTest, FromCompatibleType) { 418f92157deSopenharmony_ci Matcher<double> m1 = Eq(2.0); 419f92157deSopenharmony_ci Matcher<int> m2 = MatcherCast<int>(m1); 420f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(2)); 421f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(3)); 422f92157deSopenharmony_ci 423f92157deSopenharmony_ci Matcher<IntValue> m3 = Truly(IsPositiveIntValue); 424f92157deSopenharmony_ci Matcher<int> m4 = MatcherCast<int>(m3); 425f92157deSopenharmony_ci // In the following, the arguments 1 and 0 are statically converted 426f92157deSopenharmony_ci // to IntValue objects, and then tested by the IsPositiveIntValue() 427f92157deSopenharmony_ci // predicate. 428f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(1)); 429f92157deSopenharmony_ci EXPECT_FALSE(m4.Matches(0)); 430f92157deSopenharmony_ci} 431f92157deSopenharmony_ci 432f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>. 433f92157deSopenharmony_ciTEST(MatcherCastTest, FromConstReferenceToNonReference) { 434f92157deSopenharmony_ci Matcher<const int&> m1 = Eq(0); 435f92157deSopenharmony_ci Matcher<int> m2 = MatcherCast<int>(m1); 436f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(0)); 437f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(1)); 438f92157deSopenharmony_ci} 439f92157deSopenharmony_ci 440f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>. 441f92157deSopenharmony_ciTEST(MatcherCastTest, FromReferenceToNonReference) { 442f92157deSopenharmony_ci Matcher<int&> m1 = Eq(0); 443f92157deSopenharmony_ci Matcher<int> m2 = MatcherCast<int>(m1); 444f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(0)); 445f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(1)); 446f92157deSopenharmony_ci} 447f92157deSopenharmony_ci 448f92157deSopenharmony_ci// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 449f92157deSopenharmony_ciTEST(MatcherCastTest, FromNonReferenceToConstReference) { 450f92157deSopenharmony_ci Matcher<int> m1 = Eq(0); 451f92157deSopenharmony_ci Matcher<const int&> m2 = MatcherCast<const int&>(m1); 452f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(0)); 453f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(1)); 454f92157deSopenharmony_ci} 455f92157deSopenharmony_ci 456f92157deSopenharmony_ci// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>. 457f92157deSopenharmony_ciTEST(MatcherCastTest, FromNonReferenceToReference) { 458f92157deSopenharmony_ci Matcher<int> m1 = Eq(0); 459f92157deSopenharmony_ci Matcher<int&> m2 = MatcherCast<int&>(m1); 460f92157deSopenharmony_ci int n = 0; 461f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(n)); 462f92157deSopenharmony_ci n = 1; 463f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(n)); 464f92157deSopenharmony_ci} 465f92157deSopenharmony_ci 466f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a Matcher<T>. 467f92157deSopenharmony_ciTEST(MatcherCastTest, FromSameType) { 468f92157deSopenharmony_ci Matcher<int> m1 = Eq(0); 469f92157deSopenharmony_ci Matcher<int> m2 = MatcherCast<int>(m1); 470f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(0)); 471f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(1)); 472f92157deSopenharmony_ci} 473f92157deSopenharmony_ci 474f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a value of the same type as the 475f92157deSopenharmony_ci// value type of the Matcher. 476f92157deSopenharmony_ciTEST(MatcherCastTest, FromAValue) { 477f92157deSopenharmony_ci Matcher<int> m = MatcherCast<int>(42); 478f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(42)); 479f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(239)); 480f92157deSopenharmony_ci} 481f92157deSopenharmony_ci 482f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a value of the type implicitly 483f92157deSopenharmony_ci// convertible to the value type of the Matcher. 484f92157deSopenharmony_ciTEST(MatcherCastTest, FromAnImplicitlyConvertibleValue) { 485f92157deSopenharmony_ci const int kExpected = 'c'; 486f92157deSopenharmony_ci Matcher<int> m = MatcherCast<int>('c'); 487f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(kExpected)); 488f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(kExpected + 1)); 489f92157deSopenharmony_ci} 490f92157deSopenharmony_ci 491f92157deSopenharmony_cistruct NonImplicitlyConstructibleTypeWithOperatorEq { 492f92157deSopenharmony_ci friend bool operator==( 493f92157deSopenharmony_ci const NonImplicitlyConstructibleTypeWithOperatorEq& /* ignored */, 494f92157deSopenharmony_ci int rhs) { 495f92157deSopenharmony_ci return 42 == rhs; 496f92157deSopenharmony_ci } 497f92157deSopenharmony_ci friend bool operator==( 498f92157deSopenharmony_ci int lhs, 499f92157deSopenharmony_ci const NonImplicitlyConstructibleTypeWithOperatorEq& /* ignored */) { 500f92157deSopenharmony_ci return lhs == 42; 501f92157deSopenharmony_ci } 502f92157deSopenharmony_ci}; 503f92157deSopenharmony_ci 504f92157deSopenharmony_ci// Tests that MatcherCast<T>(m) works when m is a neither a matcher nor 505f92157deSopenharmony_ci// implicitly convertible to the value type of the Matcher, but the value type 506f92157deSopenharmony_ci// of the matcher has operator==() overload accepting m. 507f92157deSopenharmony_ciTEST(MatcherCastTest, NonImplicitlyConstructibleTypeWithOperatorEq) { 508f92157deSopenharmony_ci Matcher<NonImplicitlyConstructibleTypeWithOperatorEq> m1 = 509f92157deSopenharmony_ci MatcherCast<NonImplicitlyConstructibleTypeWithOperatorEq>(42); 510f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(NonImplicitlyConstructibleTypeWithOperatorEq())); 511f92157deSopenharmony_ci 512f92157deSopenharmony_ci Matcher<NonImplicitlyConstructibleTypeWithOperatorEq> m2 = 513f92157deSopenharmony_ci MatcherCast<NonImplicitlyConstructibleTypeWithOperatorEq>(239); 514f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(NonImplicitlyConstructibleTypeWithOperatorEq())); 515f92157deSopenharmony_ci 516f92157deSopenharmony_ci // When updating the following lines please also change the comment to 517f92157deSopenharmony_ci // namespace convertible_from_any. 518f92157deSopenharmony_ci Matcher<int> m3 = 519f92157deSopenharmony_ci MatcherCast<int>(NonImplicitlyConstructibleTypeWithOperatorEq()); 520f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(42)); 521f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(239)); 522f92157deSopenharmony_ci} 523f92157deSopenharmony_ci 524f92157deSopenharmony_ci// ConvertibleFromAny does not work with MSVC. resulting in 525f92157deSopenharmony_ci// error C2440: 'initializing': cannot convert from 'Eq' to 'M' 526f92157deSopenharmony_ci// No constructor could take the source type, or constructor overload 527f92157deSopenharmony_ci// resolution was ambiguous 528f92157deSopenharmony_ci 529f92157deSopenharmony_ci#if !defined _MSC_VER 530f92157deSopenharmony_ci 531f92157deSopenharmony_ci// The below ConvertibleFromAny struct is implicitly constructible from anything 532f92157deSopenharmony_ci// and when in the same namespace can interact with other tests. In particular, 533f92157deSopenharmony_ci// if it is in the same namespace as other tests and one removes 534f92157deSopenharmony_ci// NonImplicitlyConstructibleTypeWithOperatorEq::operator==(int lhs, ...); 535f92157deSopenharmony_ci// then the corresponding test still compiles (and it should not!) by implicitly 536f92157deSopenharmony_ci// converting NonImplicitlyConstructibleTypeWithOperatorEq to ConvertibleFromAny 537f92157deSopenharmony_ci// in m3.Matcher(). 538f92157deSopenharmony_cinamespace convertible_from_any { 539f92157deSopenharmony_ci// Implicitly convertible from any type. 540f92157deSopenharmony_cistruct ConvertibleFromAny { 541f92157deSopenharmony_ci ConvertibleFromAny(int a_value) : value(a_value) {} 542f92157deSopenharmony_ci template <typename T> 543f92157deSopenharmony_ci ConvertibleFromAny(const T& /*a_value*/) : value(-1) { 544f92157deSopenharmony_ci ADD_FAILURE() << "Conversion constructor called"; 545f92157deSopenharmony_ci } 546f92157deSopenharmony_ci int value; 547f92157deSopenharmony_ci}; 548f92157deSopenharmony_ci 549f92157deSopenharmony_cibool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) { 550f92157deSopenharmony_ci return a.value == b.value; 551f92157deSopenharmony_ci} 552f92157deSopenharmony_ci 553f92157deSopenharmony_ciostream& operator<<(ostream& os, const ConvertibleFromAny& a) { 554f92157deSopenharmony_ci return os << a.value; 555f92157deSopenharmony_ci} 556f92157deSopenharmony_ci 557f92157deSopenharmony_ciTEST(MatcherCastTest, ConversionConstructorIsUsed) { 558f92157deSopenharmony_ci Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1); 559f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 560f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 561f92157deSopenharmony_ci} 562f92157deSopenharmony_ci 563f92157deSopenharmony_ciTEST(MatcherCastTest, FromConvertibleFromAny) { 564f92157deSopenharmony_ci Matcher<ConvertibleFromAny> m = 565f92157deSopenharmony_ci MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 566f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 567f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 568f92157deSopenharmony_ci} 569f92157deSopenharmony_ci} // namespace convertible_from_any 570f92157deSopenharmony_ci 571f92157deSopenharmony_ci#endif // !defined _MSC_VER 572f92157deSopenharmony_ci 573f92157deSopenharmony_cistruct IntReferenceWrapper { 574f92157deSopenharmony_ci IntReferenceWrapper(const int& a_value) : value(&a_value) {} 575f92157deSopenharmony_ci const int* value; 576f92157deSopenharmony_ci}; 577f92157deSopenharmony_ci 578f92157deSopenharmony_cibool operator==(const IntReferenceWrapper& a, const IntReferenceWrapper& b) { 579f92157deSopenharmony_ci return a.value == b.value; 580f92157deSopenharmony_ci} 581f92157deSopenharmony_ci 582f92157deSopenharmony_ciTEST(MatcherCastTest, ValueIsNotCopied) { 583f92157deSopenharmony_ci int n = 42; 584f92157deSopenharmony_ci Matcher<IntReferenceWrapper> m = MatcherCast<IntReferenceWrapper>(n); 585f92157deSopenharmony_ci // Verify that the matcher holds a reference to n, not to its temporary copy. 586f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(n)); 587f92157deSopenharmony_ci} 588f92157deSopenharmony_ci 589f92157deSopenharmony_ciclass Base { 590f92157deSopenharmony_ci public: 591f92157deSopenharmony_ci virtual ~Base() {} 592f92157deSopenharmony_ci Base() {} 593f92157deSopenharmony_ci 594f92157deSopenharmony_ci private: 595f92157deSopenharmony_ci Base(const Base&) = delete; 596f92157deSopenharmony_ci Base& operator=(const Base&) = delete; 597f92157deSopenharmony_ci}; 598f92157deSopenharmony_ci 599f92157deSopenharmony_ciclass Derived : public Base { 600f92157deSopenharmony_ci public: 601f92157deSopenharmony_ci Derived() : Base() {} 602f92157deSopenharmony_ci int i; 603f92157deSopenharmony_ci}; 604f92157deSopenharmony_ci 605f92157deSopenharmony_ciclass OtherDerived : public Base {}; 606f92157deSopenharmony_ci 607f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(SafeMatcherCastTest); 608f92157deSopenharmony_ci 609f92157deSopenharmony_ci// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher. 610f92157deSopenharmony_ciTEST_P(SafeMatcherCastTestP, FromPolymorphicMatcher) { 611f92157deSopenharmony_ci Matcher<char> m2; 612f92157deSopenharmony_ci if (use_gtest_matcher_) { 613f92157deSopenharmony_ci m2 = SafeMatcherCast<char>(GtestGreaterThan(32)); 614f92157deSopenharmony_ci } else { 615f92157deSopenharmony_ci m2 = SafeMatcherCast<char>(Gt(32)); 616f92157deSopenharmony_ci } 617f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches('A')); 618f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches('\n')); 619f92157deSopenharmony_ci} 620f92157deSopenharmony_ci 621f92157deSopenharmony_ci// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where 622f92157deSopenharmony_ci// T and U are arithmetic types and T can be losslessly converted to 623f92157deSopenharmony_ci// U. 624f92157deSopenharmony_ciTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) { 625f92157deSopenharmony_ci Matcher<double> m1 = DoubleEq(1.0); 626f92157deSopenharmony_ci Matcher<float> m2 = SafeMatcherCast<float>(m1); 627f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(1.0f)); 628f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(2.0f)); 629f92157deSopenharmony_ci 630f92157deSopenharmony_ci Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a')); 631f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches('a')); 632f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches('b')); 633f92157deSopenharmony_ci} 634f92157deSopenharmony_ci 635f92157deSopenharmony_ci// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U 636f92157deSopenharmony_ci// are pointers or references to a derived and a base class, correspondingly. 637f92157deSopenharmony_ciTEST(SafeMatcherCastTest, FromBaseClass) { 638f92157deSopenharmony_ci Derived d, d2; 639f92157deSopenharmony_ci Matcher<Base*> m1 = Eq(&d); 640f92157deSopenharmony_ci Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1); 641f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(&d)); 642f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(&d2)); 643f92157deSopenharmony_ci 644f92157deSopenharmony_ci Matcher<Base&> m3 = Ref(d); 645f92157deSopenharmony_ci Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3); 646f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(d)); 647f92157deSopenharmony_ci EXPECT_FALSE(m4.Matches(d2)); 648f92157deSopenharmony_ci} 649f92157deSopenharmony_ci 650f92157deSopenharmony_ci// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>. 651f92157deSopenharmony_ciTEST(SafeMatcherCastTest, FromConstReferenceToReference) { 652f92157deSopenharmony_ci int n = 0; 653f92157deSopenharmony_ci Matcher<const int&> m1 = Ref(n); 654f92157deSopenharmony_ci Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 655f92157deSopenharmony_ci int n1 = 0; 656f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(n)); 657f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(n1)); 658f92157deSopenharmony_ci} 659f92157deSopenharmony_ci 660f92157deSopenharmony_ci// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 661f92157deSopenharmony_ciTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) { 662f92157deSopenharmony_ci Matcher<std::unique_ptr<int>> m1 = IsNull(); 663f92157deSopenharmony_ci Matcher<const std::unique_ptr<int>&> m2 = 664f92157deSopenharmony_ci SafeMatcherCast<const std::unique_ptr<int>&>(m1); 665f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(std::unique_ptr<int>())); 666f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(std::unique_ptr<int>(new int))); 667f92157deSopenharmony_ci} 668f92157deSopenharmony_ci 669f92157deSopenharmony_ci// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>. 670f92157deSopenharmony_ciTEST(SafeMatcherCastTest, FromNonReferenceToReference) { 671f92157deSopenharmony_ci Matcher<int> m1 = Eq(0); 672f92157deSopenharmony_ci Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 673f92157deSopenharmony_ci int n = 0; 674f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(n)); 675f92157deSopenharmony_ci n = 1; 676f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(n)); 677f92157deSopenharmony_ci} 678f92157deSopenharmony_ci 679f92157deSopenharmony_ci// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>. 680f92157deSopenharmony_ciTEST(SafeMatcherCastTest, FromSameType) { 681f92157deSopenharmony_ci Matcher<int> m1 = Eq(0); 682f92157deSopenharmony_ci Matcher<int> m2 = SafeMatcherCast<int>(m1); 683f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(0)); 684f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(1)); 685f92157deSopenharmony_ci} 686f92157deSopenharmony_ci 687f92157deSopenharmony_ci#if !defined _MSC_VER 688f92157deSopenharmony_ci 689f92157deSopenharmony_cinamespace convertible_from_any { 690f92157deSopenharmony_ciTEST(SafeMatcherCastTest, ConversionConstructorIsUsed) { 691f92157deSopenharmony_ci Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1); 692f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 693f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 694f92157deSopenharmony_ci} 695f92157deSopenharmony_ci 696f92157deSopenharmony_ciTEST(SafeMatcherCastTest, FromConvertibleFromAny) { 697f92157deSopenharmony_ci Matcher<ConvertibleFromAny> m = 698f92157deSopenharmony_ci SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 699f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 700f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 701f92157deSopenharmony_ci} 702f92157deSopenharmony_ci} // namespace convertible_from_any 703f92157deSopenharmony_ci 704f92157deSopenharmony_ci#endif // !defined _MSC_VER 705f92157deSopenharmony_ci 706f92157deSopenharmony_ciTEST(SafeMatcherCastTest, ValueIsNotCopied) { 707f92157deSopenharmony_ci int n = 42; 708f92157deSopenharmony_ci Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n); 709f92157deSopenharmony_ci // Verify that the matcher holds a reference to n, not to its temporary copy. 710f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(n)); 711f92157deSopenharmony_ci} 712f92157deSopenharmony_ci 713f92157deSopenharmony_ciTEST(ExpectThat, TakesLiterals) { 714f92157deSopenharmony_ci EXPECT_THAT(1, 1); 715f92157deSopenharmony_ci EXPECT_THAT(1.0, 1.0); 716f92157deSopenharmony_ci EXPECT_THAT(std::string(), ""); 717f92157deSopenharmony_ci} 718f92157deSopenharmony_ci 719f92157deSopenharmony_ciTEST(ExpectThat, TakesFunctions) { 720f92157deSopenharmony_ci struct Helper { 721f92157deSopenharmony_ci static void Func() {} 722f92157deSopenharmony_ci }; 723f92157deSopenharmony_ci void (*func)() = Helper::Func; 724f92157deSopenharmony_ci EXPECT_THAT(func, Helper::Func); 725f92157deSopenharmony_ci EXPECT_THAT(func, &Helper::Func); 726f92157deSopenharmony_ci} 727f92157deSopenharmony_ci 728f92157deSopenharmony_ci// Tests that A<T>() matches any value of type T. 729f92157deSopenharmony_ciTEST(ATest, MatchesAnyValue) { 730f92157deSopenharmony_ci // Tests a matcher for a value type. 731f92157deSopenharmony_ci Matcher<double> m1 = A<double>(); 732f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(91.43)); 733f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(-15.32)); 734f92157deSopenharmony_ci 735f92157deSopenharmony_ci // Tests a matcher for a reference type. 736f92157deSopenharmony_ci int a = 2; 737f92157deSopenharmony_ci int b = -6; 738f92157deSopenharmony_ci Matcher<int&> m2 = A<int&>(); 739f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(a)); 740f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(b)); 741f92157deSopenharmony_ci} 742f92157deSopenharmony_ci 743f92157deSopenharmony_ciTEST(ATest, WorksForDerivedClass) { 744f92157deSopenharmony_ci Base base; 745f92157deSopenharmony_ci Derived derived; 746f92157deSopenharmony_ci EXPECT_THAT(&base, A<Base*>()); 747f92157deSopenharmony_ci // This shouldn't compile: EXPECT_THAT(&base, A<Derived*>()); 748f92157deSopenharmony_ci EXPECT_THAT(&derived, A<Base*>()); 749f92157deSopenharmony_ci EXPECT_THAT(&derived, A<Derived*>()); 750f92157deSopenharmony_ci} 751f92157deSopenharmony_ci 752f92157deSopenharmony_ci// Tests that A<T>() describes itself properly. 753f92157deSopenharmony_ciTEST(ATest, CanDescribeSelf) { EXPECT_EQ("is anything", Describe(A<bool>())); } 754f92157deSopenharmony_ci 755f92157deSopenharmony_ci// Tests that An<T>() matches any value of type T. 756f92157deSopenharmony_ciTEST(AnTest, MatchesAnyValue) { 757f92157deSopenharmony_ci // Tests a matcher for a value type. 758f92157deSopenharmony_ci Matcher<int> m1 = An<int>(); 759f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(9143)); 760f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(-1532)); 761f92157deSopenharmony_ci 762f92157deSopenharmony_ci // Tests a matcher for a reference type. 763f92157deSopenharmony_ci int a = 2; 764f92157deSopenharmony_ci int b = -6; 765f92157deSopenharmony_ci Matcher<int&> m2 = An<int&>(); 766f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(a)); 767f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(b)); 768f92157deSopenharmony_ci} 769f92157deSopenharmony_ci 770f92157deSopenharmony_ci// Tests that An<T>() describes itself properly. 771f92157deSopenharmony_ciTEST(AnTest, CanDescribeSelf) { EXPECT_EQ("is anything", Describe(An<int>())); } 772f92157deSopenharmony_ci 773f92157deSopenharmony_ci// Tests that _ can be used as a matcher for any type and matches any 774f92157deSopenharmony_ci// value of that type. 775f92157deSopenharmony_ciTEST(UnderscoreTest, MatchesAnyValue) { 776f92157deSopenharmony_ci // Uses _ as a matcher for a value type. 777f92157deSopenharmony_ci Matcher<int> m1 = _; 778f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(123)); 779f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(-242)); 780f92157deSopenharmony_ci 781f92157deSopenharmony_ci // Uses _ as a matcher for a reference type. 782f92157deSopenharmony_ci bool a = false; 783f92157deSopenharmony_ci const bool b = true; 784f92157deSopenharmony_ci Matcher<const bool&> m2 = _; 785f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(a)); 786f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(b)); 787f92157deSopenharmony_ci} 788f92157deSopenharmony_ci 789f92157deSopenharmony_ci// Tests that _ describes itself properly. 790f92157deSopenharmony_ciTEST(UnderscoreTest, CanDescribeSelf) { 791f92157deSopenharmony_ci Matcher<int> m = _; 792f92157deSopenharmony_ci EXPECT_EQ("is anything", Describe(m)); 793f92157deSopenharmony_ci} 794f92157deSopenharmony_ci 795f92157deSopenharmony_ci// Tests that Eq(x) matches any value equal to x. 796f92157deSopenharmony_ciTEST(EqTest, MatchesEqualValue) { 797f92157deSopenharmony_ci // 2 C-strings with same content but different addresses. 798f92157deSopenharmony_ci const char a1[] = "hi"; 799f92157deSopenharmony_ci const char a2[] = "hi"; 800f92157deSopenharmony_ci 801f92157deSopenharmony_ci Matcher<const char*> m1 = Eq(a1); 802f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(a1)); 803f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(a2)); 804f92157deSopenharmony_ci} 805f92157deSopenharmony_ci 806f92157deSopenharmony_ci// Tests that Eq(v) describes itself properly. 807f92157deSopenharmony_ci 808f92157deSopenharmony_ciclass Unprintable { 809f92157deSopenharmony_ci public: 810f92157deSopenharmony_ci Unprintable() : c_('a') {} 811f92157deSopenharmony_ci 812f92157deSopenharmony_ci bool operator==(const Unprintable& /* rhs */) const { return true; } 813f92157deSopenharmony_ci // -Wunused-private-field: dummy accessor for `c_`. 814f92157deSopenharmony_ci char dummy_c() { return c_; } 815f92157deSopenharmony_ci 816f92157deSopenharmony_ci private: 817f92157deSopenharmony_ci char c_; 818f92157deSopenharmony_ci}; 819f92157deSopenharmony_ci 820f92157deSopenharmony_ciTEST(EqTest, CanDescribeSelf) { 821f92157deSopenharmony_ci Matcher<Unprintable> m = Eq(Unprintable()); 822f92157deSopenharmony_ci EXPECT_EQ("is equal to 1-byte object <61>", Describe(m)); 823f92157deSopenharmony_ci} 824f92157deSopenharmony_ci 825f92157deSopenharmony_ci// Tests that Eq(v) can be used to match any type that supports 826f92157deSopenharmony_ci// comparing with type T, where T is v's type. 827f92157deSopenharmony_ciTEST(EqTest, IsPolymorphic) { 828f92157deSopenharmony_ci Matcher<int> m1 = Eq(1); 829f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(1)); 830f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(2)); 831f92157deSopenharmony_ci 832f92157deSopenharmony_ci Matcher<char> m2 = Eq(1); 833f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches('\1')); 834f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches('a')); 835f92157deSopenharmony_ci} 836f92157deSopenharmony_ci 837f92157deSopenharmony_ci// Tests that TypedEq<T>(v) matches values of type T that's equal to v. 838f92157deSopenharmony_ciTEST(TypedEqTest, ChecksEqualityForGivenType) { 839f92157deSopenharmony_ci Matcher<char> m1 = TypedEq<char>('a'); 840f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches('a')); 841f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches('b')); 842f92157deSopenharmony_ci 843f92157deSopenharmony_ci Matcher<int> m2 = TypedEq<int>(6); 844f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(6)); 845f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(7)); 846f92157deSopenharmony_ci} 847f92157deSopenharmony_ci 848f92157deSopenharmony_ci// Tests that TypedEq(v) describes itself properly. 849f92157deSopenharmony_ciTEST(TypedEqTest, CanDescribeSelf) { 850f92157deSopenharmony_ci EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2))); 851f92157deSopenharmony_ci} 852f92157deSopenharmony_ci 853f92157deSopenharmony_ci// Tests that TypedEq<T>(v) has type Matcher<T>. 854f92157deSopenharmony_ci 855f92157deSopenharmony_ci// Type<T>::IsTypeOf(v) compiles if and only if the type of value v is T, where 856f92157deSopenharmony_ci// T is a "bare" type (i.e. not in the form of const U or U&). If v's type is 857f92157deSopenharmony_ci// not T, the compiler will generate a message about "undefined reference". 858f92157deSopenharmony_citemplate <typename T> 859f92157deSopenharmony_cistruct Type { 860f92157deSopenharmony_ci static bool IsTypeOf(const T& /* v */) { return true; } 861f92157deSopenharmony_ci 862f92157deSopenharmony_ci template <typename T2> 863f92157deSopenharmony_ci static void IsTypeOf(T2 v); 864f92157deSopenharmony_ci}; 865f92157deSopenharmony_ci 866f92157deSopenharmony_ciTEST(TypedEqTest, HasSpecifiedType) { 867f92157deSopenharmony_ci // Verfies that the type of TypedEq<T>(v) is Matcher<T>. 868f92157deSopenharmony_ci Type<Matcher<int>>::IsTypeOf(TypedEq<int>(5)); 869f92157deSopenharmony_ci Type<Matcher<double>>::IsTypeOf(TypedEq<double>(5)); 870f92157deSopenharmony_ci} 871f92157deSopenharmony_ci 872f92157deSopenharmony_ci// Tests that Ge(v) matches anything >= v. 873f92157deSopenharmony_ciTEST(GeTest, ImplementsGreaterThanOrEqual) { 874f92157deSopenharmony_ci Matcher<int> m1 = Ge(0); 875f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(1)); 876f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(0)); 877f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(-1)); 878f92157deSopenharmony_ci} 879f92157deSopenharmony_ci 880f92157deSopenharmony_ci// Tests that Ge(v) describes itself properly. 881f92157deSopenharmony_ciTEST(GeTest, CanDescribeSelf) { 882f92157deSopenharmony_ci Matcher<int> m = Ge(5); 883f92157deSopenharmony_ci EXPECT_EQ("is >= 5", Describe(m)); 884f92157deSopenharmony_ci} 885f92157deSopenharmony_ci 886f92157deSopenharmony_ci// Tests that Gt(v) matches anything > v. 887f92157deSopenharmony_ciTEST(GtTest, ImplementsGreaterThan) { 888f92157deSopenharmony_ci Matcher<double> m1 = Gt(0); 889f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(1.0)); 890f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(0.0)); 891f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(-1.0)); 892f92157deSopenharmony_ci} 893f92157deSopenharmony_ci 894f92157deSopenharmony_ci// Tests that Gt(v) describes itself properly. 895f92157deSopenharmony_ciTEST(GtTest, CanDescribeSelf) { 896f92157deSopenharmony_ci Matcher<int> m = Gt(5); 897f92157deSopenharmony_ci EXPECT_EQ("is > 5", Describe(m)); 898f92157deSopenharmony_ci} 899f92157deSopenharmony_ci 900f92157deSopenharmony_ci// Tests that Le(v) matches anything <= v. 901f92157deSopenharmony_ciTEST(LeTest, ImplementsLessThanOrEqual) { 902f92157deSopenharmony_ci Matcher<char> m1 = Le('b'); 903f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches('a')); 904f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches('b')); 905f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches('c')); 906f92157deSopenharmony_ci} 907f92157deSopenharmony_ci 908f92157deSopenharmony_ci// Tests that Le(v) describes itself properly. 909f92157deSopenharmony_ciTEST(LeTest, CanDescribeSelf) { 910f92157deSopenharmony_ci Matcher<int> m = Le(5); 911f92157deSopenharmony_ci EXPECT_EQ("is <= 5", Describe(m)); 912f92157deSopenharmony_ci} 913f92157deSopenharmony_ci 914f92157deSopenharmony_ci// Tests that Lt(v) matches anything < v. 915f92157deSopenharmony_ciTEST(LtTest, ImplementsLessThan) { 916f92157deSopenharmony_ci Matcher<const std::string&> m1 = Lt("Hello"); 917f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("Abc")); 918f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("Hello")); 919f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("Hello, world!")); 920f92157deSopenharmony_ci} 921f92157deSopenharmony_ci 922f92157deSopenharmony_ci// Tests that Lt(v) describes itself properly. 923f92157deSopenharmony_ciTEST(LtTest, CanDescribeSelf) { 924f92157deSopenharmony_ci Matcher<int> m = Lt(5); 925f92157deSopenharmony_ci EXPECT_EQ("is < 5", Describe(m)); 926f92157deSopenharmony_ci} 927f92157deSopenharmony_ci 928f92157deSopenharmony_ci// Tests that Ne(v) matches anything != v. 929f92157deSopenharmony_ciTEST(NeTest, ImplementsNotEqual) { 930f92157deSopenharmony_ci Matcher<int> m1 = Ne(0); 931f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(1)); 932f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(-1)); 933f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(0)); 934f92157deSopenharmony_ci} 935f92157deSopenharmony_ci 936f92157deSopenharmony_ci// Tests that Ne(v) describes itself properly. 937f92157deSopenharmony_ciTEST(NeTest, CanDescribeSelf) { 938f92157deSopenharmony_ci Matcher<int> m = Ne(5); 939f92157deSopenharmony_ci EXPECT_EQ("isn't equal to 5", Describe(m)); 940f92157deSopenharmony_ci} 941f92157deSopenharmony_ci 942f92157deSopenharmony_ciclass MoveOnly { 943f92157deSopenharmony_ci public: 944f92157deSopenharmony_ci explicit MoveOnly(int i) : i_(i) {} 945f92157deSopenharmony_ci MoveOnly(const MoveOnly&) = delete; 946f92157deSopenharmony_ci MoveOnly(MoveOnly&&) = default; 947f92157deSopenharmony_ci MoveOnly& operator=(const MoveOnly&) = delete; 948f92157deSopenharmony_ci MoveOnly& operator=(MoveOnly&&) = default; 949f92157deSopenharmony_ci 950f92157deSopenharmony_ci bool operator==(const MoveOnly& other) const { return i_ == other.i_; } 951f92157deSopenharmony_ci bool operator!=(const MoveOnly& other) const { return i_ != other.i_; } 952f92157deSopenharmony_ci bool operator<(const MoveOnly& other) const { return i_ < other.i_; } 953f92157deSopenharmony_ci bool operator<=(const MoveOnly& other) const { return i_ <= other.i_; } 954f92157deSopenharmony_ci bool operator>(const MoveOnly& other) const { return i_ > other.i_; } 955f92157deSopenharmony_ci bool operator>=(const MoveOnly& other) const { return i_ >= other.i_; } 956f92157deSopenharmony_ci 957f92157deSopenharmony_ci private: 958f92157deSopenharmony_ci int i_; 959f92157deSopenharmony_ci}; 960f92157deSopenharmony_ci 961f92157deSopenharmony_cistruct MoveHelper { 962f92157deSopenharmony_ci MOCK_METHOD1(Call, void(MoveOnly)); 963f92157deSopenharmony_ci}; 964f92157deSopenharmony_ci 965f92157deSopenharmony_ci// Disable this test in VS 2015 (version 14), where it fails when SEH is enabled 966f92157deSopenharmony_ci#if defined(_MSC_VER) && (_MSC_VER < 1910) 967f92157deSopenharmony_ciTEST(ComparisonBaseTest, DISABLED_WorksWithMoveOnly) { 968f92157deSopenharmony_ci#else 969f92157deSopenharmony_ciTEST(ComparisonBaseTest, WorksWithMoveOnly) { 970f92157deSopenharmony_ci#endif 971f92157deSopenharmony_ci MoveOnly m{0}; 972f92157deSopenharmony_ci MoveHelper helper; 973f92157deSopenharmony_ci 974f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Eq(ByRef(m)))); 975f92157deSopenharmony_ci helper.Call(MoveOnly(0)); 976f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Ne(ByRef(m)))); 977f92157deSopenharmony_ci helper.Call(MoveOnly(1)); 978f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Le(ByRef(m)))); 979f92157deSopenharmony_ci helper.Call(MoveOnly(0)); 980f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Lt(ByRef(m)))); 981f92157deSopenharmony_ci helper.Call(MoveOnly(-1)); 982f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Ge(ByRef(m)))); 983f92157deSopenharmony_ci helper.Call(MoveOnly(0)); 984f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Gt(ByRef(m)))); 985f92157deSopenharmony_ci helper.Call(MoveOnly(1)); 986f92157deSopenharmony_ci} 987f92157deSopenharmony_ci 988f92157deSopenharmony_ciTEST(IsEmptyTest, MatchesContainer) { 989f92157deSopenharmony_ci const Matcher<std::vector<int>> m = IsEmpty(); 990f92157deSopenharmony_ci std::vector<int> a = {}; 991f92157deSopenharmony_ci std::vector<int> b = {1}; 992f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 993f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(b)); 994f92157deSopenharmony_ci} 995f92157deSopenharmony_ci 996f92157deSopenharmony_ciTEST(IsEmptyTest, MatchesStdString) { 997f92157deSopenharmony_ci const Matcher<std::string> m = IsEmpty(); 998f92157deSopenharmony_ci std::string a = "z"; 999f92157deSopenharmony_ci std::string b = ""; 1000f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 1001f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(b)); 1002f92157deSopenharmony_ci} 1003f92157deSopenharmony_ci 1004f92157deSopenharmony_ciTEST(IsEmptyTest, MatchesCString) { 1005f92157deSopenharmony_ci const Matcher<const char*> m = IsEmpty(); 1006f92157deSopenharmony_ci const char a[] = ""; 1007f92157deSopenharmony_ci const char b[] = "x"; 1008f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 1009f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(b)); 1010f92157deSopenharmony_ci} 1011f92157deSopenharmony_ci 1012f92157deSopenharmony_ci// Tests that IsNull() matches any NULL pointer of any type. 1013f92157deSopenharmony_ciTEST(IsNullTest, MatchesNullPointer) { 1014f92157deSopenharmony_ci Matcher<int*> m1 = IsNull(); 1015f92157deSopenharmony_ci int* p1 = nullptr; 1016f92157deSopenharmony_ci int n = 0; 1017f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(p1)); 1018f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(&n)); 1019f92157deSopenharmony_ci 1020f92157deSopenharmony_ci Matcher<const char*> m2 = IsNull(); 1021f92157deSopenharmony_ci const char* p2 = nullptr; 1022f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(p2)); 1023f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("hi")); 1024f92157deSopenharmony_ci 1025f92157deSopenharmony_ci Matcher<void*> m3 = IsNull(); 1026f92157deSopenharmony_ci void* p3 = nullptr; 1027f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(p3)); 1028f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef))); 1029f92157deSopenharmony_ci} 1030f92157deSopenharmony_ci 1031f92157deSopenharmony_ciTEST(IsNullTest, StdFunction) { 1032f92157deSopenharmony_ci const Matcher<std::function<void()>> m = IsNull(); 1033f92157deSopenharmony_ci 1034f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(std::function<void()>())); 1035f92157deSopenharmony_ci EXPECT_FALSE(m.Matches([] {})); 1036f92157deSopenharmony_ci} 1037f92157deSopenharmony_ci 1038f92157deSopenharmony_ci// Tests that IsNull() describes itself properly. 1039f92157deSopenharmony_ciTEST(IsNullTest, CanDescribeSelf) { 1040f92157deSopenharmony_ci Matcher<int*> m = IsNull(); 1041f92157deSopenharmony_ci EXPECT_EQ("is NULL", Describe(m)); 1042f92157deSopenharmony_ci EXPECT_EQ("isn't NULL", DescribeNegation(m)); 1043f92157deSopenharmony_ci} 1044f92157deSopenharmony_ci 1045f92157deSopenharmony_ci// Tests that NotNull() matches any non-NULL pointer of any type. 1046f92157deSopenharmony_ciTEST(NotNullTest, MatchesNonNullPointer) { 1047f92157deSopenharmony_ci Matcher<int*> m1 = NotNull(); 1048f92157deSopenharmony_ci int* p1 = nullptr; 1049f92157deSopenharmony_ci int n = 0; 1050f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(p1)); 1051f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(&n)); 1052f92157deSopenharmony_ci 1053f92157deSopenharmony_ci Matcher<const char*> m2 = NotNull(); 1054f92157deSopenharmony_ci const char* p2 = nullptr; 1055f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(p2)); 1056f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("hi")); 1057f92157deSopenharmony_ci} 1058f92157deSopenharmony_ci 1059f92157deSopenharmony_ciTEST(NotNullTest, LinkedPtr) { 1060f92157deSopenharmony_ci const Matcher<std::shared_ptr<int>> m = NotNull(); 1061f92157deSopenharmony_ci const std::shared_ptr<int> null_p; 1062f92157deSopenharmony_ci const std::shared_ptr<int> non_null_p(new int); 1063f92157deSopenharmony_ci 1064f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(null_p)); 1065f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(non_null_p)); 1066f92157deSopenharmony_ci} 1067f92157deSopenharmony_ci 1068f92157deSopenharmony_ciTEST(NotNullTest, ReferenceToConstLinkedPtr) { 1069f92157deSopenharmony_ci const Matcher<const std::shared_ptr<double>&> m = NotNull(); 1070f92157deSopenharmony_ci const std::shared_ptr<double> null_p; 1071f92157deSopenharmony_ci const std::shared_ptr<double> non_null_p(new double); 1072f92157deSopenharmony_ci 1073f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(null_p)); 1074f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(non_null_p)); 1075f92157deSopenharmony_ci} 1076f92157deSopenharmony_ci 1077f92157deSopenharmony_ciTEST(NotNullTest, StdFunction) { 1078f92157deSopenharmony_ci const Matcher<std::function<void()>> m = NotNull(); 1079f92157deSopenharmony_ci 1080f92157deSopenharmony_ci EXPECT_TRUE(m.Matches([] {})); 1081f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(std::function<void()>())); 1082f92157deSopenharmony_ci} 1083f92157deSopenharmony_ci 1084f92157deSopenharmony_ci// Tests that NotNull() describes itself properly. 1085f92157deSopenharmony_ciTEST(NotNullTest, CanDescribeSelf) { 1086f92157deSopenharmony_ci Matcher<int*> m = NotNull(); 1087f92157deSopenharmony_ci EXPECT_EQ("isn't NULL", Describe(m)); 1088f92157deSopenharmony_ci} 1089f92157deSopenharmony_ci 1090f92157deSopenharmony_ci// Tests that Ref(variable) matches an argument that references 1091f92157deSopenharmony_ci// 'variable'. 1092f92157deSopenharmony_ciTEST(RefTest, MatchesSameVariable) { 1093f92157deSopenharmony_ci int a = 0; 1094f92157deSopenharmony_ci int b = 0; 1095f92157deSopenharmony_ci Matcher<int&> m = Ref(a); 1096f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 1097f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(b)); 1098f92157deSopenharmony_ci} 1099f92157deSopenharmony_ci 1100f92157deSopenharmony_ci// Tests that Ref(variable) describes itself properly. 1101f92157deSopenharmony_ciTEST(RefTest, CanDescribeSelf) { 1102f92157deSopenharmony_ci int n = 5; 1103f92157deSopenharmony_ci Matcher<int&> m = Ref(n); 1104f92157deSopenharmony_ci stringstream ss; 1105f92157deSopenharmony_ci ss << "references the variable @" << &n << " 5"; 1106f92157deSopenharmony_ci EXPECT_EQ(ss.str(), Describe(m)); 1107f92157deSopenharmony_ci} 1108f92157deSopenharmony_ci 1109f92157deSopenharmony_ci// Test that Ref(non_const_varialbe) can be used as a matcher for a 1110f92157deSopenharmony_ci// const reference. 1111f92157deSopenharmony_ciTEST(RefTest, CanBeUsedAsMatcherForConstReference) { 1112f92157deSopenharmony_ci int a = 0; 1113f92157deSopenharmony_ci int b = 0; 1114f92157deSopenharmony_ci Matcher<const int&> m = Ref(a); 1115f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 1116f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(b)); 1117f92157deSopenharmony_ci} 1118f92157deSopenharmony_ci 1119f92157deSopenharmony_ci// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be 1120f92157deSopenharmony_ci// used wherever Ref(base) can be used (Ref(derived) is a sub-type 1121f92157deSopenharmony_ci// of Ref(base), but not vice versa. 1122f92157deSopenharmony_ci 1123f92157deSopenharmony_ciTEST(RefTest, IsCovariant) { 1124f92157deSopenharmony_ci Base base, base2; 1125f92157deSopenharmony_ci Derived derived; 1126f92157deSopenharmony_ci Matcher<const Base&> m1 = Ref(base); 1127f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(base)); 1128f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(base2)); 1129f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(derived)); 1130f92157deSopenharmony_ci 1131f92157deSopenharmony_ci m1 = Ref(derived); 1132f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(derived)); 1133f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(base)); 1134f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(base2)); 1135f92157deSopenharmony_ci} 1136f92157deSopenharmony_ci 1137f92157deSopenharmony_ciTEST(RefTest, ExplainsResult) { 1138f92157deSopenharmony_ci int n = 0; 1139f92157deSopenharmony_ci EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n), 1140f92157deSopenharmony_ci StartsWith("which is located @")); 1141f92157deSopenharmony_ci 1142f92157deSopenharmony_ci int m = 0; 1143f92157deSopenharmony_ci EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m), 1144f92157deSopenharmony_ci StartsWith("which is located @")); 1145f92157deSopenharmony_ci} 1146f92157deSopenharmony_ci 1147f92157deSopenharmony_ci// Tests string comparison matchers. 1148f92157deSopenharmony_ci 1149f92157deSopenharmony_citemplate <typename T = std::string> 1150f92157deSopenharmony_cistd::string FromStringLike(internal::StringLike<T> str) { 1151f92157deSopenharmony_ci return std::string(str); 1152f92157deSopenharmony_ci} 1153f92157deSopenharmony_ci 1154f92157deSopenharmony_ciTEST(StringLike, TestConversions) { 1155f92157deSopenharmony_ci EXPECT_EQ("foo", FromStringLike("foo")); 1156f92157deSopenharmony_ci EXPECT_EQ("foo", FromStringLike(std::string("foo"))); 1157f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1158f92157deSopenharmony_ci EXPECT_EQ("foo", FromStringLike(internal::StringView("foo"))); 1159f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1160f92157deSopenharmony_ci 1161f92157deSopenharmony_ci // Non deducible types. 1162f92157deSopenharmony_ci EXPECT_EQ("", FromStringLike({})); 1163f92157deSopenharmony_ci EXPECT_EQ("foo", FromStringLike({'f', 'o', 'o'})); 1164f92157deSopenharmony_ci const char buf[] = "foo"; 1165f92157deSopenharmony_ci EXPECT_EQ("foo", FromStringLike({buf, buf + 3})); 1166f92157deSopenharmony_ci} 1167f92157deSopenharmony_ci 1168f92157deSopenharmony_ciTEST(StrEqTest, MatchesEqualString) { 1169f92157deSopenharmony_ci Matcher<const char*> m = StrEq(std::string("Hello")); 1170f92157deSopenharmony_ci EXPECT_TRUE(m.Matches("Hello")); 1171f92157deSopenharmony_ci EXPECT_FALSE(m.Matches("hello")); 1172f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 1173f92157deSopenharmony_ci 1174f92157deSopenharmony_ci Matcher<const std::string&> m2 = StrEq("Hello"); 1175f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("Hello")); 1176f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("Hi")); 1177f92157deSopenharmony_ci 1178f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1179f92157deSopenharmony_ci Matcher<const internal::StringView&> m3 = 1180f92157deSopenharmony_ci StrEq(internal::StringView("Hello")); 1181f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("Hello"))); 1182f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView("hello"))); 1183f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView())); 1184f92157deSopenharmony_ci 1185f92157deSopenharmony_ci Matcher<const internal::StringView&> m_empty = StrEq(""); 1186f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches(internal::StringView(""))); 1187f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches(internal::StringView())); 1188f92157deSopenharmony_ci EXPECT_FALSE(m_empty.Matches(internal::StringView("hello"))); 1189f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1190f92157deSopenharmony_ci} 1191f92157deSopenharmony_ci 1192f92157deSopenharmony_ciTEST(StrEqTest, CanDescribeSelf) { 1193f92157deSopenharmony_ci Matcher<std::string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3"); 1194f92157deSopenharmony_ci EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"", 1195f92157deSopenharmony_ci Describe(m)); 1196f92157deSopenharmony_ci 1197f92157deSopenharmony_ci std::string str("01204500800"); 1198f92157deSopenharmony_ci str[3] = '\0'; 1199f92157deSopenharmony_ci Matcher<std::string> m2 = StrEq(str); 1200f92157deSopenharmony_ci EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2)); 1201f92157deSopenharmony_ci str[0] = str[6] = str[7] = str[9] = str[10] = '\0'; 1202f92157deSopenharmony_ci Matcher<std::string> m3 = StrEq(str); 1203f92157deSopenharmony_ci EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3)); 1204f92157deSopenharmony_ci} 1205f92157deSopenharmony_ci 1206f92157deSopenharmony_ciTEST(StrNeTest, MatchesUnequalString) { 1207f92157deSopenharmony_ci Matcher<const char*> m = StrNe("Hello"); 1208f92157deSopenharmony_ci EXPECT_TRUE(m.Matches("")); 1209f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(nullptr)); 1210f92157deSopenharmony_ci EXPECT_FALSE(m.Matches("Hello")); 1211f92157deSopenharmony_ci 1212f92157deSopenharmony_ci Matcher<std::string> m2 = StrNe(std::string("Hello")); 1213f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("hello")); 1214f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("Hello")); 1215f92157deSopenharmony_ci 1216f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1217f92157deSopenharmony_ci Matcher<const internal::StringView> m3 = StrNe(internal::StringView("Hello")); 1218f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView(""))); 1219f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView())); 1220f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView("Hello"))); 1221f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1222f92157deSopenharmony_ci} 1223f92157deSopenharmony_ci 1224f92157deSopenharmony_ciTEST(StrNeTest, CanDescribeSelf) { 1225f92157deSopenharmony_ci Matcher<const char*> m = StrNe("Hi"); 1226f92157deSopenharmony_ci EXPECT_EQ("isn't equal to \"Hi\"", Describe(m)); 1227f92157deSopenharmony_ci} 1228f92157deSopenharmony_ci 1229f92157deSopenharmony_ciTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) { 1230f92157deSopenharmony_ci Matcher<const char*> m = StrCaseEq(std::string("Hello")); 1231f92157deSopenharmony_ci EXPECT_TRUE(m.Matches("Hello")); 1232f92157deSopenharmony_ci EXPECT_TRUE(m.Matches("hello")); 1233f92157deSopenharmony_ci EXPECT_FALSE(m.Matches("Hi")); 1234f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 1235f92157deSopenharmony_ci 1236f92157deSopenharmony_ci Matcher<const std::string&> m2 = StrCaseEq("Hello"); 1237f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("hello")); 1238f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("Hi")); 1239f92157deSopenharmony_ci 1240f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1241f92157deSopenharmony_ci Matcher<const internal::StringView&> m3 = 1242f92157deSopenharmony_ci StrCaseEq(internal::StringView("Hello")); 1243f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("Hello"))); 1244f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("hello"))); 1245f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView("Hi"))); 1246f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView())); 1247f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1248f92157deSopenharmony_ci} 1249f92157deSopenharmony_ci 1250f92157deSopenharmony_ciTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1251f92157deSopenharmony_ci std::string str1("oabocdooeoo"); 1252f92157deSopenharmony_ci std::string str2("OABOCDOOEOO"); 1253f92157deSopenharmony_ci Matcher<const std::string&> m0 = StrCaseEq(str1); 1254f92157deSopenharmony_ci EXPECT_FALSE(m0.Matches(str2 + std::string(1, '\0'))); 1255f92157deSopenharmony_ci 1256f92157deSopenharmony_ci str1[3] = str2[3] = '\0'; 1257f92157deSopenharmony_ci Matcher<const std::string&> m1 = StrCaseEq(str1); 1258f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(str2)); 1259f92157deSopenharmony_ci 1260f92157deSopenharmony_ci str1[0] = str1[6] = str1[7] = str1[10] = '\0'; 1261f92157deSopenharmony_ci str2[0] = str2[6] = str2[7] = str2[10] = '\0'; 1262f92157deSopenharmony_ci Matcher<const std::string&> m2 = StrCaseEq(str1); 1263f92157deSopenharmony_ci str1[9] = str2[9] = '\0'; 1264f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(str2)); 1265f92157deSopenharmony_ci 1266f92157deSopenharmony_ci Matcher<const std::string&> m3 = StrCaseEq(str1); 1267f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(str2)); 1268f92157deSopenharmony_ci 1269f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(str2 + "x")); 1270f92157deSopenharmony_ci str2.append(1, '\0'); 1271f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(str2)); 1272f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(std::string(str2, 0, 9))); 1273f92157deSopenharmony_ci} 1274f92157deSopenharmony_ci 1275f92157deSopenharmony_ciTEST(StrCaseEqTest, CanDescribeSelf) { 1276f92157deSopenharmony_ci Matcher<std::string> m = StrCaseEq("Hi"); 1277f92157deSopenharmony_ci EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m)); 1278f92157deSopenharmony_ci} 1279f92157deSopenharmony_ci 1280f92157deSopenharmony_ciTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1281f92157deSopenharmony_ci Matcher<const char*> m = StrCaseNe("Hello"); 1282f92157deSopenharmony_ci EXPECT_TRUE(m.Matches("Hi")); 1283f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(nullptr)); 1284f92157deSopenharmony_ci EXPECT_FALSE(m.Matches("Hello")); 1285f92157deSopenharmony_ci EXPECT_FALSE(m.Matches("hello")); 1286f92157deSopenharmony_ci 1287f92157deSopenharmony_ci Matcher<std::string> m2 = StrCaseNe(std::string("Hello")); 1288f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("")); 1289f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("Hello")); 1290f92157deSopenharmony_ci 1291f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1292f92157deSopenharmony_ci Matcher<const internal::StringView> m3 = 1293f92157deSopenharmony_ci StrCaseNe(internal::StringView("Hello")); 1294f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("Hi"))); 1295f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView())); 1296f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView("Hello"))); 1297f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView("hello"))); 1298f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1299f92157deSopenharmony_ci} 1300f92157deSopenharmony_ci 1301f92157deSopenharmony_ciTEST(StrCaseNeTest, CanDescribeSelf) { 1302f92157deSopenharmony_ci Matcher<const char*> m = StrCaseNe("Hi"); 1303f92157deSopenharmony_ci EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m)); 1304f92157deSopenharmony_ci} 1305f92157deSopenharmony_ci 1306f92157deSopenharmony_ci// Tests that HasSubstr() works for matching string-typed values. 1307f92157deSopenharmony_ciTEST(HasSubstrTest, WorksForStringClasses) { 1308f92157deSopenharmony_ci const Matcher<std::string> m1 = HasSubstr("foo"); 1309f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(std::string("I love food."))); 1310f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(std::string("tofo"))); 1311f92157deSopenharmony_ci 1312f92157deSopenharmony_ci const Matcher<const std::string&> m2 = HasSubstr("foo"); 1313f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(std::string("I love food."))); 1314f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(std::string("tofo"))); 1315f92157deSopenharmony_ci 1316f92157deSopenharmony_ci const Matcher<std::string> m_empty = HasSubstr(""); 1317f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches(std::string())); 1318f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches(std::string("not empty"))); 1319f92157deSopenharmony_ci} 1320f92157deSopenharmony_ci 1321f92157deSopenharmony_ci// Tests that HasSubstr() works for matching C-string-typed values. 1322f92157deSopenharmony_ciTEST(HasSubstrTest, WorksForCStrings) { 1323f92157deSopenharmony_ci const Matcher<char*> m1 = HasSubstr("foo"); 1324f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food."))); 1325f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo"))); 1326f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 1327f92157deSopenharmony_ci 1328f92157deSopenharmony_ci const Matcher<const char*> m2 = HasSubstr("foo"); 1329f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("I love food.")); 1330f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("tofo")); 1331f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(nullptr)); 1332f92157deSopenharmony_ci 1333f92157deSopenharmony_ci const Matcher<const char*> m_empty = HasSubstr(""); 1334f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches("not empty")); 1335f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches("")); 1336f92157deSopenharmony_ci EXPECT_FALSE(m_empty.Matches(nullptr)); 1337f92157deSopenharmony_ci} 1338f92157deSopenharmony_ci 1339f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1340f92157deSopenharmony_ci// Tests that HasSubstr() works for matching StringView-typed values. 1341f92157deSopenharmony_ciTEST(HasSubstrTest, WorksForStringViewClasses) { 1342f92157deSopenharmony_ci const Matcher<internal::StringView> m1 = 1343f92157deSopenharmony_ci HasSubstr(internal::StringView("foo")); 1344f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(internal::StringView("I love food."))); 1345f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(internal::StringView("tofo"))); 1346f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(internal::StringView())); 1347f92157deSopenharmony_ci 1348f92157deSopenharmony_ci const Matcher<const internal::StringView&> m2 = HasSubstr("foo"); 1349f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(internal::StringView("I love food."))); 1350f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(internal::StringView("tofo"))); 1351f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(internal::StringView())); 1352f92157deSopenharmony_ci 1353f92157deSopenharmony_ci const Matcher<const internal::StringView&> m3 = HasSubstr(""); 1354f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("foo"))); 1355f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView(""))); 1356f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView())); 1357f92157deSopenharmony_ci} 1358f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1359f92157deSopenharmony_ci 1360f92157deSopenharmony_ci// Tests that HasSubstr(s) describes itself properly. 1361f92157deSopenharmony_ciTEST(HasSubstrTest, CanDescribeSelf) { 1362f92157deSopenharmony_ci Matcher<std::string> m = HasSubstr("foo\n\""); 1363f92157deSopenharmony_ci EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m)); 1364f92157deSopenharmony_ci} 1365f92157deSopenharmony_ci 1366f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(KeyTest); 1367f92157deSopenharmony_ci 1368f92157deSopenharmony_ciTEST(KeyTest, CanDescribeSelf) { 1369f92157deSopenharmony_ci Matcher<const pair<std::string, int>&> m = Key("foo"); 1370f92157deSopenharmony_ci EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m)); 1371f92157deSopenharmony_ci EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m)); 1372f92157deSopenharmony_ci} 1373f92157deSopenharmony_ci 1374f92157deSopenharmony_ciTEST_P(KeyTestP, ExplainsResult) { 1375f92157deSopenharmony_ci Matcher<pair<int, bool>> m = Key(GreaterThan(10)); 1376f92157deSopenharmony_ci EXPECT_EQ("whose first field is a value which is 5 less than 10", 1377f92157deSopenharmony_ci Explain(m, make_pair(5, true))); 1378f92157deSopenharmony_ci EXPECT_EQ("whose first field is a value which is 5 more than 10", 1379f92157deSopenharmony_ci Explain(m, make_pair(15, true))); 1380f92157deSopenharmony_ci} 1381f92157deSopenharmony_ci 1382f92157deSopenharmony_ciTEST(KeyTest, MatchesCorrectly) { 1383f92157deSopenharmony_ci pair<int, std::string> p(25, "foo"); 1384f92157deSopenharmony_ci EXPECT_THAT(p, Key(25)); 1385f92157deSopenharmony_ci EXPECT_THAT(p, Not(Key(42))); 1386f92157deSopenharmony_ci EXPECT_THAT(p, Key(Ge(20))); 1387f92157deSopenharmony_ci EXPECT_THAT(p, Not(Key(Lt(25)))); 1388f92157deSopenharmony_ci} 1389f92157deSopenharmony_ci 1390f92157deSopenharmony_ciTEST(KeyTest, WorksWithMoveOnly) { 1391f92157deSopenharmony_ci pair<std::unique_ptr<int>, std::unique_ptr<int>> p; 1392f92157deSopenharmony_ci EXPECT_THAT(p, Key(Eq(nullptr))); 1393f92157deSopenharmony_ci} 1394f92157deSopenharmony_ci 1395f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(PairTest); 1396f92157deSopenharmony_ci 1397f92157deSopenharmony_citemplate <size_t I> 1398f92157deSopenharmony_cistruct Tag {}; 1399f92157deSopenharmony_ci 1400f92157deSopenharmony_cistruct PairWithGet { 1401f92157deSopenharmony_ci int member_1; 1402f92157deSopenharmony_ci std::string member_2; 1403f92157deSopenharmony_ci using first_type = int; 1404f92157deSopenharmony_ci using second_type = std::string; 1405f92157deSopenharmony_ci 1406f92157deSopenharmony_ci const int& GetImpl(Tag<0>) const { return member_1; } 1407f92157deSopenharmony_ci const std::string& GetImpl(Tag<1>) const { return member_2; } 1408f92157deSopenharmony_ci}; 1409f92157deSopenharmony_citemplate <size_t I> 1410f92157deSopenharmony_ciauto get(const PairWithGet& value) -> decltype(value.GetImpl(Tag<I>())) { 1411f92157deSopenharmony_ci return value.GetImpl(Tag<I>()); 1412f92157deSopenharmony_ci} 1413f92157deSopenharmony_ciTEST(PairTest, MatchesPairWithGetCorrectly) { 1414f92157deSopenharmony_ci PairWithGet p{25, "foo"}; 1415f92157deSopenharmony_ci EXPECT_THAT(p, Key(25)); 1416f92157deSopenharmony_ci EXPECT_THAT(p, Not(Key(42))); 1417f92157deSopenharmony_ci EXPECT_THAT(p, Key(Ge(20))); 1418f92157deSopenharmony_ci EXPECT_THAT(p, Not(Key(Lt(25)))); 1419f92157deSopenharmony_ci 1420f92157deSopenharmony_ci std::vector<PairWithGet> v = {{11, "Foo"}, {29, "gMockIsBestMock"}}; 1421f92157deSopenharmony_ci EXPECT_THAT(v, Contains(Key(29))); 1422f92157deSopenharmony_ci} 1423f92157deSopenharmony_ci 1424f92157deSopenharmony_ciTEST(KeyTest, SafelyCastsInnerMatcher) { 1425f92157deSopenharmony_ci Matcher<int> is_positive = Gt(0); 1426f92157deSopenharmony_ci Matcher<int> is_negative = Lt(0); 1427f92157deSopenharmony_ci pair<char, bool> p('a', true); 1428f92157deSopenharmony_ci EXPECT_THAT(p, Key(is_positive)); 1429f92157deSopenharmony_ci EXPECT_THAT(p, Not(Key(is_negative))); 1430f92157deSopenharmony_ci} 1431f92157deSopenharmony_ci 1432f92157deSopenharmony_ciTEST(KeyTest, InsideContainsUsingMap) { 1433f92157deSopenharmony_ci map<int, char> container; 1434f92157deSopenharmony_ci container.insert(make_pair(1, 'a')); 1435f92157deSopenharmony_ci container.insert(make_pair(2, 'b')); 1436f92157deSopenharmony_ci container.insert(make_pair(4, 'c')); 1437f92157deSopenharmony_ci EXPECT_THAT(container, Contains(Key(1))); 1438f92157deSopenharmony_ci EXPECT_THAT(container, Not(Contains(Key(3)))); 1439f92157deSopenharmony_ci} 1440f92157deSopenharmony_ci 1441f92157deSopenharmony_ciTEST(KeyTest, InsideContainsUsingMultimap) { 1442f92157deSopenharmony_ci multimap<int, char> container; 1443f92157deSopenharmony_ci container.insert(make_pair(1, 'a')); 1444f92157deSopenharmony_ci container.insert(make_pair(2, 'b')); 1445f92157deSopenharmony_ci container.insert(make_pair(4, 'c')); 1446f92157deSopenharmony_ci 1447f92157deSopenharmony_ci EXPECT_THAT(container, Not(Contains(Key(25)))); 1448f92157deSopenharmony_ci container.insert(make_pair(25, 'd')); 1449f92157deSopenharmony_ci EXPECT_THAT(container, Contains(Key(25))); 1450f92157deSopenharmony_ci container.insert(make_pair(25, 'e')); 1451f92157deSopenharmony_ci EXPECT_THAT(container, Contains(Key(25))); 1452f92157deSopenharmony_ci 1453f92157deSopenharmony_ci EXPECT_THAT(container, Contains(Key(1))); 1454f92157deSopenharmony_ci EXPECT_THAT(container, Not(Contains(Key(3)))); 1455f92157deSopenharmony_ci} 1456f92157deSopenharmony_ci 1457f92157deSopenharmony_ciTEST(PairTest, Typing) { 1458f92157deSopenharmony_ci // Test verifies the following type conversions can be compiled. 1459f92157deSopenharmony_ci Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42); 1460f92157deSopenharmony_ci Matcher<const pair<const char*, int>> m2 = Pair("foo", 42); 1461f92157deSopenharmony_ci Matcher<pair<const char*, int>> m3 = Pair("foo", 42); 1462f92157deSopenharmony_ci 1463f92157deSopenharmony_ci Matcher<pair<int, const std::string>> m4 = Pair(25, "42"); 1464f92157deSopenharmony_ci Matcher<pair<const std::string, int>> m5 = Pair("25", 42); 1465f92157deSopenharmony_ci} 1466f92157deSopenharmony_ci 1467f92157deSopenharmony_ciTEST(PairTest, CanDescribeSelf) { 1468f92157deSopenharmony_ci Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42); 1469f92157deSopenharmony_ci EXPECT_EQ( 1470f92157deSopenharmony_ci "has a first field that is equal to \"foo\"" 1471f92157deSopenharmony_ci ", and has a second field that is equal to 42", 1472f92157deSopenharmony_ci Describe(m1)); 1473f92157deSopenharmony_ci EXPECT_EQ( 1474f92157deSopenharmony_ci "has a first field that isn't equal to \"foo\"" 1475f92157deSopenharmony_ci ", or has a second field that isn't equal to 42", 1476f92157deSopenharmony_ci DescribeNegation(m1)); 1477f92157deSopenharmony_ci // Double and triple negation (1 or 2 times not and description of negation). 1478f92157deSopenharmony_ci Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42)); 1479f92157deSopenharmony_ci EXPECT_EQ( 1480f92157deSopenharmony_ci "has a first field that isn't equal to 13" 1481f92157deSopenharmony_ci ", and has a second field that is equal to 42", 1482f92157deSopenharmony_ci DescribeNegation(m2)); 1483f92157deSopenharmony_ci} 1484f92157deSopenharmony_ci 1485f92157deSopenharmony_ciTEST_P(PairTestP, CanExplainMatchResultTo) { 1486f92157deSopenharmony_ci // If neither field matches, Pair() should explain about the first 1487f92157deSopenharmony_ci // field. 1488f92157deSopenharmony_ci const Matcher<pair<int, int>> m = Pair(GreaterThan(0), GreaterThan(0)); 1489f92157deSopenharmony_ci EXPECT_EQ("whose first field does not match, which is 1 less than 0", 1490f92157deSopenharmony_ci Explain(m, make_pair(-1, -2))); 1491f92157deSopenharmony_ci 1492f92157deSopenharmony_ci // If the first field matches but the second doesn't, Pair() should 1493f92157deSopenharmony_ci // explain about the second field. 1494f92157deSopenharmony_ci EXPECT_EQ("whose second field does not match, which is 2 less than 0", 1495f92157deSopenharmony_ci Explain(m, make_pair(1, -2))); 1496f92157deSopenharmony_ci 1497f92157deSopenharmony_ci // If the first field doesn't match but the second does, Pair() 1498f92157deSopenharmony_ci // should explain about the first field. 1499f92157deSopenharmony_ci EXPECT_EQ("whose first field does not match, which is 1 less than 0", 1500f92157deSopenharmony_ci Explain(m, make_pair(-1, 2))); 1501f92157deSopenharmony_ci 1502f92157deSopenharmony_ci // If both fields match, Pair() should explain about them both. 1503f92157deSopenharmony_ci EXPECT_EQ( 1504f92157deSopenharmony_ci "whose both fields match, where the first field is a value " 1505f92157deSopenharmony_ci "which is 1 more than 0, and the second field is a value " 1506f92157deSopenharmony_ci "which is 2 more than 0", 1507f92157deSopenharmony_ci Explain(m, make_pair(1, 2))); 1508f92157deSopenharmony_ci 1509f92157deSopenharmony_ci // If only the first match has an explanation, only this explanation should 1510f92157deSopenharmony_ci // be printed. 1511f92157deSopenharmony_ci const Matcher<pair<int, int>> explain_first = Pair(GreaterThan(0), 0); 1512f92157deSopenharmony_ci EXPECT_EQ( 1513f92157deSopenharmony_ci "whose both fields match, where the first field is a value " 1514f92157deSopenharmony_ci "which is 1 more than 0", 1515f92157deSopenharmony_ci Explain(explain_first, make_pair(1, 0))); 1516f92157deSopenharmony_ci 1517f92157deSopenharmony_ci // If only the second match has an explanation, only this explanation should 1518f92157deSopenharmony_ci // be printed. 1519f92157deSopenharmony_ci const Matcher<pair<int, int>> explain_second = Pair(0, GreaterThan(0)); 1520f92157deSopenharmony_ci EXPECT_EQ( 1521f92157deSopenharmony_ci "whose both fields match, where the second field is a value " 1522f92157deSopenharmony_ci "which is 1 more than 0", 1523f92157deSopenharmony_ci Explain(explain_second, make_pair(0, 1))); 1524f92157deSopenharmony_ci} 1525f92157deSopenharmony_ci 1526f92157deSopenharmony_ciTEST(PairTest, MatchesCorrectly) { 1527f92157deSopenharmony_ci pair<int, std::string> p(25, "foo"); 1528f92157deSopenharmony_ci 1529f92157deSopenharmony_ci // Both fields match. 1530f92157deSopenharmony_ci EXPECT_THAT(p, Pair(25, "foo")); 1531f92157deSopenharmony_ci EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o"))); 1532f92157deSopenharmony_ci 1533f92157deSopenharmony_ci // 'first' doesnt' match, but 'second' matches. 1534f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(42, "foo"))); 1535f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(Lt(25), "foo"))); 1536f92157deSopenharmony_ci 1537f92157deSopenharmony_ci // 'first' matches, but 'second' doesn't match. 1538f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(25, "bar"))); 1539f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(25, Not("foo")))); 1540f92157deSopenharmony_ci 1541f92157deSopenharmony_ci // Neither field matches. 1542f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(13, "bar"))); 1543f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a")))); 1544f92157deSopenharmony_ci} 1545f92157deSopenharmony_ci 1546f92157deSopenharmony_ciTEST(PairTest, WorksWithMoveOnly) { 1547f92157deSopenharmony_ci pair<std::unique_ptr<int>, std::unique_ptr<int>> p; 1548f92157deSopenharmony_ci p.second.reset(new int(7)); 1549f92157deSopenharmony_ci EXPECT_THAT(p, Pair(Eq(nullptr), Ne(nullptr))); 1550f92157deSopenharmony_ci} 1551f92157deSopenharmony_ci 1552f92157deSopenharmony_ciTEST(PairTest, SafelyCastsInnerMatchers) { 1553f92157deSopenharmony_ci Matcher<int> is_positive = Gt(0); 1554f92157deSopenharmony_ci Matcher<int> is_negative = Lt(0); 1555f92157deSopenharmony_ci pair<char, bool> p('a', true); 1556f92157deSopenharmony_ci EXPECT_THAT(p, Pair(is_positive, _)); 1557f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(is_negative, _))); 1558f92157deSopenharmony_ci EXPECT_THAT(p, Pair(_, is_positive)); 1559f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pair(_, is_negative))); 1560f92157deSopenharmony_ci} 1561f92157deSopenharmony_ci 1562f92157deSopenharmony_ciTEST(PairTest, InsideContainsUsingMap) { 1563f92157deSopenharmony_ci map<int, char> container; 1564f92157deSopenharmony_ci container.insert(make_pair(1, 'a')); 1565f92157deSopenharmony_ci container.insert(make_pair(2, 'b')); 1566f92157deSopenharmony_ci container.insert(make_pair(4, 'c')); 1567f92157deSopenharmony_ci EXPECT_THAT(container, Contains(Pair(1, 'a'))); 1568f92157deSopenharmony_ci EXPECT_THAT(container, Contains(Pair(1, _))); 1569f92157deSopenharmony_ci EXPECT_THAT(container, Contains(Pair(_, 'a'))); 1570f92157deSopenharmony_ci EXPECT_THAT(container, Not(Contains(Pair(3, _)))); 1571f92157deSopenharmony_ci} 1572f92157deSopenharmony_ci 1573f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(FieldsAreTest); 1574f92157deSopenharmony_ci 1575f92157deSopenharmony_ciTEST(FieldsAreTest, MatchesCorrectly) { 1576f92157deSopenharmony_ci std::tuple<int, std::string, double> p(25, "foo", .5); 1577f92157deSopenharmony_ci 1578f92157deSopenharmony_ci // All fields match. 1579f92157deSopenharmony_ci EXPECT_THAT(p, FieldsAre(25, "foo", .5)); 1580f92157deSopenharmony_ci EXPECT_THAT(p, FieldsAre(Ge(20), HasSubstr("o"), DoubleEq(.5))); 1581f92157deSopenharmony_ci 1582f92157deSopenharmony_ci // Some don't match. 1583f92157deSopenharmony_ci EXPECT_THAT(p, Not(FieldsAre(26, "foo", .5))); 1584f92157deSopenharmony_ci EXPECT_THAT(p, Not(FieldsAre(25, "fo", .5))); 1585f92157deSopenharmony_ci EXPECT_THAT(p, Not(FieldsAre(25, "foo", .6))); 1586f92157deSopenharmony_ci} 1587f92157deSopenharmony_ci 1588f92157deSopenharmony_ciTEST(FieldsAreTest, CanDescribeSelf) { 1589f92157deSopenharmony_ci Matcher<const pair<std::string, int>&> m1 = FieldsAre("foo", 42); 1590f92157deSopenharmony_ci EXPECT_EQ( 1591f92157deSopenharmony_ci "has field #0 that is equal to \"foo\"" 1592f92157deSopenharmony_ci ", and has field #1 that is equal to 42", 1593f92157deSopenharmony_ci Describe(m1)); 1594f92157deSopenharmony_ci EXPECT_EQ( 1595f92157deSopenharmony_ci "has field #0 that isn't equal to \"foo\"" 1596f92157deSopenharmony_ci ", or has field #1 that isn't equal to 42", 1597f92157deSopenharmony_ci DescribeNegation(m1)); 1598f92157deSopenharmony_ci} 1599f92157deSopenharmony_ci 1600f92157deSopenharmony_ciTEST_P(FieldsAreTestP, CanExplainMatchResultTo) { 1601f92157deSopenharmony_ci // The first one that fails is the one that gives the error. 1602f92157deSopenharmony_ci Matcher<std::tuple<int, int, int>> m = 1603f92157deSopenharmony_ci FieldsAre(GreaterThan(0), GreaterThan(0), GreaterThan(0)); 1604f92157deSopenharmony_ci 1605f92157deSopenharmony_ci EXPECT_EQ("whose field #0 does not match, which is 1 less than 0", 1606f92157deSopenharmony_ci Explain(m, std::make_tuple(-1, -2, -3))); 1607f92157deSopenharmony_ci EXPECT_EQ("whose field #1 does not match, which is 2 less than 0", 1608f92157deSopenharmony_ci Explain(m, std::make_tuple(1, -2, -3))); 1609f92157deSopenharmony_ci EXPECT_EQ("whose field #2 does not match, which is 3 less than 0", 1610f92157deSopenharmony_ci Explain(m, std::make_tuple(1, 2, -3))); 1611f92157deSopenharmony_ci 1612f92157deSopenharmony_ci // If they all match, we get a long explanation of success. 1613f92157deSopenharmony_ci EXPECT_EQ( 1614f92157deSopenharmony_ci "whose all elements match, " 1615f92157deSopenharmony_ci "where field #0 is a value which is 1 more than 0" 1616f92157deSopenharmony_ci ", and field #1 is a value which is 2 more than 0" 1617f92157deSopenharmony_ci ", and field #2 is a value which is 3 more than 0", 1618f92157deSopenharmony_ci Explain(m, std::make_tuple(1, 2, 3))); 1619f92157deSopenharmony_ci 1620f92157deSopenharmony_ci // Only print those that have an explanation. 1621f92157deSopenharmony_ci m = FieldsAre(GreaterThan(0), 0, GreaterThan(0)); 1622f92157deSopenharmony_ci EXPECT_EQ( 1623f92157deSopenharmony_ci "whose all elements match, " 1624f92157deSopenharmony_ci "where field #0 is a value which is 1 more than 0" 1625f92157deSopenharmony_ci ", and field #2 is a value which is 3 more than 0", 1626f92157deSopenharmony_ci Explain(m, std::make_tuple(1, 0, 3))); 1627f92157deSopenharmony_ci 1628f92157deSopenharmony_ci // If only one has an explanation, then print that one. 1629f92157deSopenharmony_ci m = FieldsAre(0, GreaterThan(0), 0); 1630f92157deSopenharmony_ci EXPECT_EQ( 1631f92157deSopenharmony_ci "whose all elements match, " 1632f92157deSopenharmony_ci "where field #1 is a value which is 1 more than 0", 1633f92157deSopenharmony_ci Explain(m, std::make_tuple(0, 1, 0))); 1634f92157deSopenharmony_ci} 1635f92157deSopenharmony_ci 1636f92157deSopenharmony_ci#if defined(__cpp_structured_bindings) && __cpp_structured_bindings >= 201606 1637f92157deSopenharmony_ciTEST(FieldsAreTest, StructuredBindings) { 1638f92157deSopenharmony_ci // testing::FieldsAre can also match aggregates and such with C++17 and up. 1639f92157deSopenharmony_ci struct MyType { 1640f92157deSopenharmony_ci int i; 1641f92157deSopenharmony_ci std::string str; 1642f92157deSopenharmony_ci }; 1643f92157deSopenharmony_ci EXPECT_THAT((MyType{17, "foo"}), FieldsAre(Eq(17), HasSubstr("oo"))); 1644f92157deSopenharmony_ci 1645f92157deSopenharmony_ci // Test all the supported arities. 1646f92157deSopenharmony_ci struct MyVarType1 { 1647f92157deSopenharmony_ci int a; 1648f92157deSopenharmony_ci }; 1649f92157deSopenharmony_ci EXPECT_THAT(MyVarType1{}, FieldsAre(0)); 1650f92157deSopenharmony_ci struct MyVarType2 { 1651f92157deSopenharmony_ci int a, b; 1652f92157deSopenharmony_ci }; 1653f92157deSopenharmony_ci EXPECT_THAT(MyVarType2{}, FieldsAre(0, 0)); 1654f92157deSopenharmony_ci struct MyVarType3 { 1655f92157deSopenharmony_ci int a, b, c; 1656f92157deSopenharmony_ci }; 1657f92157deSopenharmony_ci EXPECT_THAT(MyVarType3{}, FieldsAre(0, 0, 0)); 1658f92157deSopenharmony_ci struct MyVarType4 { 1659f92157deSopenharmony_ci int a, b, c, d; 1660f92157deSopenharmony_ci }; 1661f92157deSopenharmony_ci EXPECT_THAT(MyVarType4{}, FieldsAre(0, 0, 0, 0)); 1662f92157deSopenharmony_ci struct MyVarType5 { 1663f92157deSopenharmony_ci int a, b, c, d, e; 1664f92157deSopenharmony_ci }; 1665f92157deSopenharmony_ci EXPECT_THAT(MyVarType5{}, FieldsAre(0, 0, 0, 0, 0)); 1666f92157deSopenharmony_ci struct MyVarType6 { 1667f92157deSopenharmony_ci int a, b, c, d, e, f; 1668f92157deSopenharmony_ci }; 1669f92157deSopenharmony_ci EXPECT_THAT(MyVarType6{}, FieldsAre(0, 0, 0, 0, 0, 0)); 1670f92157deSopenharmony_ci struct MyVarType7 { 1671f92157deSopenharmony_ci int a, b, c, d, e, f, g; 1672f92157deSopenharmony_ci }; 1673f92157deSopenharmony_ci EXPECT_THAT(MyVarType7{}, FieldsAre(0, 0, 0, 0, 0, 0, 0)); 1674f92157deSopenharmony_ci struct MyVarType8 { 1675f92157deSopenharmony_ci int a, b, c, d, e, f, g, h; 1676f92157deSopenharmony_ci }; 1677f92157deSopenharmony_ci EXPECT_THAT(MyVarType8{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0)); 1678f92157deSopenharmony_ci struct MyVarType9 { 1679f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i; 1680f92157deSopenharmony_ci }; 1681f92157deSopenharmony_ci EXPECT_THAT(MyVarType9{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0)); 1682f92157deSopenharmony_ci struct MyVarType10 { 1683f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j; 1684f92157deSopenharmony_ci }; 1685f92157deSopenharmony_ci EXPECT_THAT(MyVarType10{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1686f92157deSopenharmony_ci struct MyVarType11 { 1687f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k; 1688f92157deSopenharmony_ci }; 1689f92157deSopenharmony_ci EXPECT_THAT(MyVarType11{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1690f92157deSopenharmony_ci struct MyVarType12 { 1691f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l; 1692f92157deSopenharmony_ci }; 1693f92157deSopenharmony_ci EXPECT_THAT(MyVarType12{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1694f92157deSopenharmony_ci struct MyVarType13 { 1695f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l, m; 1696f92157deSopenharmony_ci }; 1697f92157deSopenharmony_ci EXPECT_THAT(MyVarType13{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1698f92157deSopenharmony_ci struct MyVarType14 { 1699f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l, m, n; 1700f92157deSopenharmony_ci }; 1701f92157deSopenharmony_ci EXPECT_THAT(MyVarType14{}, 1702f92157deSopenharmony_ci FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1703f92157deSopenharmony_ci struct MyVarType15 { 1704f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o; 1705f92157deSopenharmony_ci }; 1706f92157deSopenharmony_ci EXPECT_THAT(MyVarType15{}, 1707f92157deSopenharmony_ci FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1708f92157deSopenharmony_ci struct MyVarType16 { 1709f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p; 1710f92157deSopenharmony_ci }; 1711f92157deSopenharmony_ci EXPECT_THAT(MyVarType16{}, 1712f92157deSopenharmony_ci FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1713f92157deSopenharmony_ci struct MyVarType17 { 1714f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q; 1715f92157deSopenharmony_ci }; 1716f92157deSopenharmony_ci EXPECT_THAT(MyVarType17{}, 1717f92157deSopenharmony_ci FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1718f92157deSopenharmony_ci struct MyVarType18 { 1719f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r; 1720f92157deSopenharmony_ci }; 1721f92157deSopenharmony_ci EXPECT_THAT(MyVarType18{}, 1722f92157deSopenharmony_ci FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)); 1723f92157deSopenharmony_ci struct MyVarType19 { 1724f92157deSopenharmony_ci int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s; 1725f92157deSopenharmony_ci }; 1726f92157deSopenharmony_ci EXPECT_THAT(MyVarType19{}, FieldsAre(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1727f92157deSopenharmony_ci 0, 0, 0, 0, 0)); 1728f92157deSopenharmony_ci} 1729f92157deSopenharmony_ci#endif 1730f92157deSopenharmony_ci 1731f92157deSopenharmony_ciTEST(PairTest, UseGetInsteadOfMembers) { 1732f92157deSopenharmony_ci PairWithGet pair{7, "ABC"}; 1733f92157deSopenharmony_ci EXPECT_THAT(pair, Pair(7, "ABC")); 1734f92157deSopenharmony_ci EXPECT_THAT(pair, Pair(Ge(7), HasSubstr("AB"))); 1735f92157deSopenharmony_ci EXPECT_THAT(pair, Not(Pair(Lt(7), "ABC"))); 1736f92157deSopenharmony_ci 1737f92157deSopenharmony_ci std::vector<PairWithGet> v = {{11, "Foo"}, {29, "gMockIsBestMock"}}; 1738f92157deSopenharmony_ci EXPECT_THAT(v, 1739f92157deSopenharmony_ci ElementsAre(Pair(11, std::string("Foo")), Pair(Ge(10), Not("")))); 1740f92157deSopenharmony_ci} 1741f92157deSopenharmony_ci 1742f92157deSopenharmony_ci// Tests StartsWith(s). 1743f92157deSopenharmony_ci 1744f92157deSopenharmony_ciTEST(StartsWithTest, MatchesStringWithGivenPrefix) { 1745f92157deSopenharmony_ci const Matcher<const char*> m1 = StartsWith(std::string("")); 1746f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("Hi")); 1747f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("")); 1748f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 1749f92157deSopenharmony_ci 1750f92157deSopenharmony_ci const Matcher<const std::string&> m2 = StartsWith("Hi"); 1751f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("Hi")); 1752f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("Hi Hi!")); 1753f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("High")); 1754f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("H")); 1755f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(" Hi")); 1756f92157deSopenharmony_ci 1757f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1758f92157deSopenharmony_ci const Matcher<internal::StringView> m_empty = 1759f92157deSopenharmony_ci StartsWith(internal::StringView("")); 1760f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches(internal::StringView())); 1761f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches(internal::StringView(""))); 1762f92157deSopenharmony_ci EXPECT_TRUE(m_empty.Matches(internal::StringView("not empty"))); 1763f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1764f92157deSopenharmony_ci} 1765f92157deSopenharmony_ci 1766f92157deSopenharmony_ciTEST(StartsWithTest, CanDescribeSelf) { 1767f92157deSopenharmony_ci Matcher<const std::string> m = StartsWith("Hi"); 1768f92157deSopenharmony_ci EXPECT_EQ("starts with \"Hi\"", Describe(m)); 1769f92157deSopenharmony_ci} 1770f92157deSopenharmony_ci 1771f92157deSopenharmony_ci// Tests EndsWith(s). 1772f92157deSopenharmony_ci 1773f92157deSopenharmony_ciTEST(EndsWithTest, MatchesStringWithGivenSuffix) { 1774f92157deSopenharmony_ci const Matcher<const char*> m1 = EndsWith(""); 1775f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("Hi")); 1776f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("")); 1777f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 1778f92157deSopenharmony_ci 1779f92157deSopenharmony_ci const Matcher<const std::string&> m2 = EndsWith(std::string("Hi")); 1780f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("Hi")); 1781f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("Wow Hi Hi")); 1782f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("Super Hi")); 1783f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("i")); 1784f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("Hi ")); 1785f92157deSopenharmony_ci 1786f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1787f92157deSopenharmony_ci const Matcher<const internal::StringView&> m4 = 1788f92157deSopenharmony_ci EndsWith(internal::StringView("")); 1789f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches("Hi")); 1790f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches("")); 1791f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(internal::StringView())); 1792f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(internal::StringView(""))); 1793f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1794f92157deSopenharmony_ci} 1795f92157deSopenharmony_ci 1796f92157deSopenharmony_ciTEST(EndsWithTest, CanDescribeSelf) { 1797f92157deSopenharmony_ci Matcher<const std::string> m = EndsWith("Hi"); 1798f92157deSopenharmony_ci EXPECT_EQ("ends with \"Hi\"", Describe(m)); 1799f92157deSopenharmony_ci} 1800f92157deSopenharmony_ci 1801f92157deSopenharmony_ci// Tests WhenBase64Unescaped. 1802f92157deSopenharmony_ci 1803f92157deSopenharmony_ciTEST(WhenBase64UnescapedTest, MatchesUnescapedBase64Strings) { 1804f92157deSopenharmony_ci const Matcher<const char*> m1 = WhenBase64Unescaped(EndsWith("!")); 1805f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("invalid base64")); 1806f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches("aGVsbG8gd29ybGQ=")); // hello world 1807f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("aGVsbG8gd29ybGQh")); // hello world! 1808f92157deSopenharmony_ci 1809f92157deSopenharmony_ci const Matcher<const std::string&> m2 = WhenBase64Unescaped(EndsWith("!")); 1810f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("invalid base64")); 1811f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("aGVsbG8gd29ybGQ=")); // hello world 1812f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("aGVsbG8gd29ybGQh")); // hello world! 1813f92157deSopenharmony_ci 1814f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1815f92157deSopenharmony_ci const Matcher<const internal::StringView&> m3 = 1816f92157deSopenharmony_ci WhenBase64Unescaped(EndsWith("!")); 1817f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches("invalid base64")); 1818f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches("aGVsbG8gd29ybGQ=")); // hello world 1819f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches("aGVsbG8gd29ybGQh")); // hello world! 1820f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1821f92157deSopenharmony_ci} 1822f92157deSopenharmony_ci 1823f92157deSopenharmony_ciTEST(WhenBase64UnescapedTest, CanDescribeSelf) { 1824f92157deSopenharmony_ci const Matcher<const char*> m = WhenBase64Unescaped(EndsWith("!")); 1825f92157deSopenharmony_ci EXPECT_EQ("matches after Base64Unescape ends with \"!\"", Describe(m)); 1826f92157deSopenharmony_ci} 1827f92157deSopenharmony_ci 1828f92157deSopenharmony_ci// Tests MatchesRegex(). 1829f92157deSopenharmony_ci 1830f92157deSopenharmony_ciTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) { 1831f92157deSopenharmony_ci const Matcher<const char*> m1 = MatchesRegex("a.*z"); 1832f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("az")); 1833f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("abcz")); 1834f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 1835f92157deSopenharmony_ci 1836f92157deSopenharmony_ci const Matcher<const std::string&> m2 = MatchesRegex(new RE("a.*z")); 1837f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("azbz")); 1838f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("az1")); 1839f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("1az")); 1840f92157deSopenharmony_ci 1841f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1842f92157deSopenharmony_ci const Matcher<const internal::StringView&> m3 = MatchesRegex("a.*z"); 1843f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("az"))); 1844f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("abcz"))); 1845f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView("1az"))); 1846f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView())); 1847f92157deSopenharmony_ci const Matcher<const internal::StringView&> m4 = 1848f92157deSopenharmony_ci MatchesRegex(internal::StringView("")); 1849f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(internal::StringView(""))); 1850f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(internal::StringView())); 1851f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1852f92157deSopenharmony_ci} 1853f92157deSopenharmony_ci 1854f92157deSopenharmony_ciTEST(MatchesRegexTest, CanDescribeSelf) { 1855f92157deSopenharmony_ci Matcher<const std::string> m1 = MatchesRegex(std::string("Hi.*")); 1856f92157deSopenharmony_ci EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1)); 1857f92157deSopenharmony_ci 1858f92157deSopenharmony_ci Matcher<const char*> m2 = MatchesRegex(new RE("a.*")); 1859f92157deSopenharmony_ci EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2)); 1860f92157deSopenharmony_ci 1861f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1862f92157deSopenharmony_ci Matcher<const internal::StringView> m3 = MatchesRegex(new RE("0.*")); 1863f92157deSopenharmony_ci EXPECT_EQ("matches regular expression \"0.*\"", Describe(m3)); 1864f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1865f92157deSopenharmony_ci} 1866f92157deSopenharmony_ci 1867f92157deSopenharmony_ci// Tests ContainsRegex(). 1868f92157deSopenharmony_ci 1869f92157deSopenharmony_ciTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) { 1870f92157deSopenharmony_ci const Matcher<const char*> m1 = ContainsRegex(std::string("a.*z")); 1871f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("az")); 1872f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches("0abcz1")); 1873f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 1874f92157deSopenharmony_ci 1875f92157deSopenharmony_ci const Matcher<const std::string&> m2 = ContainsRegex(new RE("a.*z")); 1876f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("azbz")); 1877f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches("az1")); 1878f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches("1a")); 1879f92157deSopenharmony_ci 1880f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1881f92157deSopenharmony_ci const Matcher<const internal::StringView&> m3 = ContainsRegex(new RE("a.*z")); 1882f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("azbz"))); 1883f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(internal::StringView("az1"))); 1884f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView("1a"))); 1885f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(internal::StringView())); 1886f92157deSopenharmony_ci const Matcher<const internal::StringView&> m4 = 1887f92157deSopenharmony_ci ContainsRegex(internal::StringView("")); 1888f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(internal::StringView(""))); 1889f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(internal::StringView())); 1890f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1891f92157deSopenharmony_ci} 1892f92157deSopenharmony_ci 1893f92157deSopenharmony_ciTEST(ContainsRegexTest, CanDescribeSelf) { 1894f92157deSopenharmony_ci Matcher<const std::string> m1 = ContainsRegex("Hi.*"); 1895f92157deSopenharmony_ci EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1)); 1896f92157deSopenharmony_ci 1897f92157deSopenharmony_ci Matcher<const char*> m2 = ContainsRegex(new RE("a.*")); 1898f92157deSopenharmony_ci EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2)); 1899f92157deSopenharmony_ci 1900f92157deSopenharmony_ci#if GTEST_INTERNAL_HAS_STRING_VIEW 1901f92157deSopenharmony_ci Matcher<const internal::StringView> m3 = ContainsRegex(new RE("0.*")); 1902f92157deSopenharmony_ci EXPECT_EQ("contains regular expression \"0.*\"", Describe(m3)); 1903f92157deSopenharmony_ci#endif // GTEST_INTERNAL_HAS_STRING_VIEW 1904f92157deSopenharmony_ci} 1905f92157deSopenharmony_ci 1906f92157deSopenharmony_ci// Tests for wide strings. 1907f92157deSopenharmony_ci#if GTEST_HAS_STD_WSTRING 1908f92157deSopenharmony_ciTEST(StdWideStrEqTest, MatchesEqual) { 1909f92157deSopenharmony_ci Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello")); 1910f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(L"Hello")); 1911f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(L"hello")); 1912f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 1913f92157deSopenharmony_ci 1914f92157deSopenharmony_ci Matcher<const ::std::wstring&> m2 = StrEq(L"Hello"); 1915f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"Hello")); 1916f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"Hi")); 1917f92157deSopenharmony_ci 1918f92157deSopenharmony_ci Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1919f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 1920f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 1921f92157deSopenharmony_ci 1922f92157deSopenharmony_ci ::std::wstring str(L"01204500800"); 1923f92157deSopenharmony_ci str[3] = L'\0'; 1924f92157deSopenharmony_ci Matcher<const ::std::wstring&> m4 = StrEq(str); 1925f92157deSopenharmony_ci EXPECT_TRUE(m4.Matches(str)); 1926f92157deSopenharmony_ci str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1927f92157deSopenharmony_ci Matcher<const ::std::wstring&> m5 = StrEq(str); 1928f92157deSopenharmony_ci EXPECT_TRUE(m5.Matches(str)); 1929f92157deSopenharmony_ci} 1930f92157deSopenharmony_ci 1931f92157deSopenharmony_ciTEST(StdWideStrEqTest, CanDescribeSelf) { 1932f92157deSopenharmony_ci Matcher<::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v"); 1933f92157deSopenharmony_ci EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 1934f92157deSopenharmony_ci Describe(m)); 1935f92157deSopenharmony_ci 1936f92157deSopenharmony_ci Matcher<::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1937f92157deSopenharmony_ci EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", Describe(m2)); 1938f92157deSopenharmony_ci 1939f92157deSopenharmony_ci ::std::wstring str(L"01204500800"); 1940f92157deSopenharmony_ci str[3] = L'\0'; 1941f92157deSopenharmony_ci Matcher<const ::std::wstring&> m4 = StrEq(str); 1942f92157deSopenharmony_ci EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 1943f92157deSopenharmony_ci str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1944f92157deSopenharmony_ci Matcher<const ::std::wstring&> m5 = StrEq(str); 1945f92157deSopenharmony_ci EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 1946f92157deSopenharmony_ci} 1947f92157deSopenharmony_ci 1948f92157deSopenharmony_ciTEST(StdWideStrNeTest, MatchesUnequalString) { 1949f92157deSopenharmony_ci Matcher<const wchar_t*> m = StrNe(L"Hello"); 1950f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(L"")); 1951f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(nullptr)); 1952f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(L"Hello")); 1953f92157deSopenharmony_ci 1954f92157deSopenharmony_ci Matcher<::std::wstring> m2 = StrNe(::std::wstring(L"Hello")); 1955f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"hello")); 1956f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"Hello")); 1957f92157deSopenharmony_ci} 1958f92157deSopenharmony_ci 1959f92157deSopenharmony_ciTEST(StdWideStrNeTest, CanDescribeSelf) { 1960f92157deSopenharmony_ci Matcher<const wchar_t*> m = StrNe(L"Hi"); 1961f92157deSopenharmony_ci EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m)); 1962f92157deSopenharmony_ci} 1963f92157deSopenharmony_ci 1964f92157deSopenharmony_ciTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 1965f92157deSopenharmony_ci Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello")); 1966f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(L"Hello")); 1967f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(L"hello")); 1968f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(L"Hi")); 1969f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 1970f92157deSopenharmony_ci 1971f92157deSopenharmony_ci Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello"); 1972f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"hello")); 1973f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"Hi")); 1974f92157deSopenharmony_ci} 1975f92157deSopenharmony_ci 1976f92157deSopenharmony_ciTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1977f92157deSopenharmony_ci ::std::wstring str1(L"oabocdooeoo"); 1978f92157deSopenharmony_ci ::std::wstring str2(L"OABOCDOOEOO"); 1979f92157deSopenharmony_ci Matcher<const ::std::wstring&> m0 = StrCaseEq(str1); 1980f92157deSopenharmony_ci EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0'))); 1981f92157deSopenharmony_ci 1982f92157deSopenharmony_ci str1[3] = str2[3] = L'\0'; 1983f92157deSopenharmony_ci Matcher<const ::std::wstring&> m1 = StrCaseEq(str1); 1984f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(str2)); 1985f92157deSopenharmony_ci 1986f92157deSopenharmony_ci str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 1987f92157deSopenharmony_ci str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 1988f92157deSopenharmony_ci Matcher<const ::std::wstring&> m2 = StrCaseEq(str1); 1989f92157deSopenharmony_ci str1[9] = str2[9] = L'\0'; 1990f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(str2)); 1991f92157deSopenharmony_ci 1992f92157deSopenharmony_ci Matcher<const ::std::wstring&> m3 = StrCaseEq(str1); 1993f92157deSopenharmony_ci EXPECT_TRUE(m3.Matches(str2)); 1994f92157deSopenharmony_ci 1995f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(str2 + L"x")); 1996f92157deSopenharmony_ci str2.append(1, L'\0'); 1997f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(str2)); 1998f92157deSopenharmony_ci EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9))); 1999f92157deSopenharmony_ci} 2000f92157deSopenharmony_ci 2001f92157deSopenharmony_ciTEST(StdWideStrCaseEqTest, CanDescribeSelf) { 2002f92157deSopenharmony_ci Matcher<::std::wstring> m = StrCaseEq(L"Hi"); 2003f92157deSopenharmony_ci EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 2004f92157deSopenharmony_ci} 2005f92157deSopenharmony_ci 2006f92157deSopenharmony_ciTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 2007f92157deSopenharmony_ci Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 2008f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(L"Hi")); 2009f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(nullptr)); 2010f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(L"Hello")); 2011f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(L"hello")); 2012f92157deSopenharmony_ci 2013f92157deSopenharmony_ci Matcher<::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello")); 2014f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"")); 2015f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"Hello")); 2016f92157deSopenharmony_ci} 2017f92157deSopenharmony_ci 2018f92157deSopenharmony_ciTEST(StdWideStrCaseNeTest, CanDescribeSelf) { 2019f92157deSopenharmony_ci Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 2020f92157deSopenharmony_ci EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m)); 2021f92157deSopenharmony_ci} 2022f92157deSopenharmony_ci 2023f92157deSopenharmony_ci// Tests that HasSubstr() works for matching wstring-typed values. 2024f92157deSopenharmony_ciTEST(StdWideHasSubstrTest, WorksForStringClasses) { 2025f92157deSopenharmony_ci const Matcher<::std::wstring> m1 = HasSubstr(L"foo"); 2026f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food."))); 2027f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo"))); 2028f92157deSopenharmony_ci 2029f92157deSopenharmony_ci const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo"); 2030f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food."))); 2031f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo"))); 2032f92157deSopenharmony_ci} 2033f92157deSopenharmony_ci 2034f92157deSopenharmony_ci// Tests that HasSubstr() works for matching C-wide-string-typed values. 2035f92157deSopenharmony_ciTEST(StdWideHasSubstrTest, WorksForCStrings) { 2036f92157deSopenharmony_ci const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 2037f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 2038f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 2039f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 2040f92157deSopenharmony_ci 2041f92157deSopenharmony_ci const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 2042f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"I love food.")); 2043f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"tofo")); 2044f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(nullptr)); 2045f92157deSopenharmony_ci} 2046f92157deSopenharmony_ci 2047f92157deSopenharmony_ci// Tests that HasSubstr(s) describes itself properly. 2048f92157deSopenharmony_ciTEST(StdWideHasSubstrTest, CanDescribeSelf) { 2049f92157deSopenharmony_ci Matcher<::std::wstring> m = HasSubstr(L"foo\n\""); 2050f92157deSopenharmony_ci EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 2051f92157deSopenharmony_ci} 2052f92157deSopenharmony_ci 2053f92157deSopenharmony_ci// Tests StartsWith(s). 2054f92157deSopenharmony_ci 2055f92157deSopenharmony_ciTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) { 2056f92157deSopenharmony_ci const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L"")); 2057f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(L"Hi")); 2058f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(L"")); 2059f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 2060f92157deSopenharmony_ci 2061f92157deSopenharmony_ci const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi"); 2062f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"Hi")); 2063f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 2064f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"High")); 2065f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"H")); 2066f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L" Hi")); 2067f92157deSopenharmony_ci} 2068f92157deSopenharmony_ci 2069f92157deSopenharmony_ciTEST(StdWideStartsWithTest, CanDescribeSelf) { 2070f92157deSopenharmony_ci Matcher<const ::std::wstring> m = StartsWith(L"Hi"); 2071f92157deSopenharmony_ci EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 2072f92157deSopenharmony_ci} 2073f92157deSopenharmony_ci 2074f92157deSopenharmony_ci// Tests EndsWith(s). 2075f92157deSopenharmony_ci 2076f92157deSopenharmony_ciTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) { 2077f92157deSopenharmony_ci const Matcher<const wchar_t*> m1 = EndsWith(L""); 2078f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(L"Hi")); 2079f92157deSopenharmony_ci EXPECT_TRUE(m1.Matches(L"")); 2080f92157deSopenharmony_ci EXPECT_FALSE(m1.Matches(nullptr)); 2081f92157deSopenharmony_ci 2082f92157deSopenharmony_ci const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi")); 2083f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"Hi")); 2084f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 2085f92157deSopenharmony_ci EXPECT_TRUE(m2.Matches(L"Super Hi")); 2086f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"i")); 2087f92157deSopenharmony_ci EXPECT_FALSE(m2.Matches(L"Hi ")); 2088f92157deSopenharmony_ci} 2089f92157deSopenharmony_ci 2090f92157deSopenharmony_ciTEST(StdWideEndsWithTest, CanDescribeSelf) { 2091f92157deSopenharmony_ci Matcher<const ::std::wstring> m = EndsWith(L"Hi"); 2092f92157deSopenharmony_ci EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 2093f92157deSopenharmony_ci} 2094f92157deSopenharmony_ci 2095f92157deSopenharmony_ci#endif // GTEST_HAS_STD_WSTRING 2096f92157deSopenharmony_ci 2097f92157deSopenharmony_ciTEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) { 2098f92157deSopenharmony_ci StringMatchResultListener listener1; 2099f92157deSopenharmony_ci EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1)); 2100f92157deSopenharmony_ci EXPECT_EQ("% 2 == 0", listener1.str()); 2101f92157deSopenharmony_ci 2102f92157deSopenharmony_ci StringMatchResultListener listener2; 2103f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2)); 2104f92157deSopenharmony_ci EXPECT_EQ("", listener2.str()); 2105f92157deSopenharmony_ci} 2106f92157deSopenharmony_ci 2107f92157deSopenharmony_ciTEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) { 2108f92157deSopenharmony_ci const Matcher<int> is_even = PolymorphicIsEven(); 2109f92157deSopenharmony_ci StringMatchResultListener listener1; 2110f92157deSopenharmony_ci EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1)); 2111f92157deSopenharmony_ci EXPECT_EQ("% 2 == 0", listener1.str()); 2112f92157deSopenharmony_ci 2113f92157deSopenharmony_ci const Matcher<const double&> is_zero = Eq(0); 2114f92157deSopenharmony_ci StringMatchResultListener listener2; 2115f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2)); 2116f92157deSopenharmony_ci EXPECT_EQ("", listener2.str()); 2117f92157deSopenharmony_ci} 2118f92157deSopenharmony_ci 2119f92157deSopenharmony_ciMATCHER(ConstructNoArg, "") { return true; } 2120f92157deSopenharmony_ciMATCHER_P(Construct1Arg, arg1, "") { return true; } 2121f92157deSopenharmony_ciMATCHER_P2(Construct2Args, arg1, arg2, "") { return true; } 2122f92157deSopenharmony_ci 2123f92157deSopenharmony_ciTEST(MatcherConstruct, ExplicitVsImplicit) { 2124f92157deSopenharmony_ci { 2125f92157deSopenharmony_ci // No arg constructor can be constructed with empty brace. 2126f92157deSopenharmony_ci ConstructNoArgMatcher m = {}; 2127f92157deSopenharmony_ci (void)m; 2128f92157deSopenharmony_ci // And with no args 2129f92157deSopenharmony_ci ConstructNoArgMatcher m2; 2130f92157deSopenharmony_ci (void)m2; 2131f92157deSopenharmony_ci } 2132f92157deSopenharmony_ci { 2133f92157deSopenharmony_ci // The one arg constructor has an explicit constructor. 2134f92157deSopenharmony_ci // This is to prevent the implicit conversion. 2135f92157deSopenharmony_ci using M = Construct1ArgMatcherP<int>; 2136f92157deSopenharmony_ci EXPECT_TRUE((std::is_constructible<M, int>::value)); 2137f92157deSopenharmony_ci EXPECT_FALSE((std::is_convertible<int, M>::value)); 2138f92157deSopenharmony_ci } 2139f92157deSopenharmony_ci { 2140f92157deSopenharmony_ci // Multiple arg matchers can be constructed with an implicit construction. 2141f92157deSopenharmony_ci Construct2ArgsMatcherP2<int, double> m = {1, 2.2}; 2142f92157deSopenharmony_ci (void)m; 2143f92157deSopenharmony_ci } 2144f92157deSopenharmony_ci} 2145f92157deSopenharmony_ci 2146f92157deSopenharmony_ciMATCHER_P(Really, inner_matcher, "") { 2147f92157deSopenharmony_ci return ExplainMatchResult(inner_matcher, arg, result_listener); 2148f92157deSopenharmony_ci} 2149f92157deSopenharmony_ci 2150f92157deSopenharmony_ciTEST(ExplainMatchResultTest, WorksInsideMATCHER) { 2151f92157deSopenharmony_ci EXPECT_THAT(0, Really(Eq(0))); 2152f92157deSopenharmony_ci} 2153f92157deSopenharmony_ci 2154f92157deSopenharmony_ciTEST(DescribeMatcherTest, WorksWithValue) { 2155f92157deSopenharmony_ci EXPECT_EQ("is equal to 42", DescribeMatcher<int>(42)); 2156f92157deSopenharmony_ci EXPECT_EQ("isn't equal to 42", DescribeMatcher<int>(42, true)); 2157f92157deSopenharmony_ci} 2158f92157deSopenharmony_ci 2159f92157deSopenharmony_ciTEST(DescribeMatcherTest, WorksWithMonomorphicMatcher) { 2160f92157deSopenharmony_ci const Matcher<int> monomorphic = Le(0); 2161f92157deSopenharmony_ci EXPECT_EQ("is <= 0", DescribeMatcher<int>(monomorphic)); 2162f92157deSopenharmony_ci EXPECT_EQ("isn't <= 0", DescribeMatcher<int>(monomorphic, true)); 2163f92157deSopenharmony_ci} 2164f92157deSopenharmony_ci 2165f92157deSopenharmony_ciTEST(DescribeMatcherTest, WorksWithPolymorphicMatcher) { 2166f92157deSopenharmony_ci EXPECT_EQ("is even", DescribeMatcher<int>(PolymorphicIsEven())); 2167f92157deSopenharmony_ci EXPECT_EQ("is odd", DescribeMatcher<int>(PolymorphicIsEven(), true)); 2168f92157deSopenharmony_ci} 2169f92157deSopenharmony_ci 2170f92157deSopenharmony_ciMATCHER_P(FieldIIs, inner_matcher, "") { 2171f92157deSopenharmony_ci return ExplainMatchResult(inner_matcher, arg.i, result_listener); 2172f92157deSopenharmony_ci} 2173f92157deSopenharmony_ci 2174f92157deSopenharmony_ci#if GTEST_HAS_RTTI 2175f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, SameType) { 2176f92157deSopenharmony_ci Derived derived; 2177f92157deSopenharmony_ci derived.i = 4; 2178f92157deSopenharmony_ci 2179f92157deSopenharmony_ci // Right type. A pointer is passed down. 2180f92157deSopenharmony_ci Base* as_base_ptr = &derived; 2181f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull()))); 2182f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4)))); 2183f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, 2184f92157deSopenharmony_ci Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5))))); 2185f92157deSopenharmony_ci} 2186f92157deSopenharmony_ci 2187f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, WrongTypes) { 2188f92157deSopenharmony_ci Base base; 2189f92157deSopenharmony_ci Derived derived; 2190f92157deSopenharmony_ci OtherDerived other_derived; 2191f92157deSopenharmony_ci 2192f92157deSopenharmony_ci // Wrong types. NULL is passed. 2193f92157deSopenharmony_ci EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_)))); 2194f92157deSopenharmony_ci EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull())); 2195f92157deSopenharmony_ci Base* as_base_ptr = &derived; 2196f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_)))); 2197f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull())); 2198f92157deSopenharmony_ci as_base_ptr = &other_derived; 2199f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_)))); 2200f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull())); 2201f92157deSopenharmony_ci} 2202f92157deSopenharmony_ci 2203f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, AlreadyNull) { 2204f92157deSopenharmony_ci // Already NULL. 2205f92157deSopenharmony_ci Base* as_base_ptr = nullptr; 2206f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull())); 2207f92157deSopenharmony_ci} 2208f92157deSopenharmony_ci 2209f92157deSopenharmony_cistruct AmbiguousCastTypes { 2210f92157deSopenharmony_ci class VirtualDerived : public virtual Base {}; 2211f92157deSopenharmony_ci class DerivedSub1 : public VirtualDerived {}; 2212f92157deSopenharmony_ci class DerivedSub2 : public VirtualDerived {}; 2213f92157deSopenharmony_ci class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {}; 2214f92157deSopenharmony_ci}; 2215f92157deSopenharmony_ci 2216f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, AmbiguousCast) { 2217f92157deSopenharmony_ci AmbiguousCastTypes::DerivedSub1 sub1; 2218f92157deSopenharmony_ci AmbiguousCastTypes::ManyDerivedInHierarchy many_derived; 2219f92157deSopenharmony_ci // Multiply derived from Base. dynamic_cast<> returns NULL. 2220f92157deSopenharmony_ci Base* as_base_ptr = 2221f92157deSopenharmony_ci static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived); 2222f92157deSopenharmony_ci EXPECT_THAT(as_base_ptr, 2223f92157deSopenharmony_ci WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull())); 2224f92157deSopenharmony_ci as_base_ptr = &sub1; 2225f92157deSopenharmony_ci EXPECT_THAT( 2226f92157deSopenharmony_ci as_base_ptr, 2227f92157deSopenharmony_ci WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull()))); 2228f92157deSopenharmony_ci} 2229f92157deSopenharmony_ci 2230f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, Describe) { 2231f92157deSopenharmony_ci Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_)); 2232f92157deSopenharmony_ci const std::string prefix = 2233f92157deSopenharmony_ci "when dynamic_cast to " + internal::GetTypeName<Derived*>() + ", "; 2234f92157deSopenharmony_ci EXPECT_EQ(prefix + "points to a value that is anything", Describe(matcher)); 2235f92157deSopenharmony_ci EXPECT_EQ(prefix + "does not point to a value that is anything", 2236f92157deSopenharmony_ci DescribeNegation(matcher)); 2237f92157deSopenharmony_ci} 2238f92157deSopenharmony_ci 2239f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, Explain) { 2240f92157deSopenharmony_ci Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_)); 2241f92157deSopenharmony_ci Base* null = nullptr; 2242f92157deSopenharmony_ci EXPECT_THAT(Explain(matcher, null), HasSubstr("NULL")); 2243f92157deSopenharmony_ci Derived derived; 2244f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(&derived)); 2245f92157deSopenharmony_ci EXPECT_THAT(Explain(matcher, &derived), HasSubstr("which points to ")); 2246f92157deSopenharmony_ci 2247f92157deSopenharmony_ci // With references, the matcher itself can fail. Test for that one. 2248f92157deSopenharmony_ci Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_); 2249f92157deSopenharmony_ci EXPECT_THAT(Explain(ref_matcher, derived), 2250f92157deSopenharmony_ci HasSubstr("which cannot be dynamic_cast")); 2251f92157deSopenharmony_ci} 2252f92157deSopenharmony_ci 2253f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, GoodReference) { 2254f92157deSopenharmony_ci Derived derived; 2255f92157deSopenharmony_ci derived.i = 4; 2256f92157deSopenharmony_ci Base& as_base_ref = derived; 2257f92157deSopenharmony_ci EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4))); 2258f92157deSopenharmony_ci EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5)))); 2259f92157deSopenharmony_ci} 2260f92157deSopenharmony_ci 2261f92157deSopenharmony_ciTEST(WhenDynamicCastToTest, BadReference) { 2262f92157deSopenharmony_ci Derived derived; 2263f92157deSopenharmony_ci Base& as_base_ref = derived; 2264f92157deSopenharmony_ci EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_))); 2265f92157deSopenharmony_ci} 2266f92157deSopenharmony_ci#endif // GTEST_HAS_RTTI 2267f92157deSopenharmony_ci 2268f92157deSopenharmony_ciclass DivisibleByImpl { 2269f92157deSopenharmony_ci public: 2270f92157deSopenharmony_ci explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {} 2271f92157deSopenharmony_ci 2272f92157deSopenharmony_ci // For testing using ExplainMatchResultTo() with polymorphic matchers. 2273f92157deSopenharmony_ci template <typename T> 2274f92157deSopenharmony_ci bool MatchAndExplain(const T& n, MatchResultListener* listener) const { 2275f92157deSopenharmony_ci *listener << "which is " << (n % divider_) << " modulo " << divider_; 2276f92157deSopenharmony_ci return (n % divider_) == 0; 2277f92157deSopenharmony_ci } 2278f92157deSopenharmony_ci 2279f92157deSopenharmony_ci void DescribeTo(ostream* os) const { *os << "is divisible by " << divider_; } 2280f92157deSopenharmony_ci 2281f92157deSopenharmony_ci void DescribeNegationTo(ostream* os) const { 2282f92157deSopenharmony_ci *os << "is not divisible by " << divider_; 2283f92157deSopenharmony_ci } 2284f92157deSopenharmony_ci 2285f92157deSopenharmony_ci void set_divider(int a_divider) { divider_ = a_divider; } 2286f92157deSopenharmony_ci int divider() const { return divider_; } 2287f92157deSopenharmony_ci 2288f92157deSopenharmony_ci private: 2289f92157deSopenharmony_ci int divider_; 2290f92157deSopenharmony_ci}; 2291f92157deSopenharmony_ci 2292f92157deSopenharmony_ciPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) { 2293f92157deSopenharmony_ci return MakePolymorphicMatcher(DivisibleByImpl(n)); 2294f92157deSopenharmony_ci} 2295f92157deSopenharmony_ci 2296f92157deSopenharmony_ci// Tests that when AllOf() fails, only the first failing matcher is 2297f92157deSopenharmony_ci// asked to explain why. 2298f92157deSopenharmony_ciTEST(ExplainMatchResultTest, AllOf_False_False) { 2299f92157deSopenharmony_ci const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 2300f92157deSopenharmony_ci EXPECT_EQ("which is 1 modulo 4", Explain(m, 5)); 2301f92157deSopenharmony_ci} 2302f92157deSopenharmony_ci 2303f92157deSopenharmony_ci// Tests that when AllOf() fails, only the first failing matcher is 2304f92157deSopenharmony_ci// asked to explain why. 2305f92157deSopenharmony_ciTEST(ExplainMatchResultTest, AllOf_False_True) { 2306f92157deSopenharmony_ci const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 2307f92157deSopenharmony_ci EXPECT_EQ("which is 2 modulo 4", Explain(m, 6)); 2308f92157deSopenharmony_ci} 2309f92157deSopenharmony_ci 2310f92157deSopenharmony_ci// Tests that when AllOf() fails, only the first failing matcher is 2311f92157deSopenharmony_ci// asked to explain why. 2312f92157deSopenharmony_ciTEST(ExplainMatchResultTest, AllOf_True_False) { 2313f92157deSopenharmony_ci const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3)); 2314f92157deSopenharmony_ci EXPECT_EQ("which is 2 modulo 3", Explain(m, 5)); 2315f92157deSopenharmony_ci} 2316f92157deSopenharmony_ci 2317f92157deSopenharmony_ci// Tests that when AllOf() succeeds, all matchers are asked to explain 2318f92157deSopenharmony_ci// why. 2319f92157deSopenharmony_ciTEST(ExplainMatchResultTest, AllOf_True_True) { 2320f92157deSopenharmony_ci const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3)); 2321f92157deSopenharmony_ci EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6)); 2322f92157deSopenharmony_ci} 2323f92157deSopenharmony_ci 2324f92157deSopenharmony_ciTEST(ExplainMatchResultTest, AllOf_True_True_2) { 2325f92157deSopenharmony_ci const Matcher<int> m = AllOf(Ge(2), Le(3)); 2326f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, 2)); 2327f92157deSopenharmony_ci} 2328f92157deSopenharmony_ci 2329f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(ExplainmatcherResultTest); 2330f92157deSopenharmony_ci 2331f92157deSopenharmony_ciTEST_P(ExplainmatcherResultTestP, MonomorphicMatcher) { 2332f92157deSopenharmony_ci const Matcher<int> m = GreaterThan(5); 2333f92157deSopenharmony_ci EXPECT_EQ("which is 1 more than 5", Explain(m, 6)); 2334f92157deSopenharmony_ci} 2335f92157deSopenharmony_ci 2336f92157deSopenharmony_ci// Tests PolymorphicMatcher::mutable_impl(). 2337f92157deSopenharmony_ciTEST(PolymorphicMatcherTest, CanAccessMutableImpl) { 2338f92157deSopenharmony_ci PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 2339f92157deSopenharmony_ci DivisibleByImpl& impl = m.mutable_impl(); 2340f92157deSopenharmony_ci EXPECT_EQ(42, impl.divider()); 2341f92157deSopenharmony_ci 2342f92157deSopenharmony_ci impl.set_divider(0); 2343f92157deSopenharmony_ci EXPECT_EQ(0, m.mutable_impl().divider()); 2344f92157deSopenharmony_ci} 2345f92157deSopenharmony_ci 2346f92157deSopenharmony_ci// Tests PolymorphicMatcher::impl(). 2347f92157deSopenharmony_ciTEST(PolymorphicMatcherTest, CanAccessImpl) { 2348f92157deSopenharmony_ci const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 2349f92157deSopenharmony_ci const DivisibleByImpl& impl = m.impl(); 2350f92157deSopenharmony_ci EXPECT_EQ(42, impl.divider()); 2351f92157deSopenharmony_ci} 2352f92157deSopenharmony_ci 2353f92157deSopenharmony_ci} // namespace 2354f92157deSopenharmony_ci} // namespace gmock_matchers_test 2355f92157deSopenharmony_ci} // namespace testing 2356f92157deSopenharmony_ci 2357f92157deSopenharmony_ci#ifdef _MSC_VER 2358f92157deSopenharmony_ci#pragma warning(pop) 2359f92157deSopenharmony_ci#endif 2360