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