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