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