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