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 "test/gmock-matchers_test.h" 43f92157deSopenharmony_ci 44f92157deSopenharmony_cinamespace testing { 45f92157deSopenharmony_cinamespace gmock_matchers_test { 46f92157deSopenharmony_cinamespace { 47f92157deSopenharmony_ci 48f92157deSopenharmony_cistd::vector<std::unique_ptr<int>> MakeUniquePtrs(const std::vector<int>& ints) { 49f92157deSopenharmony_ci std::vector<std::unique_ptr<int>> pointers; 50f92157deSopenharmony_ci for (int i : ints) pointers.emplace_back(new int(i)); 51f92157deSopenharmony_ci return pointers; 52f92157deSopenharmony_ci} 53f92157deSopenharmony_ci 54f92157deSopenharmony_cistd::string OfType(const std::string& type_name) { 55f92157deSopenharmony_ci#if GTEST_HAS_RTTI 56f92157deSopenharmony_ci return IsReadableTypeName(type_name) ? " (of type " + type_name + ")" : ""; 57f92157deSopenharmony_ci#else 58f92157deSopenharmony_ci return ""; 59f92157deSopenharmony_ci#endif 60f92157deSopenharmony_ci} 61f92157deSopenharmony_ci 62f92157deSopenharmony_ciTEST(ContainsTest, WorksWithMoveOnly) { 63f92157deSopenharmony_ci ContainerHelper helper; 64f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Contains(Pointee(2)))); 65f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1, 2})); 66f92157deSopenharmony_ci} 67f92157deSopenharmony_ci 68f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(ElementsAreTest); 69f92157deSopenharmony_ci 70f92157deSopenharmony_ci// Tests the variadic version of the ElementsAreMatcher 71f92157deSopenharmony_ciTEST(ElementsAreTest, HugeMatcher) { 72f92157deSopenharmony_ci vector<int> test_vector{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 73f92157deSopenharmony_ci 74f92157deSopenharmony_ci EXPECT_THAT(test_vector, 75f92157deSopenharmony_ci ElementsAre(Eq(1), Eq(2), Lt(13), Eq(4), Eq(5), Eq(6), Eq(7), 76f92157deSopenharmony_ci Eq(8), Eq(9), Eq(10), Gt(1), Eq(12))); 77f92157deSopenharmony_ci} 78f92157deSopenharmony_ci 79f92157deSopenharmony_ci// Tests the variadic version of the UnorderedElementsAreMatcher 80f92157deSopenharmony_ciTEST(ElementsAreTest, HugeMatcherStr) { 81f92157deSopenharmony_ci vector<std::string> test_vector{ 82f92157deSopenharmony_ci "literal_string", "", "", "", "", "", "", "", "", "", "", ""}; 83f92157deSopenharmony_ci 84f92157deSopenharmony_ci EXPECT_THAT(test_vector, UnorderedElementsAre("literal_string", _, _, _, _, _, 85f92157deSopenharmony_ci _, _, _, _, _, _)); 86f92157deSopenharmony_ci} 87f92157deSopenharmony_ci 88f92157deSopenharmony_ci// Tests the variadic version of the UnorderedElementsAreMatcher 89f92157deSopenharmony_ciTEST(ElementsAreTest, HugeMatcherUnordered) { 90f92157deSopenharmony_ci vector<int> test_vector{2, 1, 8, 5, 4, 6, 7, 3, 9, 12, 11, 10}; 91f92157deSopenharmony_ci 92f92157deSopenharmony_ci EXPECT_THAT(test_vector, UnorderedElementsAre( 93f92157deSopenharmony_ci Eq(2), Eq(1), Gt(7), Eq(5), Eq(4), Eq(6), Eq(7), 94f92157deSopenharmony_ci Eq(3), Eq(9), Eq(12), Eq(11), Ne(122))); 95f92157deSopenharmony_ci} 96f92157deSopenharmony_ci 97f92157deSopenharmony_ci// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 98f92157deSopenharmony_ci// matches the matcher. 99f92157deSopenharmony_ciTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) { 100f92157deSopenharmony_ci ASSERT_THAT(5, Ge(2)) << "This should succeed."; 101f92157deSopenharmony_ci ASSERT_THAT("Foo", EndsWith("oo")); 102f92157deSopenharmony_ci EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too."; 103f92157deSopenharmony_ci EXPECT_THAT("Hello", StartsWith("Hell")); 104f92157deSopenharmony_ci} 105f92157deSopenharmony_ci 106f92157deSopenharmony_ci// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 107f92157deSopenharmony_ci// doesn't match the matcher. 108f92157deSopenharmony_ciTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) { 109f92157deSopenharmony_ci // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(), 110f92157deSopenharmony_ci // which cannot reference auto variables. 111f92157deSopenharmony_ci static unsigned short n; // NOLINT 112f92157deSopenharmony_ci n = 5; 113f92157deSopenharmony_ci 114f92157deSopenharmony_ci EXPECT_FATAL_FAILURE(ASSERT_THAT(n, Gt(10)), 115f92157deSopenharmony_ci "Value of: n\n" 116f92157deSopenharmony_ci "Expected: is > 10\n" 117f92157deSopenharmony_ci " Actual: 5" + 118f92157deSopenharmony_ci OfType("unsigned short")); 119f92157deSopenharmony_ci n = 0; 120f92157deSopenharmony_ci EXPECT_NONFATAL_FAILURE(EXPECT_THAT(n, AllOf(Le(7), Ge(5))), 121f92157deSopenharmony_ci "Value of: n\n" 122f92157deSopenharmony_ci "Expected: (is <= 7) and (is >= 5)\n" 123f92157deSopenharmony_ci " Actual: 0" + 124f92157deSopenharmony_ci OfType("unsigned short")); 125f92157deSopenharmony_ci} 126f92157deSopenharmony_ci 127f92157deSopenharmony_ci// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument 128f92157deSopenharmony_ci// has a reference type. 129f92157deSopenharmony_ciTEST(MatcherAssertionTest, WorksForByRefArguments) { 130f92157deSopenharmony_ci // We use a static variable here as EXPECT_FATAL_FAILURE() cannot 131f92157deSopenharmony_ci // reference auto variables. 132f92157deSopenharmony_ci static int n; 133f92157deSopenharmony_ci n = 0; 134f92157deSopenharmony_ci EXPECT_THAT(n, AllOf(Le(7), Ref(n))); 135f92157deSopenharmony_ci EXPECT_FATAL_FAILURE(ASSERT_THAT(n, Not(Ref(n))), 136f92157deSopenharmony_ci "Value of: n\n" 137f92157deSopenharmony_ci "Expected: does not reference the variable @"); 138f92157deSopenharmony_ci // Tests the "Actual" part. 139f92157deSopenharmony_ci EXPECT_FATAL_FAILURE(ASSERT_THAT(n, Not(Ref(n))), 140f92157deSopenharmony_ci "Actual: 0" + OfType("int") + ", which is located @"); 141f92157deSopenharmony_ci} 142f92157deSopenharmony_ci 143f92157deSopenharmony_ci// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is 144f92157deSopenharmony_ci// monomorphic. 145f92157deSopenharmony_ciTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) { 146f92157deSopenharmony_ci Matcher<const char*> starts_with_he = StartsWith("he"); 147f92157deSopenharmony_ci ASSERT_THAT("hello", starts_with_he); 148f92157deSopenharmony_ci 149f92157deSopenharmony_ci Matcher<const std::string&> ends_with_ok = EndsWith("ok"); 150f92157deSopenharmony_ci ASSERT_THAT("book", ends_with_ok); 151f92157deSopenharmony_ci const std::string bad = "bad"; 152f92157deSopenharmony_ci EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok), 153f92157deSopenharmony_ci "Value of: bad\n" 154f92157deSopenharmony_ci "Expected: ends with \"ok\"\n" 155f92157deSopenharmony_ci " Actual: \"bad\""); 156f92157deSopenharmony_ci Matcher<int> is_greater_than_5 = Gt(5); 157f92157deSopenharmony_ci EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5), 158f92157deSopenharmony_ci "Value of: 5\n" 159f92157deSopenharmony_ci "Expected: is > 5\n" 160f92157deSopenharmony_ci " Actual: 5" + 161f92157deSopenharmony_ci OfType("int")); 162f92157deSopenharmony_ci} 163f92157deSopenharmony_ci 164f92157deSopenharmony_ciTEST(PointeeTest, RawPointer) { 165f92157deSopenharmony_ci const Matcher<int*> m = Pointee(Ge(0)); 166f92157deSopenharmony_ci 167f92157deSopenharmony_ci int n = 1; 168f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&n)); 169f92157deSopenharmony_ci n = -1; 170f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&n)); 171f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 172f92157deSopenharmony_ci} 173f92157deSopenharmony_ci 174f92157deSopenharmony_ciTEST(PointeeTest, RawPointerToConst) { 175f92157deSopenharmony_ci const Matcher<const double*> m = Pointee(Ge(0)); 176f92157deSopenharmony_ci 177f92157deSopenharmony_ci double x = 1; 178f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&x)); 179f92157deSopenharmony_ci x = -1; 180f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&x)); 181f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 182f92157deSopenharmony_ci} 183f92157deSopenharmony_ci 184f92157deSopenharmony_ciTEST(PointeeTest, ReferenceToConstRawPointer) { 185f92157deSopenharmony_ci const Matcher<int* const&> m = Pointee(Ge(0)); 186f92157deSopenharmony_ci 187f92157deSopenharmony_ci int n = 1; 188f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&n)); 189f92157deSopenharmony_ci n = -1; 190f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&n)); 191f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 192f92157deSopenharmony_ci} 193f92157deSopenharmony_ci 194f92157deSopenharmony_ciTEST(PointeeTest, ReferenceToNonConstRawPointer) { 195f92157deSopenharmony_ci const Matcher<double*&> m = Pointee(Ge(0)); 196f92157deSopenharmony_ci 197f92157deSopenharmony_ci double x = 1.0; 198f92157deSopenharmony_ci double* p = &x; 199f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(p)); 200f92157deSopenharmony_ci x = -1; 201f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(p)); 202f92157deSopenharmony_ci p = nullptr; 203f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(p)); 204f92157deSopenharmony_ci} 205f92157deSopenharmony_ci 206f92157deSopenharmony_ciTEST(PointeeTest, SmartPointer) { 207f92157deSopenharmony_ci const Matcher<std::unique_ptr<int>> m = Pointee(Ge(0)); 208f92157deSopenharmony_ci 209f92157deSopenharmony_ci std::unique_ptr<int> n(new int(1)); 210f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(n)); 211f92157deSopenharmony_ci} 212f92157deSopenharmony_ci 213f92157deSopenharmony_ciTEST(PointeeTest, SmartPointerToConst) { 214f92157deSopenharmony_ci const Matcher<std::unique_ptr<const int>> m = Pointee(Ge(0)); 215f92157deSopenharmony_ci 216f92157deSopenharmony_ci // There's no implicit conversion from unique_ptr<int> to const 217f92157deSopenharmony_ci // unique_ptr<const int>, so we must pass a unique_ptr<const int> into the 218f92157deSopenharmony_ci // matcher. 219f92157deSopenharmony_ci std::unique_ptr<const int> n(new int(1)); 220f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(n)); 221f92157deSopenharmony_ci} 222f92157deSopenharmony_ci 223f92157deSopenharmony_ciTEST(PointerTest, RawPointer) { 224f92157deSopenharmony_ci int n = 1; 225f92157deSopenharmony_ci const Matcher<int*> m = Pointer(Eq(&n)); 226f92157deSopenharmony_ci 227f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&n)); 228f92157deSopenharmony_ci 229f92157deSopenharmony_ci int* p = nullptr; 230f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(p)); 231f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 232f92157deSopenharmony_ci} 233f92157deSopenharmony_ci 234f92157deSopenharmony_ciTEST(PointerTest, RawPointerToConst) { 235f92157deSopenharmony_ci int n = 1; 236f92157deSopenharmony_ci const Matcher<const int*> m = Pointer(Eq(&n)); 237f92157deSopenharmony_ci 238f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&n)); 239f92157deSopenharmony_ci 240f92157deSopenharmony_ci int* p = nullptr; 241f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(p)); 242f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 243f92157deSopenharmony_ci} 244f92157deSopenharmony_ci 245f92157deSopenharmony_ciTEST(PointerTest, SmartPointer) { 246f92157deSopenharmony_ci std::unique_ptr<int> n(new int(10)); 247f92157deSopenharmony_ci int* raw_n = n.get(); 248f92157deSopenharmony_ci const Matcher<std::unique_ptr<int>> m = Pointer(Eq(raw_n)); 249f92157deSopenharmony_ci 250f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(n)); 251f92157deSopenharmony_ci} 252f92157deSopenharmony_ci 253f92157deSopenharmony_ciTEST(PointerTest, SmartPointerToConst) { 254f92157deSopenharmony_ci std::unique_ptr<const int> n(new int(10)); 255f92157deSopenharmony_ci const int* raw_n = n.get(); 256f92157deSopenharmony_ci const Matcher<std::unique_ptr<const int>> m = Pointer(Eq(raw_n)); 257f92157deSopenharmony_ci 258f92157deSopenharmony_ci // There's no implicit conversion from unique_ptr<int> to const 259f92157deSopenharmony_ci // unique_ptr<const int>, so we must pass a unique_ptr<const int> into the 260f92157deSopenharmony_ci // matcher. 261f92157deSopenharmony_ci std::unique_ptr<const int> p(new int(10)); 262f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(p)); 263f92157deSopenharmony_ci} 264f92157deSopenharmony_ci 265f92157deSopenharmony_ci// Minimal const-propagating pointer. 266f92157deSopenharmony_citemplate <typename T> 267f92157deSopenharmony_ciclass ConstPropagatingPtr { 268f92157deSopenharmony_ci public: 269f92157deSopenharmony_ci typedef T element_type; 270f92157deSopenharmony_ci 271f92157deSopenharmony_ci ConstPropagatingPtr() : val_() {} 272f92157deSopenharmony_ci explicit ConstPropagatingPtr(T* t) : val_(t) {} 273f92157deSopenharmony_ci ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {} 274f92157deSopenharmony_ci 275f92157deSopenharmony_ci T* get() { return val_; } 276f92157deSopenharmony_ci T& operator*() { return *val_; } 277f92157deSopenharmony_ci // Most smart pointers return non-const T* and T& from the next methods. 278f92157deSopenharmony_ci const T* get() const { return val_; } 279f92157deSopenharmony_ci const T& operator*() const { return *val_; } 280f92157deSopenharmony_ci 281f92157deSopenharmony_ci private: 282f92157deSopenharmony_ci T* val_; 283f92157deSopenharmony_ci}; 284f92157deSopenharmony_ci 285f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(PointeeTest); 286f92157deSopenharmony_ci 287f92157deSopenharmony_ciTEST(PointeeTest, WorksWithConstPropagatingPointers) { 288f92157deSopenharmony_ci const Matcher<ConstPropagatingPtr<int>> m = Pointee(Lt(5)); 289f92157deSopenharmony_ci int three = 3; 290f92157deSopenharmony_ci const ConstPropagatingPtr<int> co(&three); 291f92157deSopenharmony_ci ConstPropagatingPtr<int> o(&three); 292f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(o)); 293f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(co)); 294f92157deSopenharmony_ci *o = 6; 295f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(o)); 296f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>())); 297f92157deSopenharmony_ci} 298f92157deSopenharmony_ci 299f92157deSopenharmony_ciTEST(PointeeTest, NeverMatchesNull) { 300f92157deSopenharmony_ci const Matcher<const char*> m = Pointee(_); 301f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 302f92157deSopenharmony_ci} 303f92157deSopenharmony_ci 304f92157deSopenharmony_ci// Tests that we can write Pointee(value) instead of Pointee(Eq(value)). 305f92157deSopenharmony_ciTEST(PointeeTest, MatchesAgainstAValue) { 306f92157deSopenharmony_ci const Matcher<int*> m = Pointee(5); 307f92157deSopenharmony_ci 308f92157deSopenharmony_ci int n = 5; 309f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&n)); 310f92157deSopenharmony_ci n = -1; 311f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&n)); 312f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 313f92157deSopenharmony_ci} 314f92157deSopenharmony_ci 315f92157deSopenharmony_ciTEST(PointeeTest, CanDescribeSelf) { 316f92157deSopenharmony_ci const Matcher<int*> m = Pointee(Gt(3)); 317f92157deSopenharmony_ci EXPECT_EQ("points to a value that is > 3", Describe(m)); 318f92157deSopenharmony_ci EXPECT_EQ("does not point to a value that is > 3", DescribeNegation(m)); 319f92157deSopenharmony_ci} 320f92157deSopenharmony_ci 321f92157deSopenharmony_ciTEST_P(PointeeTestP, CanExplainMatchResult) { 322f92157deSopenharmony_ci const Matcher<const std::string*> m = Pointee(StartsWith("Hi")); 323f92157deSopenharmony_ci 324f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, static_cast<const std::string*>(nullptr))); 325f92157deSopenharmony_ci 326f92157deSopenharmony_ci const Matcher<long*> m2 = Pointee(GreaterThan(1)); // NOLINT 327f92157deSopenharmony_ci long n = 3; // NOLINT 328f92157deSopenharmony_ci EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1", 329f92157deSopenharmony_ci Explain(m2, &n)); 330f92157deSopenharmony_ci} 331f92157deSopenharmony_ci 332f92157deSopenharmony_ciTEST(PointeeTest, AlwaysExplainsPointee) { 333f92157deSopenharmony_ci const Matcher<int*> m = Pointee(0); 334f92157deSopenharmony_ci int n = 42; 335f92157deSopenharmony_ci EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n)); 336f92157deSopenharmony_ci} 337f92157deSopenharmony_ci 338f92157deSopenharmony_ci// An uncopyable class. 339f92157deSopenharmony_ciclass Uncopyable { 340f92157deSopenharmony_ci public: 341f92157deSopenharmony_ci Uncopyable() : value_(-1) {} 342f92157deSopenharmony_ci explicit Uncopyable(int a_value) : value_(a_value) {} 343f92157deSopenharmony_ci 344f92157deSopenharmony_ci int value() const { return value_; } 345f92157deSopenharmony_ci void set_value(int i) { value_ = i; } 346f92157deSopenharmony_ci 347f92157deSopenharmony_ci private: 348f92157deSopenharmony_ci int value_; 349f92157deSopenharmony_ci Uncopyable(const Uncopyable&) = delete; 350f92157deSopenharmony_ci Uncopyable& operator=(const Uncopyable&) = delete; 351f92157deSopenharmony_ci}; 352f92157deSopenharmony_ci 353f92157deSopenharmony_ci// Returns true if and only if x.value() is positive. 354f92157deSopenharmony_cibool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; } 355f92157deSopenharmony_ci 356f92157deSopenharmony_ciMATCHER_P(UncopyableIs, inner_matcher, "") { 357f92157deSopenharmony_ci return ExplainMatchResult(inner_matcher, arg.value(), result_listener); 358f92157deSopenharmony_ci} 359f92157deSopenharmony_ci 360f92157deSopenharmony_ci// A user-defined struct for testing Field(). 361f92157deSopenharmony_cistruct AStruct { 362f92157deSopenharmony_ci AStruct() : x(0), y(1.0), z(5), p(nullptr) {} 363f92157deSopenharmony_ci AStruct(const AStruct& rhs) 364f92157deSopenharmony_ci : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {} 365f92157deSopenharmony_ci 366f92157deSopenharmony_ci int x; // A non-const field. 367f92157deSopenharmony_ci const double y; // A const field. 368f92157deSopenharmony_ci Uncopyable z; // An uncopyable field. 369f92157deSopenharmony_ci const char* p; // A pointer field. 370f92157deSopenharmony_ci}; 371f92157deSopenharmony_ci 372f92157deSopenharmony_ci// A derived struct for testing Field(). 373f92157deSopenharmony_cistruct DerivedStruct : public AStruct { 374f92157deSopenharmony_ci char ch; 375f92157deSopenharmony_ci}; 376f92157deSopenharmony_ci 377f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(FieldTest); 378f92157deSopenharmony_ci 379f92157deSopenharmony_ci// Tests that Field(&Foo::field, ...) works when field is non-const. 380f92157deSopenharmony_ciTEST(FieldTest, WorksForNonConstField) { 381f92157deSopenharmony_ci Matcher<AStruct> m = Field(&AStruct::x, Ge(0)); 382f92157deSopenharmony_ci Matcher<AStruct> m_with_name = Field("x", &AStruct::x, Ge(0)); 383f92157deSopenharmony_ci 384f92157deSopenharmony_ci AStruct a; 385f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 386f92157deSopenharmony_ci EXPECT_TRUE(m_with_name.Matches(a)); 387f92157deSopenharmony_ci a.x = -1; 388f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 389f92157deSopenharmony_ci EXPECT_FALSE(m_with_name.Matches(a)); 390f92157deSopenharmony_ci} 391f92157deSopenharmony_ci 392f92157deSopenharmony_ci// Tests that Field(&Foo::field, ...) works when field is const. 393f92157deSopenharmony_ciTEST(FieldTest, WorksForConstField) { 394f92157deSopenharmony_ci AStruct a; 395f92157deSopenharmony_ci 396f92157deSopenharmony_ci Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0)); 397f92157deSopenharmony_ci Matcher<AStruct> m_with_name = Field("y", &AStruct::y, Ge(0.0)); 398f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 399f92157deSopenharmony_ci EXPECT_TRUE(m_with_name.Matches(a)); 400f92157deSopenharmony_ci m = Field(&AStruct::y, Le(0.0)); 401f92157deSopenharmony_ci m_with_name = Field("y", &AStruct::y, Le(0.0)); 402f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 403f92157deSopenharmony_ci EXPECT_FALSE(m_with_name.Matches(a)); 404f92157deSopenharmony_ci} 405f92157deSopenharmony_ci 406f92157deSopenharmony_ci// Tests that Field(&Foo::field, ...) works when field is not copyable. 407f92157deSopenharmony_ciTEST(FieldTest, WorksForUncopyableField) { 408f92157deSopenharmony_ci AStruct a; 409f92157deSopenharmony_ci 410f92157deSopenharmony_ci Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive)); 411f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 412f92157deSopenharmony_ci m = Field(&AStruct::z, Not(Truly(ValueIsPositive))); 413f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 414f92157deSopenharmony_ci} 415f92157deSopenharmony_ci 416f92157deSopenharmony_ci// Tests that Field(&Foo::field, ...) works when field is a pointer. 417f92157deSopenharmony_ciTEST(FieldTest, WorksForPointerField) { 418f92157deSopenharmony_ci // Matching against NULL. 419f92157deSopenharmony_ci Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(nullptr)); 420f92157deSopenharmony_ci AStruct a; 421f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 422f92157deSopenharmony_ci a.p = "hi"; 423f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 424f92157deSopenharmony_ci 425f92157deSopenharmony_ci // Matching a pointer that is not NULL. 426f92157deSopenharmony_ci m = Field(&AStruct::p, StartsWith("hi")); 427f92157deSopenharmony_ci a.p = "hill"; 428f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 429f92157deSopenharmony_ci a.p = "hole"; 430f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 431f92157deSopenharmony_ci} 432f92157deSopenharmony_ci 433f92157deSopenharmony_ci// Tests that Field() works when the object is passed by reference. 434f92157deSopenharmony_ciTEST(FieldTest, WorksForByRefArgument) { 435f92157deSopenharmony_ci Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 436f92157deSopenharmony_ci 437f92157deSopenharmony_ci AStruct a; 438f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 439f92157deSopenharmony_ci a.x = -1; 440f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 441f92157deSopenharmony_ci} 442f92157deSopenharmony_ci 443f92157deSopenharmony_ci// Tests that Field(&Foo::field, ...) works when the argument's type 444f92157deSopenharmony_ci// is a sub-type of Foo. 445f92157deSopenharmony_ciTEST(FieldTest, WorksForArgumentOfSubType) { 446f92157deSopenharmony_ci // Note that the matcher expects DerivedStruct but we say AStruct 447f92157deSopenharmony_ci // inside Field(). 448f92157deSopenharmony_ci Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0)); 449f92157deSopenharmony_ci 450f92157deSopenharmony_ci DerivedStruct d; 451f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(d)); 452f92157deSopenharmony_ci d.x = -1; 453f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(d)); 454f92157deSopenharmony_ci} 455f92157deSopenharmony_ci 456f92157deSopenharmony_ci// Tests that Field(&Foo::field, m) works when field's type and m's 457f92157deSopenharmony_ci// argument type are compatible but not the same. 458f92157deSopenharmony_ciTEST(FieldTest, WorksForCompatibleMatcherType) { 459f92157deSopenharmony_ci // The field is an int, but the inner matcher expects a signed char. 460f92157deSopenharmony_ci Matcher<const AStruct&> m = Field(&AStruct::x, Matcher<signed char>(Ge(0))); 461f92157deSopenharmony_ci 462f92157deSopenharmony_ci AStruct a; 463f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 464f92157deSopenharmony_ci a.x = -1; 465f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 466f92157deSopenharmony_ci} 467f92157deSopenharmony_ci 468f92157deSopenharmony_ci// Tests that Field() can describe itself. 469f92157deSopenharmony_ciTEST(FieldTest, CanDescribeSelf) { 470f92157deSopenharmony_ci Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 471f92157deSopenharmony_ci 472f92157deSopenharmony_ci EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 473f92157deSopenharmony_ci EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 474f92157deSopenharmony_ci} 475f92157deSopenharmony_ci 476f92157deSopenharmony_ciTEST(FieldTest, CanDescribeSelfWithFieldName) { 477f92157deSopenharmony_ci Matcher<const AStruct&> m = Field("field_name", &AStruct::x, Ge(0)); 478f92157deSopenharmony_ci 479f92157deSopenharmony_ci EXPECT_EQ("is an object whose field `field_name` is >= 0", Describe(m)); 480f92157deSopenharmony_ci EXPECT_EQ("is an object whose field `field_name` isn't >= 0", 481f92157deSopenharmony_ci DescribeNegation(m)); 482f92157deSopenharmony_ci} 483f92157deSopenharmony_ci 484f92157deSopenharmony_ci// Tests that Field() can explain the match result. 485f92157deSopenharmony_ciTEST_P(FieldTestP, CanExplainMatchResult) { 486f92157deSopenharmony_ci Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 487f92157deSopenharmony_ci 488f92157deSopenharmony_ci AStruct a; 489f92157deSopenharmony_ci a.x = 1; 490f92157deSopenharmony_ci EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a)); 491f92157deSopenharmony_ci 492f92157deSopenharmony_ci m = Field(&AStruct::x, GreaterThan(0)); 493f92157deSopenharmony_ci EXPECT_EQ( 494f92157deSopenharmony_ci "whose given field is 1" + OfType("int") + ", which is 1 more than 0", 495f92157deSopenharmony_ci Explain(m, a)); 496f92157deSopenharmony_ci} 497f92157deSopenharmony_ci 498f92157deSopenharmony_ciTEST_P(FieldTestP, CanExplainMatchResultWithFieldName) { 499f92157deSopenharmony_ci Matcher<const AStruct&> m = Field("field_name", &AStruct::x, Ge(0)); 500f92157deSopenharmony_ci 501f92157deSopenharmony_ci AStruct a; 502f92157deSopenharmony_ci a.x = 1; 503f92157deSopenharmony_ci EXPECT_EQ("whose field `field_name` is 1" + OfType("int"), Explain(m, a)); 504f92157deSopenharmony_ci 505f92157deSopenharmony_ci m = Field("field_name", &AStruct::x, GreaterThan(0)); 506f92157deSopenharmony_ci EXPECT_EQ("whose field `field_name` is 1" + OfType("int") + 507f92157deSopenharmony_ci ", which is 1 more than 0", 508f92157deSopenharmony_ci Explain(m, a)); 509f92157deSopenharmony_ci} 510f92157deSopenharmony_ci 511f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(FieldForPointerTest); 512f92157deSopenharmony_ci 513f92157deSopenharmony_ci// Tests that Field() works when the argument is a pointer to const. 514f92157deSopenharmony_ciTEST(FieldForPointerTest, WorksForPointerToConst) { 515f92157deSopenharmony_ci Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 516f92157deSopenharmony_ci 517f92157deSopenharmony_ci AStruct a; 518f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&a)); 519f92157deSopenharmony_ci a.x = -1; 520f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&a)); 521f92157deSopenharmony_ci} 522f92157deSopenharmony_ci 523f92157deSopenharmony_ci// Tests that Field() works when the argument is a pointer to non-const. 524f92157deSopenharmony_ciTEST(FieldForPointerTest, WorksForPointerToNonConst) { 525f92157deSopenharmony_ci Matcher<AStruct*> m = Field(&AStruct::x, Ge(0)); 526f92157deSopenharmony_ci 527f92157deSopenharmony_ci AStruct a; 528f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&a)); 529f92157deSopenharmony_ci a.x = -1; 530f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&a)); 531f92157deSopenharmony_ci} 532f92157deSopenharmony_ci 533f92157deSopenharmony_ci// Tests that Field() works when the argument is a reference to a const pointer. 534f92157deSopenharmony_ciTEST(FieldForPointerTest, WorksForReferenceToConstPointer) { 535f92157deSopenharmony_ci Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0)); 536f92157deSopenharmony_ci 537f92157deSopenharmony_ci AStruct a; 538f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&a)); 539f92157deSopenharmony_ci a.x = -1; 540f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&a)); 541f92157deSopenharmony_ci} 542f92157deSopenharmony_ci 543f92157deSopenharmony_ci// Tests that Field() does not match the NULL pointer. 544f92157deSopenharmony_ciTEST(FieldForPointerTest, DoesNotMatchNull) { 545f92157deSopenharmony_ci Matcher<const AStruct*> m = Field(&AStruct::x, _); 546f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 547f92157deSopenharmony_ci} 548f92157deSopenharmony_ci 549f92157deSopenharmony_ci// Tests that Field(&Foo::field, ...) works when the argument's type 550f92157deSopenharmony_ci// is a sub-type of const Foo*. 551f92157deSopenharmony_ciTEST(FieldForPointerTest, WorksForArgumentOfSubType) { 552f92157deSopenharmony_ci // Note that the matcher expects DerivedStruct but we say AStruct 553f92157deSopenharmony_ci // inside Field(). 554f92157deSopenharmony_ci Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0)); 555f92157deSopenharmony_ci 556f92157deSopenharmony_ci DerivedStruct d; 557f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&d)); 558f92157deSopenharmony_ci d.x = -1; 559f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&d)); 560f92157deSopenharmony_ci} 561f92157deSopenharmony_ci 562f92157deSopenharmony_ci// Tests that Field() can describe itself when used to match a pointer. 563f92157deSopenharmony_ciTEST(FieldForPointerTest, CanDescribeSelf) { 564f92157deSopenharmony_ci Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 565f92157deSopenharmony_ci 566f92157deSopenharmony_ci EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 567f92157deSopenharmony_ci EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 568f92157deSopenharmony_ci} 569f92157deSopenharmony_ci 570f92157deSopenharmony_ciTEST(FieldForPointerTest, CanDescribeSelfWithFieldName) { 571f92157deSopenharmony_ci Matcher<const AStruct*> m = Field("field_name", &AStruct::x, Ge(0)); 572f92157deSopenharmony_ci 573f92157deSopenharmony_ci EXPECT_EQ("is an object whose field `field_name` is >= 0", Describe(m)); 574f92157deSopenharmony_ci EXPECT_EQ("is an object whose field `field_name` isn't >= 0", 575f92157deSopenharmony_ci DescribeNegation(m)); 576f92157deSopenharmony_ci} 577f92157deSopenharmony_ci 578f92157deSopenharmony_ci// Tests that Field() can explain the result of matching a pointer. 579f92157deSopenharmony_ciTEST_P(FieldForPointerTestP, CanExplainMatchResult) { 580f92157deSopenharmony_ci Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 581f92157deSopenharmony_ci 582f92157deSopenharmony_ci AStruct a; 583f92157deSopenharmony_ci a.x = 1; 584f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(nullptr))); 585f92157deSopenharmony_ci EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"), 586f92157deSopenharmony_ci Explain(m, &a)); 587f92157deSopenharmony_ci 588f92157deSopenharmony_ci m = Field(&AStruct::x, GreaterThan(0)); 589f92157deSopenharmony_ci EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") + 590f92157deSopenharmony_ci ", which is 1 more than 0", 591f92157deSopenharmony_ci Explain(m, &a)); 592f92157deSopenharmony_ci} 593f92157deSopenharmony_ci 594f92157deSopenharmony_ciTEST_P(FieldForPointerTestP, CanExplainMatchResultWithFieldName) { 595f92157deSopenharmony_ci Matcher<const AStruct*> m = Field("field_name", &AStruct::x, Ge(0)); 596f92157deSopenharmony_ci 597f92157deSopenharmony_ci AStruct a; 598f92157deSopenharmony_ci a.x = 1; 599f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(nullptr))); 600f92157deSopenharmony_ci EXPECT_EQ( 601f92157deSopenharmony_ci "which points to an object whose field `field_name` is 1" + OfType("int"), 602f92157deSopenharmony_ci Explain(m, &a)); 603f92157deSopenharmony_ci 604f92157deSopenharmony_ci m = Field("field_name", &AStruct::x, GreaterThan(0)); 605f92157deSopenharmony_ci EXPECT_EQ("which points to an object whose field `field_name` is 1" + 606f92157deSopenharmony_ci OfType("int") + ", which is 1 more than 0", 607f92157deSopenharmony_ci Explain(m, &a)); 608f92157deSopenharmony_ci} 609f92157deSopenharmony_ci 610f92157deSopenharmony_ci// A user-defined class for testing Property(). 611f92157deSopenharmony_ciclass AClass { 612f92157deSopenharmony_ci public: 613f92157deSopenharmony_ci AClass() : n_(0) {} 614f92157deSopenharmony_ci 615f92157deSopenharmony_ci // A getter that returns a non-reference. 616f92157deSopenharmony_ci int n() const { return n_; } 617f92157deSopenharmony_ci 618f92157deSopenharmony_ci void set_n(int new_n) { n_ = new_n; } 619f92157deSopenharmony_ci 620f92157deSopenharmony_ci // A getter that returns a reference to const. 621f92157deSopenharmony_ci const std::string& s() const { return s_; } 622f92157deSopenharmony_ci 623f92157deSopenharmony_ci const std::string& s_ref() const& { return s_; } 624f92157deSopenharmony_ci 625f92157deSopenharmony_ci void set_s(const std::string& new_s) { s_ = new_s; } 626f92157deSopenharmony_ci 627f92157deSopenharmony_ci // A getter that returns a reference to non-const. 628f92157deSopenharmony_ci double& x() const { return x_; } 629f92157deSopenharmony_ci 630f92157deSopenharmony_ci private: 631f92157deSopenharmony_ci int n_; 632f92157deSopenharmony_ci std::string s_; 633f92157deSopenharmony_ci 634f92157deSopenharmony_ci static double x_; 635f92157deSopenharmony_ci}; 636f92157deSopenharmony_ci 637f92157deSopenharmony_cidouble AClass::x_ = 0.0; 638f92157deSopenharmony_ci 639f92157deSopenharmony_ci// A derived class for testing Property(). 640f92157deSopenharmony_ciclass DerivedClass : public AClass { 641f92157deSopenharmony_ci public: 642f92157deSopenharmony_ci int k() const { return k_; } 643f92157deSopenharmony_ci 644f92157deSopenharmony_ci private: 645f92157deSopenharmony_ci int k_; 646f92157deSopenharmony_ci}; 647f92157deSopenharmony_ci 648f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(PropertyTest); 649f92157deSopenharmony_ci 650f92157deSopenharmony_ci// Tests that Property(&Foo::property, ...) works when property() 651f92157deSopenharmony_ci// returns a non-reference. 652f92157deSopenharmony_ciTEST(PropertyTest, WorksForNonReferenceProperty) { 653f92157deSopenharmony_ci Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 654f92157deSopenharmony_ci Matcher<const AClass&> m_with_name = Property("n", &AClass::n, Ge(0)); 655f92157deSopenharmony_ci 656f92157deSopenharmony_ci AClass a; 657f92157deSopenharmony_ci a.set_n(1); 658f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 659f92157deSopenharmony_ci EXPECT_TRUE(m_with_name.Matches(a)); 660f92157deSopenharmony_ci 661f92157deSopenharmony_ci a.set_n(-1); 662f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 663f92157deSopenharmony_ci EXPECT_FALSE(m_with_name.Matches(a)); 664f92157deSopenharmony_ci} 665f92157deSopenharmony_ci 666f92157deSopenharmony_ci// Tests that Property(&Foo::property, ...) works when property() 667f92157deSopenharmony_ci// returns a reference to const. 668f92157deSopenharmony_ciTEST(PropertyTest, WorksForReferenceToConstProperty) { 669f92157deSopenharmony_ci Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi")); 670f92157deSopenharmony_ci Matcher<const AClass&> m_with_name = 671f92157deSopenharmony_ci Property("s", &AClass::s, StartsWith("hi")); 672f92157deSopenharmony_ci 673f92157deSopenharmony_ci AClass a; 674f92157deSopenharmony_ci a.set_s("hill"); 675f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 676f92157deSopenharmony_ci EXPECT_TRUE(m_with_name.Matches(a)); 677f92157deSopenharmony_ci 678f92157deSopenharmony_ci a.set_s("hole"); 679f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 680f92157deSopenharmony_ci EXPECT_FALSE(m_with_name.Matches(a)); 681f92157deSopenharmony_ci} 682f92157deSopenharmony_ci 683f92157deSopenharmony_ci// Tests that Property(&Foo::property, ...) works when property() is 684f92157deSopenharmony_ci// ref-qualified. 685f92157deSopenharmony_ciTEST(PropertyTest, WorksForRefQualifiedProperty) { 686f92157deSopenharmony_ci Matcher<const AClass&> m = Property(&AClass::s_ref, StartsWith("hi")); 687f92157deSopenharmony_ci Matcher<const AClass&> m_with_name = 688f92157deSopenharmony_ci Property("s", &AClass::s_ref, StartsWith("hi")); 689f92157deSopenharmony_ci 690f92157deSopenharmony_ci AClass a; 691f92157deSopenharmony_ci a.set_s("hill"); 692f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 693f92157deSopenharmony_ci EXPECT_TRUE(m_with_name.Matches(a)); 694f92157deSopenharmony_ci 695f92157deSopenharmony_ci a.set_s("hole"); 696f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 697f92157deSopenharmony_ci EXPECT_FALSE(m_with_name.Matches(a)); 698f92157deSopenharmony_ci} 699f92157deSopenharmony_ci 700f92157deSopenharmony_ci// Tests that Property(&Foo::property, ...) works when property() 701f92157deSopenharmony_ci// returns a reference to non-const. 702f92157deSopenharmony_ciTEST(PropertyTest, WorksForReferenceToNonConstProperty) { 703f92157deSopenharmony_ci double x = 0.0; 704f92157deSopenharmony_ci AClass a; 705f92157deSopenharmony_ci 706f92157deSopenharmony_ci Matcher<const AClass&> m = Property(&AClass::x, Ref(x)); 707f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 708f92157deSopenharmony_ci 709f92157deSopenharmony_ci m = Property(&AClass::x, Not(Ref(x))); 710f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 711f92157deSopenharmony_ci} 712f92157deSopenharmony_ci 713f92157deSopenharmony_ci// Tests that Property(&Foo::property, ...) works when the argument is 714f92157deSopenharmony_ci// passed by value. 715f92157deSopenharmony_ciTEST(PropertyTest, WorksForByValueArgument) { 716f92157deSopenharmony_ci Matcher<AClass> m = Property(&AClass::s, StartsWith("hi")); 717f92157deSopenharmony_ci 718f92157deSopenharmony_ci AClass a; 719f92157deSopenharmony_ci a.set_s("hill"); 720f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 721f92157deSopenharmony_ci 722f92157deSopenharmony_ci a.set_s("hole"); 723f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 724f92157deSopenharmony_ci} 725f92157deSopenharmony_ci 726f92157deSopenharmony_ci// Tests that Property(&Foo::property, ...) works when the argument's 727f92157deSopenharmony_ci// type is a sub-type of Foo. 728f92157deSopenharmony_ciTEST(PropertyTest, WorksForArgumentOfSubType) { 729f92157deSopenharmony_ci // The matcher expects a DerivedClass, but inside the Property() we 730f92157deSopenharmony_ci // say AClass. 731f92157deSopenharmony_ci Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0)); 732f92157deSopenharmony_ci 733f92157deSopenharmony_ci DerivedClass d; 734f92157deSopenharmony_ci d.set_n(1); 735f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(d)); 736f92157deSopenharmony_ci 737f92157deSopenharmony_ci d.set_n(-1); 738f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(d)); 739f92157deSopenharmony_ci} 740f92157deSopenharmony_ci 741f92157deSopenharmony_ci// Tests that Property(&Foo::property, m) works when property()'s type 742f92157deSopenharmony_ci// and m's argument type are compatible but different. 743f92157deSopenharmony_ciTEST(PropertyTest, WorksForCompatibleMatcherType) { 744f92157deSopenharmony_ci // n() returns an int but the inner matcher expects a signed char. 745f92157deSopenharmony_ci Matcher<const AClass&> m = Property(&AClass::n, Matcher<signed char>(Ge(0))); 746f92157deSopenharmony_ci 747f92157deSopenharmony_ci Matcher<const AClass&> m_with_name = 748f92157deSopenharmony_ci Property("n", &AClass::n, Matcher<signed char>(Ge(0))); 749f92157deSopenharmony_ci 750f92157deSopenharmony_ci AClass a; 751f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(a)); 752f92157deSopenharmony_ci EXPECT_TRUE(m_with_name.Matches(a)); 753f92157deSopenharmony_ci a.set_n(-1); 754f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(a)); 755f92157deSopenharmony_ci EXPECT_FALSE(m_with_name.Matches(a)); 756f92157deSopenharmony_ci} 757f92157deSopenharmony_ci 758f92157deSopenharmony_ci// Tests that Property() can describe itself. 759f92157deSopenharmony_ciTEST(PropertyTest, CanDescribeSelf) { 760f92157deSopenharmony_ci Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 761f92157deSopenharmony_ci 762f92157deSopenharmony_ci EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 763f92157deSopenharmony_ci EXPECT_EQ("is an object whose given property isn't >= 0", 764f92157deSopenharmony_ci DescribeNegation(m)); 765f92157deSopenharmony_ci} 766f92157deSopenharmony_ci 767f92157deSopenharmony_ciTEST(PropertyTest, CanDescribeSelfWithPropertyName) { 768f92157deSopenharmony_ci Matcher<const AClass&> m = Property("fancy_name", &AClass::n, Ge(0)); 769f92157deSopenharmony_ci 770f92157deSopenharmony_ci EXPECT_EQ("is an object whose property `fancy_name` is >= 0", Describe(m)); 771f92157deSopenharmony_ci EXPECT_EQ("is an object whose property `fancy_name` isn't >= 0", 772f92157deSopenharmony_ci DescribeNegation(m)); 773f92157deSopenharmony_ci} 774f92157deSopenharmony_ci 775f92157deSopenharmony_ci// Tests that Property() can explain the match result. 776f92157deSopenharmony_ciTEST_P(PropertyTestP, CanExplainMatchResult) { 777f92157deSopenharmony_ci Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 778f92157deSopenharmony_ci 779f92157deSopenharmony_ci AClass a; 780f92157deSopenharmony_ci a.set_n(1); 781f92157deSopenharmony_ci EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a)); 782f92157deSopenharmony_ci 783f92157deSopenharmony_ci m = Property(&AClass::n, GreaterThan(0)); 784f92157deSopenharmony_ci EXPECT_EQ( 785f92157deSopenharmony_ci "whose given property is 1" + OfType("int") + ", which is 1 more than 0", 786f92157deSopenharmony_ci Explain(m, a)); 787f92157deSopenharmony_ci} 788f92157deSopenharmony_ci 789f92157deSopenharmony_ciTEST_P(PropertyTestP, CanExplainMatchResultWithPropertyName) { 790f92157deSopenharmony_ci Matcher<const AClass&> m = Property("fancy_name", &AClass::n, Ge(0)); 791f92157deSopenharmony_ci 792f92157deSopenharmony_ci AClass a; 793f92157deSopenharmony_ci a.set_n(1); 794f92157deSopenharmony_ci EXPECT_EQ("whose property `fancy_name` is 1" + OfType("int"), Explain(m, a)); 795f92157deSopenharmony_ci 796f92157deSopenharmony_ci m = Property("fancy_name", &AClass::n, GreaterThan(0)); 797f92157deSopenharmony_ci EXPECT_EQ("whose property `fancy_name` is 1" + OfType("int") + 798f92157deSopenharmony_ci ", which is 1 more than 0", 799f92157deSopenharmony_ci Explain(m, a)); 800f92157deSopenharmony_ci} 801f92157deSopenharmony_ci 802f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(PropertyForPointerTest); 803f92157deSopenharmony_ci 804f92157deSopenharmony_ci// Tests that Property() works when the argument is a pointer to const. 805f92157deSopenharmony_ciTEST(PropertyForPointerTest, WorksForPointerToConst) { 806f92157deSopenharmony_ci Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 807f92157deSopenharmony_ci 808f92157deSopenharmony_ci AClass a; 809f92157deSopenharmony_ci a.set_n(1); 810f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&a)); 811f92157deSopenharmony_ci 812f92157deSopenharmony_ci a.set_n(-1); 813f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&a)); 814f92157deSopenharmony_ci} 815f92157deSopenharmony_ci 816f92157deSopenharmony_ci// Tests that Property() works when the argument is a pointer to non-const. 817f92157deSopenharmony_ciTEST(PropertyForPointerTest, WorksForPointerToNonConst) { 818f92157deSopenharmony_ci Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi")); 819f92157deSopenharmony_ci 820f92157deSopenharmony_ci AClass a; 821f92157deSopenharmony_ci a.set_s("hill"); 822f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&a)); 823f92157deSopenharmony_ci 824f92157deSopenharmony_ci a.set_s("hole"); 825f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&a)); 826f92157deSopenharmony_ci} 827f92157deSopenharmony_ci 828f92157deSopenharmony_ci// Tests that Property() works when the argument is a reference to a 829f92157deSopenharmony_ci// const pointer. 830f92157deSopenharmony_ciTEST(PropertyForPointerTest, WorksForReferenceToConstPointer) { 831f92157deSopenharmony_ci Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi")); 832f92157deSopenharmony_ci 833f92157deSopenharmony_ci AClass a; 834f92157deSopenharmony_ci a.set_s("hill"); 835f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&a)); 836f92157deSopenharmony_ci 837f92157deSopenharmony_ci a.set_s("hole"); 838f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&a)); 839f92157deSopenharmony_ci} 840f92157deSopenharmony_ci 841f92157deSopenharmony_ci// Tests that Property() does not match the NULL pointer. 842f92157deSopenharmony_ciTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) { 843f92157deSopenharmony_ci Matcher<const AClass*> m = Property(&AClass::x, _); 844f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(nullptr)); 845f92157deSopenharmony_ci} 846f92157deSopenharmony_ci 847f92157deSopenharmony_ci// Tests that Property(&Foo::property, ...) works when the argument's 848f92157deSopenharmony_ci// type is a sub-type of const Foo*. 849f92157deSopenharmony_ciTEST(PropertyForPointerTest, WorksForArgumentOfSubType) { 850f92157deSopenharmony_ci // The matcher expects a DerivedClass, but inside the Property() we 851f92157deSopenharmony_ci // say AClass. 852f92157deSopenharmony_ci Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0)); 853f92157deSopenharmony_ci 854f92157deSopenharmony_ci DerivedClass d; 855f92157deSopenharmony_ci d.set_n(1); 856f92157deSopenharmony_ci EXPECT_TRUE(m.Matches(&d)); 857f92157deSopenharmony_ci 858f92157deSopenharmony_ci d.set_n(-1); 859f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(&d)); 860f92157deSopenharmony_ci} 861f92157deSopenharmony_ci 862f92157deSopenharmony_ci// Tests that Property() can describe itself when used to match a pointer. 863f92157deSopenharmony_ciTEST(PropertyForPointerTest, CanDescribeSelf) { 864f92157deSopenharmony_ci Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 865f92157deSopenharmony_ci 866f92157deSopenharmony_ci EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 867f92157deSopenharmony_ci EXPECT_EQ("is an object whose given property isn't >= 0", 868f92157deSopenharmony_ci DescribeNegation(m)); 869f92157deSopenharmony_ci} 870f92157deSopenharmony_ci 871f92157deSopenharmony_ciTEST(PropertyForPointerTest, CanDescribeSelfWithPropertyDescription) { 872f92157deSopenharmony_ci Matcher<const AClass*> m = Property("fancy_name", &AClass::n, Ge(0)); 873f92157deSopenharmony_ci 874f92157deSopenharmony_ci EXPECT_EQ("is an object whose property `fancy_name` is >= 0", Describe(m)); 875f92157deSopenharmony_ci EXPECT_EQ("is an object whose property `fancy_name` isn't >= 0", 876f92157deSopenharmony_ci DescribeNegation(m)); 877f92157deSopenharmony_ci} 878f92157deSopenharmony_ci 879f92157deSopenharmony_ci// Tests that Property() can explain the result of matching a pointer. 880f92157deSopenharmony_ciTEST_P(PropertyForPointerTestP, CanExplainMatchResult) { 881f92157deSopenharmony_ci Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 882f92157deSopenharmony_ci 883f92157deSopenharmony_ci AClass a; 884f92157deSopenharmony_ci a.set_n(1); 885f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, static_cast<const AClass*>(nullptr))); 886f92157deSopenharmony_ci EXPECT_EQ( 887f92157deSopenharmony_ci "which points to an object whose given property is 1" + OfType("int"), 888f92157deSopenharmony_ci Explain(m, &a)); 889f92157deSopenharmony_ci 890f92157deSopenharmony_ci m = Property(&AClass::n, GreaterThan(0)); 891f92157deSopenharmony_ci EXPECT_EQ("which points to an object whose given property is 1" + 892f92157deSopenharmony_ci OfType("int") + ", which is 1 more than 0", 893f92157deSopenharmony_ci Explain(m, &a)); 894f92157deSopenharmony_ci} 895f92157deSopenharmony_ci 896f92157deSopenharmony_ciTEST_P(PropertyForPointerTestP, CanExplainMatchResultWithPropertyName) { 897f92157deSopenharmony_ci Matcher<const AClass*> m = Property("fancy_name", &AClass::n, Ge(0)); 898f92157deSopenharmony_ci 899f92157deSopenharmony_ci AClass a; 900f92157deSopenharmony_ci a.set_n(1); 901f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, static_cast<const AClass*>(nullptr))); 902f92157deSopenharmony_ci EXPECT_EQ("which points to an object whose property `fancy_name` is 1" + 903f92157deSopenharmony_ci OfType("int"), 904f92157deSopenharmony_ci Explain(m, &a)); 905f92157deSopenharmony_ci 906f92157deSopenharmony_ci m = Property("fancy_name", &AClass::n, GreaterThan(0)); 907f92157deSopenharmony_ci EXPECT_EQ("which points to an object whose property `fancy_name` is 1" + 908f92157deSopenharmony_ci OfType("int") + ", which is 1 more than 0", 909f92157deSopenharmony_ci Explain(m, &a)); 910f92157deSopenharmony_ci} 911f92157deSopenharmony_ci 912f92157deSopenharmony_ci// Tests ResultOf. 913f92157deSopenharmony_ci 914f92157deSopenharmony_ci// Tests that ResultOf(f, ...) compiles and works as expected when f is a 915f92157deSopenharmony_ci// function pointer. 916f92157deSopenharmony_cistd::string IntToStringFunction(int input) { 917f92157deSopenharmony_ci return input == 1 ? "foo" : "bar"; 918f92157deSopenharmony_ci} 919f92157deSopenharmony_ci 920f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(ResultOfTest); 921f92157deSopenharmony_ci 922f92157deSopenharmony_ciTEST(ResultOfTest, WorksForFunctionPointers) { 923f92157deSopenharmony_ci Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(std::string("foo"))); 924f92157deSopenharmony_ci 925f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(1)); 926f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(2)); 927f92157deSopenharmony_ci} 928f92157deSopenharmony_ci 929f92157deSopenharmony_ci// Tests that ResultOf() can describe itself. 930f92157deSopenharmony_ciTEST(ResultOfTest, CanDescribeItself) { 931f92157deSopenharmony_ci Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo")); 932f92157deSopenharmony_ci 933f92157deSopenharmony_ci EXPECT_EQ( 934f92157deSopenharmony_ci "is mapped by the given callable to a value that " 935f92157deSopenharmony_ci "is equal to \"foo\"", 936f92157deSopenharmony_ci Describe(matcher)); 937f92157deSopenharmony_ci EXPECT_EQ( 938f92157deSopenharmony_ci "is mapped by the given callable to a value that " 939f92157deSopenharmony_ci "isn't equal to \"foo\"", 940f92157deSopenharmony_ci DescribeNegation(matcher)); 941f92157deSopenharmony_ci} 942f92157deSopenharmony_ci 943f92157deSopenharmony_ci// Tests that ResultOf() can describe itself when provided a result description. 944f92157deSopenharmony_ciTEST(ResultOfTest, CanDescribeItselfWithResultDescription) { 945f92157deSopenharmony_ci Matcher<int> matcher = 946f92157deSopenharmony_ci ResultOf("string conversion", &IntToStringFunction, StrEq("foo")); 947f92157deSopenharmony_ci 948f92157deSopenharmony_ci EXPECT_EQ("whose string conversion is equal to \"foo\"", Describe(matcher)); 949f92157deSopenharmony_ci EXPECT_EQ("whose string conversion isn't equal to \"foo\"", 950f92157deSopenharmony_ci DescribeNegation(matcher)); 951f92157deSopenharmony_ci} 952f92157deSopenharmony_ci 953f92157deSopenharmony_ci// Tests that ResultOf() can explain the match result. 954f92157deSopenharmony_ciint IntFunction(int input) { return input == 42 ? 80 : 90; } 955f92157deSopenharmony_ci 956f92157deSopenharmony_ciTEST_P(ResultOfTestP, CanExplainMatchResult) { 957f92157deSopenharmony_ci Matcher<int> matcher = ResultOf(&IntFunction, Ge(85)); 958f92157deSopenharmony_ci EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"), 959f92157deSopenharmony_ci Explain(matcher, 36)); 960f92157deSopenharmony_ci 961f92157deSopenharmony_ci matcher = ResultOf(&IntFunction, GreaterThan(85)); 962f92157deSopenharmony_ci EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") + 963f92157deSopenharmony_ci ", which is 5 more than 85", 964f92157deSopenharmony_ci Explain(matcher, 36)); 965f92157deSopenharmony_ci} 966f92157deSopenharmony_ci 967f92157deSopenharmony_ciTEST_P(ResultOfTestP, CanExplainMatchResultWithResultDescription) { 968f92157deSopenharmony_ci Matcher<int> matcher = ResultOf("magic int conversion", &IntFunction, Ge(85)); 969f92157deSopenharmony_ci EXPECT_EQ("whose magic int conversion is 90" + OfType("int"), 970f92157deSopenharmony_ci Explain(matcher, 36)); 971f92157deSopenharmony_ci 972f92157deSopenharmony_ci matcher = ResultOf("magic int conversion", &IntFunction, GreaterThan(85)); 973f92157deSopenharmony_ci EXPECT_EQ("whose magic int conversion is 90" + OfType("int") + 974f92157deSopenharmony_ci ", which is 5 more than 85", 975f92157deSopenharmony_ci Explain(matcher, 36)); 976f92157deSopenharmony_ci} 977f92157deSopenharmony_ci 978f92157deSopenharmony_ci// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 979f92157deSopenharmony_ci// returns a non-reference. 980f92157deSopenharmony_ciTEST(ResultOfTest, WorksForNonReferenceResults) { 981f92157deSopenharmony_ci Matcher<int> matcher = ResultOf(&IntFunction, Eq(80)); 982f92157deSopenharmony_ci 983f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(42)); 984f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(36)); 985f92157deSopenharmony_ci} 986f92157deSopenharmony_ci 987f92157deSopenharmony_ci// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 988f92157deSopenharmony_ci// returns a reference to non-const. 989f92157deSopenharmony_cidouble& DoubleFunction(double& input) { return input; } // NOLINT 990f92157deSopenharmony_ci 991f92157deSopenharmony_ciUncopyable& RefUncopyableFunction(Uncopyable& obj) { // NOLINT 992f92157deSopenharmony_ci return obj; 993f92157deSopenharmony_ci} 994f92157deSopenharmony_ci 995f92157deSopenharmony_ciTEST(ResultOfTest, WorksForReferenceToNonConstResults) { 996f92157deSopenharmony_ci double x = 3.14; 997f92157deSopenharmony_ci double x2 = x; 998f92157deSopenharmony_ci Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x)); 999f92157deSopenharmony_ci 1000f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(x)); 1001f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(x2)); 1002f92157deSopenharmony_ci 1003f92157deSopenharmony_ci // Test that ResultOf works with uncopyable objects 1004f92157deSopenharmony_ci Uncopyable obj(0); 1005f92157deSopenharmony_ci Uncopyable obj2(0); 1006f92157deSopenharmony_ci Matcher<Uncopyable&> matcher2 = ResultOf(&RefUncopyableFunction, Ref(obj)); 1007f92157deSopenharmony_ci 1008f92157deSopenharmony_ci EXPECT_TRUE(matcher2.Matches(obj)); 1009f92157deSopenharmony_ci EXPECT_FALSE(matcher2.Matches(obj2)); 1010f92157deSopenharmony_ci} 1011f92157deSopenharmony_ci 1012f92157deSopenharmony_ci// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 1013f92157deSopenharmony_ci// returns a reference to const. 1014f92157deSopenharmony_ciconst std::string& StringFunction(const std::string& input) { return input; } 1015f92157deSopenharmony_ci 1016f92157deSopenharmony_ciTEST(ResultOfTest, WorksForReferenceToConstResults) { 1017f92157deSopenharmony_ci std::string s = "foo"; 1018f92157deSopenharmony_ci std::string s2 = s; 1019f92157deSopenharmony_ci Matcher<const std::string&> matcher = ResultOf(&StringFunction, Ref(s)); 1020f92157deSopenharmony_ci 1021f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(s)); 1022f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(s2)); 1023f92157deSopenharmony_ci} 1024f92157deSopenharmony_ci 1025f92157deSopenharmony_ci// Tests that ResultOf(f, m) works when f(x) and m's 1026f92157deSopenharmony_ci// argument types are compatible but different. 1027f92157deSopenharmony_ciTEST(ResultOfTest, WorksForCompatibleMatcherTypes) { 1028f92157deSopenharmony_ci // IntFunction() returns int but the inner matcher expects a signed char. 1029f92157deSopenharmony_ci Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85))); 1030f92157deSopenharmony_ci 1031f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(36)); 1032f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(42)); 1033f92157deSopenharmony_ci} 1034f92157deSopenharmony_ci 1035f92157deSopenharmony_ci// Tests that the program aborts when ResultOf is passed 1036f92157deSopenharmony_ci// a NULL function pointer. 1037f92157deSopenharmony_ciTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) { 1038f92157deSopenharmony_ci EXPECT_DEATH_IF_SUPPORTED( 1039f92157deSopenharmony_ci ResultOf(static_cast<std::string (*)(int dummy)>(nullptr), 1040f92157deSopenharmony_ci Eq(std::string("foo"))), 1041f92157deSopenharmony_ci "NULL function pointer is passed into ResultOf\\(\\)\\."); 1042f92157deSopenharmony_ci} 1043f92157deSopenharmony_ci 1044f92157deSopenharmony_ci// Tests that ResultOf(f, ...) compiles and works as expected when f is a 1045f92157deSopenharmony_ci// function reference. 1046f92157deSopenharmony_ciTEST(ResultOfTest, WorksForFunctionReferences) { 1047f92157deSopenharmony_ci Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo")); 1048f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(1)); 1049f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(2)); 1050f92157deSopenharmony_ci} 1051f92157deSopenharmony_ci 1052f92157deSopenharmony_ci// Tests that ResultOf(f, ...) compiles and works as expected when f is a 1053f92157deSopenharmony_ci// function object. 1054f92157deSopenharmony_cistruct Functor { 1055f92157deSopenharmony_ci std::string operator()(int input) const { return IntToStringFunction(input); } 1056f92157deSopenharmony_ci}; 1057f92157deSopenharmony_ci 1058f92157deSopenharmony_ciTEST(ResultOfTest, WorksForFunctors) { 1059f92157deSopenharmony_ci Matcher<int> matcher = ResultOf(Functor(), Eq(std::string("foo"))); 1060f92157deSopenharmony_ci 1061f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(1)); 1062f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(2)); 1063f92157deSopenharmony_ci} 1064f92157deSopenharmony_ci 1065f92157deSopenharmony_ci// Tests that ResultOf(f, ...) compiles and works as expected when f is a 1066f92157deSopenharmony_ci// functor with more than one operator() defined. ResultOf() must work 1067f92157deSopenharmony_ci// for each defined operator(). 1068f92157deSopenharmony_cistruct PolymorphicFunctor { 1069f92157deSopenharmony_ci typedef int result_type; 1070f92157deSopenharmony_ci int operator()(int n) { return n; } 1071f92157deSopenharmony_ci int operator()(const char* s) { return static_cast<int>(strlen(s)); } 1072f92157deSopenharmony_ci std::string operator()(int* p) { return p ? "good ptr" : "null"; } 1073f92157deSopenharmony_ci}; 1074f92157deSopenharmony_ci 1075f92157deSopenharmony_ciTEST(ResultOfTest, WorksForPolymorphicFunctors) { 1076f92157deSopenharmony_ci Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5)); 1077f92157deSopenharmony_ci 1078f92157deSopenharmony_ci EXPECT_TRUE(matcher_int.Matches(10)); 1079f92157deSopenharmony_ci EXPECT_FALSE(matcher_int.Matches(2)); 1080f92157deSopenharmony_ci 1081f92157deSopenharmony_ci Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5)); 1082f92157deSopenharmony_ci 1083f92157deSopenharmony_ci EXPECT_TRUE(matcher_string.Matches("long string")); 1084f92157deSopenharmony_ci EXPECT_FALSE(matcher_string.Matches("shrt")); 1085f92157deSopenharmony_ci} 1086f92157deSopenharmony_ci 1087f92157deSopenharmony_ciTEST(ResultOfTest, WorksForPolymorphicFunctorsIgnoringResultType) { 1088f92157deSopenharmony_ci Matcher<int*> matcher = ResultOf(PolymorphicFunctor(), "good ptr"); 1089f92157deSopenharmony_ci 1090f92157deSopenharmony_ci int n = 0; 1091f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(&n)); 1092f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(nullptr)); 1093f92157deSopenharmony_ci} 1094f92157deSopenharmony_ci 1095f92157deSopenharmony_ciTEST(ResultOfTest, WorksForLambdas) { 1096f92157deSopenharmony_ci Matcher<int> matcher = ResultOf( 1097f92157deSopenharmony_ci [](int str_len) { 1098f92157deSopenharmony_ci return std::string(static_cast<size_t>(str_len), 'x'); 1099f92157deSopenharmony_ci }, 1100f92157deSopenharmony_ci "xxx"); 1101f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(3)); 1102f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(1)); 1103f92157deSopenharmony_ci} 1104f92157deSopenharmony_ci 1105f92157deSopenharmony_ciTEST(ResultOfTest, WorksForNonCopyableArguments) { 1106f92157deSopenharmony_ci Matcher<std::unique_ptr<int>> matcher = ResultOf( 1107f92157deSopenharmony_ci [](const std::unique_ptr<int>& str_len) { 1108f92157deSopenharmony_ci return std::string(static_cast<size_t>(*str_len), 'x'); 1109f92157deSopenharmony_ci }, 1110f92157deSopenharmony_ci "xxx"); 1111f92157deSopenharmony_ci EXPECT_TRUE(matcher.Matches(std::unique_ptr<int>(new int(3)))); 1112f92157deSopenharmony_ci EXPECT_FALSE(matcher.Matches(std::unique_ptr<int>(new int(1)))); 1113f92157deSopenharmony_ci} 1114f92157deSopenharmony_ci 1115f92157deSopenharmony_ciconst int* ReferencingFunction(const int& n) { return &n; } 1116f92157deSopenharmony_ci 1117f92157deSopenharmony_cistruct ReferencingFunctor { 1118f92157deSopenharmony_ci typedef const int* result_type; 1119f92157deSopenharmony_ci result_type operator()(const int& n) { return &n; } 1120f92157deSopenharmony_ci}; 1121f92157deSopenharmony_ci 1122f92157deSopenharmony_ciTEST(ResultOfTest, WorksForReferencingCallables) { 1123f92157deSopenharmony_ci const int n = 1; 1124f92157deSopenharmony_ci const int n2 = 1; 1125f92157deSopenharmony_ci Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n)); 1126f92157deSopenharmony_ci EXPECT_TRUE(matcher2.Matches(n)); 1127f92157deSopenharmony_ci EXPECT_FALSE(matcher2.Matches(n2)); 1128f92157deSopenharmony_ci 1129f92157deSopenharmony_ci Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n)); 1130f92157deSopenharmony_ci EXPECT_TRUE(matcher3.Matches(n)); 1131f92157deSopenharmony_ci EXPECT_FALSE(matcher3.Matches(n2)); 1132f92157deSopenharmony_ci} 1133f92157deSopenharmony_ci 1134f92157deSopenharmony_ciTEST(SizeIsTest, ImplementsSizeIs) { 1135f92157deSopenharmony_ci vector<int> container; 1136f92157deSopenharmony_ci EXPECT_THAT(container, SizeIs(0)); 1137f92157deSopenharmony_ci EXPECT_THAT(container, Not(SizeIs(1))); 1138f92157deSopenharmony_ci container.push_back(0); 1139f92157deSopenharmony_ci EXPECT_THAT(container, Not(SizeIs(0))); 1140f92157deSopenharmony_ci EXPECT_THAT(container, SizeIs(1)); 1141f92157deSopenharmony_ci container.push_back(0); 1142f92157deSopenharmony_ci EXPECT_THAT(container, Not(SizeIs(0))); 1143f92157deSopenharmony_ci EXPECT_THAT(container, SizeIs(2)); 1144f92157deSopenharmony_ci} 1145f92157deSopenharmony_ci 1146f92157deSopenharmony_ciTEST(SizeIsTest, WorksWithMap) { 1147f92157deSopenharmony_ci map<std::string, int> container; 1148f92157deSopenharmony_ci EXPECT_THAT(container, SizeIs(0)); 1149f92157deSopenharmony_ci EXPECT_THAT(container, Not(SizeIs(1))); 1150f92157deSopenharmony_ci container.insert(make_pair("foo", 1)); 1151f92157deSopenharmony_ci EXPECT_THAT(container, Not(SizeIs(0))); 1152f92157deSopenharmony_ci EXPECT_THAT(container, SizeIs(1)); 1153f92157deSopenharmony_ci container.insert(make_pair("bar", 2)); 1154f92157deSopenharmony_ci EXPECT_THAT(container, Not(SizeIs(0))); 1155f92157deSopenharmony_ci EXPECT_THAT(container, SizeIs(2)); 1156f92157deSopenharmony_ci} 1157f92157deSopenharmony_ci 1158f92157deSopenharmony_ciTEST(SizeIsTest, WorksWithReferences) { 1159f92157deSopenharmony_ci vector<int> container; 1160f92157deSopenharmony_ci Matcher<const vector<int>&> m = SizeIs(1); 1161f92157deSopenharmony_ci EXPECT_THAT(container, Not(m)); 1162f92157deSopenharmony_ci container.push_back(0); 1163f92157deSopenharmony_ci EXPECT_THAT(container, m); 1164f92157deSopenharmony_ci} 1165f92157deSopenharmony_ci 1166f92157deSopenharmony_ciTEST(SizeIsTest, WorksWithMoveOnly) { 1167f92157deSopenharmony_ci ContainerHelper helper; 1168f92157deSopenharmony_ci EXPECT_CALL(helper, Call(SizeIs(3))); 1169f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1, 2, 3})); 1170f92157deSopenharmony_ci} 1171f92157deSopenharmony_ci 1172f92157deSopenharmony_ci// SizeIs should work for any type that provides a size() member function. 1173f92157deSopenharmony_ci// For example, a size_type member type should not need to be provided. 1174f92157deSopenharmony_cistruct MinimalistCustomType { 1175f92157deSopenharmony_ci int size() const { return 1; } 1176f92157deSopenharmony_ci}; 1177f92157deSopenharmony_ciTEST(SizeIsTest, WorksWithMinimalistCustomType) { 1178f92157deSopenharmony_ci MinimalistCustomType container; 1179f92157deSopenharmony_ci EXPECT_THAT(container, SizeIs(1)); 1180f92157deSopenharmony_ci EXPECT_THAT(container, Not(SizeIs(0))); 1181f92157deSopenharmony_ci} 1182f92157deSopenharmony_ci 1183f92157deSopenharmony_ciTEST(SizeIsTest, CanDescribeSelf) { 1184f92157deSopenharmony_ci Matcher<vector<int>> m = SizeIs(2); 1185f92157deSopenharmony_ci EXPECT_EQ("has a size that is equal to 2", Describe(m)); 1186f92157deSopenharmony_ci EXPECT_EQ("has a size that isn't equal to 2", DescribeNegation(m)); 1187f92157deSopenharmony_ci} 1188f92157deSopenharmony_ci 1189f92157deSopenharmony_ciTEST(SizeIsTest, ExplainsResult) { 1190f92157deSopenharmony_ci Matcher<vector<int>> m1 = SizeIs(2); 1191f92157deSopenharmony_ci Matcher<vector<int>> m2 = SizeIs(Lt(2u)); 1192f92157deSopenharmony_ci Matcher<vector<int>> m3 = SizeIs(AnyOf(0, 3)); 1193f92157deSopenharmony_ci Matcher<vector<int>> m4 = SizeIs(Gt(1u)); 1194f92157deSopenharmony_ci vector<int> container; 1195f92157deSopenharmony_ci EXPECT_EQ("whose size 0 doesn't match", Explain(m1, container)); 1196f92157deSopenharmony_ci EXPECT_EQ("whose size 0 matches", Explain(m2, container)); 1197f92157deSopenharmony_ci EXPECT_EQ("whose size 0 matches", Explain(m3, container)); 1198f92157deSopenharmony_ci EXPECT_EQ("whose size 0 doesn't match", Explain(m4, container)); 1199f92157deSopenharmony_ci container.push_back(0); 1200f92157deSopenharmony_ci container.push_back(0); 1201f92157deSopenharmony_ci EXPECT_EQ("whose size 2 matches", Explain(m1, container)); 1202f92157deSopenharmony_ci EXPECT_EQ("whose size 2 doesn't match", Explain(m2, container)); 1203f92157deSopenharmony_ci EXPECT_EQ("whose size 2 doesn't match", Explain(m3, container)); 1204f92157deSopenharmony_ci EXPECT_EQ("whose size 2 matches", Explain(m4, container)); 1205f92157deSopenharmony_ci} 1206f92157deSopenharmony_ci 1207f92157deSopenharmony_ciTEST(WhenSortedByTest, WorksForEmptyContainer) { 1208f92157deSopenharmony_ci const vector<int> numbers; 1209f92157deSopenharmony_ci EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre())); 1210f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1)))); 1211f92157deSopenharmony_ci} 1212f92157deSopenharmony_ci 1213f92157deSopenharmony_ciTEST(WhenSortedByTest, WorksForNonEmptyContainer) { 1214f92157deSopenharmony_ci vector<unsigned> numbers; 1215f92157deSopenharmony_ci numbers.push_back(3); 1216f92157deSopenharmony_ci numbers.push_back(1); 1217f92157deSopenharmony_ci numbers.push_back(2); 1218f92157deSopenharmony_ci numbers.push_back(2); 1219f92157deSopenharmony_ci EXPECT_THAT(numbers, 1220f92157deSopenharmony_ci WhenSortedBy(greater<unsigned>(), ElementsAre(3, 2, 2, 1))); 1221f92157deSopenharmony_ci EXPECT_THAT(numbers, 1222f92157deSopenharmony_ci Not(WhenSortedBy(greater<unsigned>(), ElementsAre(1, 2, 2, 3)))); 1223f92157deSopenharmony_ci} 1224f92157deSopenharmony_ci 1225f92157deSopenharmony_ciTEST(WhenSortedByTest, WorksForNonVectorContainer) { 1226f92157deSopenharmony_ci list<std::string> words; 1227f92157deSopenharmony_ci words.push_back("say"); 1228f92157deSopenharmony_ci words.push_back("hello"); 1229f92157deSopenharmony_ci words.push_back("world"); 1230f92157deSopenharmony_ci EXPECT_THAT(words, WhenSortedBy(less<std::string>(), 1231f92157deSopenharmony_ci ElementsAre("hello", "say", "world"))); 1232f92157deSopenharmony_ci EXPECT_THAT(words, Not(WhenSortedBy(less<std::string>(), 1233f92157deSopenharmony_ci ElementsAre("say", "hello", "world")))); 1234f92157deSopenharmony_ci} 1235f92157deSopenharmony_ci 1236f92157deSopenharmony_ciTEST(WhenSortedByTest, WorksForNativeArray) { 1237f92157deSopenharmony_ci const int numbers[] = {1, 3, 2, 4}; 1238f92157deSopenharmony_ci const int sorted_numbers[] = {1, 2, 3, 4}; 1239f92157deSopenharmony_ci EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4))); 1240f92157deSopenharmony_ci EXPECT_THAT(numbers, 1241f92157deSopenharmony_ci WhenSortedBy(less<int>(), ElementsAreArray(sorted_numbers))); 1242f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4)))); 1243f92157deSopenharmony_ci} 1244f92157deSopenharmony_ci 1245f92157deSopenharmony_ciTEST(WhenSortedByTest, CanDescribeSelf) { 1246f92157deSopenharmony_ci const Matcher<vector<int>> m = WhenSortedBy(less<int>(), ElementsAre(1, 2)); 1247f92157deSopenharmony_ci EXPECT_EQ( 1248f92157deSopenharmony_ci "(when sorted) has 2 elements where\n" 1249f92157deSopenharmony_ci "element #0 is equal to 1,\n" 1250f92157deSopenharmony_ci "element #1 is equal to 2", 1251f92157deSopenharmony_ci Describe(m)); 1252f92157deSopenharmony_ci EXPECT_EQ( 1253f92157deSopenharmony_ci "(when sorted) doesn't have 2 elements, or\n" 1254f92157deSopenharmony_ci "element #0 isn't equal to 1, or\n" 1255f92157deSopenharmony_ci "element #1 isn't equal to 2", 1256f92157deSopenharmony_ci DescribeNegation(m)); 1257f92157deSopenharmony_ci} 1258f92157deSopenharmony_ci 1259f92157deSopenharmony_ciTEST(WhenSortedByTest, ExplainsMatchResult) { 1260f92157deSopenharmony_ci const int a[] = {2, 1}; 1261f92157deSopenharmony_ci EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match", 1262f92157deSopenharmony_ci Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a)); 1263f92157deSopenharmony_ci EXPECT_EQ("which is { 1, 2 } when sorted", 1264f92157deSopenharmony_ci Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a)); 1265f92157deSopenharmony_ci} 1266f92157deSopenharmony_ci 1267f92157deSopenharmony_ci// WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't 1268f92157deSopenharmony_ci// need to test it as exhaustively as we test the latter. 1269f92157deSopenharmony_ci 1270f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForEmptyContainer) { 1271f92157deSopenharmony_ci const vector<int> numbers; 1272f92157deSopenharmony_ci EXPECT_THAT(numbers, WhenSorted(ElementsAre())); 1273f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1)))); 1274f92157deSopenharmony_ci} 1275f92157deSopenharmony_ci 1276f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForNonEmptyContainer) { 1277f92157deSopenharmony_ci list<std::string> words; 1278f92157deSopenharmony_ci words.push_back("3"); 1279f92157deSopenharmony_ci words.push_back("1"); 1280f92157deSopenharmony_ci words.push_back("2"); 1281f92157deSopenharmony_ci words.push_back("2"); 1282f92157deSopenharmony_ci EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3"))); 1283f92157deSopenharmony_ci EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2")))); 1284f92157deSopenharmony_ci} 1285f92157deSopenharmony_ci 1286f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForMapTypes) { 1287f92157deSopenharmony_ci map<std::string, int> word_counts; 1288f92157deSopenharmony_ci word_counts["and"] = 1; 1289f92157deSopenharmony_ci word_counts["the"] = 1; 1290f92157deSopenharmony_ci word_counts["buffalo"] = 2; 1291f92157deSopenharmony_ci EXPECT_THAT(word_counts, 1292f92157deSopenharmony_ci WhenSorted(ElementsAre(Pair("and", 1), Pair("buffalo", 2), 1293f92157deSopenharmony_ci Pair("the", 1)))); 1294f92157deSopenharmony_ci EXPECT_THAT(word_counts, 1295f92157deSopenharmony_ci Not(WhenSorted(ElementsAre(Pair("and", 1), Pair("the", 1), 1296f92157deSopenharmony_ci Pair("buffalo", 2))))); 1297f92157deSopenharmony_ci} 1298f92157deSopenharmony_ci 1299f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForMultiMapTypes) { 1300f92157deSopenharmony_ci multimap<int, int> ifib; 1301f92157deSopenharmony_ci ifib.insert(make_pair(8, 6)); 1302f92157deSopenharmony_ci ifib.insert(make_pair(2, 3)); 1303f92157deSopenharmony_ci ifib.insert(make_pair(1, 1)); 1304f92157deSopenharmony_ci ifib.insert(make_pair(3, 4)); 1305f92157deSopenharmony_ci ifib.insert(make_pair(1, 2)); 1306f92157deSopenharmony_ci ifib.insert(make_pair(5, 5)); 1307f92157deSopenharmony_ci EXPECT_THAT(ifib, 1308f92157deSopenharmony_ci WhenSorted(ElementsAre(Pair(1, 1), Pair(1, 2), Pair(2, 3), 1309f92157deSopenharmony_ci Pair(3, 4), Pair(5, 5), Pair(8, 6)))); 1310f92157deSopenharmony_ci EXPECT_THAT(ifib, 1311f92157deSopenharmony_ci Not(WhenSorted(ElementsAre(Pair(8, 6), Pair(2, 3), Pair(1, 1), 1312f92157deSopenharmony_ci Pair(3, 4), Pair(1, 2), Pair(5, 5))))); 1313f92157deSopenharmony_ci} 1314f92157deSopenharmony_ci 1315f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForPolymorphicMatcher) { 1316f92157deSopenharmony_ci std::deque<int> d; 1317f92157deSopenharmony_ci d.push_back(2); 1318f92157deSopenharmony_ci d.push_back(1); 1319f92157deSopenharmony_ci EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2))); 1320f92157deSopenharmony_ci EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1)))); 1321f92157deSopenharmony_ci} 1322f92157deSopenharmony_ci 1323f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForVectorConstRefMatcher) { 1324f92157deSopenharmony_ci std::deque<int> d; 1325f92157deSopenharmony_ci d.push_back(2); 1326f92157deSopenharmony_ci d.push_back(1); 1327f92157deSopenharmony_ci Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2); 1328f92157deSopenharmony_ci EXPECT_THAT(d, WhenSorted(vector_match)); 1329f92157deSopenharmony_ci Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1); 1330f92157deSopenharmony_ci EXPECT_THAT(d, Not(WhenSorted(not_vector_match))); 1331f92157deSopenharmony_ci} 1332f92157deSopenharmony_ci 1333f92157deSopenharmony_ci// Deliberately bare pseudo-container. 1334f92157deSopenharmony_ci// Offers only begin() and end() accessors, yielding InputIterator. 1335f92157deSopenharmony_citemplate <typename T> 1336f92157deSopenharmony_ciclass Streamlike { 1337f92157deSopenharmony_ci private: 1338f92157deSopenharmony_ci class ConstIter; 1339f92157deSopenharmony_ci 1340f92157deSopenharmony_ci public: 1341f92157deSopenharmony_ci typedef ConstIter const_iterator; 1342f92157deSopenharmony_ci typedef T value_type; 1343f92157deSopenharmony_ci 1344f92157deSopenharmony_ci template <typename InIter> 1345f92157deSopenharmony_ci Streamlike(InIter first, InIter last) : remainder_(first, last) {} 1346f92157deSopenharmony_ci 1347f92157deSopenharmony_ci const_iterator begin() const { 1348f92157deSopenharmony_ci return const_iterator(this, remainder_.begin()); 1349f92157deSopenharmony_ci } 1350f92157deSopenharmony_ci const_iterator end() const { return const_iterator(this, remainder_.end()); } 1351f92157deSopenharmony_ci 1352f92157deSopenharmony_ci private: 1353f92157deSopenharmony_ci class ConstIter { 1354f92157deSopenharmony_ci public: 1355f92157deSopenharmony_ci using iterator_category = std::input_iterator_tag; 1356f92157deSopenharmony_ci using value_type = T; 1357f92157deSopenharmony_ci using difference_type = ptrdiff_t; 1358f92157deSopenharmony_ci using pointer = const value_type*; 1359f92157deSopenharmony_ci using reference = const value_type&; 1360f92157deSopenharmony_ci 1361f92157deSopenharmony_ci ConstIter(const Streamlike* s, typename std::list<value_type>::iterator pos) 1362f92157deSopenharmony_ci : s_(s), pos_(pos) {} 1363f92157deSopenharmony_ci 1364f92157deSopenharmony_ci const value_type& operator*() const { return *pos_; } 1365f92157deSopenharmony_ci const value_type* operator->() const { return &*pos_; } 1366f92157deSopenharmony_ci ConstIter& operator++() { 1367f92157deSopenharmony_ci s_->remainder_.erase(pos_++); 1368f92157deSopenharmony_ci return *this; 1369f92157deSopenharmony_ci } 1370f92157deSopenharmony_ci 1371f92157deSopenharmony_ci // *iter++ is required to work (see std::istreambuf_iterator). 1372f92157deSopenharmony_ci // (void)iter++ is also required to work. 1373f92157deSopenharmony_ci class PostIncrProxy { 1374f92157deSopenharmony_ci public: 1375f92157deSopenharmony_ci explicit PostIncrProxy(const value_type& value) : value_(value) {} 1376f92157deSopenharmony_ci value_type operator*() const { return value_; } 1377f92157deSopenharmony_ci 1378f92157deSopenharmony_ci private: 1379f92157deSopenharmony_ci value_type value_; 1380f92157deSopenharmony_ci }; 1381f92157deSopenharmony_ci PostIncrProxy operator++(int) { 1382f92157deSopenharmony_ci PostIncrProxy proxy(**this); 1383f92157deSopenharmony_ci ++(*this); 1384f92157deSopenharmony_ci return proxy; 1385f92157deSopenharmony_ci } 1386f92157deSopenharmony_ci 1387f92157deSopenharmony_ci friend bool operator==(const ConstIter& a, const ConstIter& b) { 1388f92157deSopenharmony_ci return a.s_ == b.s_ && a.pos_ == b.pos_; 1389f92157deSopenharmony_ci } 1390f92157deSopenharmony_ci friend bool operator!=(const ConstIter& a, const ConstIter& b) { 1391f92157deSopenharmony_ci return !(a == b); 1392f92157deSopenharmony_ci } 1393f92157deSopenharmony_ci 1394f92157deSopenharmony_ci private: 1395f92157deSopenharmony_ci const Streamlike* s_; 1396f92157deSopenharmony_ci typename std::list<value_type>::iterator pos_; 1397f92157deSopenharmony_ci }; 1398f92157deSopenharmony_ci 1399f92157deSopenharmony_ci friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) { 1400f92157deSopenharmony_ci os << "["; 1401f92157deSopenharmony_ci typedef typename std::list<value_type>::const_iterator Iter; 1402f92157deSopenharmony_ci const char* sep = ""; 1403f92157deSopenharmony_ci for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) { 1404f92157deSopenharmony_ci os << sep << *it; 1405f92157deSopenharmony_ci sep = ","; 1406f92157deSopenharmony_ci } 1407f92157deSopenharmony_ci os << "]"; 1408f92157deSopenharmony_ci return os; 1409f92157deSopenharmony_ci } 1410f92157deSopenharmony_ci 1411f92157deSopenharmony_ci mutable std::list<value_type> remainder_; // modified by iteration 1412f92157deSopenharmony_ci}; 1413f92157deSopenharmony_ci 1414f92157deSopenharmony_ciTEST(StreamlikeTest, Iteration) { 1415f92157deSopenharmony_ci const int a[5] = {2, 1, 4, 5, 3}; 1416f92157deSopenharmony_ci Streamlike<int> s(a, a + 5); 1417f92157deSopenharmony_ci Streamlike<int>::const_iterator it = s.begin(); 1418f92157deSopenharmony_ci const int* ip = a; 1419f92157deSopenharmony_ci while (it != s.end()) { 1420f92157deSopenharmony_ci SCOPED_TRACE(ip - a); 1421f92157deSopenharmony_ci EXPECT_EQ(*ip++, *it++); 1422f92157deSopenharmony_ci } 1423f92157deSopenharmony_ci} 1424f92157deSopenharmony_ci 1425f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(BeginEndDistanceIsTest); 1426f92157deSopenharmony_ci 1427f92157deSopenharmony_ciTEST(BeginEndDistanceIsTest, WorksWithForwardList) { 1428f92157deSopenharmony_ci std::forward_list<int> container; 1429f92157deSopenharmony_ci EXPECT_THAT(container, BeginEndDistanceIs(0)); 1430f92157deSopenharmony_ci EXPECT_THAT(container, Not(BeginEndDistanceIs(1))); 1431f92157deSopenharmony_ci container.push_front(0); 1432f92157deSopenharmony_ci EXPECT_THAT(container, Not(BeginEndDistanceIs(0))); 1433f92157deSopenharmony_ci EXPECT_THAT(container, BeginEndDistanceIs(1)); 1434f92157deSopenharmony_ci container.push_front(0); 1435f92157deSopenharmony_ci EXPECT_THAT(container, Not(BeginEndDistanceIs(0))); 1436f92157deSopenharmony_ci EXPECT_THAT(container, BeginEndDistanceIs(2)); 1437f92157deSopenharmony_ci} 1438f92157deSopenharmony_ci 1439f92157deSopenharmony_ciTEST(BeginEndDistanceIsTest, WorksWithNonStdList) { 1440f92157deSopenharmony_ci const int a[5] = {1, 2, 3, 4, 5}; 1441f92157deSopenharmony_ci Streamlike<int> s(a, a + 5); 1442f92157deSopenharmony_ci EXPECT_THAT(s, BeginEndDistanceIs(5)); 1443f92157deSopenharmony_ci} 1444f92157deSopenharmony_ci 1445f92157deSopenharmony_ciTEST(BeginEndDistanceIsTest, CanDescribeSelf) { 1446f92157deSopenharmony_ci Matcher<vector<int>> m = BeginEndDistanceIs(2); 1447f92157deSopenharmony_ci EXPECT_EQ("distance between begin() and end() is equal to 2", Describe(m)); 1448f92157deSopenharmony_ci EXPECT_EQ("distance between begin() and end() isn't equal to 2", 1449f92157deSopenharmony_ci DescribeNegation(m)); 1450f92157deSopenharmony_ci} 1451f92157deSopenharmony_ci 1452f92157deSopenharmony_ciTEST(BeginEndDistanceIsTest, WorksWithMoveOnly) { 1453f92157deSopenharmony_ci ContainerHelper helper; 1454f92157deSopenharmony_ci EXPECT_CALL(helper, Call(BeginEndDistanceIs(2))); 1455f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1, 2})); 1456f92157deSopenharmony_ci} 1457f92157deSopenharmony_ci 1458f92157deSopenharmony_ciTEST_P(BeginEndDistanceIsTestP, ExplainsResult) { 1459f92157deSopenharmony_ci Matcher<vector<int>> m1 = BeginEndDistanceIs(2); 1460f92157deSopenharmony_ci Matcher<vector<int>> m2 = BeginEndDistanceIs(Lt(2)); 1461f92157deSopenharmony_ci Matcher<vector<int>> m3 = BeginEndDistanceIs(AnyOf(0, 3)); 1462f92157deSopenharmony_ci Matcher<vector<int>> m4 = BeginEndDistanceIs(GreaterThan(1)); 1463f92157deSopenharmony_ci vector<int> container; 1464f92157deSopenharmony_ci EXPECT_EQ("whose distance between begin() and end() 0 doesn't match", 1465f92157deSopenharmony_ci Explain(m1, container)); 1466f92157deSopenharmony_ci EXPECT_EQ("whose distance between begin() and end() 0 matches", 1467f92157deSopenharmony_ci Explain(m2, container)); 1468f92157deSopenharmony_ci EXPECT_EQ("whose distance between begin() and end() 0 matches", 1469f92157deSopenharmony_ci Explain(m3, container)); 1470f92157deSopenharmony_ci EXPECT_EQ( 1471f92157deSopenharmony_ci "whose distance between begin() and end() 0 doesn't match, which is 1 " 1472f92157deSopenharmony_ci "less than 1", 1473f92157deSopenharmony_ci Explain(m4, container)); 1474f92157deSopenharmony_ci container.push_back(0); 1475f92157deSopenharmony_ci container.push_back(0); 1476f92157deSopenharmony_ci EXPECT_EQ("whose distance between begin() and end() 2 matches", 1477f92157deSopenharmony_ci Explain(m1, container)); 1478f92157deSopenharmony_ci EXPECT_EQ("whose distance between begin() and end() 2 doesn't match", 1479f92157deSopenharmony_ci Explain(m2, container)); 1480f92157deSopenharmony_ci EXPECT_EQ("whose distance between begin() and end() 2 doesn't match", 1481f92157deSopenharmony_ci Explain(m3, container)); 1482f92157deSopenharmony_ci EXPECT_EQ( 1483f92157deSopenharmony_ci "whose distance between begin() and end() 2 matches, which is 1 more " 1484f92157deSopenharmony_ci "than 1", 1485f92157deSopenharmony_ci Explain(m4, container)); 1486f92157deSopenharmony_ci} 1487f92157deSopenharmony_ci 1488f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForStreamlike) { 1489f92157deSopenharmony_ci // Streamlike 'container' provides only minimal iterator support. 1490f92157deSopenharmony_ci // Its iterators are tagged with input_iterator_tag. 1491f92157deSopenharmony_ci const int a[5] = {2, 1, 4, 5, 3}; 1492f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1493f92157deSopenharmony_ci EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5))); 1494f92157deSopenharmony_ci EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3)))); 1495f92157deSopenharmony_ci} 1496f92157deSopenharmony_ci 1497f92157deSopenharmony_ciTEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) { 1498f92157deSopenharmony_ci const int a[] = {2, 1, 4, 5, 3}; 1499f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1500f92157deSopenharmony_ci Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5); 1501f92157deSopenharmony_ci EXPECT_THAT(s, WhenSorted(vector_match)); 1502f92157deSopenharmony_ci EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3)))); 1503f92157deSopenharmony_ci} 1504f92157deSopenharmony_ci 1505f92157deSopenharmony_ciTEST(IsSupersetOfTest, WorksForNativeArray) { 1506f92157deSopenharmony_ci const int subset[] = {1, 4}; 1507f92157deSopenharmony_ci const int superset[] = {1, 2, 4}; 1508f92157deSopenharmony_ci const int disjoint[] = {1, 0, 3}; 1509f92157deSopenharmony_ci EXPECT_THAT(subset, IsSupersetOf(subset)); 1510f92157deSopenharmony_ci EXPECT_THAT(subset, Not(IsSupersetOf(superset))); 1511f92157deSopenharmony_ci EXPECT_THAT(superset, IsSupersetOf(subset)); 1512f92157deSopenharmony_ci EXPECT_THAT(subset, Not(IsSupersetOf(disjoint))); 1513f92157deSopenharmony_ci EXPECT_THAT(disjoint, Not(IsSupersetOf(subset))); 1514f92157deSopenharmony_ci} 1515f92157deSopenharmony_ci 1516f92157deSopenharmony_ciTEST(IsSupersetOfTest, WorksWithDuplicates) { 1517f92157deSopenharmony_ci const int not_enough[] = {1, 2}; 1518f92157deSopenharmony_ci const int enough[] = {1, 1, 2}; 1519f92157deSopenharmony_ci const int expected[] = {1, 1}; 1520f92157deSopenharmony_ci EXPECT_THAT(not_enough, Not(IsSupersetOf(expected))); 1521f92157deSopenharmony_ci EXPECT_THAT(enough, IsSupersetOf(expected)); 1522f92157deSopenharmony_ci} 1523f92157deSopenharmony_ci 1524f92157deSopenharmony_ciTEST(IsSupersetOfTest, WorksForEmpty) { 1525f92157deSopenharmony_ci vector<int> numbers; 1526f92157deSopenharmony_ci vector<int> expected; 1527f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSupersetOf(expected)); 1528f92157deSopenharmony_ci expected.push_back(1); 1529f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(IsSupersetOf(expected))); 1530f92157deSopenharmony_ci expected.clear(); 1531f92157deSopenharmony_ci numbers.push_back(1); 1532f92157deSopenharmony_ci numbers.push_back(2); 1533f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSupersetOf(expected)); 1534f92157deSopenharmony_ci expected.push_back(1); 1535f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSupersetOf(expected)); 1536f92157deSopenharmony_ci expected.push_back(2); 1537f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSupersetOf(expected)); 1538f92157deSopenharmony_ci expected.push_back(3); 1539f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(IsSupersetOf(expected))); 1540f92157deSopenharmony_ci} 1541f92157deSopenharmony_ci 1542f92157deSopenharmony_ciTEST(IsSupersetOfTest, WorksForStreamlike) { 1543f92157deSopenharmony_ci const int a[5] = {1, 2, 3, 4, 5}; 1544f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1545f92157deSopenharmony_ci 1546f92157deSopenharmony_ci vector<int> expected; 1547f92157deSopenharmony_ci expected.push_back(1); 1548f92157deSopenharmony_ci expected.push_back(2); 1549f92157deSopenharmony_ci expected.push_back(5); 1550f92157deSopenharmony_ci EXPECT_THAT(s, IsSupersetOf(expected)); 1551f92157deSopenharmony_ci 1552f92157deSopenharmony_ci expected.push_back(0); 1553f92157deSopenharmony_ci EXPECT_THAT(s, Not(IsSupersetOf(expected))); 1554f92157deSopenharmony_ci} 1555f92157deSopenharmony_ci 1556f92157deSopenharmony_ciTEST(IsSupersetOfTest, TakesStlContainer) { 1557f92157deSopenharmony_ci const int actual[] = {3, 1, 2}; 1558f92157deSopenharmony_ci 1559f92157deSopenharmony_ci ::std::list<int> expected; 1560f92157deSopenharmony_ci expected.push_back(1); 1561f92157deSopenharmony_ci expected.push_back(3); 1562f92157deSopenharmony_ci EXPECT_THAT(actual, IsSupersetOf(expected)); 1563f92157deSopenharmony_ci 1564f92157deSopenharmony_ci expected.push_back(4); 1565f92157deSopenharmony_ci EXPECT_THAT(actual, Not(IsSupersetOf(expected))); 1566f92157deSopenharmony_ci} 1567f92157deSopenharmony_ci 1568f92157deSopenharmony_ciTEST(IsSupersetOfTest, Describe) { 1569f92157deSopenharmony_ci typedef std::vector<int> IntVec; 1570f92157deSopenharmony_ci IntVec expected; 1571f92157deSopenharmony_ci expected.push_back(111); 1572f92157deSopenharmony_ci expected.push_back(222); 1573f92157deSopenharmony_ci expected.push_back(333); 1574f92157deSopenharmony_ci EXPECT_THAT( 1575f92157deSopenharmony_ci Describe<IntVec>(IsSupersetOf(expected)), 1576f92157deSopenharmony_ci Eq("a surjection from elements to requirements exists such that:\n" 1577f92157deSopenharmony_ci " - an element is equal to 111\n" 1578f92157deSopenharmony_ci " - an element is equal to 222\n" 1579f92157deSopenharmony_ci " - an element is equal to 333")); 1580f92157deSopenharmony_ci} 1581f92157deSopenharmony_ci 1582f92157deSopenharmony_ciTEST(IsSupersetOfTest, DescribeNegation) { 1583f92157deSopenharmony_ci typedef std::vector<int> IntVec; 1584f92157deSopenharmony_ci IntVec expected; 1585f92157deSopenharmony_ci expected.push_back(111); 1586f92157deSopenharmony_ci expected.push_back(222); 1587f92157deSopenharmony_ci expected.push_back(333); 1588f92157deSopenharmony_ci EXPECT_THAT( 1589f92157deSopenharmony_ci DescribeNegation<IntVec>(IsSupersetOf(expected)), 1590f92157deSopenharmony_ci Eq("no surjection from elements to requirements exists such that:\n" 1591f92157deSopenharmony_ci " - an element is equal to 111\n" 1592f92157deSopenharmony_ci " - an element is equal to 222\n" 1593f92157deSopenharmony_ci " - an element is equal to 333")); 1594f92157deSopenharmony_ci} 1595f92157deSopenharmony_ci 1596f92157deSopenharmony_ciTEST(IsSupersetOfTest, MatchAndExplain) { 1597f92157deSopenharmony_ci std::vector<int> v; 1598f92157deSopenharmony_ci v.push_back(2); 1599f92157deSopenharmony_ci v.push_back(3); 1600f92157deSopenharmony_ci std::vector<int> expected; 1601f92157deSopenharmony_ci expected.push_back(1); 1602f92157deSopenharmony_ci expected.push_back(2); 1603f92157deSopenharmony_ci StringMatchResultListener listener; 1604f92157deSopenharmony_ci ASSERT_FALSE(ExplainMatchResult(IsSupersetOf(expected), v, &listener)) 1605f92157deSopenharmony_ci << listener.str(); 1606f92157deSopenharmony_ci EXPECT_THAT(listener.str(), 1607f92157deSopenharmony_ci Eq("where the following matchers don't match any elements:\n" 1608f92157deSopenharmony_ci "matcher #0: is equal to 1")); 1609f92157deSopenharmony_ci 1610f92157deSopenharmony_ci v.push_back(1); 1611f92157deSopenharmony_ci listener.Clear(); 1612f92157deSopenharmony_ci ASSERT_TRUE(ExplainMatchResult(IsSupersetOf(expected), v, &listener)) 1613f92157deSopenharmony_ci << listener.str(); 1614f92157deSopenharmony_ci EXPECT_THAT(listener.str(), Eq("where:\n" 1615f92157deSopenharmony_ci " - element #0 is matched by matcher #1,\n" 1616f92157deSopenharmony_ci " - element #2 is matched by matcher #0")); 1617f92157deSopenharmony_ci} 1618f92157deSopenharmony_ci 1619f92157deSopenharmony_ciTEST(IsSupersetOfTest, WorksForRhsInitializerList) { 1620f92157deSopenharmony_ci const int numbers[] = {1, 3, 6, 2, 4, 5}; 1621f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSupersetOf({1, 2})); 1622f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(IsSupersetOf({3, 0}))); 1623f92157deSopenharmony_ci} 1624f92157deSopenharmony_ci 1625f92157deSopenharmony_ciTEST(IsSupersetOfTest, WorksWithMoveOnly) { 1626f92157deSopenharmony_ci ContainerHelper helper; 1627f92157deSopenharmony_ci EXPECT_CALL(helper, Call(IsSupersetOf({Pointee(1)}))); 1628f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1, 2})); 1629f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Not(IsSupersetOf({Pointee(1), Pointee(2)})))); 1630f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({2})); 1631f92157deSopenharmony_ci} 1632f92157deSopenharmony_ci 1633f92157deSopenharmony_ciTEST(IsSubsetOfTest, WorksForNativeArray) { 1634f92157deSopenharmony_ci const int subset[] = {1, 4}; 1635f92157deSopenharmony_ci const int superset[] = {1, 2, 4}; 1636f92157deSopenharmony_ci const int disjoint[] = {1, 0, 3}; 1637f92157deSopenharmony_ci EXPECT_THAT(subset, IsSubsetOf(subset)); 1638f92157deSopenharmony_ci EXPECT_THAT(subset, IsSubsetOf(superset)); 1639f92157deSopenharmony_ci EXPECT_THAT(superset, Not(IsSubsetOf(subset))); 1640f92157deSopenharmony_ci EXPECT_THAT(subset, Not(IsSubsetOf(disjoint))); 1641f92157deSopenharmony_ci EXPECT_THAT(disjoint, Not(IsSubsetOf(subset))); 1642f92157deSopenharmony_ci} 1643f92157deSopenharmony_ci 1644f92157deSopenharmony_ciTEST(IsSubsetOfTest, WorksWithDuplicates) { 1645f92157deSopenharmony_ci const int not_enough[] = {1, 2}; 1646f92157deSopenharmony_ci const int enough[] = {1, 1, 2}; 1647f92157deSopenharmony_ci const int actual[] = {1, 1}; 1648f92157deSopenharmony_ci EXPECT_THAT(actual, Not(IsSubsetOf(not_enough))); 1649f92157deSopenharmony_ci EXPECT_THAT(actual, IsSubsetOf(enough)); 1650f92157deSopenharmony_ci} 1651f92157deSopenharmony_ci 1652f92157deSopenharmony_ciTEST(IsSubsetOfTest, WorksForEmpty) { 1653f92157deSopenharmony_ci vector<int> numbers; 1654f92157deSopenharmony_ci vector<int> expected; 1655f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSubsetOf(expected)); 1656f92157deSopenharmony_ci expected.push_back(1); 1657f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSubsetOf(expected)); 1658f92157deSopenharmony_ci expected.clear(); 1659f92157deSopenharmony_ci numbers.push_back(1); 1660f92157deSopenharmony_ci numbers.push_back(2); 1661f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(IsSubsetOf(expected))); 1662f92157deSopenharmony_ci expected.push_back(1); 1663f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(IsSubsetOf(expected))); 1664f92157deSopenharmony_ci expected.push_back(2); 1665f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSubsetOf(expected)); 1666f92157deSopenharmony_ci expected.push_back(3); 1667f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSubsetOf(expected)); 1668f92157deSopenharmony_ci} 1669f92157deSopenharmony_ci 1670f92157deSopenharmony_ciTEST(IsSubsetOfTest, WorksForStreamlike) { 1671f92157deSopenharmony_ci const int a[5] = {1, 2}; 1672f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1673f92157deSopenharmony_ci 1674f92157deSopenharmony_ci vector<int> expected; 1675f92157deSopenharmony_ci expected.push_back(1); 1676f92157deSopenharmony_ci EXPECT_THAT(s, Not(IsSubsetOf(expected))); 1677f92157deSopenharmony_ci expected.push_back(2); 1678f92157deSopenharmony_ci expected.push_back(5); 1679f92157deSopenharmony_ci EXPECT_THAT(s, IsSubsetOf(expected)); 1680f92157deSopenharmony_ci} 1681f92157deSopenharmony_ci 1682f92157deSopenharmony_ciTEST(IsSubsetOfTest, TakesStlContainer) { 1683f92157deSopenharmony_ci const int actual[] = {3, 1, 2}; 1684f92157deSopenharmony_ci 1685f92157deSopenharmony_ci ::std::list<int> expected; 1686f92157deSopenharmony_ci expected.push_back(1); 1687f92157deSopenharmony_ci expected.push_back(3); 1688f92157deSopenharmony_ci EXPECT_THAT(actual, Not(IsSubsetOf(expected))); 1689f92157deSopenharmony_ci 1690f92157deSopenharmony_ci expected.push_back(2); 1691f92157deSopenharmony_ci expected.push_back(4); 1692f92157deSopenharmony_ci EXPECT_THAT(actual, IsSubsetOf(expected)); 1693f92157deSopenharmony_ci} 1694f92157deSopenharmony_ci 1695f92157deSopenharmony_ciTEST(IsSubsetOfTest, Describe) { 1696f92157deSopenharmony_ci typedef std::vector<int> IntVec; 1697f92157deSopenharmony_ci IntVec expected; 1698f92157deSopenharmony_ci expected.push_back(111); 1699f92157deSopenharmony_ci expected.push_back(222); 1700f92157deSopenharmony_ci expected.push_back(333); 1701f92157deSopenharmony_ci 1702f92157deSopenharmony_ci EXPECT_THAT( 1703f92157deSopenharmony_ci Describe<IntVec>(IsSubsetOf(expected)), 1704f92157deSopenharmony_ci Eq("an injection from elements to requirements exists such that:\n" 1705f92157deSopenharmony_ci " - an element is equal to 111\n" 1706f92157deSopenharmony_ci " - an element is equal to 222\n" 1707f92157deSopenharmony_ci " - an element is equal to 333")); 1708f92157deSopenharmony_ci} 1709f92157deSopenharmony_ci 1710f92157deSopenharmony_ciTEST(IsSubsetOfTest, DescribeNegation) { 1711f92157deSopenharmony_ci typedef std::vector<int> IntVec; 1712f92157deSopenharmony_ci IntVec expected; 1713f92157deSopenharmony_ci expected.push_back(111); 1714f92157deSopenharmony_ci expected.push_back(222); 1715f92157deSopenharmony_ci expected.push_back(333); 1716f92157deSopenharmony_ci EXPECT_THAT( 1717f92157deSopenharmony_ci DescribeNegation<IntVec>(IsSubsetOf(expected)), 1718f92157deSopenharmony_ci Eq("no injection from elements to requirements exists such that:\n" 1719f92157deSopenharmony_ci " - an element is equal to 111\n" 1720f92157deSopenharmony_ci " - an element is equal to 222\n" 1721f92157deSopenharmony_ci " - an element is equal to 333")); 1722f92157deSopenharmony_ci} 1723f92157deSopenharmony_ci 1724f92157deSopenharmony_ciTEST(IsSubsetOfTest, MatchAndExplain) { 1725f92157deSopenharmony_ci std::vector<int> v; 1726f92157deSopenharmony_ci v.push_back(2); 1727f92157deSopenharmony_ci v.push_back(3); 1728f92157deSopenharmony_ci std::vector<int> expected; 1729f92157deSopenharmony_ci expected.push_back(1); 1730f92157deSopenharmony_ci expected.push_back(2); 1731f92157deSopenharmony_ci StringMatchResultListener listener; 1732f92157deSopenharmony_ci ASSERT_FALSE(ExplainMatchResult(IsSubsetOf(expected), v, &listener)) 1733f92157deSopenharmony_ci << listener.str(); 1734f92157deSopenharmony_ci EXPECT_THAT(listener.str(), 1735f92157deSopenharmony_ci Eq("where the following elements don't match any matchers:\n" 1736f92157deSopenharmony_ci "element #1: 3")); 1737f92157deSopenharmony_ci 1738f92157deSopenharmony_ci expected.push_back(3); 1739f92157deSopenharmony_ci listener.Clear(); 1740f92157deSopenharmony_ci ASSERT_TRUE(ExplainMatchResult(IsSubsetOf(expected), v, &listener)) 1741f92157deSopenharmony_ci << listener.str(); 1742f92157deSopenharmony_ci EXPECT_THAT(listener.str(), Eq("where:\n" 1743f92157deSopenharmony_ci " - element #0 is matched by matcher #1,\n" 1744f92157deSopenharmony_ci " - element #1 is matched by matcher #2")); 1745f92157deSopenharmony_ci} 1746f92157deSopenharmony_ci 1747f92157deSopenharmony_ciTEST(IsSubsetOfTest, WorksForRhsInitializerList) { 1748f92157deSopenharmony_ci const int numbers[] = {1, 2, 3}; 1749f92157deSopenharmony_ci EXPECT_THAT(numbers, IsSubsetOf({1, 2, 3, 4})); 1750f92157deSopenharmony_ci EXPECT_THAT(numbers, Not(IsSubsetOf({1, 2}))); 1751f92157deSopenharmony_ci} 1752f92157deSopenharmony_ci 1753f92157deSopenharmony_ciTEST(IsSubsetOfTest, WorksWithMoveOnly) { 1754f92157deSopenharmony_ci ContainerHelper helper; 1755f92157deSopenharmony_ci EXPECT_CALL(helper, Call(IsSubsetOf({Pointee(1), Pointee(2)}))); 1756f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1})); 1757f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Not(IsSubsetOf({Pointee(1)})))); 1758f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({2})); 1759f92157deSopenharmony_ci} 1760f92157deSopenharmony_ci 1761f92157deSopenharmony_ci// Tests using ElementsAre() and ElementsAreArray() with stream-like 1762f92157deSopenharmony_ci// "containers". 1763f92157deSopenharmony_ci 1764f92157deSopenharmony_ciTEST(ElemensAreStreamTest, WorksForStreamlike) { 1765f92157deSopenharmony_ci const int a[5] = {1, 2, 3, 4, 5}; 1766f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1767f92157deSopenharmony_ci EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5)); 1768f92157deSopenharmony_ci EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3))); 1769f92157deSopenharmony_ci} 1770f92157deSopenharmony_ci 1771f92157deSopenharmony_ciTEST(ElemensAreArrayStreamTest, WorksForStreamlike) { 1772f92157deSopenharmony_ci const int a[5] = {1, 2, 3, 4, 5}; 1773f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1774f92157deSopenharmony_ci 1775f92157deSopenharmony_ci vector<int> expected; 1776f92157deSopenharmony_ci expected.push_back(1); 1777f92157deSopenharmony_ci expected.push_back(2); 1778f92157deSopenharmony_ci expected.push_back(3); 1779f92157deSopenharmony_ci expected.push_back(4); 1780f92157deSopenharmony_ci expected.push_back(5); 1781f92157deSopenharmony_ci EXPECT_THAT(s, ElementsAreArray(expected)); 1782f92157deSopenharmony_ci 1783f92157deSopenharmony_ci expected[3] = 0; 1784f92157deSopenharmony_ci EXPECT_THAT(s, Not(ElementsAreArray(expected))); 1785f92157deSopenharmony_ci} 1786f92157deSopenharmony_ci 1787f92157deSopenharmony_ciTEST(ElementsAreTest, WorksWithUncopyable) { 1788f92157deSopenharmony_ci Uncopyable objs[2]; 1789f92157deSopenharmony_ci objs[0].set_value(-3); 1790f92157deSopenharmony_ci objs[1].set_value(1); 1791f92157deSopenharmony_ci EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive))); 1792f92157deSopenharmony_ci} 1793f92157deSopenharmony_ci 1794f92157deSopenharmony_ciTEST(ElementsAreTest, WorksWithMoveOnly) { 1795f92157deSopenharmony_ci ContainerHelper helper; 1796f92157deSopenharmony_ci EXPECT_CALL(helper, Call(ElementsAre(Pointee(1), Pointee(2)))); 1797f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1, 2})); 1798f92157deSopenharmony_ci 1799f92157deSopenharmony_ci EXPECT_CALL(helper, Call(ElementsAreArray({Pointee(3), Pointee(4)}))); 1800f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({3, 4})); 1801f92157deSopenharmony_ci} 1802f92157deSopenharmony_ci 1803f92157deSopenharmony_ciTEST(ElementsAreTest, TakesStlContainer) { 1804f92157deSopenharmony_ci const int actual[] = {3, 1, 2}; 1805f92157deSopenharmony_ci 1806f92157deSopenharmony_ci ::std::list<int> expected; 1807f92157deSopenharmony_ci expected.push_back(3); 1808f92157deSopenharmony_ci expected.push_back(1); 1809f92157deSopenharmony_ci expected.push_back(2); 1810f92157deSopenharmony_ci EXPECT_THAT(actual, ElementsAreArray(expected)); 1811f92157deSopenharmony_ci 1812f92157deSopenharmony_ci expected.push_back(4); 1813f92157deSopenharmony_ci EXPECT_THAT(actual, Not(ElementsAreArray(expected))); 1814f92157deSopenharmony_ci} 1815f92157deSopenharmony_ci 1816f92157deSopenharmony_ci// Tests for UnorderedElementsAreArray() 1817f92157deSopenharmony_ci 1818f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) { 1819f92157deSopenharmony_ci const int a[] = {0, 1, 2, 3, 4}; 1820f92157deSopenharmony_ci std::vector<int> s(std::begin(a), std::end(a)); 1821f92157deSopenharmony_ci do { 1822f92157deSopenharmony_ci StringMatchResultListener listener; 1823f92157deSopenharmony_ci EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a), s, &listener)) 1824f92157deSopenharmony_ci << listener.str(); 1825f92157deSopenharmony_ci } while (std::next_permutation(s.begin(), s.end())); 1826f92157deSopenharmony_ci} 1827f92157deSopenharmony_ci 1828f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, VectorBool) { 1829f92157deSopenharmony_ci const bool a[] = {0, 1, 0, 1, 1}; 1830f92157deSopenharmony_ci const bool b[] = {1, 0, 1, 1, 0}; 1831f92157deSopenharmony_ci std::vector<bool> expected(std::begin(a), std::end(a)); 1832f92157deSopenharmony_ci std::vector<bool> actual(std::begin(b), std::end(b)); 1833f92157deSopenharmony_ci StringMatchResultListener listener; 1834f92157deSopenharmony_ci EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected), actual, 1835f92157deSopenharmony_ci &listener)) 1836f92157deSopenharmony_ci << listener.str(); 1837f92157deSopenharmony_ci} 1838f92157deSopenharmony_ci 1839f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, WorksForStreamlike) { 1840f92157deSopenharmony_ci // Streamlike 'container' provides only minimal iterator support. 1841f92157deSopenharmony_ci // Its iterators are tagged with input_iterator_tag, and it has no 1842f92157deSopenharmony_ci // size() or empty() methods. 1843f92157deSopenharmony_ci const int a[5] = {2, 1, 4, 5, 3}; 1844f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1845f92157deSopenharmony_ci 1846f92157deSopenharmony_ci ::std::vector<int> expected; 1847f92157deSopenharmony_ci expected.push_back(1); 1848f92157deSopenharmony_ci expected.push_back(2); 1849f92157deSopenharmony_ci expected.push_back(3); 1850f92157deSopenharmony_ci expected.push_back(4); 1851f92157deSopenharmony_ci expected.push_back(5); 1852f92157deSopenharmony_ci EXPECT_THAT(s, UnorderedElementsAreArray(expected)); 1853f92157deSopenharmony_ci 1854f92157deSopenharmony_ci expected.push_back(6); 1855f92157deSopenharmony_ci EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected))); 1856f92157deSopenharmony_ci} 1857f92157deSopenharmony_ci 1858f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, TakesStlContainer) { 1859f92157deSopenharmony_ci const int actual[] = {3, 1, 2}; 1860f92157deSopenharmony_ci 1861f92157deSopenharmony_ci ::std::list<int> expected; 1862f92157deSopenharmony_ci expected.push_back(1); 1863f92157deSopenharmony_ci expected.push_back(2); 1864f92157deSopenharmony_ci expected.push_back(3); 1865f92157deSopenharmony_ci EXPECT_THAT(actual, UnorderedElementsAreArray(expected)); 1866f92157deSopenharmony_ci 1867f92157deSopenharmony_ci expected.push_back(4); 1868f92157deSopenharmony_ci EXPECT_THAT(actual, Not(UnorderedElementsAreArray(expected))); 1869f92157deSopenharmony_ci} 1870f92157deSopenharmony_ci 1871f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, TakesInitializerList) { 1872f92157deSopenharmony_ci const int a[5] = {2, 1, 4, 5, 3}; 1873f92157deSopenharmony_ci EXPECT_THAT(a, UnorderedElementsAreArray({1, 2, 3, 4, 5})); 1874f92157deSopenharmony_ci EXPECT_THAT(a, Not(UnorderedElementsAreArray({1, 2, 3, 4, 6}))); 1875f92157deSopenharmony_ci} 1876f92157deSopenharmony_ci 1877f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) { 1878f92157deSopenharmony_ci const std::string a[5] = {"a", "b", "c", "d", "e"}; 1879f92157deSopenharmony_ci EXPECT_THAT(a, UnorderedElementsAreArray({"a", "b", "c", "d", "e"})); 1880f92157deSopenharmony_ci EXPECT_THAT(a, Not(UnorderedElementsAreArray({"a", "b", "c", "d", "ef"}))); 1881f92157deSopenharmony_ci} 1882f92157deSopenharmony_ci 1883f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) { 1884f92157deSopenharmony_ci const int a[5] = {2, 1, 4, 5, 3}; 1885f92157deSopenharmony_ci EXPECT_THAT(a, 1886f92157deSopenharmony_ci UnorderedElementsAreArray({Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)})); 1887f92157deSopenharmony_ci EXPECT_THAT( 1888f92157deSopenharmony_ci a, Not(UnorderedElementsAreArray({Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)}))); 1889f92157deSopenharmony_ci} 1890f92157deSopenharmony_ci 1891f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, 1892f92157deSopenharmony_ci TakesInitializerListOfDifferentTypedMatchers) { 1893f92157deSopenharmony_ci const int a[5] = {2, 1, 4, 5, 3}; 1894f92157deSopenharmony_ci // The compiler cannot infer the type of the initializer list if its 1895f92157deSopenharmony_ci // elements have different types. We must explicitly specify the 1896f92157deSopenharmony_ci // unified element type in this case. 1897f92157deSopenharmony_ci EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int>>( 1898f92157deSopenharmony_ci {Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)})); 1899f92157deSopenharmony_ci EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int>>( 1900f92157deSopenharmony_ci {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)}))); 1901f92157deSopenharmony_ci} 1902f92157deSopenharmony_ci 1903f92157deSopenharmony_ciTEST(UnorderedElementsAreArrayTest, WorksWithMoveOnly) { 1904f92157deSopenharmony_ci ContainerHelper helper; 1905f92157deSopenharmony_ci EXPECT_CALL(helper, 1906f92157deSopenharmony_ci Call(UnorderedElementsAreArray({Pointee(1), Pointee(2)}))); 1907f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({2, 1})); 1908f92157deSopenharmony_ci} 1909f92157deSopenharmony_ci 1910f92157deSopenharmony_ciclass UnorderedElementsAreTest : public testing::Test { 1911f92157deSopenharmony_ci protected: 1912f92157deSopenharmony_ci typedef std::vector<int> IntVec; 1913f92157deSopenharmony_ci}; 1914f92157deSopenharmony_ci 1915f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, WorksWithUncopyable) { 1916f92157deSopenharmony_ci Uncopyable objs[2]; 1917f92157deSopenharmony_ci objs[0].set_value(-3); 1918f92157deSopenharmony_ci objs[1].set_value(1); 1919f92157deSopenharmony_ci EXPECT_THAT(objs, 1920f92157deSopenharmony_ci UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3))); 1921f92157deSopenharmony_ci} 1922f92157deSopenharmony_ci 1923f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) { 1924f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 1925f92157deSopenharmony_ci std::vector<int> s(std::begin(a), std::end(a)); 1926f92157deSopenharmony_ci do { 1927f92157deSopenharmony_ci StringMatchResultListener listener; 1928f92157deSopenharmony_ci EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), s, &listener)) 1929f92157deSopenharmony_ci << listener.str(); 1930f92157deSopenharmony_ci } while (std::next_permutation(s.begin(), s.end())); 1931f92157deSopenharmony_ci} 1932f92157deSopenharmony_ci 1933f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) { 1934f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 1935f92157deSopenharmony_ci std::vector<int> s(std::begin(a), std::end(a)); 1936f92157deSopenharmony_ci std::vector<Matcher<int>> mv; 1937f92157deSopenharmony_ci mv.push_back(1); 1938f92157deSopenharmony_ci mv.push_back(2); 1939f92157deSopenharmony_ci mv.push_back(2); 1940f92157deSopenharmony_ci // The element with value '3' matches nothing: fail fast. 1941f92157deSopenharmony_ci StringMatchResultListener listener; 1942f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv), s, &listener)) 1943f92157deSopenharmony_ci << listener.str(); 1944f92157deSopenharmony_ci} 1945f92157deSopenharmony_ci 1946f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, WorksForStreamlike) { 1947f92157deSopenharmony_ci // Streamlike 'container' provides only minimal iterator support. 1948f92157deSopenharmony_ci // Its iterators are tagged with input_iterator_tag, and it has no 1949f92157deSopenharmony_ci // size() or empty() methods. 1950f92157deSopenharmony_ci const int a[5] = {2, 1, 4, 5, 3}; 1951f92157deSopenharmony_ci Streamlike<int> s(std::begin(a), std::end(a)); 1952f92157deSopenharmony_ci 1953f92157deSopenharmony_ci EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5)); 1954f92157deSopenharmony_ci EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5))); 1955f92157deSopenharmony_ci} 1956f92157deSopenharmony_ci 1957f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, WorksWithMoveOnly) { 1958f92157deSopenharmony_ci ContainerHelper helper; 1959f92157deSopenharmony_ci EXPECT_CALL(helper, Call(UnorderedElementsAre(Pointee(1), Pointee(2)))); 1960f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({2, 1})); 1961f92157deSopenharmony_ci} 1962f92157deSopenharmony_ci 1963f92157deSopenharmony_ci// One naive implementation of the matcher runs in O(N!) time, which is too 1964f92157deSopenharmony_ci// slow for many real-world inputs. This test shows that our matcher can match 1965f92157deSopenharmony_ci// 100 inputs very quickly (a few milliseconds). An O(100!) is 10^158 1966f92157deSopenharmony_ci// iterations and obviously effectively incomputable. 1967f92157deSopenharmony_ci// [ RUN ] UnorderedElementsAreTest.Performance 1968f92157deSopenharmony_ci// [ OK ] UnorderedElementsAreTest.Performance (4 ms) 1969f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, Performance) { 1970f92157deSopenharmony_ci std::vector<int> s; 1971f92157deSopenharmony_ci std::vector<Matcher<int>> mv; 1972f92157deSopenharmony_ci for (int i = 0; i < 100; ++i) { 1973f92157deSopenharmony_ci s.push_back(i); 1974f92157deSopenharmony_ci mv.push_back(_); 1975f92157deSopenharmony_ci } 1976f92157deSopenharmony_ci mv[50] = Eq(0); 1977f92157deSopenharmony_ci StringMatchResultListener listener; 1978f92157deSopenharmony_ci EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv), s, &listener)) 1979f92157deSopenharmony_ci << listener.str(); 1980f92157deSopenharmony_ci} 1981f92157deSopenharmony_ci 1982f92157deSopenharmony_ci// Another variant of 'Performance' with similar expectations. 1983f92157deSopenharmony_ci// [ RUN ] UnorderedElementsAreTest.PerformanceHalfStrict 1984f92157deSopenharmony_ci// [ OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms) 1985f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) { 1986f92157deSopenharmony_ci std::vector<int> s; 1987f92157deSopenharmony_ci std::vector<Matcher<int>> mv; 1988f92157deSopenharmony_ci for (int i = 0; i < 100; ++i) { 1989f92157deSopenharmony_ci s.push_back(i); 1990f92157deSopenharmony_ci if (i & 1) { 1991f92157deSopenharmony_ci mv.push_back(_); 1992f92157deSopenharmony_ci } else { 1993f92157deSopenharmony_ci mv.push_back(i); 1994f92157deSopenharmony_ci } 1995f92157deSopenharmony_ci } 1996f92157deSopenharmony_ci StringMatchResultListener listener; 1997f92157deSopenharmony_ci EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv), s, &listener)) 1998f92157deSopenharmony_ci << listener.str(); 1999f92157deSopenharmony_ci} 2000f92157deSopenharmony_ci 2001f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, FailMessageCountWrong) { 2002f92157deSopenharmony_ci std::vector<int> v; 2003f92157deSopenharmony_ci v.push_back(4); 2004f92157deSopenharmony_ci StringMatchResultListener listener; 2005f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), v, &listener)) 2006f92157deSopenharmony_ci << listener.str(); 2007f92157deSopenharmony_ci EXPECT_THAT(listener.str(), Eq("which has 1 element")); 2008f92157deSopenharmony_ci} 2009f92157deSopenharmony_ci 2010f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) { 2011f92157deSopenharmony_ci std::vector<int> v; 2012f92157deSopenharmony_ci StringMatchResultListener listener; 2013f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), v, &listener)) 2014f92157deSopenharmony_ci << listener.str(); 2015f92157deSopenharmony_ci EXPECT_THAT(listener.str(), Eq("")); 2016f92157deSopenharmony_ci} 2017f92157deSopenharmony_ci 2018f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) { 2019f92157deSopenharmony_ci std::vector<int> v; 2020f92157deSopenharmony_ci v.push_back(1); 2021f92157deSopenharmony_ci v.push_back(1); 2022f92157deSopenharmony_ci StringMatchResultListener listener; 2023f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2), v, &listener)) 2024f92157deSopenharmony_ci << listener.str(); 2025f92157deSopenharmony_ci EXPECT_THAT(listener.str(), 2026f92157deSopenharmony_ci Eq("where the following matchers don't match any elements:\n" 2027f92157deSopenharmony_ci "matcher #1: is equal to 2")); 2028f92157deSopenharmony_ci} 2029f92157deSopenharmony_ci 2030f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) { 2031f92157deSopenharmony_ci std::vector<int> v; 2032f92157deSopenharmony_ci v.push_back(1); 2033f92157deSopenharmony_ci v.push_back(2); 2034f92157deSopenharmony_ci StringMatchResultListener listener; 2035f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1), v, &listener)) 2036f92157deSopenharmony_ci << listener.str(); 2037f92157deSopenharmony_ci EXPECT_THAT(listener.str(), 2038f92157deSopenharmony_ci Eq("where the following elements don't match any matchers:\n" 2039f92157deSopenharmony_ci "element #1: 2")); 2040f92157deSopenharmony_ci} 2041f92157deSopenharmony_ci 2042f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) { 2043f92157deSopenharmony_ci std::vector<int> v; 2044f92157deSopenharmony_ci v.push_back(2); 2045f92157deSopenharmony_ci v.push_back(3); 2046f92157deSopenharmony_ci StringMatchResultListener listener; 2047f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2), v, &listener)) 2048f92157deSopenharmony_ci << listener.str(); 2049f92157deSopenharmony_ci EXPECT_THAT(listener.str(), 2050f92157deSopenharmony_ci Eq("where" 2051f92157deSopenharmony_ci " the following matchers don't match any elements:\n" 2052f92157deSopenharmony_ci "matcher #0: is equal to 1\n" 2053f92157deSopenharmony_ci "and" 2054f92157deSopenharmony_ci " where" 2055f92157deSopenharmony_ci " the following elements don't match any matchers:\n" 2056f92157deSopenharmony_ci "element #1: 3")); 2057f92157deSopenharmony_ci} 2058f92157deSopenharmony_ci 2059f92157deSopenharmony_ci// Test helper for formatting element, matcher index pairs in expectations. 2060f92157deSopenharmony_cistatic std::string EMString(int element, int matcher) { 2061f92157deSopenharmony_ci stringstream ss; 2062f92157deSopenharmony_ci ss << "(element #" << element << ", matcher #" << matcher << ")"; 2063f92157deSopenharmony_ci return ss.str(); 2064f92157deSopenharmony_ci} 2065f92157deSopenharmony_ci 2066f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) { 2067f92157deSopenharmony_ci // A situation where all elements and matchers have a match 2068f92157deSopenharmony_ci // associated with them, but the max matching is not perfect. 2069f92157deSopenharmony_ci std::vector<std::string> v; 2070f92157deSopenharmony_ci v.push_back("a"); 2071f92157deSopenharmony_ci v.push_back("b"); 2072f92157deSopenharmony_ci v.push_back("c"); 2073f92157deSopenharmony_ci StringMatchResultListener listener; 2074f92157deSopenharmony_ci EXPECT_FALSE(ExplainMatchResult( 2075f92157deSopenharmony_ci UnorderedElementsAre("a", "a", AnyOf("b", "c")), v, &listener)) 2076f92157deSopenharmony_ci << listener.str(); 2077f92157deSopenharmony_ci 2078f92157deSopenharmony_ci std::string prefix = 2079f92157deSopenharmony_ci "where no permutation of the elements can satisfy all matchers, " 2080f92157deSopenharmony_ci "and the closest match is 2 of 3 matchers with the " 2081f92157deSopenharmony_ci "pairings:\n"; 2082f92157deSopenharmony_ci 2083f92157deSopenharmony_ci // We have to be a bit loose here, because there are 4 valid max matches. 2084f92157deSopenharmony_ci EXPECT_THAT( 2085f92157deSopenharmony_ci listener.str(), 2086f92157deSopenharmony_ci AnyOf( 2087f92157deSopenharmony_ci prefix + "{\n " + EMString(0, 0) + ",\n " + EMString(1, 2) + "\n}", 2088f92157deSopenharmony_ci prefix + "{\n " + EMString(0, 1) + ",\n " + EMString(1, 2) + "\n}", 2089f92157deSopenharmony_ci prefix + "{\n " + EMString(0, 0) + ",\n " + EMString(2, 2) + "\n}", 2090f92157deSopenharmony_ci prefix + "{\n " + EMString(0, 1) + ",\n " + EMString(2, 2) + 2091f92157deSopenharmony_ci "\n}")); 2092f92157deSopenharmony_ci} 2093f92157deSopenharmony_ci 2094f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, Describe) { 2095f92157deSopenharmony_ci EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()), Eq("is empty")); 2096f92157deSopenharmony_ci EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre(345)), 2097f92157deSopenharmony_ci Eq("has 1 element and that element is equal to 345")); 2098f92157deSopenharmony_ci EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre(111, 222, 333)), 2099f92157deSopenharmony_ci Eq("has 3 elements and there exists some permutation " 2100f92157deSopenharmony_ci "of elements such that:\n" 2101f92157deSopenharmony_ci " - element #0 is equal to 111, and\n" 2102f92157deSopenharmony_ci " - element #1 is equal to 222, and\n" 2103f92157deSopenharmony_ci " - element #2 is equal to 333")); 2104f92157deSopenharmony_ci} 2105f92157deSopenharmony_ci 2106f92157deSopenharmony_ciTEST_F(UnorderedElementsAreTest, DescribeNegation) { 2107f92157deSopenharmony_ci EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()), 2108f92157deSopenharmony_ci Eq("isn't empty")); 2109f92157deSopenharmony_ci EXPECT_THAT( 2110f92157deSopenharmony_ci DescribeNegation<IntVec>(UnorderedElementsAre(345)), 2111f92157deSopenharmony_ci Eq("doesn't have 1 element, or has 1 element that isn't equal to 345")); 2112f92157deSopenharmony_ci EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)), 2113f92157deSopenharmony_ci Eq("doesn't have 3 elements, or there exists no permutation " 2114f92157deSopenharmony_ci "of elements such that:\n" 2115f92157deSopenharmony_ci " - element #0 is equal to 123, and\n" 2116f92157deSopenharmony_ci " - element #1 is equal to 234, and\n" 2117f92157deSopenharmony_ci " - element #2 is equal to 345")); 2118f92157deSopenharmony_ci} 2119f92157deSopenharmony_ci 2120f92157deSopenharmony_ci// Tests Each(). 2121f92157deSopenharmony_ci 2122f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(EachTest); 2123f92157deSopenharmony_ci 2124f92157deSopenharmony_ciTEST_P(EachTestP, ExplainsMatchResultCorrectly) { 2125f92157deSopenharmony_ci set<int> a; // empty 2126f92157deSopenharmony_ci 2127f92157deSopenharmony_ci Matcher<set<int>> m = Each(2); 2128f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, a)); 2129f92157deSopenharmony_ci 2130f92157deSopenharmony_ci Matcher<const int(&)[1]> n = Each(1); // NOLINT 2131f92157deSopenharmony_ci 2132f92157deSopenharmony_ci const int b[1] = {1}; 2133f92157deSopenharmony_ci EXPECT_EQ("", Explain(n, b)); 2134f92157deSopenharmony_ci 2135f92157deSopenharmony_ci n = Each(3); 2136f92157deSopenharmony_ci EXPECT_EQ("whose element #0 doesn't match", Explain(n, b)); 2137f92157deSopenharmony_ci 2138f92157deSopenharmony_ci a.insert(1); 2139f92157deSopenharmony_ci a.insert(2); 2140f92157deSopenharmony_ci a.insert(3); 2141f92157deSopenharmony_ci m = Each(GreaterThan(0)); 2142f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, a)); 2143f92157deSopenharmony_ci 2144f92157deSopenharmony_ci m = Each(GreaterThan(10)); 2145f92157deSopenharmony_ci EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10", 2146f92157deSopenharmony_ci Explain(m, a)); 2147f92157deSopenharmony_ci} 2148f92157deSopenharmony_ci 2149f92157deSopenharmony_ciTEST(EachTest, DescribesItselfCorrectly) { 2150f92157deSopenharmony_ci Matcher<vector<int>> m = Each(1); 2151f92157deSopenharmony_ci EXPECT_EQ("only contains elements that is equal to 1", Describe(m)); 2152f92157deSopenharmony_ci 2153f92157deSopenharmony_ci Matcher<vector<int>> m2 = Not(m); 2154f92157deSopenharmony_ci EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2)); 2155f92157deSopenharmony_ci} 2156f92157deSopenharmony_ci 2157f92157deSopenharmony_ciTEST(EachTest, MatchesVectorWhenAllElementsMatch) { 2158f92157deSopenharmony_ci vector<int> some_vector; 2159f92157deSopenharmony_ci EXPECT_THAT(some_vector, Each(1)); 2160f92157deSopenharmony_ci some_vector.push_back(3); 2161f92157deSopenharmony_ci EXPECT_THAT(some_vector, Not(Each(1))); 2162f92157deSopenharmony_ci EXPECT_THAT(some_vector, Each(3)); 2163f92157deSopenharmony_ci some_vector.push_back(1); 2164f92157deSopenharmony_ci some_vector.push_back(2); 2165f92157deSopenharmony_ci EXPECT_THAT(some_vector, Not(Each(3))); 2166f92157deSopenharmony_ci EXPECT_THAT(some_vector, Each(Lt(3.5))); 2167f92157deSopenharmony_ci 2168f92157deSopenharmony_ci vector<std::string> another_vector; 2169f92157deSopenharmony_ci another_vector.push_back("fee"); 2170f92157deSopenharmony_ci EXPECT_THAT(another_vector, Each(std::string("fee"))); 2171f92157deSopenharmony_ci another_vector.push_back("fie"); 2172f92157deSopenharmony_ci another_vector.push_back("foe"); 2173f92157deSopenharmony_ci another_vector.push_back("fum"); 2174f92157deSopenharmony_ci EXPECT_THAT(another_vector, Not(Each(std::string("fee")))); 2175f92157deSopenharmony_ci} 2176f92157deSopenharmony_ci 2177f92157deSopenharmony_ciTEST(EachTest, MatchesMapWhenAllElementsMatch) { 2178f92157deSopenharmony_ci map<const char*, int> my_map; 2179f92157deSopenharmony_ci const char* bar = "a string"; 2180f92157deSopenharmony_ci my_map[bar] = 2; 2181f92157deSopenharmony_ci EXPECT_THAT(my_map, Each(make_pair(bar, 2))); 2182f92157deSopenharmony_ci 2183f92157deSopenharmony_ci map<std::string, int> another_map; 2184f92157deSopenharmony_ci EXPECT_THAT(another_map, Each(make_pair(std::string("fee"), 1))); 2185f92157deSopenharmony_ci another_map["fee"] = 1; 2186f92157deSopenharmony_ci EXPECT_THAT(another_map, Each(make_pair(std::string("fee"), 1))); 2187f92157deSopenharmony_ci another_map["fie"] = 2; 2188f92157deSopenharmony_ci another_map["foe"] = 3; 2189f92157deSopenharmony_ci another_map["fum"] = 4; 2190f92157deSopenharmony_ci EXPECT_THAT(another_map, Not(Each(make_pair(std::string("fee"), 1)))); 2191f92157deSopenharmony_ci EXPECT_THAT(another_map, Not(Each(make_pair(std::string("fum"), 1)))); 2192f92157deSopenharmony_ci EXPECT_THAT(another_map, Each(Pair(_, Gt(0)))); 2193f92157deSopenharmony_ci} 2194f92157deSopenharmony_ci 2195f92157deSopenharmony_ciTEST(EachTest, AcceptsMatcher) { 2196f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 2197f92157deSopenharmony_ci EXPECT_THAT(a, Each(Gt(0))); 2198f92157deSopenharmony_ci EXPECT_THAT(a, Not(Each(Gt(1)))); 2199f92157deSopenharmony_ci} 2200f92157deSopenharmony_ci 2201f92157deSopenharmony_ciTEST(EachTest, WorksForNativeArrayAsTuple) { 2202f92157deSopenharmony_ci const int a[] = {1, 2}; 2203f92157deSopenharmony_ci const int* const pointer = a; 2204f92157deSopenharmony_ci EXPECT_THAT(std::make_tuple(pointer, 2), Each(Gt(0))); 2205f92157deSopenharmony_ci EXPECT_THAT(std::make_tuple(pointer, 2), Not(Each(Gt(1)))); 2206f92157deSopenharmony_ci} 2207f92157deSopenharmony_ci 2208f92157deSopenharmony_ciTEST(EachTest, WorksWithMoveOnly) { 2209f92157deSopenharmony_ci ContainerHelper helper; 2210f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Each(Pointee(Gt(0))))); 2211f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1, 2})); 2212f92157deSopenharmony_ci} 2213f92157deSopenharmony_ci 2214f92157deSopenharmony_ci// For testing Pointwise(). 2215f92157deSopenharmony_ciclass IsHalfOfMatcher { 2216f92157deSopenharmony_ci public: 2217f92157deSopenharmony_ci template <typename T1, typename T2> 2218f92157deSopenharmony_ci bool MatchAndExplain(const std::tuple<T1, T2>& a_pair, 2219f92157deSopenharmony_ci MatchResultListener* listener) const { 2220f92157deSopenharmony_ci if (std::get<0>(a_pair) == std::get<1>(a_pair) / 2) { 2221f92157deSopenharmony_ci *listener << "where the second is " << std::get<1>(a_pair); 2222f92157deSopenharmony_ci return true; 2223f92157deSopenharmony_ci } else { 2224f92157deSopenharmony_ci *listener << "where the second/2 is " << std::get<1>(a_pair) / 2; 2225f92157deSopenharmony_ci return false; 2226f92157deSopenharmony_ci } 2227f92157deSopenharmony_ci } 2228f92157deSopenharmony_ci 2229f92157deSopenharmony_ci void DescribeTo(ostream* os) const { 2230f92157deSopenharmony_ci *os << "are a pair where the first is half of the second"; 2231f92157deSopenharmony_ci } 2232f92157deSopenharmony_ci 2233f92157deSopenharmony_ci void DescribeNegationTo(ostream* os) const { 2234f92157deSopenharmony_ci *os << "are a pair where the first isn't half of the second"; 2235f92157deSopenharmony_ci } 2236f92157deSopenharmony_ci}; 2237f92157deSopenharmony_ci 2238f92157deSopenharmony_ciPolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() { 2239f92157deSopenharmony_ci return MakePolymorphicMatcher(IsHalfOfMatcher()); 2240f92157deSopenharmony_ci} 2241f92157deSopenharmony_ci 2242f92157deSopenharmony_ciTEST(PointwiseTest, DescribesSelf) { 2243f92157deSopenharmony_ci vector<int> rhs; 2244f92157deSopenharmony_ci rhs.push_back(1); 2245f92157deSopenharmony_ci rhs.push_back(2); 2246f92157deSopenharmony_ci rhs.push_back(3); 2247f92157deSopenharmony_ci const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs); 2248f92157deSopenharmony_ci EXPECT_EQ( 2249f92157deSopenharmony_ci "contains 3 values, where each value and its corresponding value " 2250f92157deSopenharmony_ci "in { 1, 2, 3 } are a pair where the first is half of the second", 2251f92157deSopenharmony_ci Describe(m)); 2252f92157deSopenharmony_ci EXPECT_EQ( 2253f92157deSopenharmony_ci "doesn't contain exactly 3 values, or contains a value x at some " 2254f92157deSopenharmony_ci "index i where x and the i-th value of { 1, 2, 3 } are a pair " 2255f92157deSopenharmony_ci "where the first isn't half of the second", 2256f92157deSopenharmony_ci DescribeNegation(m)); 2257f92157deSopenharmony_ci} 2258f92157deSopenharmony_ci 2259f92157deSopenharmony_ciTEST(PointwiseTest, MakesCopyOfRhs) { 2260f92157deSopenharmony_ci list<signed char> rhs; 2261f92157deSopenharmony_ci rhs.push_back(2); 2262f92157deSopenharmony_ci rhs.push_back(4); 2263f92157deSopenharmony_ci 2264f92157deSopenharmony_ci int lhs[] = {1, 2}; 2265f92157deSopenharmony_ci const Matcher<const int(&)[2]> m = Pointwise(IsHalfOf(), rhs); 2266f92157deSopenharmony_ci EXPECT_THAT(lhs, m); 2267f92157deSopenharmony_ci 2268f92157deSopenharmony_ci // Changing rhs now shouldn't affect m, which made a copy of rhs. 2269f92157deSopenharmony_ci rhs.push_back(6); 2270f92157deSopenharmony_ci EXPECT_THAT(lhs, m); 2271f92157deSopenharmony_ci} 2272f92157deSopenharmony_ci 2273f92157deSopenharmony_ciTEST(PointwiseTest, WorksForLhsNativeArray) { 2274f92157deSopenharmony_ci const int lhs[] = {1, 2, 3}; 2275f92157deSopenharmony_ci vector<int> rhs; 2276f92157deSopenharmony_ci rhs.push_back(2); 2277f92157deSopenharmony_ci rhs.push_back(4); 2278f92157deSopenharmony_ci rhs.push_back(6); 2279f92157deSopenharmony_ci EXPECT_THAT(lhs, Pointwise(Lt(), rhs)); 2280f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 2281f92157deSopenharmony_ci} 2282f92157deSopenharmony_ci 2283f92157deSopenharmony_ciTEST(PointwiseTest, WorksForRhsNativeArray) { 2284f92157deSopenharmony_ci const int rhs[] = {1, 2, 3}; 2285f92157deSopenharmony_ci vector<int> lhs; 2286f92157deSopenharmony_ci lhs.push_back(2); 2287f92157deSopenharmony_ci lhs.push_back(4); 2288f92157deSopenharmony_ci lhs.push_back(6); 2289f92157deSopenharmony_ci EXPECT_THAT(lhs, Pointwise(Gt(), rhs)); 2290f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs))); 2291f92157deSopenharmony_ci} 2292f92157deSopenharmony_ci 2293f92157deSopenharmony_ci// Test is effective only with sanitizers. 2294f92157deSopenharmony_ciTEST(PointwiseTest, WorksForVectorOfBool) { 2295f92157deSopenharmony_ci vector<bool> rhs(3, false); 2296f92157deSopenharmony_ci rhs[1] = true; 2297f92157deSopenharmony_ci vector<bool> lhs = rhs; 2298f92157deSopenharmony_ci EXPECT_THAT(lhs, Pointwise(Eq(), rhs)); 2299f92157deSopenharmony_ci rhs[0] = true; 2300f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(Pointwise(Eq(), rhs))); 2301f92157deSopenharmony_ci} 2302f92157deSopenharmony_ci 2303f92157deSopenharmony_ciTEST(PointwiseTest, WorksForRhsInitializerList) { 2304f92157deSopenharmony_ci const vector<int> lhs{2, 4, 6}; 2305f92157deSopenharmony_ci EXPECT_THAT(lhs, Pointwise(Gt(), {1, 2, 3})); 2306f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(Pointwise(Lt(), {3, 3, 7}))); 2307f92157deSopenharmony_ci} 2308f92157deSopenharmony_ci 2309f92157deSopenharmony_ciTEST(PointwiseTest, RejectsWrongSize) { 2310f92157deSopenharmony_ci const double lhs[2] = {1, 2}; 2311f92157deSopenharmony_ci const int rhs[1] = {0}; 2312f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 2313f92157deSopenharmony_ci EXPECT_EQ("which contains 2 values", Explain(Pointwise(Gt(), rhs), lhs)); 2314f92157deSopenharmony_ci 2315f92157deSopenharmony_ci const int rhs2[3] = {0, 1, 2}; 2316f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2))); 2317f92157deSopenharmony_ci} 2318f92157deSopenharmony_ci 2319f92157deSopenharmony_ciTEST(PointwiseTest, RejectsWrongContent) { 2320f92157deSopenharmony_ci const double lhs[3] = {1, 2, 3}; 2321f92157deSopenharmony_ci const int rhs[3] = {2, 6, 4}; 2322f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs))); 2323f92157deSopenharmony_ci EXPECT_EQ( 2324f92157deSopenharmony_ci "where the value pair (2, 6) at index #1 don't match, " 2325f92157deSopenharmony_ci "where the second/2 is 3", 2326f92157deSopenharmony_ci Explain(Pointwise(IsHalfOf(), rhs), lhs)); 2327f92157deSopenharmony_ci} 2328f92157deSopenharmony_ci 2329f92157deSopenharmony_ciTEST(PointwiseTest, AcceptsCorrectContent) { 2330f92157deSopenharmony_ci const double lhs[3] = {1, 2, 3}; 2331f92157deSopenharmony_ci const int rhs[3] = {2, 4, 6}; 2332f92157deSopenharmony_ci EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs)); 2333f92157deSopenharmony_ci EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs)); 2334f92157deSopenharmony_ci} 2335f92157deSopenharmony_ci 2336f92157deSopenharmony_ciTEST(PointwiseTest, AllowsMonomorphicInnerMatcher) { 2337f92157deSopenharmony_ci const double lhs[3] = {1, 2, 3}; 2338f92157deSopenharmony_ci const int rhs[3] = {2, 4, 6}; 2339f92157deSopenharmony_ci const Matcher<std::tuple<const double&, const int&>> m1 = IsHalfOf(); 2340f92157deSopenharmony_ci EXPECT_THAT(lhs, Pointwise(m1, rhs)); 2341f92157deSopenharmony_ci EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs)); 2342f92157deSopenharmony_ci 2343f92157deSopenharmony_ci // This type works as a std::tuple<const double&, const int&> can be 2344f92157deSopenharmony_ci // implicitly cast to std::tuple<double, int>. 2345f92157deSopenharmony_ci const Matcher<std::tuple<double, int>> m2 = IsHalfOf(); 2346f92157deSopenharmony_ci EXPECT_THAT(lhs, Pointwise(m2, rhs)); 2347f92157deSopenharmony_ci EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs)); 2348f92157deSopenharmony_ci} 2349f92157deSopenharmony_ci 2350f92157deSopenharmony_ciMATCHER(PointeeEquals, "Points to an equal value") { 2351f92157deSopenharmony_ci return ExplainMatchResult(::testing::Pointee(::testing::get<1>(arg)), 2352f92157deSopenharmony_ci ::testing::get<0>(arg), result_listener); 2353f92157deSopenharmony_ci} 2354f92157deSopenharmony_ci 2355f92157deSopenharmony_ciTEST(PointwiseTest, WorksWithMoveOnly) { 2356f92157deSopenharmony_ci ContainerHelper helper; 2357f92157deSopenharmony_ci EXPECT_CALL(helper, Call(Pointwise(PointeeEquals(), std::vector<int>{1, 2}))); 2358f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({1, 2})); 2359f92157deSopenharmony_ci} 2360f92157deSopenharmony_ci 2361f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, DescribesSelf) { 2362f92157deSopenharmony_ci vector<int> rhs; 2363f92157deSopenharmony_ci rhs.push_back(1); 2364f92157deSopenharmony_ci rhs.push_back(2); 2365f92157deSopenharmony_ci rhs.push_back(3); 2366f92157deSopenharmony_ci const Matcher<const vector<int>&> m = UnorderedPointwise(IsHalfOf(), rhs); 2367f92157deSopenharmony_ci EXPECT_EQ( 2368f92157deSopenharmony_ci "has 3 elements and there exists some permutation of elements such " 2369f92157deSopenharmony_ci "that:\n" 2370f92157deSopenharmony_ci " - element #0 and 1 are a pair where the first is half of the second, " 2371f92157deSopenharmony_ci "and\n" 2372f92157deSopenharmony_ci " - element #1 and 2 are a pair where the first is half of the second, " 2373f92157deSopenharmony_ci "and\n" 2374f92157deSopenharmony_ci " - element #2 and 3 are a pair where the first is half of the second", 2375f92157deSopenharmony_ci Describe(m)); 2376f92157deSopenharmony_ci EXPECT_EQ( 2377f92157deSopenharmony_ci "doesn't have 3 elements, or there exists no permutation of elements " 2378f92157deSopenharmony_ci "such that:\n" 2379f92157deSopenharmony_ci " - element #0 and 1 are a pair where the first is half of the second, " 2380f92157deSopenharmony_ci "and\n" 2381f92157deSopenharmony_ci " - element #1 and 2 are a pair where the first is half of the second, " 2382f92157deSopenharmony_ci "and\n" 2383f92157deSopenharmony_ci " - element #2 and 3 are a pair where the first is half of the second", 2384f92157deSopenharmony_ci DescribeNegation(m)); 2385f92157deSopenharmony_ci} 2386f92157deSopenharmony_ci 2387f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, MakesCopyOfRhs) { 2388f92157deSopenharmony_ci list<signed char> rhs; 2389f92157deSopenharmony_ci rhs.push_back(2); 2390f92157deSopenharmony_ci rhs.push_back(4); 2391f92157deSopenharmony_ci 2392f92157deSopenharmony_ci int lhs[] = {2, 1}; 2393f92157deSopenharmony_ci const Matcher<const int(&)[2]> m = UnorderedPointwise(IsHalfOf(), rhs); 2394f92157deSopenharmony_ci EXPECT_THAT(lhs, m); 2395f92157deSopenharmony_ci 2396f92157deSopenharmony_ci // Changing rhs now shouldn't affect m, which made a copy of rhs. 2397f92157deSopenharmony_ci rhs.push_back(6); 2398f92157deSopenharmony_ci EXPECT_THAT(lhs, m); 2399f92157deSopenharmony_ci} 2400f92157deSopenharmony_ci 2401f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, WorksForLhsNativeArray) { 2402f92157deSopenharmony_ci const int lhs[] = {1, 2, 3}; 2403f92157deSopenharmony_ci vector<int> rhs; 2404f92157deSopenharmony_ci rhs.push_back(4); 2405f92157deSopenharmony_ci rhs.push_back(6); 2406f92157deSopenharmony_ci rhs.push_back(2); 2407f92157deSopenharmony_ci EXPECT_THAT(lhs, UnorderedPointwise(Lt(), rhs)); 2408f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs))); 2409f92157deSopenharmony_ci} 2410f92157deSopenharmony_ci 2411f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, WorksForRhsNativeArray) { 2412f92157deSopenharmony_ci const int rhs[] = {1, 2, 3}; 2413f92157deSopenharmony_ci vector<int> lhs; 2414f92157deSopenharmony_ci lhs.push_back(4); 2415f92157deSopenharmony_ci lhs.push_back(2); 2416f92157deSopenharmony_ci lhs.push_back(6); 2417f92157deSopenharmony_ci EXPECT_THAT(lhs, UnorderedPointwise(Gt(), rhs)); 2418f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), rhs))); 2419f92157deSopenharmony_ci} 2420f92157deSopenharmony_ci 2421f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, WorksForRhsInitializerList) { 2422f92157deSopenharmony_ci const vector<int> lhs{2, 4, 6}; 2423f92157deSopenharmony_ci EXPECT_THAT(lhs, UnorderedPointwise(Gt(), {5, 1, 3})); 2424f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), {1, 1, 7}))); 2425f92157deSopenharmony_ci} 2426f92157deSopenharmony_ci 2427f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, RejectsWrongSize) { 2428f92157deSopenharmony_ci const double lhs[2] = {1, 2}; 2429f92157deSopenharmony_ci const int rhs[1] = {0}; 2430f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs))); 2431f92157deSopenharmony_ci EXPECT_EQ("which has 2 elements", 2432f92157deSopenharmony_ci Explain(UnorderedPointwise(Gt(), rhs), lhs)); 2433f92157deSopenharmony_ci 2434f92157deSopenharmony_ci const int rhs2[3] = {0, 1, 2}; 2435f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs2))); 2436f92157deSopenharmony_ci} 2437f92157deSopenharmony_ci 2438f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, RejectsWrongContent) { 2439f92157deSopenharmony_ci const double lhs[3] = {1, 2, 3}; 2440f92157deSopenharmony_ci const int rhs[3] = {2, 6, 6}; 2441f92157deSopenharmony_ci EXPECT_THAT(lhs, Not(UnorderedPointwise(IsHalfOf(), rhs))); 2442f92157deSopenharmony_ci EXPECT_EQ( 2443f92157deSopenharmony_ci "where the following elements don't match any matchers:\n" 2444f92157deSopenharmony_ci "element #1: 2", 2445f92157deSopenharmony_ci Explain(UnorderedPointwise(IsHalfOf(), rhs), lhs)); 2446f92157deSopenharmony_ci} 2447f92157deSopenharmony_ci 2448f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, AcceptsCorrectContentInSameOrder) { 2449f92157deSopenharmony_ci const double lhs[3] = {1, 2, 3}; 2450f92157deSopenharmony_ci const int rhs[3] = {2, 4, 6}; 2451f92157deSopenharmony_ci EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs)); 2452f92157deSopenharmony_ci} 2453f92157deSopenharmony_ci 2454f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, AcceptsCorrectContentInDifferentOrder) { 2455f92157deSopenharmony_ci const double lhs[3] = {1, 2, 3}; 2456f92157deSopenharmony_ci const int rhs[3] = {6, 4, 2}; 2457f92157deSopenharmony_ci EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs)); 2458f92157deSopenharmony_ci} 2459f92157deSopenharmony_ci 2460f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) { 2461f92157deSopenharmony_ci const double lhs[3] = {1, 2, 3}; 2462f92157deSopenharmony_ci const int rhs[3] = {4, 6, 2}; 2463f92157deSopenharmony_ci const Matcher<std::tuple<const double&, const int&>> m1 = IsHalfOf(); 2464f92157deSopenharmony_ci EXPECT_THAT(lhs, UnorderedPointwise(m1, rhs)); 2465f92157deSopenharmony_ci 2466f92157deSopenharmony_ci // This type works as a std::tuple<const double&, const int&> can be 2467f92157deSopenharmony_ci // implicitly cast to std::tuple<double, int>. 2468f92157deSopenharmony_ci const Matcher<std::tuple<double, int>> m2 = IsHalfOf(); 2469f92157deSopenharmony_ci EXPECT_THAT(lhs, UnorderedPointwise(m2, rhs)); 2470f92157deSopenharmony_ci} 2471f92157deSopenharmony_ci 2472f92157deSopenharmony_ciTEST(UnorderedPointwiseTest, WorksWithMoveOnly) { 2473f92157deSopenharmony_ci ContainerHelper helper; 2474f92157deSopenharmony_ci EXPECT_CALL(helper, Call(UnorderedPointwise(PointeeEquals(), 2475f92157deSopenharmony_ci std::vector<int>{1, 2}))); 2476f92157deSopenharmony_ci helper.Call(MakeUniquePtrs({2, 1})); 2477f92157deSopenharmony_ci} 2478f92157deSopenharmony_ci 2479f92157deSopenharmony_ciTEST(PointeeTest, WorksOnMoveOnlyType) { 2480f92157deSopenharmony_ci std::unique_ptr<int> p(new int(3)); 2481f92157deSopenharmony_ci EXPECT_THAT(p, Pointee(Eq(3))); 2482f92157deSopenharmony_ci EXPECT_THAT(p, Not(Pointee(Eq(2)))); 2483f92157deSopenharmony_ci} 2484f92157deSopenharmony_ci 2485f92157deSopenharmony_ciclass PredicateFormatterFromMatcherTest : public ::testing::Test { 2486f92157deSopenharmony_ci protected: 2487f92157deSopenharmony_ci enum Behavior { kInitialSuccess, kAlwaysFail, kFlaky }; 2488f92157deSopenharmony_ci 2489f92157deSopenharmony_ci // A matcher that can return different results when used multiple times on the 2490f92157deSopenharmony_ci // same input. No real matcher should do this; but this lets us test that we 2491f92157deSopenharmony_ci // detect such behavior and fail appropriately. 2492f92157deSopenharmony_ci class MockMatcher : public MatcherInterface<Behavior> { 2493f92157deSopenharmony_ci public: 2494f92157deSopenharmony_ci bool MatchAndExplain(Behavior behavior, 2495f92157deSopenharmony_ci MatchResultListener* listener) const override { 2496f92157deSopenharmony_ci *listener << "[MatchAndExplain]"; 2497f92157deSopenharmony_ci switch (behavior) { 2498f92157deSopenharmony_ci case kInitialSuccess: 2499f92157deSopenharmony_ci // The first call to MatchAndExplain should use a "not interested" 2500f92157deSopenharmony_ci // listener; so this is expected to return |true|. There should be no 2501f92157deSopenharmony_ci // subsequent calls. 2502f92157deSopenharmony_ci return !listener->IsInterested(); 2503f92157deSopenharmony_ci 2504f92157deSopenharmony_ci case kAlwaysFail: 2505f92157deSopenharmony_ci return false; 2506f92157deSopenharmony_ci 2507f92157deSopenharmony_ci case kFlaky: 2508f92157deSopenharmony_ci // The first call to MatchAndExplain should use a "not interested" 2509f92157deSopenharmony_ci // listener; so this will return |false|. Subsequent calls should have 2510f92157deSopenharmony_ci // an "interested" listener; so this will return |true|, thus 2511f92157deSopenharmony_ci // simulating a flaky matcher. 2512f92157deSopenharmony_ci return listener->IsInterested(); 2513f92157deSopenharmony_ci } 2514f92157deSopenharmony_ci 2515f92157deSopenharmony_ci GTEST_LOG_(FATAL) << "This should never be reached"; 2516f92157deSopenharmony_ci return false; 2517f92157deSopenharmony_ci } 2518f92157deSopenharmony_ci 2519f92157deSopenharmony_ci void DescribeTo(ostream* os) const override { *os << "[DescribeTo]"; } 2520f92157deSopenharmony_ci 2521f92157deSopenharmony_ci void DescribeNegationTo(ostream* os) const override { 2522f92157deSopenharmony_ci *os << "[DescribeNegationTo]"; 2523f92157deSopenharmony_ci } 2524f92157deSopenharmony_ci }; 2525f92157deSopenharmony_ci 2526f92157deSopenharmony_ci AssertionResult RunPredicateFormatter(Behavior behavior) { 2527f92157deSopenharmony_ci auto matcher = MakeMatcher(new MockMatcher); 2528f92157deSopenharmony_ci PredicateFormatterFromMatcher<Matcher<Behavior>> predicate_formatter( 2529f92157deSopenharmony_ci matcher); 2530f92157deSopenharmony_ci return predicate_formatter("dummy-name", behavior); 2531f92157deSopenharmony_ci } 2532f92157deSopenharmony_ci}; 2533f92157deSopenharmony_ci 2534f92157deSopenharmony_ciTEST_F(PredicateFormatterFromMatcherTest, ShortCircuitOnSuccess) { 2535f92157deSopenharmony_ci AssertionResult result = RunPredicateFormatter(kInitialSuccess); 2536f92157deSopenharmony_ci EXPECT_TRUE(result); // Implicit cast to bool. 2537f92157deSopenharmony_ci std::string expect; 2538f92157deSopenharmony_ci EXPECT_EQ(expect, result.message()); 2539f92157deSopenharmony_ci} 2540f92157deSopenharmony_ci 2541f92157deSopenharmony_ciTEST_F(PredicateFormatterFromMatcherTest, NoShortCircuitOnFailure) { 2542f92157deSopenharmony_ci AssertionResult result = RunPredicateFormatter(kAlwaysFail); 2543f92157deSopenharmony_ci EXPECT_FALSE(result); // Implicit cast to bool. 2544f92157deSopenharmony_ci std::string expect = 2545f92157deSopenharmony_ci "Value of: dummy-name\nExpected: [DescribeTo]\n" 2546f92157deSopenharmony_ci " Actual: 1" + 2547f92157deSopenharmony_ci OfType(internal::GetTypeName<Behavior>()) + ", [MatchAndExplain]"; 2548f92157deSopenharmony_ci EXPECT_EQ(expect, result.message()); 2549f92157deSopenharmony_ci} 2550f92157deSopenharmony_ci 2551f92157deSopenharmony_ciTEST_F(PredicateFormatterFromMatcherTest, DetectsFlakyShortCircuit) { 2552f92157deSopenharmony_ci AssertionResult result = RunPredicateFormatter(kFlaky); 2553f92157deSopenharmony_ci EXPECT_FALSE(result); // Implicit cast to bool. 2554f92157deSopenharmony_ci std::string expect = 2555f92157deSopenharmony_ci "Value of: dummy-name\nExpected: [DescribeTo]\n" 2556f92157deSopenharmony_ci " The matcher failed on the initial attempt; but passed when rerun to " 2557f92157deSopenharmony_ci "generate the explanation.\n" 2558f92157deSopenharmony_ci " Actual: 2" + 2559f92157deSopenharmony_ci OfType(internal::GetTypeName<Behavior>()) + ", [MatchAndExplain]"; 2560f92157deSopenharmony_ci EXPECT_EQ(expect, result.message()); 2561f92157deSopenharmony_ci} 2562f92157deSopenharmony_ci 2563f92157deSopenharmony_ci// Tests for ElementsAre(). 2564f92157deSopenharmony_ci 2565f92157deSopenharmony_ciTEST(ElementsAreTest, CanDescribeExpectingNoElement) { 2566f92157deSopenharmony_ci Matcher<const vector<int>&> m = ElementsAre(); 2567f92157deSopenharmony_ci EXPECT_EQ("is empty", Describe(m)); 2568f92157deSopenharmony_ci} 2569f92157deSopenharmony_ci 2570f92157deSopenharmony_ciTEST(ElementsAreTest, CanDescribeExpectingOneElement) { 2571f92157deSopenharmony_ci Matcher<vector<int>> m = ElementsAre(Gt(5)); 2572f92157deSopenharmony_ci EXPECT_EQ("has 1 element that is > 5", Describe(m)); 2573f92157deSopenharmony_ci} 2574f92157deSopenharmony_ci 2575f92157deSopenharmony_ciTEST(ElementsAreTest, CanDescribeExpectingManyElements) { 2576f92157deSopenharmony_ci Matcher<list<std::string>> m = ElementsAre(StrEq("one"), "two"); 2577f92157deSopenharmony_ci EXPECT_EQ( 2578f92157deSopenharmony_ci "has 2 elements where\n" 2579f92157deSopenharmony_ci "element #0 is equal to \"one\",\n" 2580f92157deSopenharmony_ci "element #1 is equal to \"two\"", 2581f92157deSopenharmony_ci Describe(m)); 2582f92157deSopenharmony_ci} 2583f92157deSopenharmony_ci 2584f92157deSopenharmony_ciTEST(ElementsAreTest, CanDescribeNegationOfExpectingNoElement) { 2585f92157deSopenharmony_ci Matcher<vector<int>> m = ElementsAre(); 2586f92157deSopenharmony_ci EXPECT_EQ("isn't empty", DescribeNegation(m)); 2587f92157deSopenharmony_ci} 2588f92157deSopenharmony_ci 2589f92157deSopenharmony_ciTEST(ElementsAreTest, CanDescribeNegationOfExpectingOneElement) { 2590f92157deSopenharmony_ci Matcher<const list<int>&> m = ElementsAre(Gt(5)); 2591f92157deSopenharmony_ci EXPECT_EQ( 2592f92157deSopenharmony_ci "doesn't have 1 element, or\n" 2593f92157deSopenharmony_ci "element #0 isn't > 5", 2594f92157deSopenharmony_ci DescribeNegation(m)); 2595f92157deSopenharmony_ci} 2596f92157deSopenharmony_ci 2597f92157deSopenharmony_ciTEST(ElementsAreTest, CanDescribeNegationOfExpectingManyElements) { 2598f92157deSopenharmony_ci Matcher<const list<std::string>&> m = ElementsAre("one", "two"); 2599f92157deSopenharmony_ci EXPECT_EQ( 2600f92157deSopenharmony_ci "doesn't have 2 elements, or\n" 2601f92157deSopenharmony_ci "element #0 isn't equal to \"one\", or\n" 2602f92157deSopenharmony_ci "element #1 isn't equal to \"two\"", 2603f92157deSopenharmony_ci DescribeNegation(m)); 2604f92157deSopenharmony_ci} 2605f92157deSopenharmony_ci 2606f92157deSopenharmony_ciTEST(ElementsAreTest, DoesNotExplainTrivialMatch) { 2607f92157deSopenharmony_ci Matcher<const list<int>&> m = ElementsAre(1, Ne(2)); 2608f92157deSopenharmony_ci 2609f92157deSopenharmony_ci list<int> test_list; 2610f92157deSopenharmony_ci test_list.push_back(1); 2611f92157deSopenharmony_ci test_list.push_back(3); 2612f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, test_list)); // No need to explain anything. 2613f92157deSopenharmony_ci} 2614f92157deSopenharmony_ci 2615f92157deSopenharmony_ciTEST_P(ElementsAreTestP, ExplainsNonTrivialMatch) { 2616f92157deSopenharmony_ci Matcher<const vector<int>&> m = 2617f92157deSopenharmony_ci ElementsAre(GreaterThan(1), 0, GreaterThan(2)); 2618f92157deSopenharmony_ci 2619f92157deSopenharmony_ci const int a[] = {10, 0, 100}; 2620f92157deSopenharmony_ci vector<int> test_vector(std::begin(a), std::end(a)); 2621f92157deSopenharmony_ci EXPECT_EQ( 2622f92157deSopenharmony_ci "whose element #0 matches, which is 9 more than 1,\n" 2623f92157deSopenharmony_ci "and whose element #2 matches, which is 98 more than 2", 2624f92157deSopenharmony_ci Explain(m, test_vector)); 2625f92157deSopenharmony_ci} 2626f92157deSopenharmony_ci 2627f92157deSopenharmony_ciTEST(ElementsAreTest, CanExplainMismatchWrongSize) { 2628f92157deSopenharmony_ci Matcher<const list<int>&> m = ElementsAre(1, 3); 2629f92157deSopenharmony_ci 2630f92157deSopenharmony_ci list<int> test_list; 2631f92157deSopenharmony_ci // No need to explain when the container is empty. 2632f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, test_list)); 2633f92157deSopenharmony_ci 2634f92157deSopenharmony_ci test_list.push_back(1); 2635f92157deSopenharmony_ci EXPECT_EQ("which has 1 element", Explain(m, test_list)); 2636f92157deSopenharmony_ci} 2637f92157deSopenharmony_ci 2638f92157deSopenharmony_ciTEST_P(ElementsAreTestP, CanExplainMismatchRightSize) { 2639f92157deSopenharmony_ci Matcher<const vector<int>&> m = ElementsAre(1, GreaterThan(5)); 2640f92157deSopenharmony_ci 2641f92157deSopenharmony_ci vector<int> v; 2642f92157deSopenharmony_ci v.push_back(2); 2643f92157deSopenharmony_ci v.push_back(1); 2644f92157deSopenharmony_ci EXPECT_EQ("whose element #0 doesn't match", Explain(m, v)); 2645f92157deSopenharmony_ci 2646f92157deSopenharmony_ci v[0] = 1; 2647f92157deSopenharmony_ci EXPECT_EQ("whose element #1 doesn't match, which is 4 less than 5", 2648f92157deSopenharmony_ci Explain(m, v)); 2649f92157deSopenharmony_ci} 2650f92157deSopenharmony_ci 2651f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesOneElementVector) { 2652f92157deSopenharmony_ci vector<std::string> test_vector; 2653f92157deSopenharmony_ci test_vector.push_back("test string"); 2654f92157deSopenharmony_ci 2655f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAre(StrEq("test string"))); 2656f92157deSopenharmony_ci} 2657f92157deSopenharmony_ci 2658f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesOneElementList) { 2659f92157deSopenharmony_ci list<std::string> test_list; 2660f92157deSopenharmony_ci test_list.push_back("test string"); 2661f92157deSopenharmony_ci 2662f92157deSopenharmony_ci EXPECT_THAT(test_list, ElementsAre("test string")); 2663f92157deSopenharmony_ci} 2664f92157deSopenharmony_ci 2665f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesThreeElementVector) { 2666f92157deSopenharmony_ci vector<std::string> test_vector; 2667f92157deSopenharmony_ci test_vector.push_back("one"); 2668f92157deSopenharmony_ci test_vector.push_back("two"); 2669f92157deSopenharmony_ci test_vector.push_back("three"); 2670f92157deSopenharmony_ci 2671f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAre("one", StrEq("two"), _)); 2672f92157deSopenharmony_ci} 2673f92157deSopenharmony_ci 2674f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesOneElementEqMatcher) { 2675f92157deSopenharmony_ci vector<int> test_vector; 2676f92157deSopenharmony_ci test_vector.push_back(4); 2677f92157deSopenharmony_ci 2678f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAre(Eq(4))); 2679f92157deSopenharmony_ci} 2680f92157deSopenharmony_ci 2681f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesOneElementAnyMatcher) { 2682f92157deSopenharmony_ci vector<int> test_vector; 2683f92157deSopenharmony_ci test_vector.push_back(4); 2684f92157deSopenharmony_ci 2685f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAre(_)); 2686f92157deSopenharmony_ci} 2687f92157deSopenharmony_ci 2688f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesOneElementValue) { 2689f92157deSopenharmony_ci vector<int> test_vector; 2690f92157deSopenharmony_ci test_vector.push_back(4); 2691f92157deSopenharmony_ci 2692f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAre(4)); 2693f92157deSopenharmony_ci} 2694f92157deSopenharmony_ci 2695f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesThreeElementsMixedMatchers) { 2696f92157deSopenharmony_ci vector<int> test_vector; 2697f92157deSopenharmony_ci test_vector.push_back(1); 2698f92157deSopenharmony_ci test_vector.push_back(2); 2699f92157deSopenharmony_ci test_vector.push_back(3); 2700f92157deSopenharmony_ci 2701f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAre(1, Eq(2), _)); 2702f92157deSopenharmony_ci} 2703f92157deSopenharmony_ci 2704f92157deSopenharmony_ciTEST(ElementsAreTest, MatchesTenElementVector) { 2705f92157deSopenharmony_ci const int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2706f92157deSopenharmony_ci vector<int> test_vector(std::begin(a), std::end(a)); 2707f92157deSopenharmony_ci 2708f92157deSopenharmony_ci EXPECT_THAT(test_vector, 2709f92157deSopenharmony_ci // The element list can contain values and/or matchers 2710f92157deSopenharmony_ci // of different types. 2711f92157deSopenharmony_ci ElementsAre(0, Ge(0), _, 3, 4, Ne(2), Eq(6), 7, 8, _)); 2712f92157deSopenharmony_ci} 2713f92157deSopenharmony_ci 2714f92157deSopenharmony_ciTEST(ElementsAreTest, DoesNotMatchWrongSize) { 2715f92157deSopenharmony_ci vector<std::string> test_vector; 2716f92157deSopenharmony_ci test_vector.push_back("test string"); 2717f92157deSopenharmony_ci test_vector.push_back("test string"); 2718f92157deSopenharmony_ci 2719f92157deSopenharmony_ci Matcher<vector<std::string>> m = ElementsAre(StrEq("test string")); 2720f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(test_vector)); 2721f92157deSopenharmony_ci} 2722f92157deSopenharmony_ci 2723f92157deSopenharmony_ciTEST(ElementsAreTest, DoesNotMatchWrongValue) { 2724f92157deSopenharmony_ci vector<std::string> test_vector; 2725f92157deSopenharmony_ci test_vector.push_back("other string"); 2726f92157deSopenharmony_ci 2727f92157deSopenharmony_ci Matcher<vector<std::string>> m = ElementsAre(StrEq("test string")); 2728f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(test_vector)); 2729f92157deSopenharmony_ci} 2730f92157deSopenharmony_ci 2731f92157deSopenharmony_ciTEST(ElementsAreTest, DoesNotMatchWrongOrder) { 2732f92157deSopenharmony_ci vector<std::string> test_vector; 2733f92157deSopenharmony_ci test_vector.push_back("one"); 2734f92157deSopenharmony_ci test_vector.push_back("three"); 2735f92157deSopenharmony_ci test_vector.push_back("two"); 2736f92157deSopenharmony_ci 2737f92157deSopenharmony_ci Matcher<vector<std::string>> m = 2738f92157deSopenharmony_ci ElementsAre(StrEq("one"), StrEq("two"), StrEq("three")); 2739f92157deSopenharmony_ci EXPECT_FALSE(m.Matches(test_vector)); 2740f92157deSopenharmony_ci} 2741f92157deSopenharmony_ci 2742f92157deSopenharmony_ciTEST(ElementsAreTest, WorksForNestedContainer) { 2743f92157deSopenharmony_ci constexpr std::array<const char*, 2> strings = {{"Hi", "world"}}; 2744f92157deSopenharmony_ci 2745f92157deSopenharmony_ci vector<list<char>> nested; 2746f92157deSopenharmony_ci for (const auto& s : strings) { 2747f92157deSopenharmony_ci nested.emplace_back(s, s + strlen(s)); 2748f92157deSopenharmony_ci } 2749f92157deSopenharmony_ci 2750f92157deSopenharmony_ci EXPECT_THAT(nested, ElementsAre(ElementsAre('H', Ne('e')), 2751f92157deSopenharmony_ci ElementsAre('w', 'o', _, _, 'd'))); 2752f92157deSopenharmony_ci EXPECT_THAT(nested, Not(ElementsAre(ElementsAre('H', 'e'), 2753f92157deSopenharmony_ci ElementsAre('w', 'o', _, _, 'd')))); 2754f92157deSopenharmony_ci} 2755f92157deSopenharmony_ci 2756f92157deSopenharmony_ciTEST(ElementsAreTest, WorksWithByRefElementMatchers) { 2757f92157deSopenharmony_ci int a[] = {0, 1, 2}; 2758f92157deSopenharmony_ci vector<int> v(std::begin(a), std::end(a)); 2759f92157deSopenharmony_ci 2760f92157deSopenharmony_ci EXPECT_THAT(v, ElementsAre(Ref(v[0]), Ref(v[1]), Ref(v[2]))); 2761f92157deSopenharmony_ci EXPECT_THAT(v, Not(ElementsAre(Ref(v[0]), Ref(v[1]), Ref(a[2])))); 2762f92157deSopenharmony_ci} 2763f92157deSopenharmony_ci 2764f92157deSopenharmony_ciTEST(ElementsAreTest, WorksWithContainerPointerUsingPointee) { 2765f92157deSopenharmony_ci int a[] = {0, 1, 2}; 2766f92157deSopenharmony_ci vector<int> v(std::begin(a), std::end(a)); 2767f92157deSopenharmony_ci 2768f92157deSopenharmony_ci EXPECT_THAT(&v, Pointee(ElementsAre(0, 1, _))); 2769f92157deSopenharmony_ci EXPECT_THAT(&v, Not(Pointee(ElementsAre(0, _, 3)))); 2770f92157deSopenharmony_ci} 2771f92157deSopenharmony_ci 2772f92157deSopenharmony_ciTEST(ElementsAreTest, WorksWithNativeArrayPassedByReference) { 2773f92157deSopenharmony_ci int array[] = {0, 1, 2}; 2774f92157deSopenharmony_ci EXPECT_THAT(array, ElementsAre(0, 1, _)); 2775f92157deSopenharmony_ci EXPECT_THAT(array, Not(ElementsAre(1, _, _))); 2776f92157deSopenharmony_ci EXPECT_THAT(array, Not(ElementsAre(0, _))); 2777f92157deSopenharmony_ci} 2778f92157deSopenharmony_ci 2779f92157deSopenharmony_ciclass NativeArrayPassedAsPointerAndSize { 2780f92157deSopenharmony_ci public: 2781f92157deSopenharmony_ci NativeArrayPassedAsPointerAndSize() {} 2782f92157deSopenharmony_ci 2783f92157deSopenharmony_ci MOCK_METHOD(void, Helper, (int* array, int size)); 2784f92157deSopenharmony_ci 2785f92157deSopenharmony_ci private: 2786f92157deSopenharmony_ci NativeArrayPassedAsPointerAndSize(const NativeArrayPassedAsPointerAndSize&) = 2787f92157deSopenharmony_ci delete; 2788f92157deSopenharmony_ci NativeArrayPassedAsPointerAndSize& operator=( 2789f92157deSopenharmony_ci const NativeArrayPassedAsPointerAndSize&) = delete; 2790f92157deSopenharmony_ci}; 2791f92157deSopenharmony_ci 2792f92157deSopenharmony_ciTEST(ElementsAreTest, WorksWithNativeArrayPassedAsPointerAndSize) { 2793f92157deSopenharmony_ci int array[] = {0, 1}; 2794f92157deSopenharmony_ci ::std::tuple<int*, size_t> array_as_tuple(array, 2); 2795f92157deSopenharmony_ci EXPECT_THAT(array_as_tuple, ElementsAre(0, 1)); 2796f92157deSopenharmony_ci EXPECT_THAT(array_as_tuple, Not(ElementsAre(0))); 2797f92157deSopenharmony_ci 2798f92157deSopenharmony_ci NativeArrayPassedAsPointerAndSize helper; 2799f92157deSopenharmony_ci EXPECT_CALL(helper, Helper(_, _)).With(ElementsAre(0, 1)); 2800f92157deSopenharmony_ci helper.Helper(array, 2); 2801f92157deSopenharmony_ci} 2802f92157deSopenharmony_ci 2803f92157deSopenharmony_ciTEST(ElementsAreTest, WorksWithTwoDimensionalNativeArray) { 2804f92157deSopenharmony_ci const char a2[][3] = {"hi", "lo"}; 2805f92157deSopenharmony_ci EXPECT_THAT(a2, ElementsAre(ElementsAre('h', 'i', '\0'), 2806f92157deSopenharmony_ci ElementsAre('l', 'o', '\0'))); 2807f92157deSopenharmony_ci EXPECT_THAT(a2, ElementsAre(StrEq("hi"), StrEq("lo"))); 2808f92157deSopenharmony_ci EXPECT_THAT(a2, ElementsAre(Not(ElementsAre('h', 'o', '\0')), 2809f92157deSopenharmony_ci ElementsAre('l', 'o', '\0'))); 2810f92157deSopenharmony_ci} 2811f92157deSopenharmony_ci 2812f92157deSopenharmony_ciTEST(ElementsAreTest, AcceptsStringLiteral) { 2813f92157deSopenharmony_ci std::string array[] = {"hi", "one", "two"}; 2814f92157deSopenharmony_ci EXPECT_THAT(array, ElementsAre("hi", "one", "two")); 2815f92157deSopenharmony_ci EXPECT_THAT(array, Not(ElementsAre("hi", "one", "too"))); 2816f92157deSopenharmony_ci} 2817f92157deSopenharmony_ci 2818f92157deSopenharmony_ci// Declared here with the size unknown. Defined AFTER the following test. 2819f92157deSopenharmony_ciextern const char kHi[]; 2820f92157deSopenharmony_ci 2821f92157deSopenharmony_ciTEST(ElementsAreTest, AcceptsArrayWithUnknownSize) { 2822f92157deSopenharmony_ci // The size of kHi is not known in this test, but ElementsAre() should 2823f92157deSopenharmony_ci // still accept it. 2824f92157deSopenharmony_ci 2825f92157deSopenharmony_ci std::string array1[] = {"hi"}; 2826f92157deSopenharmony_ci EXPECT_THAT(array1, ElementsAre(kHi)); 2827f92157deSopenharmony_ci 2828f92157deSopenharmony_ci std::string array2[] = {"ho"}; 2829f92157deSopenharmony_ci EXPECT_THAT(array2, Not(ElementsAre(kHi))); 2830f92157deSopenharmony_ci} 2831f92157deSopenharmony_ci 2832f92157deSopenharmony_ciconst char kHi[] = "hi"; 2833f92157deSopenharmony_ci 2834f92157deSopenharmony_ciTEST(ElementsAreTest, MakesCopyOfArguments) { 2835f92157deSopenharmony_ci int x = 1; 2836f92157deSopenharmony_ci int y = 2; 2837f92157deSopenharmony_ci // This should make a copy of x and y. 2838f92157deSopenharmony_ci ::testing::internal::ElementsAreMatcher<std::tuple<int, int>> 2839f92157deSopenharmony_ci polymorphic_matcher = ElementsAre(x, y); 2840f92157deSopenharmony_ci // Changing x and y now shouldn't affect the meaning of the above matcher. 2841f92157deSopenharmony_ci x = y = 0; 2842f92157deSopenharmony_ci const int array1[] = {1, 2}; 2843f92157deSopenharmony_ci EXPECT_THAT(array1, polymorphic_matcher); 2844f92157deSopenharmony_ci const int array2[] = {0, 0}; 2845f92157deSopenharmony_ci EXPECT_THAT(array2, Not(polymorphic_matcher)); 2846f92157deSopenharmony_ci} 2847f92157deSopenharmony_ci 2848f92157deSopenharmony_ci// Tests for ElementsAreArray(). Since ElementsAreArray() shares most 2849f92157deSopenharmony_ci// of the implementation with ElementsAre(), we don't test it as 2850f92157deSopenharmony_ci// thoroughly here. 2851f92157deSopenharmony_ci 2852f92157deSopenharmony_ciTEST(ElementsAreArrayTest, CanBeCreatedWithValueArray) { 2853f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 2854f92157deSopenharmony_ci 2855f92157deSopenharmony_ci vector<int> test_vector(std::begin(a), std::end(a)); 2856f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(a)); 2857f92157deSopenharmony_ci 2858f92157deSopenharmony_ci test_vector[2] = 0; 2859f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(ElementsAreArray(a))); 2860f92157deSopenharmony_ci} 2861f92157deSopenharmony_ci 2862f92157deSopenharmony_ciTEST(ElementsAreArrayTest, CanBeCreatedWithArraySize) { 2863f92157deSopenharmony_ci std::array<const char*, 3> a = {{"one", "two", "three"}}; 2864f92157deSopenharmony_ci 2865f92157deSopenharmony_ci vector<std::string> test_vector(std::begin(a), std::end(a)); 2866f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(a.data(), a.size())); 2867f92157deSopenharmony_ci 2868f92157deSopenharmony_ci const char** p = a.data(); 2869f92157deSopenharmony_ci test_vector[0] = "1"; 2870f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(ElementsAreArray(p, a.size()))); 2871f92157deSopenharmony_ci} 2872f92157deSopenharmony_ci 2873f92157deSopenharmony_ciTEST(ElementsAreArrayTest, CanBeCreatedWithoutArraySize) { 2874f92157deSopenharmony_ci const char* a[] = {"one", "two", "three"}; 2875f92157deSopenharmony_ci 2876f92157deSopenharmony_ci vector<std::string> test_vector(std::begin(a), std::end(a)); 2877f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(a)); 2878f92157deSopenharmony_ci 2879f92157deSopenharmony_ci test_vector[0] = "1"; 2880f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(ElementsAreArray(a))); 2881f92157deSopenharmony_ci} 2882f92157deSopenharmony_ci 2883f92157deSopenharmony_ciTEST(ElementsAreArrayTest, CanBeCreatedWithMatcherArray) { 2884f92157deSopenharmony_ci const Matcher<std::string> kMatcherArray[] = {StrEq("one"), StrEq("two"), 2885f92157deSopenharmony_ci StrEq("three")}; 2886f92157deSopenharmony_ci 2887f92157deSopenharmony_ci vector<std::string> test_vector; 2888f92157deSopenharmony_ci test_vector.push_back("one"); 2889f92157deSopenharmony_ci test_vector.push_back("two"); 2890f92157deSopenharmony_ci test_vector.push_back("three"); 2891f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(kMatcherArray)); 2892f92157deSopenharmony_ci 2893f92157deSopenharmony_ci test_vector.push_back("three"); 2894f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(ElementsAreArray(kMatcherArray))); 2895f92157deSopenharmony_ci} 2896f92157deSopenharmony_ci 2897f92157deSopenharmony_ciTEST(ElementsAreArrayTest, CanBeCreatedWithVector) { 2898f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 2899f92157deSopenharmony_ci vector<int> test_vector(std::begin(a), std::end(a)); 2900f92157deSopenharmony_ci const vector<int> expected(std::begin(a), std::end(a)); 2901f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(expected)); 2902f92157deSopenharmony_ci test_vector.push_back(4); 2903f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(ElementsAreArray(expected))); 2904f92157deSopenharmony_ci} 2905f92157deSopenharmony_ci 2906f92157deSopenharmony_ciTEST(ElementsAreArrayTest, TakesInitializerList) { 2907f92157deSopenharmony_ci const int a[5] = {1, 2, 3, 4, 5}; 2908f92157deSopenharmony_ci EXPECT_THAT(a, ElementsAreArray({1, 2, 3, 4, 5})); 2909f92157deSopenharmony_ci EXPECT_THAT(a, Not(ElementsAreArray({1, 2, 3, 5, 4}))); 2910f92157deSopenharmony_ci EXPECT_THAT(a, Not(ElementsAreArray({1, 2, 3, 4, 6}))); 2911f92157deSopenharmony_ci} 2912f92157deSopenharmony_ci 2913f92157deSopenharmony_ciTEST(ElementsAreArrayTest, TakesInitializerListOfCStrings) { 2914f92157deSopenharmony_ci const std::string a[5] = {"a", "b", "c", "d", "e"}; 2915f92157deSopenharmony_ci EXPECT_THAT(a, ElementsAreArray({"a", "b", "c", "d", "e"})); 2916f92157deSopenharmony_ci EXPECT_THAT(a, Not(ElementsAreArray({"a", "b", "c", "e", "d"}))); 2917f92157deSopenharmony_ci EXPECT_THAT(a, Not(ElementsAreArray({"a", "b", "c", "d", "ef"}))); 2918f92157deSopenharmony_ci} 2919f92157deSopenharmony_ci 2920f92157deSopenharmony_ciTEST(ElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) { 2921f92157deSopenharmony_ci const int a[5] = {1, 2, 3, 4, 5}; 2922f92157deSopenharmony_ci EXPECT_THAT(a, ElementsAreArray({Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)})); 2923f92157deSopenharmony_ci EXPECT_THAT(a, Not(ElementsAreArray({Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)}))); 2924f92157deSopenharmony_ci} 2925f92157deSopenharmony_ci 2926f92157deSopenharmony_ciTEST(ElementsAreArrayTest, TakesInitializerListOfDifferentTypedMatchers) { 2927f92157deSopenharmony_ci const int a[5] = {1, 2, 3, 4, 5}; 2928f92157deSopenharmony_ci // The compiler cannot infer the type of the initializer list if its 2929f92157deSopenharmony_ci // elements have different types. We must explicitly specify the 2930f92157deSopenharmony_ci // unified element type in this case. 2931f92157deSopenharmony_ci EXPECT_THAT( 2932f92157deSopenharmony_ci a, ElementsAreArray<Matcher<int>>({Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)})); 2933f92157deSopenharmony_ci EXPECT_THAT(a, Not(ElementsAreArray<Matcher<int>>( 2934f92157deSopenharmony_ci {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)}))); 2935f92157deSopenharmony_ci} 2936f92157deSopenharmony_ci 2937f92157deSopenharmony_ciTEST(ElementsAreArrayTest, CanBeCreatedWithMatcherVector) { 2938f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 2939f92157deSopenharmony_ci const Matcher<int> kMatchers[] = {Eq(1), Eq(2), Eq(3)}; 2940f92157deSopenharmony_ci vector<int> test_vector(std::begin(a), std::end(a)); 2941f92157deSopenharmony_ci const vector<Matcher<int>> expected(std::begin(kMatchers), 2942f92157deSopenharmony_ci std::end(kMatchers)); 2943f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(expected)); 2944f92157deSopenharmony_ci test_vector.push_back(4); 2945f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(ElementsAreArray(expected))); 2946f92157deSopenharmony_ci} 2947f92157deSopenharmony_ci 2948f92157deSopenharmony_ciTEST(ElementsAreArrayTest, CanBeCreatedWithIteratorRange) { 2949f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 2950f92157deSopenharmony_ci const vector<int> test_vector(std::begin(a), std::end(a)); 2951f92157deSopenharmony_ci const vector<int> expected(std::begin(a), std::end(a)); 2952f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(expected.begin(), expected.end())); 2953f92157deSopenharmony_ci // Pointers are iterators, too. 2954f92157deSopenharmony_ci EXPECT_THAT(test_vector, ElementsAreArray(std::begin(a), std::end(a))); 2955f92157deSopenharmony_ci // The empty range of NULL pointers should also be okay. 2956f92157deSopenharmony_ci int* const null_int = nullptr; 2957f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(ElementsAreArray(null_int, null_int))); 2958f92157deSopenharmony_ci EXPECT_THAT((vector<int>()), ElementsAreArray(null_int, null_int)); 2959f92157deSopenharmony_ci} 2960f92157deSopenharmony_ci 2961f92157deSopenharmony_ci// Since ElementsAre() and ElementsAreArray() share much of the 2962f92157deSopenharmony_ci// implementation, we only do a test for native arrays here. 2963f92157deSopenharmony_ciTEST(ElementsAreArrayTest, WorksWithNativeArray) { 2964f92157deSopenharmony_ci ::std::string a[] = {"hi", "ho"}; 2965f92157deSopenharmony_ci ::std::string b[] = {"hi", "ho"}; 2966f92157deSopenharmony_ci 2967f92157deSopenharmony_ci EXPECT_THAT(a, ElementsAreArray(b)); 2968f92157deSopenharmony_ci EXPECT_THAT(a, ElementsAreArray(b, 2)); 2969f92157deSopenharmony_ci EXPECT_THAT(a, Not(ElementsAreArray(b, 1))); 2970f92157deSopenharmony_ci} 2971f92157deSopenharmony_ci 2972f92157deSopenharmony_ciTEST(ElementsAreArrayTest, SourceLifeSpan) { 2973f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 2974f92157deSopenharmony_ci vector<int> test_vector(std::begin(a), std::end(a)); 2975f92157deSopenharmony_ci vector<int> expect(std::begin(a), std::end(a)); 2976f92157deSopenharmony_ci ElementsAreArrayMatcher<int> matcher_maker = 2977f92157deSopenharmony_ci ElementsAreArray(expect.begin(), expect.end()); 2978f92157deSopenharmony_ci EXPECT_THAT(test_vector, matcher_maker); 2979f92157deSopenharmony_ci // Changing in place the values that initialized matcher_maker should not 2980f92157deSopenharmony_ci // affect matcher_maker anymore. It should have made its own copy of them. 2981f92157deSopenharmony_ci for (int& i : expect) { 2982f92157deSopenharmony_ci i += 10; 2983f92157deSopenharmony_ci } 2984f92157deSopenharmony_ci EXPECT_THAT(test_vector, matcher_maker); 2985f92157deSopenharmony_ci test_vector.push_back(3); 2986f92157deSopenharmony_ci EXPECT_THAT(test_vector, Not(matcher_maker)); 2987f92157deSopenharmony_ci} 2988f92157deSopenharmony_ci 2989f92157deSopenharmony_ci// Tests Contains(). 2990f92157deSopenharmony_ci 2991f92157deSopenharmony_ciINSTANTIATE_GTEST_MATCHER_TEST_P(ContainsTest); 2992f92157deSopenharmony_ci 2993f92157deSopenharmony_ciTEST(ContainsTest, ListMatchesWhenElementIsInContainer) { 2994f92157deSopenharmony_ci list<int> some_list; 2995f92157deSopenharmony_ci some_list.push_back(3); 2996f92157deSopenharmony_ci some_list.push_back(1); 2997f92157deSopenharmony_ci some_list.push_back(2); 2998f92157deSopenharmony_ci some_list.push_back(3); 2999f92157deSopenharmony_ci EXPECT_THAT(some_list, Contains(1)); 3000f92157deSopenharmony_ci EXPECT_THAT(some_list, Contains(Gt(2.5))); 3001f92157deSopenharmony_ci EXPECT_THAT(some_list, Contains(Eq(2.0f))); 3002f92157deSopenharmony_ci 3003f92157deSopenharmony_ci list<std::string> another_list; 3004f92157deSopenharmony_ci another_list.push_back("fee"); 3005f92157deSopenharmony_ci another_list.push_back("fie"); 3006f92157deSopenharmony_ci another_list.push_back("foe"); 3007f92157deSopenharmony_ci another_list.push_back("fum"); 3008f92157deSopenharmony_ci EXPECT_THAT(another_list, Contains(std::string("fee"))); 3009f92157deSopenharmony_ci} 3010f92157deSopenharmony_ci 3011f92157deSopenharmony_ciTEST(ContainsTest, ListDoesNotMatchWhenElementIsNotInContainer) { 3012f92157deSopenharmony_ci list<int> some_list; 3013f92157deSopenharmony_ci some_list.push_back(3); 3014f92157deSopenharmony_ci some_list.push_back(1); 3015f92157deSopenharmony_ci EXPECT_THAT(some_list, Not(Contains(4))); 3016f92157deSopenharmony_ci} 3017f92157deSopenharmony_ci 3018f92157deSopenharmony_ciTEST(ContainsTest, SetMatchesWhenElementIsInContainer) { 3019f92157deSopenharmony_ci set<int> some_set; 3020f92157deSopenharmony_ci some_set.insert(3); 3021f92157deSopenharmony_ci some_set.insert(1); 3022f92157deSopenharmony_ci some_set.insert(2); 3023f92157deSopenharmony_ci EXPECT_THAT(some_set, Contains(Eq(1.0))); 3024f92157deSopenharmony_ci EXPECT_THAT(some_set, Contains(Eq(3.0f))); 3025f92157deSopenharmony_ci EXPECT_THAT(some_set, Contains(2)); 3026f92157deSopenharmony_ci 3027f92157deSopenharmony_ci set<std::string> another_set; 3028f92157deSopenharmony_ci another_set.insert("fee"); 3029f92157deSopenharmony_ci another_set.insert("fie"); 3030f92157deSopenharmony_ci another_set.insert("foe"); 3031f92157deSopenharmony_ci another_set.insert("fum"); 3032f92157deSopenharmony_ci EXPECT_THAT(another_set, Contains(Eq(std::string("fum")))); 3033f92157deSopenharmony_ci} 3034f92157deSopenharmony_ci 3035f92157deSopenharmony_ciTEST(ContainsTest, SetDoesNotMatchWhenElementIsNotInContainer) { 3036f92157deSopenharmony_ci set<int> some_set; 3037f92157deSopenharmony_ci some_set.insert(3); 3038f92157deSopenharmony_ci some_set.insert(1); 3039f92157deSopenharmony_ci EXPECT_THAT(some_set, Not(Contains(4))); 3040f92157deSopenharmony_ci 3041f92157deSopenharmony_ci set<std::string> c_string_set; 3042f92157deSopenharmony_ci c_string_set.insert("hello"); 3043f92157deSopenharmony_ci EXPECT_THAT(c_string_set, Not(Contains(std::string("goodbye")))); 3044f92157deSopenharmony_ci} 3045f92157deSopenharmony_ci 3046f92157deSopenharmony_ciTEST_P(ContainsTestP, ExplainsMatchResultCorrectly) { 3047f92157deSopenharmony_ci const int a[2] = {1, 2}; 3048f92157deSopenharmony_ci Matcher<const int(&)[2]> m = Contains(2); 3049f92157deSopenharmony_ci EXPECT_EQ("whose element #1 matches", Explain(m, a)); 3050f92157deSopenharmony_ci 3051f92157deSopenharmony_ci m = Contains(3); 3052f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, a)); 3053f92157deSopenharmony_ci 3054f92157deSopenharmony_ci m = Contains(GreaterThan(0)); 3055f92157deSopenharmony_ci EXPECT_EQ("whose element #0 matches, which is 1 more than 0", Explain(m, a)); 3056f92157deSopenharmony_ci 3057f92157deSopenharmony_ci m = Contains(GreaterThan(10)); 3058f92157deSopenharmony_ci EXPECT_EQ("", Explain(m, a)); 3059f92157deSopenharmony_ci} 3060f92157deSopenharmony_ci 3061f92157deSopenharmony_ciTEST(ContainsTest, DescribesItselfCorrectly) { 3062f92157deSopenharmony_ci Matcher<vector<int>> m = Contains(1); 3063f92157deSopenharmony_ci EXPECT_EQ("contains at least one element that is equal to 1", Describe(m)); 3064f92157deSopenharmony_ci 3065f92157deSopenharmony_ci Matcher<vector<int>> m2 = Not(m); 3066f92157deSopenharmony_ci EXPECT_EQ("doesn't contain any element that is equal to 1", Describe(m2)); 3067f92157deSopenharmony_ci} 3068f92157deSopenharmony_ci 3069f92157deSopenharmony_ciTEST(ContainsTest, MapMatchesWhenElementIsInContainer) { 3070f92157deSopenharmony_ci map<std::string, int> my_map; 3071f92157deSopenharmony_ci const char* bar = "a string"; 3072f92157deSopenharmony_ci my_map[bar] = 2; 3073f92157deSopenharmony_ci EXPECT_THAT(my_map, Contains(pair<const char* const, int>(bar, 2))); 3074f92157deSopenharmony_ci 3075f92157deSopenharmony_ci map<std::string, int> another_map; 3076f92157deSopenharmony_ci another_map["fee"] = 1; 3077f92157deSopenharmony_ci another_map["fie"] = 2; 3078f92157deSopenharmony_ci another_map["foe"] = 3; 3079f92157deSopenharmony_ci another_map["fum"] = 4; 3080f92157deSopenharmony_ci EXPECT_THAT(another_map, 3081f92157deSopenharmony_ci Contains(pair<const std::string, int>(std::string("fee"), 1))); 3082f92157deSopenharmony_ci EXPECT_THAT(another_map, Contains(pair<const std::string, int>("fie", 2))); 3083f92157deSopenharmony_ci} 3084f92157deSopenharmony_ci 3085f92157deSopenharmony_ciTEST(ContainsTest, MapDoesNotMatchWhenElementIsNotInContainer) { 3086f92157deSopenharmony_ci map<int, int> some_map; 3087f92157deSopenharmony_ci some_map[1] = 11; 3088f92157deSopenharmony_ci some_map[2] = 22; 3089f92157deSopenharmony_ci EXPECT_THAT(some_map, Not(Contains(pair<const int, int>(2, 23)))); 3090f92157deSopenharmony_ci} 3091f92157deSopenharmony_ci 3092f92157deSopenharmony_ciTEST(ContainsTest, ArrayMatchesWhenElementIsInContainer) { 3093f92157deSopenharmony_ci const char* string_array[] = {"fee", "fie", "foe", "fum"}; 3094f92157deSopenharmony_ci EXPECT_THAT(string_array, Contains(Eq(std::string("fum")))); 3095f92157deSopenharmony_ci} 3096f92157deSopenharmony_ci 3097f92157deSopenharmony_ciTEST(ContainsTest, ArrayDoesNotMatchWhenElementIsNotInContainer) { 3098f92157deSopenharmony_ci int int_array[] = {1, 2, 3, 4}; 3099f92157deSopenharmony_ci EXPECT_THAT(int_array, Not(Contains(5))); 3100f92157deSopenharmony_ci} 3101f92157deSopenharmony_ci 3102f92157deSopenharmony_ciTEST(ContainsTest, AcceptsMatcher) { 3103f92157deSopenharmony_ci const int a[] = {1, 2, 3}; 3104f92157deSopenharmony_ci EXPECT_THAT(a, Contains(Gt(2))); 3105f92157deSopenharmony_ci EXPECT_THAT(a, Not(Contains(Gt(4)))); 3106f92157deSopenharmony_ci} 3107f92157deSopenharmony_ci 3108f92157deSopenharmony_ciTEST(ContainsTest, WorksForNativeArrayAsTuple) { 3109f92157deSopenharmony_ci const int a[] = {1, 2}; 3110f92157deSopenharmony_ci const int* const pointer = a; 3111f92157deSopenharmony_ci EXPECT_THAT(std::make_tuple(pointer, 2), Contains(1)); 3112f92157deSopenharmony_ci EXPECT_THAT(std::make_tuple(pointer, 2), Not(Contains(Gt(3)))); 3113f92157deSopenharmony_ci} 3114f92157deSopenharmony_ci 3115f92157deSopenharmony_ciTEST(ContainsTest, WorksForTwoDimensionalNativeArray) { 3116f92157deSopenharmony_ci int a[][3] = {{1, 2, 3}, {4, 5, 6}}; 3117f92157deSopenharmony_ci EXPECT_THAT(a, Contains(ElementsAre(4, 5, 6))); 3118f92157deSopenharmony_ci EXPECT_THAT(a, Contains(Contains(5))); 3119f92157deSopenharmony_ci EXPECT_THAT(a, Not(Contains(ElementsAre(3, 4, 5)))); 3120f92157deSopenharmony_ci EXPECT_THAT(a, Contains(Not(Contains(5)))); 3121f92157deSopenharmony_ci} 3122f92157deSopenharmony_ci 3123f92157deSopenharmony_ci} // namespace 3124f92157deSopenharmony_ci} // namespace gmock_matchers_test 3125f92157deSopenharmony_ci} // namespace testing 3126f92157deSopenharmony_ci 3127f92157deSopenharmony_ci#ifdef _MSC_VER 3128f92157deSopenharmony_ci#pragma warning(pop) 3129f92157deSopenharmony_ci#endif 3130