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 // Author: wan@google.com (Zhanyong Wan)
31
32 // Google Mock - a framework for writing C++ mock classes.
33 //
34 // This file tests some commonly used argument matchers.
35
36 #include "gmock/gmock-matchers.h"
37 #include "gmock/gmock-more-matchers.h"
38
39 #include <string.h>
40 #include <time.h>
41 #include <deque>
42 #include <functional>
43 #include <iostream>
44 #include <iterator>
45 #include <limits>
46 #include <list>
47 #include <map>
48 #include <set>
49 #include <sstream>
50 #include <string>
51 #include <utility>
52 #include <vector>
53 #include "gmock/gmock.h"
54 #include "gtest/gtest.h"
55 #include "gtest/gtest-spi.h"
56
57 namespace testing {
58
59 namespace internal {
60 GTEST_API_ string JoinAsTuple(const Strings& fields);
61 } // namespace internal
62
63 namespace gmock_matchers_test {
64
65 using std::greater;
66 using std::less;
67 using std::list;
68 using std::make_pair;
69 using std::map;
70 using std::multimap;
71 using std::multiset;
72 using std::ostream;
73 using std::pair;
74 using std::set;
75 using std::stringstream;
76 using std::tr1::get;
77 using std::tr1::make_tuple;
78 using std::tr1::tuple;
79 using std::vector;
80 using testing::A;
81 using testing::AllArgs;
82 using testing::AllOf;
83 using testing::An;
84 using testing::AnyOf;
85 using testing::ByRef;
86 using testing::ContainsRegex;
87 using testing::DoubleEq;
88 using testing::DoubleNear;
89 using testing::EndsWith;
90 using testing::Eq;
91 using testing::ExplainMatchResult;
92 using testing::Field;
93 using testing::FloatEq;
94 using testing::FloatNear;
95 using testing::Ge;
96 using testing::Gt;
97 using testing::HasSubstr;
98 using testing::IsEmpty;
99 using testing::IsNull;
100 using testing::Key;
101 using testing::Le;
102 using testing::Lt;
103 using testing::MakeMatcher;
104 using testing::MakePolymorphicMatcher;
105 using testing::MatchResultListener;
106 using testing::Matcher;
107 using testing::MatcherCast;
108 using testing::MatcherInterface;
109 using testing::Matches;
110 using testing::MatchesRegex;
111 using testing::NanSensitiveDoubleEq;
112 using testing::NanSensitiveDoubleNear;
113 using testing::NanSensitiveFloatEq;
114 using testing::NanSensitiveFloatNear;
115 using testing::Ne;
116 using testing::Not;
117 using testing::NotNull;
118 using testing::Pair;
119 using testing::Pointee;
120 using testing::Pointwise;
121 using testing::PolymorphicMatcher;
122 using testing::Property;
123 using testing::Ref;
124 using testing::ResultOf;
125 using testing::SizeIs;
126 using testing::StartsWith;
127 using testing::StringMatchResultListener;
128 using testing::StrCaseEq;
129 using testing::StrCaseNe;
130 using testing::StrEq;
131 using testing::StrNe;
132 using testing::Truly;
133 using testing::TypedEq;
134 using testing::Value;
135 using testing::WhenSorted;
136 using testing::WhenSortedBy;
137 using testing::_;
138 using testing::internal::DummyMatchResultListener;
139 using testing::internal::ElementMatcherPair;
140 using testing::internal::ElementMatcherPairs;
141 using testing::internal::ExplainMatchFailureTupleTo;
142 using testing::internal::FloatingEqMatcher;
143 using testing::internal::FormatMatcherDescription;
144 using testing::internal::IsReadableTypeName;
145 using testing::internal::JoinAsTuple;
146 using testing::internal::MatchMatrix;
147 using testing::internal::RE;
148 using testing::internal::StreamMatchResultListener;
149 using testing::internal::Strings;
150 using testing::internal::linked_ptr;
151 using testing::internal::scoped_ptr;
152 using testing::internal::string;
153
154 // Evaluates to the number of elements in 'array'.
155 #define GMOCK_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))
156
157 // For testing ExplainMatchResultTo().
158 class GreaterThanMatcher : public MatcherInterface<int> {
159 public:
GreaterThanMatcher(int rhs)160 explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}
161
DescribeTo(ostream * os) const162 virtual void DescribeTo(ostream* os) const {
163 *os << "is > " << rhs_;
164 }
165
MatchAndExplain(int lhs,MatchResultListener * listener) const166 virtual bool MatchAndExplain(int lhs,
167 MatchResultListener* listener) const {
168 const int diff = lhs - rhs_;
169 if (diff > 0) {
170 *listener << "which is " << diff << " more than " << rhs_;
171 } else if (diff == 0) {
172 *listener << "which is the same as " << rhs_;
173 } else {
174 *listener << "which is " << -diff << " less than " << rhs_;
175 }
176
177 return lhs > rhs_;
178 }
179
180 private:
181 int rhs_;
182 };
183
GreaterThan(int n)184 Matcher<int> GreaterThan(int n) {
185 return MakeMatcher(new GreaterThanMatcher(n));
186 }
187
OfType(const string & type_name)188 string OfType(const string& type_name) {
189 #if GTEST_HAS_RTTI
190 return " (of type " + type_name + ")";
191 #else
192 return "";
193 #endif
194 }
195
196 // Returns the description of the given matcher.
197 template <typename T>
Describe(const Matcher<T> & m)198 string Describe(const Matcher<T>& m) {
199 stringstream ss;
200 m.DescribeTo(&ss);
201 return ss.str();
202 }
203
204 // Returns the description of the negation of the given matcher.
205 template <typename T>
DescribeNegation(const Matcher<T> & m)206 string DescribeNegation(const Matcher<T>& m) {
207 stringstream ss;
208 m.DescribeNegationTo(&ss);
209 return ss.str();
210 }
211
212 // Returns the reason why x matches, or doesn't match, m.
213 template <typename MatcherType, typename Value>
Explain(const MatcherType & m,const Value & x)214 string Explain(const MatcherType& m, const Value& x) {
215 StringMatchResultListener listener;
216 ExplainMatchResult(m, x, &listener);
217 return listener.str();
218 }
219
TEST(MatchResultListenerTest,StreamingWorks)220 TEST(MatchResultListenerTest, StreamingWorks) {
221 StringMatchResultListener listener;
222 listener << "hi" << 5;
223 EXPECT_EQ("hi5", listener.str());
224
225 listener.Clear();
226 EXPECT_EQ("", listener.str());
227
228 listener << 42;
229 EXPECT_EQ("42", listener.str());
230
231 // Streaming shouldn't crash when the underlying ostream is NULL.
232 DummyMatchResultListener dummy;
233 dummy << "hi" << 5;
234 }
235
TEST(MatchResultListenerTest,CanAccessUnderlyingStream)236 TEST(MatchResultListenerTest, CanAccessUnderlyingStream) {
237 EXPECT_TRUE(DummyMatchResultListener().stream() == NULL);
238 EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL);
239
240 EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream());
241 }
242
TEST(MatchResultListenerTest,IsInterestedWorks)243 TEST(MatchResultListenerTest, IsInterestedWorks) {
244 EXPECT_TRUE(StringMatchResultListener().IsInterested());
245 EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested());
246
247 EXPECT_FALSE(DummyMatchResultListener().IsInterested());
248 EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested());
249 }
250
251 // Makes sure that the MatcherInterface<T> interface doesn't
252 // change.
253 class EvenMatcherImpl : public MatcherInterface<int> {
254 public:
MatchAndExplain(int x,MatchResultListener *) const255 virtual bool MatchAndExplain(int x,
256 MatchResultListener* /* listener */) const {
257 return x % 2 == 0;
258 }
259
DescribeTo(ostream * os) const260 virtual void DescribeTo(ostream* os) const {
261 *os << "is an even number";
262 }
263
264 // We deliberately don't define DescribeNegationTo() and
265 // ExplainMatchResultTo() here, to make sure the definition of these
266 // two methods is optional.
267 };
268
269 // Makes sure that the MatcherInterface API doesn't change.
TEST(MatcherInterfaceTest,CanBeImplementedUsingPublishedAPI)270 TEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) {
271 EvenMatcherImpl m;
272 }
273
274 // Tests implementing a monomorphic matcher using MatchAndExplain().
275
276 class NewEvenMatcherImpl : public MatcherInterface<int> {
277 public:
MatchAndExplain(int x,MatchResultListener * listener) const278 virtual bool MatchAndExplain(int x, MatchResultListener* listener) const {
279 const bool match = x % 2 == 0;
280 // Verifies that we can stream to a listener directly.
281 *listener << "value % " << 2;
282 if (listener->stream() != NULL) {
283 // Verifies that we can stream to a listener's underlying stream
284 // too.
285 *listener->stream() << " == " << (x % 2);
286 }
287 return match;
288 }
289
DescribeTo(ostream * os) const290 virtual void DescribeTo(ostream* os) const {
291 *os << "is an even number";
292 }
293 };
294
TEST(MatcherInterfaceTest,CanBeImplementedUsingNewAPI)295 TEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) {
296 Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl);
297 EXPECT_TRUE(m.Matches(2));
298 EXPECT_FALSE(m.Matches(3));
299 EXPECT_EQ("value % 2 == 0", Explain(m, 2));
300 EXPECT_EQ("value % 2 == 1", Explain(m, 3));
301 }
302
303 // Tests default-constructing a matcher.
TEST(MatcherTest,CanBeDefaultConstructed)304 TEST(MatcherTest, CanBeDefaultConstructed) {
305 Matcher<double> m;
306 }
307
308 // Tests that Matcher<T> can be constructed from a MatcherInterface<T>*.
TEST(MatcherTest,CanBeConstructedFromMatcherInterface)309 TEST(MatcherTest, CanBeConstructedFromMatcherInterface) {
310 const MatcherInterface<int>* impl = new EvenMatcherImpl;
311 Matcher<int> m(impl);
312 EXPECT_TRUE(m.Matches(4));
313 EXPECT_FALSE(m.Matches(5));
314 }
315
316 // Tests that value can be used in place of Eq(value).
TEST(MatcherTest,CanBeImplicitlyConstructedFromValue)317 TEST(MatcherTest, CanBeImplicitlyConstructedFromValue) {
318 Matcher<int> m1 = 5;
319 EXPECT_TRUE(m1.Matches(5));
320 EXPECT_FALSE(m1.Matches(6));
321 }
322
323 // Tests that NULL can be used in place of Eq(NULL).
TEST(MatcherTest,CanBeImplicitlyConstructedFromNULL)324 TEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) {
325 Matcher<int*> m1 = NULL;
326 EXPECT_TRUE(m1.Matches(NULL));
327 int n = 0;
328 EXPECT_FALSE(m1.Matches(&n));
329 }
330
331 // Tests that matchers are copyable.
TEST(MatcherTest,IsCopyable)332 TEST(MatcherTest, IsCopyable) {
333 // Tests the copy constructor.
334 Matcher<bool> m1 = Eq(false);
335 EXPECT_TRUE(m1.Matches(false));
336 EXPECT_FALSE(m1.Matches(true));
337
338 // Tests the assignment operator.
339 m1 = Eq(true);
340 EXPECT_TRUE(m1.Matches(true));
341 EXPECT_FALSE(m1.Matches(false));
342 }
343
344 // Tests that Matcher<T>::DescribeTo() calls
345 // MatcherInterface<T>::DescribeTo().
TEST(MatcherTest,CanDescribeItself)346 TEST(MatcherTest, CanDescribeItself) {
347 EXPECT_EQ("is an even number",
348 Describe(Matcher<int>(new EvenMatcherImpl)));
349 }
350
351 // Tests Matcher<T>::MatchAndExplain().
TEST(MatcherTest,MatchAndExplain)352 TEST(MatcherTest, MatchAndExplain) {
353 Matcher<int> m = GreaterThan(0);
354 StringMatchResultListener listener1;
355 EXPECT_TRUE(m.MatchAndExplain(42, &listener1));
356 EXPECT_EQ("which is 42 more than 0", listener1.str());
357
358 StringMatchResultListener listener2;
359 EXPECT_FALSE(m.MatchAndExplain(-9, &listener2));
360 EXPECT_EQ("which is 9 less than 0", listener2.str());
361 }
362
363 // Tests that a C-string literal can be implicitly converted to a
364 // Matcher<string> or Matcher<const string&>.
TEST(StringMatcherTest,CanBeImplicitlyConstructedFromCStringLiteral)365 TEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {
366 Matcher<string> m1 = "hi";
367 EXPECT_TRUE(m1.Matches("hi"));
368 EXPECT_FALSE(m1.Matches("hello"));
369
370 Matcher<const string&> m2 = "hi";
371 EXPECT_TRUE(m2.Matches("hi"));
372 EXPECT_FALSE(m2.Matches("hello"));
373 }
374
375 // Tests that a string object can be implicitly converted to a
376 // Matcher<string> or Matcher<const string&>.
TEST(StringMatcherTest,CanBeImplicitlyConstructedFromString)377 TEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) {
378 Matcher<string> m1 = string("hi");
379 EXPECT_TRUE(m1.Matches("hi"));
380 EXPECT_FALSE(m1.Matches("hello"));
381
382 Matcher<const string&> m2 = string("hi");
383 EXPECT_TRUE(m2.Matches("hi"));
384 EXPECT_FALSE(m2.Matches("hello"));
385 }
386
387 #if GTEST_HAS_STRING_PIECE_
388 // Tests that a C-string literal can be implicitly converted to a
389 // Matcher<StringPiece> or Matcher<const StringPiece&>.
TEST(StringPieceMatcherTest,CanBeImplicitlyConstructedFromCStringLiteral)390 TEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {
391 Matcher<StringPiece> m1 = "cats";
392 EXPECT_TRUE(m1.Matches("cats"));
393 EXPECT_FALSE(m1.Matches("dogs"));
394
395 Matcher<const StringPiece&> m2 = "cats";
396 EXPECT_TRUE(m2.Matches("cats"));
397 EXPECT_FALSE(m2.Matches("dogs"));
398 }
399
400 // Tests that a string object can be implicitly converted to a
401 // Matcher<StringPiece> or Matcher<const StringPiece&>.
TEST(StringPieceMatcherTest,CanBeImplicitlyConstructedFromString)402 TEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromString) {
403 Matcher<StringPiece> m1 = string("cats");
404 EXPECT_TRUE(m1.Matches("cats"));
405 EXPECT_FALSE(m1.Matches("dogs"));
406
407 Matcher<const StringPiece&> m2 = string("cats");
408 EXPECT_TRUE(m2.Matches("cats"));
409 EXPECT_FALSE(m2.Matches("dogs"));
410 }
411
412 // Tests that a StringPiece object can be implicitly converted to a
413 // Matcher<StringPiece> or Matcher<const StringPiece&>.
TEST(StringPieceMatcherTest,CanBeImplicitlyConstructedFromStringPiece)414 TEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromStringPiece) {
415 Matcher<StringPiece> m1 = StringPiece("cats");
416 EXPECT_TRUE(m1.Matches("cats"));
417 EXPECT_FALSE(m1.Matches("dogs"));
418
419 Matcher<const StringPiece&> m2 = StringPiece("cats");
420 EXPECT_TRUE(m2.Matches("cats"));
421 EXPECT_FALSE(m2.Matches("dogs"));
422 }
423 #endif // GTEST_HAS_STRING_PIECE_
424
425 // Tests that MakeMatcher() constructs a Matcher<T> from a
426 // MatcherInterface* without requiring the user to explicitly
427 // write the type.
TEST(MakeMatcherTest,ConstructsMatcherFromMatcherInterface)428 TEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) {
429 const MatcherInterface<int>* dummy_impl = NULL;
430 Matcher<int> m = MakeMatcher(dummy_impl);
431 }
432
433 // Tests that MakePolymorphicMatcher() can construct a polymorphic
434 // matcher from its implementation using the old API.
435 const int g_bar = 1;
436 class ReferencesBarOrIsZeroImpl {
437 public:
438 template <typename T>
MatchAndExplain(const T & x,MatchResultListener *) const439 bool MatchAndExplain(const T& x,
440 MatchResultListener* /* listener */) const {
441 const void* p = &x;
442 return p == &g_bar || x == 0;
443 }
444
DescribeTo(ostream * os) const445 void DescribeTo(ostream* os) const { *os << "g_bar or zero"; }
446
DescribeNegationTo(ostream * os) const447 void DescribeNegationTo(ostream* os) const {
448 *os << "doesn't reference g_bar and is not zero";
449 }
450 };
451
452 // This function verifies that MakePolymorphicMatcher() returns a
453 // PolymorphicMatcher<T> where T is the argument's type.
ReferencesBarOrIsZero()454 PolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() {
455 return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl());
456 }
457
TEST(MakePolymorphicMatcherTest,ConstructsMatcherUsingOldAPI)458 TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) {
459 // Using a polymorphic matcher to match a reference type.
460 Matcher<const int&> m1 = ReferencesBarOrIsZero();
461 EXPECT_TRUE(m1.Matches(0));
462 // Verifies that the identity of a by-reference argument is preserved.
463 EXPECT_TRUE(m1.Matches(g_bar));
464 EXPECT_FALSE(m1.Matches(1));
465 EXPECT_EQ("g_bar or zero", Describe(m1));
466
467 // Using a polymorphic matcher to match a value type.
468 Matcher<double> m2 = ReferencesBarOrIsZero();
469 EXPECT_TRUE(m2.Matches(0.0));
470 EXPECT_FALSE(m2.Matches(0.1));
471 EXPECT_EQ("g_bar or zero", Describe(m2));
472 }
473
474 // Tests implementing a polymorphic matcher using MatchAndExplain().
475
476 class PolymorphicIsEvenImpl {
477 public:
DescribeTo(ostream * os) const478 void DescribeTo(ostream* os) const { *os << "is even"; }
479
DescribeNegationTo(ostream * os) const480 void DescribeNegationTo(ostream* os) const {
481 *os << "is odd";
482 }
483
484 template <typename T>
MatchAndExplain(const T & x,MatchResultListener * listener) const485 bool MatchAndExplain(const T& x, MatchResultListener* listener) const {
486 // Verifies that we can stream to the listener directly.
487 *listener << "% " << 2;
488 if (listener->stream() != NULL) {
489 // Verifies that we can stream to the listener's underlying stream
490 // too.
491 *listener->stream() << " == " << (x % 2);
492 }
493 return (x % 2) == 0;
494 }
495 };
496
PolymorphicIsEven()497 PolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() {
498 return MakePolymorphicMatcher(PolymorphicIsEvenImpl());
499 }
500
TEST(MakePolymorphicMatcherTest,ConstructsMatcherUsingNewAPI)501 TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) {
502 // Using PolymorphicIsEven() as a Matcher<int>.
503 const Matcher<int> m1 = PolymorphicIsEven();
504 EXPECT_TRUE(m1.Matches(42));
505 EXPECT_FALSE(m1.Matches(43));
506 EXPECT_EQ("is even", Describe(m1));
507
508 const Matcher<int> not_m1 = Not(m1);
509 EXPECT_EQ("is odd", Describe(not_m1));
510
511 EXPECT_EQ("% 2 == 0", Explain(m1, 42));
512
513 // Using PolymorphicIsEven() as a Matcher<char>.
514 const Matcher<char> m2 = PolymorphicIsEven();
515 EXPECT_TRUE(m2.Matches('\x42'));
516 EXPECT_FALSE(m2.Matches('\x43'));
517 EXPECT_EQ("is even", Describe(m2));
518
519 const Matcher<char> not_m2 = Not(m2);
520 EXPECT_EQ("is odd", Describe(not_m2));
521
522 EXPECT_EQ("% 2 == 0", Explain(m2, '\x42'));
523 }
524
525 // Tests that MatcherCast<T>(m) works when m is a polymorphic matcher.
TEST(MatcherCastTest,FromPolymorphicMatcher)526 TEST(MatcherCastTest, FromPolymorphicMatcher) {
527 Matcher<int> m = MatcherCast<int>(Eq(5));
528 EXPECT_TRUE(m.Matches(5));
529 EXPECT_FALSE(m.Matches(6));
530 }
531
532 // For testing casting matchers between compatible types.
533 class IntValue {
534 public:
535 // An int can be statically (although not implicitly) cast to a
536 // IntValue.
IntValue(int a_value)537 explicit IntValue(int a_value) : value_(a_value) {}
538
value() const539 int value() const { return value_; }
540 private:
541 int value_;
542 };
543
544 // For testing casting matchers between compatible types.
IsPositiveIntValue(const IntValue & foo)545 bool IsPositiveIntValue(const IntValue& foo) {
546 return foo.value() > 0;
547 }
548
549 // Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T
550 // can be statically converted to U.
TEST(MatcherCastTest,FromCompatibleType)551 TEST(MatcherCastTest, FromCompatibleType) {
552 Matcher<double> m1 = Eq(2.0);
553 Matcher<int> m2 = MatcherCast<int>(m1);
554 EXPECT_TRUE(m2.Matches(2));
555 EXPECT_FALSE(m2.Matches(3));
556
557 Matcher<IntValue> m3 = Truly(IsPositiveIntValue);
558 Matcher<int> m4 = MatcherCast<int>(m3);
559 // In the following, the arguments 1 and 0 are statically converted
560 // to IntValue objects, and then tested by the IsPositiveIntValue()
561 // predicate.
562 EXPECT_TRUE(m4.Matches(1));
563 EXPECT_FALSE(m4.Matches(0));
564 }
565
566 // Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>.
TEST(MatcherCastTest,FromConstReferenceToNonReference)567 TEST(MatcherCastTest, FromConstReferenceToNonReference) {
568 Matcher<const int&> m1 = Eq(0);
569 Matcher<int> m2 = MatcherCast<int>(m1);
570 EXPECT_TRUE(m2.Matches(0));
571 EXPECT_FALSE(m2.Matches(1));
572 }
573
574 // Tests that MatcherCast<T>(m) works when m is a Matcher<T&>.
TEST(MatcherCastTest,FromReferenceToNonReference)575 TEST(MatcherCastTest, FromReferenceToNonReference) {
576 Matcher<int&> m1 = Eq(0);
577 Matcher<int> m2 = MatcherCast<int>(m1);
578 EXPECT_TRUE(m2.Matches(0));
579 EXPECT_FALSE(m2.Matches(1));
580 }
581
582 // Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
TEST(MatcherCastTest,FromNonReferenceToConstReference)583 TEST(MatcherCastTest, FromNonReferenceToConstReference) {
584 Matcher<int> m1 = Eq(0);
585 Matcher<const int&> m2 = MatcherCast<const int&>(m1);
586 EXPECT_TRUE(m2.Matches(0));
587 EXPECT_FALSE(m2.Matches(1));
588 }
589
590 // Tests that MatcherCast<T&>(m) works when m is a Matcher<T>.
TEST(MatcherCastTest,FromNonReferenceToReference)591 TEST(MatcherCastTest, FromNonReferenceToReference) {
592 Matcher<int> m1 = Eq(0);
593 Matcher<int&> m2 = MatcherCast<int&>(m1);
594 int n = 0;
595 EXPECT_TRUE(m2.Matches(n));
596 n = 1;
597 EXPECT_FALSE(m2.Matches(n));
598 }
599
600 // Tests that MatcherCast<T>(m) works when m is a Matcher<T>.
TEST(MatcherCastTest,FromSameType)601 TEST(MatcherCastTest, FromSameType) {
602 Matcher<int> m1 = Eq(0);
603 Matcher<int> m2 = MatcherCast<int>(m1);
604 EXPECT_TRUE(m2.Matches(0));
605 EXPECT_FALSE(m2.Matches(1));
606 }
607
608 // Implicitly convertible form any type.
609 struct ConvertibleFromAny {
ConvertibleFromAnytesting::gmock_matchers_test::ConvertibleFromAny610 ConvertibleFromAny(int a_value) : value(a_value) {}
611 template <typename T>
ConvertibleFromAnytesting::gmock_matchers_test::ConvertibleFromAny612 ConvertibleFromAny(const T& a_value) : value(-1) {
613 ADD_FAILURE() << "Conversion constructor called";
614 }
615 int value;
616 };
617
operator ==(const ConvertibleFromAny & a,const ConvertibleFromAny & b)618 bool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) {
619 return a.value == b.value;
620 }
621
operator <<(ostream & os,const ConvertibleFromAny & a)622 ostream& operator<<(ostream& os, const ConvertibleFromAny& a) {
623 return os << a.value;
624 }
625
TEST(MatcherCastTest,ConversionConstructorIsUsed)626 TEST(MatcherCastTest, ConversionConstructorIsUsed) {
627 Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1);
628 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
629 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
630 }
631
TEST(MatcherCastTest,FromConvertibleFromAny)632 TEST(MatcherCastTest, FromConvertibleFromAny) {
633 Matcher<ConvertibleFromAny> m =
634 MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
635 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
636 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
637 }
638
639 class Base {};
640 class Derived : public Base {};
641
642 // Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher.
TEST(SafeMatcherCastTest,FromPolymorphicMatcher)643 TEST(SafeMatcherCastTest, FromPolymorphicMatcher) {
644 Matcher<char> m2 = SafeMatcherCast<char>(Eq(32));
645 EXPECT_TRUE(m2.Matches(' '));
646 EXPECT_FALSE(m2.Matches('\n'));
647 }
648
649 // Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where
650 // T and U are arithmetic types and T can be losslessly converted to
651 // U.
TEST(SafeMatcherCastTest,FromLosslesslyConvertibleArithmeticType)652 TEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) {
653 Matcher<double> m1 = DoubleEq(1.0);
654 Matcher<float> m2 = SafeMatcherCast<float>(m1);
655 EXPECT_TRUE(m2.Matches(1.0f));
656 EXPECT_FALSE(m2.Matches(2.0f));
657
658 Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a'));
659 EXPECT_TRUE(m3.Matches('a'));
660 EXPECT_FALSE(m3.Matches('b'));
661 }
662
663 // Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U
664 // are pointers or references to a derived and a base class, correspondingly.
TEST(SafeMatcherCastTest,FromBaseClass)665 TEST(SafeMatcherCastTest, FromBaseClass) {
666 Derived d, d2;
667 Matcher<Base*> m1 = Eq(&d);
668 Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1);
669 EXPECT_TRUE(m2.Matches(&d));
670 EXPECT_FALSE(m2.Matches(&d2));
671
672 Matcher<Base&> m3 = Ref(d);
673 Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3);
674 EXPECT_TRUE(m4.Matches(d));
675 EXPECT_FALSE(m4.Matches(d2));
676 }
677
678 // Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>.
TEST(SafeMatcherCastTest,FromConstReferenceToReference)679 TEST(SafeMatcherCastTest, FromConstReferenceToReference) {
680 int n = 0;
681 Matcher<const int&> m1 = Ref(n);
682 Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
683 int n1 = 0;
684 EXPECT_TRUE(m2.Matches(n));
685 EXPECT_FALSE(m2.Matches(n1));
686 }
687
688 // Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
TEST(SafeMatcherCastTest,FromNonReferenceToConstReference)689 TEST(SafeMatcherCastTest, FromNonReferenceToConstReference) {
690 Matcher<int> m1 = Eq(0);
691 Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1);
692 EXPECT_TRUE(m2.Matches(0));
693 EXPECT_FALSE(m2.Matches(1));
694 }
695
696 // Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>.
TEST(SafeMatcherCastTest,FromNonReferenceToReference)697 TEST(SafeMatcherCastTest, FromNonReferenceToReference) {
698 Matcher<int> m1 = Eq(0);
699 Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
700 int n = 0;
701 EXPECT_TRUE(m2.Matches(n));
702 n = 1;
703 EXPECT_FALSE(m2.Matches(n));
704 }
705
706 // Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>.
TEST(SafeMatcherCastTest,FromSameType)707 TEST(SafeMatcherCastTest, FromSameType) {
708 Matcher<int> m1 = Eq(0);
709 Matcher<int> m2 = SafeMatcherCast<int>(m1);
710 EXPECT_TRUE(m2.Matches(0));
711 EXPECT_FALSE(m2.Matches(1));
712 }
713
TEST(SafeMatcherCastTest,ConversionConstructorIsUsed)714 TEST(SafeMatcherCastTest, ConversionConstructorIsUsed) {
715 Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1);
716 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
717 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
718 }
719
TEST(SafeMatcherCastTest,FromConvertibleFromAny)720 TEST(SafeMatcherCastTest, FromConvertibleFromAny) {
721 Matcher<ConvertibleFromAny> m =
722 SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
723 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
724 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
725 }
726
727 // Tests that A<T>() matches any value of type T.
TEST(ATest,MatchesAnyValue)728 TEST(ATest, MatchesAnyValue) {
729 // Tests a matcher for a value type.
730 Matcher<double> m1 = A<double>();
731 EXPECT_TRUE(m1.Matches(91.43));
732 EXPECT_TRUE(m1.Matches(-15.32));
733
734 // Tests a matcher for a reference type.
735 int a = 2;
736 int b = -6;
737 Matcher<int&> m2 = A<int&>();
738 EXPECT_TRUE(m2.Matches(a));
739 EXPECT_TRUE(m2.Matches(b));
740 }
741
TEST(ATest,WorksForDerivedClass)742 TEST(ATest, WorksForDerivedClass) {
743 Base base;
744 Derived derived;
745 EXPECT_THAT(&base, A<Base*>());
746 // This shouldn't compile: EXPECT_THAT(&base, A<Derived*>());
747 EXPECT_THAT(&derived, A<Base*>());
748 EXPECT_THAT(&derived, A<Derived*>());
749 }
750
751 // Tests that A<T>() describes itself properly.
TEST(ATest,CanDescribeSelf)752 TEST(ATest, CanDescribeSelf) {
753 EXPECT_EQ("is anything", Describe(A<bool>()));
754 }
755
756 // Tests that An<T>() matches any value of type T.
TEST(AnTest,MatchesAnyValue)757 TEST(AnTest, MatchesAnyValue) {
758 // Tests a matcher for a value type.
759 Matcher<int> m1 = An<int>();
760 EXPECT_TRUE(m1.Matches(9143));
761 EXPECT_TRUE(m1.Matches(-1532));
762
763 // Tests a matcher for a reference type.
764 int a = 2;
765 int b = -6;
766 Matcher<int&> m2 = An<int&>();
767 EXPECT_TRUE(m2.Matches(a));
768 EXPECT_TRUE(m2.Matches(b));
769 }
770
771 // Tests that An<T>() describes itself properly.
TEST(AnTest,CanDescribeSelf)772 TEST(AnTest, CanDescribeSelf) {
773 EXPECT_EQ("is anything", Describe(An<int>()));
774 }
775
776 // Tests that _ can be used as a matcher for any type and matches any
777 // value of that type.
TEST(UnderscoreTest,MatchesAnyValue)778 TEST(UnderscoreTest, MatchesAnyValue) {
779 // Uses _ as a matcher for a value type.
780 Matcher<int> m1 = _;
781 EXPECT_TRUE(m1.Matches(123));
782 EXPECT_TRUE(m1.Matches(-242));
783
784 // Uses _ as a matcher for a reference type.
785 bool a = false;
786 const bool b = true;
787 Matcher<const bool&> m2 = _;
788 EXPECT_TRUE(m2.Matches(a));
789 EXPECT_TRUE(m2.Matches(b));
790 }
791
792 // Tests that _ describes itself properly.
TEST(UnderscoreTest,CanDescribeSelf)793 TEST(UnderscoreTest, CanDescribeSelf) {
794 Matcher<int> m = _;
795 EXPECT_EQ("is anything", Describe(m));
796 }
797
798 // Tests that Eq(x) matches any value equal to x.
TEST(EqTest,MatchesEqualValue)799 TEST(EqTest, MatchesEqualValue) {
800 // 2 C-strings with same content but different addresses.
801 const char a1[] = "hi";
802 const char a2[] = "hi";
803
804 Matcher<const char*> m1 = Eq(a1);
805 EXPECT_TRUE(m1.Matches(a1));
806 EXPECT_FALSE(m1.Matches(a2));
807 }
808
809 // Tests that Eq(v) describes itself properly.
810
811 class Unprintable {
812 public:
Unprintable()813 Unprintable() : c_('a') {}
814
operator ==(const Unprintable &)815 bool operator==(const Unprintable& /* rhs */) { return true; }
816 private:
817 char c_;
818 };
819
TEST(EqTest,CanDescribeSelf)820 TEST(EqTest, CanDescribeSelf) {
821 Matcher<Unprintable> m = Eq(Unprintable());
822 EXPECT_EQ("is equal to 1-byte object <61>", Describe(m));
823 }
824
825 // Tests that Eq(v) can be used to match any type that supports
826 // comparing with type T, where T is v's type.
TEST(EqTest,IsPolymorphic)827 TEST(EqTest, IsPolymorphic) {
828 Matcher<int> m1 = Eq(1);
829 EXPECT_TRUE(m1.Matches(1));
830 EXPECT_FALSE(m1.Matches(2));
831
832 Matcher<char> m2 = Eq(1);
833 EXPECT_TRUE(m2.Matches('\1'));
834 EXPECT_FALSE(m2.Matches('a'));
835 }
836
837 // Tests that TypedEq<T>(v) matches values of type T that's equal to v.
TEST(TypedEqTest,ChecksEqualityForGivenType)838 TEST(TypedEqTest, ChecksEqualityForGivenType) {
839 Matcher<char> m1 = TypedEq<char>('a');
840 EXPECT_TRUE(m1.Matches('a'));
841 EXPECT_FALSE(m1.Matches('b'));
842
843 Matcher<int> m2 = TypedEq<int>(6);
844 EXPECT_TRUE(m2.Matches(6));
845 EXPECT_FALSE(m2.Matches(7));
846 }
847
848 // Tests that TypedEq(v) describes itself properly.
TEST(TypedEqTest,CanDescribeSelf)849 TEST(TypedEqTest, CanDescribeSelf) {
850 EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2)));
851 }
852
853 // Tests that TypedEq<T>(v) has type Matcher<T>.
854
855 // Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T
856 // is a "bare" type (i.e. not in the form of const U or U&). If v's
857 // type is not T, the compiler will generate a message about
858 // "undefined referece".
859 template <typename T>
860 struct Type {
IsTypeOftesting::gmock_matchers_test::Type861 static bool IsTypeOf(const T& /* v */) { return true; }
862
863 template <typename T2>
864 static void IsTypeOf(T2 v);
865 };
866
TEST(TypedEqTest,HasSpecifiedType)867 TEST(TypedEqTest, HasSpecifiedType) {
868 // Verfies that the type of TypedEq<T>(v) is Matcher<T>.
869 Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5));
870 Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5));
871 }
872
873 // Tests that Ge(v) matches anything >= v.
TEST(GeTest,ImplementsGreaterThanOrEqual)874 TEST(GeTest, ImplementsGreaterThanOrEqual) {
875 Matcher<int> m1 = Ge(0);
876 EXPECT_TRUE(m1.Matches(1));
877 EXPECT_TRUE(m1.Matches(0));
878 EXPECT_FALSE(m1.Matches(-1));
879 }
880
881 // Tests that Ge(v) describes itself properly.
TEST(GeTest,CanDescribeSelf)882 TEST(GeTest, CanDescribeSelf) {
883 Matcher<int> m = Ge(5);
884 EXPECT_EQ("is >= 5", Describe(m));
885 }
886
887 // Tests that Gt(v) matches anything > v.
TEST(GtTest,ImplementsGreaterThan)888 TEST(GtTest, ImplementsGreaterThan) {
889 Matcher<double> m1 = Gt(0);
890 EXPECT_TRUE(m1.Matches(1.0));
891 EXPECT_FALSE(m1.Matches(0.0));
892 EXPECT_FALSE(m1.Matches(-1.0));
893 }
894
895 // Tests that Gt(v) describes itself properly.
TEST(GtTest,CanDescribeSelf)896 TEST(GtTest, CanDescribeSelf) {
897 Matcher<int> m = Gt(5);
898 EXPECT_EQ("is > 5", Describe(m));
899 }
900
901 // Tests that Le(v) matches anything <= v.
TEST(LeTest,ImplementsLessThanOrEqual)902 TEST(LeTest, ImplementsLessThanOrEqual) {
903 Matcher<char> m1 = Le('b');
904 EXPECT_TRUE(m1.Matches('a'));
905 EXPECT_TRUE(m1.Matches('b'));
906 EXPECT_FALSE(m1.Matches('c'));
907 }
908
909 // Tests that Le(v) describes itself properly.
TEST(LeTest,CanDescribeSelf)910 TEST(LeTest, CanDescribeSelf) {
911 Matcher<int> m = Le(5);
912 EXPECT_EQ("is <= 5", Describe(m));
913 }
914
915 // Tests that Lt(v) matches anything < v.
TEST(LtTest,ImplementsLessThan)916 TEST(LtTest, ImplementsLessThan) {
917 Matcher<const string&> m1 = Lt("Hello");
918 EXPECT_TRUE(m1.Matches("Abc"));
919 EXPECT_FALSE(m1.Matches("Hello"));
920 EXPECT_FALSE(m1.Matches("Hello, world!"));
921 }
922
923 // Tests that Lt(v) describes itself properly.
TEST(LtTest,CanDescribeSelf)924 TEST(LtTest, CanDescribeSelf) {
925 Matcher<int> m = Lt(5);
926 EXPECT_EQ("is < 5", Describe(m));
927 }
928
929 // Tests that Ne(v) matches anything != v.
TEST(NeTest,ImplementsNotEqual)930 TEST(NeTest, ImplementsNotEqual) {
931 Matcher<int> m1 = Ne(0);
932 EXPECT_TRUE(m1.Matches(1));
933 EXPECT_TRUE(m1.Matches(-1));
934 EXPECT_FALSE(m1.Matches(0));
935 }
936
937 // Tests that Ne(v) describes itself properly.
TEST(NeTest,CanDescribeSelf)938 TEST(NeTest, CanDescribeSelf) {
939 Matcher<int> m = Ne(5);
940 EXPECT_EQ("isn't equal to 5", Describe(m));
941 }
942
943 // Tests that IsNull() matches any NULL pointer of any type.
TEST(IsNullTest,MatchesNullPointer)944 TEST(IsNullTest, MatchesNullPointer) {
945 Matcher<int*> m1 = IsNull();
946 int* p1 = NULL;
947 int n = 0;
948 EXPECT_TRUE(m1.Matches(p1));
949 EXPECT_FALSE(m1.Matches(&n));
950
951 Matcher<const char*> m2 = IsNull();
952 const char* p2 = NULL;
953 EXPECT_TRUE(m2.Matches(p2));
954 EXPECT_FALSE(m2.Matches("hi"));
955
956 #if !GTEST_OS_SYMBIAN
957 // Nokia's Symbian compiler generates:
958 // gmock-matchers.h: ambiguous access to overloaded function
959 // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)'
960 // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing::
961 // MatcherInterface<void *> *)'
962 // gmock-matchers.h: (point of instantiation: 'testing::
963 // gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()')
964 // gmock-matchers.h: (instantiating: 'testing::PolymorphicMatc
965 Matcher<void*> m3 = IsNull();
966 void* p3 = NULL;
967 EXPECT_TRUE(m3.Matches(p3));
968 EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef)));
969 #endif
970 }
971
TEST(IsNullTest,LinkedPtr)972 TEST(IsNullTest, LinkedPtr) {
973 const Matcher<linked_ptr<int> > m = IsNull();
974 const linked_ptr<int> null_p;
975 const linked_ptr<int> non_null_p(new int);
976
977 EXPECT_TRUE(m.Matches(null_p));
978 EXPECT_FALSE(m.Matches(non_null_p));
979 }
980
TEST(IsNullTest,ReferenceToConstLinkedPtr)981 TEST(IsNullTest, ReferenceToConstLinkedPtr) {
982 const Matcher<const linked_ptr<double>&> m = IsNull();
983 const linked_ptr<double> null_p;
984 const linked_ptr<double> non_null_p(new double);
985
986 EXPECT_TRUE(m.Matches(null_p));
987 EXPECT_FALSE(m.Matches(non_null_p));
988 }
989
TEST(IsNullTest,ReferenceToConstScopedPtr)990 TEST(IsNullTest, ReferenceToConstScopedPtr) {
991 const Matcher<const scoped_ptr<double>&> m = IsNull();
992 const scoped_ptr<double> null_p;
993 const scoped_ptr<double> non_null_p(new double);
994
995 EXPECT_TRUE(m.Matches(null_p));
996 EXPECT_FALSE(m.Matches(non_null_p));
997 }
998
999 // Tests that IsNull() describes itself properly.
TEST(IsNullTest,CanDescribeSelf)1000 TEST(IsNullTest, CanDescribeSelf) {
1001 Matcher<int*> m = IsNull();
1002 EXPECT_EQ("is NULL", Describe(m));
1003 EXPECT_EQ("isn't NULL", DescribeNegation(m));
1004 }
1005
1006 // Tests that NotNull() matches any non-NULL pointer of any type.
TEST(NotNullTest,MatchesNonNullPointer)1007 TEST(NotNullTest, MatchesNonNullPointer) {
1008 Matcher<int*> m1 = NotNull();
1009 int* p1 = NULL;
1010 int n = 0;
1011 EXPECT_FALSE(m1.Matches(p1));
1012 EXPECT_TRUE(m1.Matches(&n));
1013
1014 Matcher<const char*> m2 = NotNull();
1015 const char* p2 = NULL;
1016 EXPECT_FALSE(m2.Matches(p2));
1017 EXPECT_TRUE(m2.Matches("hi"));
1018 }
1019
TEST(NotNullTest,LinkedPtr)1020 TEST(NotNullTest, LinkedPtr) {
1021 const Matcher<linked_ptr<int> > m = NotNull();
1022 const linked_ptr<int> null_p;
1023 const linked_ptr<int> non_null_p(new int);
1024
1025 EXPECT_FALSE(m.Matches(null_p));
1026 EXPECT_TRUE(m.Matches(non_null_p));
1027 }
1028
TEST(NotNullTest,ReferenceToConstLinkedPtr)1029 TEST(NotNullTest, ReferenceToConstLinkedPtr) {
1030 const Matcher<const linked_ptr<double>&> m = NotNull();
1031 const linked_ptr<double> null_p;
1032 const linked_ptr<double> non_null_p(new double);
1033
1034 EXPECT_FALSE(m.Matches(null_p));
1035 EXPECT_TRUE(m.Matches(non_null_p));
1036 }
1037
TEST(NotNullTest,ReferenceToConstScopedPtr)1038 TEST(NotNullTest, ReferenceToConstScopedPtr) {
1039 const Matcher<const scoped_ptr<double>&> m = NotNull();
1040 const scoped_ptr<double> null_p;
1041 const scoped_ptr<double> non_null_p(new double);
1042
1043 EXPECT_FALSE(m.Matches(null_p));
1044 EXPECT_TRUE(m.Matches(non_null_p));
1045 }
1046
1047 // Tests that NotNull() describes itself properly.
TEST(NotNullTest,CanDescribeSelf)1048 TEST(NotNullTest, CanDescribeSelf) {
1049 Matcher<int*> m = NotNull();
1050 EXPECT_EQ("isn't NULL", Describe(m));
1051 }
1052
1053 // Tests that Ref(variable) matches an argument that references
1054 // 'variable'.
TEST(RefTest,MatchesSameVariable)1055 TEST(RefTest, MatchesSameVariable) {
1056 int a = 0;
1057 int b = 0;
1058 Matcher<int&> m = Ref(a);
1059 EXPECT_TRUE(m.Matches(a));
1060 EXPECT_FALSE(m.Matches(b));
1061 }
1062
1063 // Tests that Ref(variable) describes itself properly.
TEST(RefTest,CanDescribeSelf)1064 TEST(RefTest, CanDescribeSelf) {
1065 int n = 5;
1066 Matcher<int&> m = Ref(n);
1067 stringstream ss;
1068 ss << "references the variable @" << &n << " 5";
1069 EXPECT_EQ(string(ss.str()), Describe(m));
1070 }
1071
1072 // Test that Ref(non_const_varialbe) can be used as a matcher for a
1073 // const reference.
TEST(RefTest,CanBeUsedAsMatcherForConstReference)1074 TEST(RefTest, CanBeUsedAsMatcherForConstReference) {
1075 int a = 0;
1076 int b = 0;
1077 Matcher<const int&> m = Ref(a);
1078 EXPECT_TRUE(m.Matches(a));
1079 EXPECT_FALSE(m.Matches(b));
1080 }
1081
1082 // Tests that Ref(variable) is covariant, i.e. Ref(derived) can be
1083 // used wherever Ref(base) can be used (Ref(derived) is a sub-type
1084 // of Ref(base), but not vice versa.
1085
TEST(RefTest,IsCovariant)1086 TEST(RefTest, IsCovariant) {
1087 Base base, base2;
1088 Derived derived;
1089 Matcher<const Base&> m1 = Ref(base);
1090 EXPECT_TRUE(m1.Matches(base));
1091 EXPECT_FALSE(m1.Matches(base2));
1092 EXPECT_FALSE(m1.Matches(derived));
1093
1094 m1 = Ref(derived);
1095 EXPECT_TRUE(m1.Matches(derived));
1096 EXPECT_FALSE(m1.Matches(base));
1097 EXPECT_FALSE(m1.Matches(base2));
1098 }
1099
TEST(RefTest,ExplainsResult)1100 TEST(RefTest, ExplainsResult) {
1101 int n = 0;
1102 EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n),
1103 StartsWith("which is located @"));
1104
1105 int m = 0;
1106 EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m),
1107 StartsWith("which is located @"));
1108 }
1109
1110 // Tests string comparison matchers.
1111
TEST(StrEqTest,MatchesEqualString)1112 TEST(StrEqTest, MatchesEqualString) {
1113 Matcher<const char*> m = StrEq(string("Hello"));
1114 EXPECT_TRUE(m.Matches("Hello"));
1115 EXPECT_FALSE(m.Matches("hello"));
1116 EXPECT_FALSE(m.Matches(NULL));
1117
1118 Matcher<const string&> m2 = StrEq("Hello");
1119 EXPECT_TRUE(m2.Matches("Hello"));
1120 EXPECT_FALSE(m2.Matches("Hi"));
1121 }
1122
TEST(StrEqTest,CanDescribeSelf)1123 TEST(StrEqTest, CanDescribeSelf) {
1124 Matcher<string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3");
1125 EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"",
1126 Describe(m));
1127
1128 string str("01204500800");
1129 str[3] = '\0';
1130 Matcher<string> m2 = StrEq(str);
1131 EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2));
1132 str[0] = str[6] = str[7] = str[9] = str[10] = '\0';
1133 Matcher<string> m3 = StrEq(str);
1134 EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3));
1135 }
1136
TEST(StrNeTest,MatchesUnequalString)1137 TEST(StrNeTest, MatchesUnequalString) {
1138 Matcher<const char*> m = StrNe("Hello");
1139 EXPECT_TRUE(m.Matches(""));
1140 EXPECT_TRUE(m.Matches(NULL));
1141 EXPECT_FALSE(m.Matches("Hello"));
1142
1143 Matcher<string> m2 = StrNe(string("Hello"));
1144 EXPECT_TRUE(m2.Matches("hello"));
1145 EXPECT_FALSE(m2.Matches("Hello"));
1146 }
1147
TEST(StrNeTest,CanDescribeSelf)1148 TEST(StrNeTest, CanDescribeSelf) {
1149 Matcher<const char*> m = StrNe("Hi");
1150 EXPECT_EQ("isn't equal to \"Hi\"", Describe(m));
1151 }
1152
TEST(StrCaseEqTest,MatchesEqualStringIgnoringCase)1153 TEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) {
1154 Matcher<const char*> m = StrCaseEq(string("Hello"));
1155 EXPECT_TRUE(m.Matches("Hello"));
1156 EXPECT_TRUE(m.Matches("hello"));
1157 EXPECT_FALSE(m.Matches("Hi"));
1158 EXPECT_FALSE(m.Matches(NULL));
1159
1160 Matcher<const string&> m2 = StrCaseEq("Hello");
1161 EXPECT_TRUE(m2.Matches("hello"));
1162 EXPECT_FALSE(m2.Matches("Hi"));
1163 }
1164
TEST(StrCaseEqTest,MatchesEqualStringWith0IgnoringCase)1165 TEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1166 string str1("oabocdooeoo");
1167 string str2("OABOCDOOEOO");
1168 Matcher<const string&> m0 = StrCaseEq(str1);
1169 EXPECT_FALSE(m0.Matches(str2 + string(1, '\0')));
1170
1171 str1[3] = str2[3] = '\0';
1172 Matcher<const string&> m1 = StrCaseEq(str1);
1173 EXPECT_TRUE(m1.Matches(str2));
1174
1175 str1[0] = str1[6] = str1[7] = str1[10] = '\0';
1176 str2[0] = str2[6] = str2[7] = str2[10] = '\0';
1177 Matcher<const string&> m2 = StrCaseEq(str1);
1178 str1[9] = str2[9] = '\0';
1179 EXPECT_FALSE(m2.Matches(str2));
1180
1181 Matcher<const string&> m3 = StrCaseEq(str1);
1182 EXPECT_TRUE(m3.Matches(str2));
1183
1184 EXPECT_FALSE(m3.Matches(str2 + "x"));
1185 str2.append(1, '\0');
1186 EXPECT_FALSE(m3.Matches(str2));
1187 EXPECT_FALSE(m3.Matches(string(str2, 0, 9)));
1188 }
1189
TEST(StrCaseEqTest,CanDescribeSelf)1190 TEST(StrCaseEqTest, CanDescribeSelf) {
1191 Matcher<string> m = StrCaseEq("Hi");
1192 EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m));
1193 }
1194
TEST(StrCaseNeTest,MatchesUnequalStringIgnoringCase)1195 TEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1196 Matcher<const char*> m = StrCaseNe("Hello");
1197 EXPECT_TRUE(m.Matches("Hi"));
1198 EXPECT_TRUE(m.Matches(NULL));
1199 EXPECT_FALSE(m.Matches("Hello"));
1200 EXPECT_FALSE(m.Matches("hello"));
1201
1202 Matcher<string> m2 = StrCaseNe(string("Hello"));
1203 EXPECT_TRUE(m2.Matches(""));
1204 EXPECT_FALSE(m2.Matches("Hello"));
1205 }
1206
TEST(StrCaseNeTest,CanDescribeSelf)1207 TEST(StrCaseNeTest, CanDescribeSelf) {
1208 Matcher<const char*> m = StrCaseNe("Hi");
1209 EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m));
1210 }
1211
1212 // Tests that HasSubstr() works for matching string-typed values.
TEST(HasSubstrTest,WorksForStringClasses)1213 TEST(HasSubstrTest, WorksForStringClasses) {
1214 const Matcher<string> m1 = HasSubstr("foo");
1215 EXPECT_TRUE(m1.Matches(string("I love food.")));
1216 EXPECT_FALSE(m1.Matches(string("tofo")));
1217
1218 const Matcher<const std::string&> m2 = HasSubstr("foo");
1219 EXPECT_TRUE(m2.Matches(std::string("I love food.")));
1220 EXPECT_FALSE(m2.Matches(std::string("tofo")));
1221 }
1222
1223 // Tests that HasSubstr() works for matching C-string-typed values.
TEST(HasSubstrTest,WorksForCStrings)1224 TEST(HasSubstrTest, WorksForCStrings) {
1225 const Matcher<char*> m1 = HasSubstr("foo");
1226 EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food.")));
1227 EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo")));
1228 EXPECT_FALSE(m1.Matches(NULL));
1229
1230 const Matcher<const char*> m2 = HasSubstr("foo");
1231 EXPECT_TRUE(m2.Matches("I love food."));
1232 EXPECT_FALSE(m2.Matches("tofo"));
1233 EXPECT_FALSE(m2.Matches(NULL));
1234 }
1235
1236 // Tests that HasSubstr(s) describes itself properly.
TEST(HasSubstrTest,CanDescribeSelf)1237 TEST(HasSubstrTest, CanDescribeSelf) {
1238 Matcher<string> m = HasSubstr("foo\n\"");
1239 EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m));
1240 }
1241
TEST(KeyTest,CanDescribeSelf)1242 TEST(KeyTest, CanDescribeSelf) {
1243 Matcher<const pair<std::string, int>&> m = Key("foo");
1244 EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m));
1245 EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m));
1246 }
1247
TEST(KeyTest,ExplainsResult)1248 TEST(KeyTest, ExplainsResult) {
1249 Matcher<pair<int, bool> > m = Key(GreaterThan(10));
1250 EXPECT_EQ("whose first field is a value which is 5 less than 10",
1251 Explain(m, make_pair(5, true)));
1252 EXPECT_EQ("whose first field is a value which is 5 more than 10",
1253 Explain(m, make_pair(15, true)));
1254 }
1255
TEST(KeyTest,MatchesCorrectly)1256 TEST(KeyTest, MatchesCorrectly) {
1257 pair<int, std::string> p(25, "foo");
1258 EXPECT_THAT(p, Key(25));
1259 EXPECT_THAT(p, Not(Key(42)));
1260 EXPECT_THAT(p, Key(Ge(20)));
1261 EXPECT_THAT(p, Not(Key(Lt(25))));
1262 }
1263
TEST(KeyTest,SafelyCastsInnerMatcher)1264 TEST(KeyTest, SafelyCastsInnerMatcher) {
1265 Matcher<int> is_positive = Gt(0);
1266 Matcher<int> is_negative = Lt(0);
1267 pair<char, bool> p('a', true);
1268 EXPECT_THAT(p, Key(is_positive));
1269 EXPECT_THAT(p, Not(Key(is_negative)));
1270 }
1271
TEST(KeyTest,InsideContainsUsingMap)1272 TEST(KeyTest, InsideContainsUsingMap) {
1273 map<int, char> container;
1274 container.insert(make_pair(1, 'a'));
1275 container.insert(make_pair(2, 'b'));
1276 container.insert(make_pair(4, 'c'));
1277 EXPECT_THAT(container, Contains(Key(1)));
1278 EXPECT_THAT(container, Not(Contains(Key(3))));
1279 }
1280
TEST(KeyTest,InsideContainsUsingMultimap)1281 TEST(KeyTest, InsideContainsUsingMultimap) {
1282 multimap<int, char> container;
1283 container.insert(make_pair(1, 'a'));
1284 container.insert(make_pair(2, 'b'));
1285 container.insert(make_pair(4, 'c'));
1286
1287 EXPECT_THAT(container, Not(Contains(Key(25))));
1288 container.insert(make_pair(25, 'd'));
1289 EXPECT_THAT(container, Contains(Key(25)));
1290 container.insert(make_pair(25, 'e'));
1291 EXPECT_THAT(container, Contains(Key(25)));
1292
1293 EXPECT_THAT(container, Contains(Key(1)));
1294 EXPECT_THAT(container, Not(Contains(Key(3))));
1295 }
1296
TEST(PairTest,Typing)1297 TEST(PairTest, Typing) {
1298 // Test verifies the following type conversions can be compiled.
1299 Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42);
1300 Matcher<const pair<const char*, int> > m2 = Pair("foo", 42);
1301 Matcher<pair<const char*, int> > m3 = Pair("foo", 42);
1302
1303 Matcher<pair<int, const std::string> > m4 = Pair(25, "42");
1304 Matcher<pair<const std::string, int> > m5 = Pair("25", 42);
1305 }
1306
TEST(PairTest,CanDescribeSelf)1307 TEST(PairTest, CanDescribeSelf) {
1308 Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42);
1309 EXPECT_EQ("has a first field that is equal to \"foo\""
1310 ", and has a second field that is equal to 42",
1311 Describe(m1));
1312 EXPECT_EQ("has a first field that isn't equal to \"foo\""
1313 ", or has a second field that isn't equal to 42",
1314 DescribeNegation(m1));
1315 // Double and triple negation (1 or 2 times not and description of negation).
1316 Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42));
1317 EXPECT_EQ("has a first field that isn't equal to 13"
1318 ", and has a second field that is equal to 42",
1319 DescribeNegation(m2));
1320 }
1321
TEST(PairTest,CanExplainMatchResultTo)1322 TEST(PairTest, CanExplainMatchResultTo) {
1323 // If neither field matches, Pair() should explain about the first
1324 // field.
1325 const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0));
1326 EXPECT_EQ("whose first field does not match, which is 1 less than 0",
1327 Explain(m, make_pair(-1, -2)));
1328
1329 // If the first field matches but the second doesn't, Pair() should
1330 // explain about the second field.
1331 EXPECT_EQ("whose second field does not match, which is 2 less than 0",
1332 Explain(m, make_pair(1, -2)));
1333
1334 // If the first field doesn't match but the second does, Pair()
1335 // should explain about the first field.
1336 EXPECT_EQ("whose first field does not match, which is 1 less than 0",
1337 Explain(m, make_pair(-1, 2)));
1338
1339 // If both fields match, Pair() should explain about them both.
1340 EXPECT_EQ("whose both fields match, where the first field is a value "
1341 "which is 1 more than 0, and the second field is a value "
1342 "which is 2 more than 0",
1343 Explain(m, make_pair(1, 2)));
1344
1345 // If only the first match has an explanation, only this explanation should
1346 // be printed.
1347 const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0);
1348 EXPECT_EQ("whose both fields match, where the first field is a value "
1349 "which is 1 more than 0",
1350 Explain(explain_first, make_pair(1, 0)));
1351
1352 // If only the second match has an explanation, only this explanation should
1353 // be printed.
1354 const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0));
1355 EXPECT_EQ("whose both fields match, where the second field is a value "
1356 "which is 1 more than 0",
1357 Explain(explain_second, make_pair(0, 1)));
1358 }
1359
TEST(PairTest,MatchesCorrectly)1360 TEST(PairTest, MatchesCorrectly) {
1361 pair<int, std::string> p(25, "foo");
1362
1363 // Both fields match.
1364 EXPECT_THAT(p, Pair(25, "foo"));
1365 EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o")));
1366
1367 // 'first' doesnt' match, but 'second' matches.
1368 EXPECT_THAT(p, Not(Pair(42, "foo")));
1369 EXPECT_THAT(p, Not(Pair(Lt(25), "foo")));
1370
1371 // 'first' matches, but 'second' doesn't match.
1372 EXPECT_THAT(p, Not(Pair(25, "bar")));
1373 EXPECT_THAT(p, Not(Pair(25, Not("foo"))));
1374
1375 // Neither field matches.
1376 EXPECT_THAT(p, Not(Pair(13, "bar")));
1377 EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a"))));
1378 }
1379
TEST(PairTest,SafelyCastsInnerMatchers)1380 TEST(PairTest, SafelyCastsInnerMatchers) {
1381 Matcher<int> is_positive = Gt(0);
1382 Matcher<int> is_negative = Lt(0);
1383 pair<char, bool> p('a', true);
1384 EXPECT_THAT(p, Pair(is_positive, _));
1385 EXPECT_THAT(p, Not(Pair(is_negative, _)));
1386 EXPECT_THAT(p, Pair(_, is_positive));
1387 EXPECT_THAT(p, Not(Pair(_, is_negative)));
1388 }
1389
TEST(PairTest,InsideContainsUsingMap)1390 TEST(PairTest, InsideContainsUsingMap) {
1391 map<int, char> container;
1392 container.insert(make_pair(1, 'a'));
1393 container.insert(make_pair(2, 'b'));
1394 container.insert(make_pair(4, 'c'));
1395 EXPECT_THAT(container, Contains(Pair(1, 'a')));
1396 EXPECT_THAT(container, Contains(Pair(1, _)));
1397 EXPECT_THAT(container, Contains(Pair(_, 'a')));
1398 EXPECT_THAT(container, Not(Contains(Pair(3, _))));
1399 }
1400
1401 // Tests StartsWith(s).
1402
TEST(StartsWithTest,MatchesStringWithGivenPrefix)1403 TEST(StartsWithTest, MatchesStringWithGivenPrefix) {
1404 const Matcher<const char*> m1 = StartsWith(string(""));
1405 EXPECT_TRUE(m1.Matches("Hi"));
1406 EXPECT_TRUE(m1.Matches(""));
1407 EXPECT_FALSE(m1.Matches(NULL));
1408
1409 const Matcher<const string&> m2 = StartsWith("Hi");
1410 EXPECT_TRUE(m2.Matches("Hi"));
1411 EXPECT_TRUE(m2.Matches("Hi Hi!"));
1412 EXPECT_TRUE(m2.Matches("High"));
1413 EXPECT_FALSE(m2.Matches("H"));
1414 EXPECT_FALSE(m2.Matches(" Hi"));
1415 }
1416
TEST(StartsWithTest,CanDescribeSelf)1417 TEST(StartsWithTest, CanDescribeSelf) {
1418 Matcher<const std::string> m = StartsWith("Hi");
1419 EXPECT_EQ("starts with \"Hi\"", Describe(m));
1420 }
1421
1422 // Tests EndsWith(s).
1423
TEST(EndsWithTest,MatchesStringWithGivenSuffix)1424 TEST(EndsWithTest, MatchesStringWithGivenSuffix) {
1425 const Matcher<const char*> m1 = EndsWith("");
1426 EXPECT_TRUE(m1.Matches("Hi"));
1427 EXPECT_TRUE(m1.Matches(""));
1428 EXPECT_FALSE(m1.Matches(NULL));
1429
1430 const Matcher<const string&> m2 = EndsWith(string("Hi"));
1431 EXPECT_TRUE(m2.Matches("Hi"));
1432 EXPECT_TRUE(m2.Matches("Wow Hi Hi"));
1433 EXPECT_TRUE(m2.Matches("Super Hi"));
1434 EXPECT_FALSE(m2.Matches("i"));
1435 EXPECT_FALSE(m2.Matches("Hi "));
1436 }
1437
TEST(EndsWithTest,CanDescribeSelf)1438 TEST(EndsWithTest, CanDescribeSelf) {
1439 Matcher<const std::string> m = EndsWith("Hi");
1440 EXPECT_EQ("ends with \"Hi\"", Describe(m));
1441 }
1442
1443 // Tests MatchesRegex().
1444
TEST(MatchesRegexTest,MatchesStringMatchingGivenRegex)1445 TEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) {
1446 const Matcher<const char*> m1 = MatchesRegex("a.*z");
1447 EXPECT_TRUE(m1.Matches("az"));
1448 EXPECT_TRUE(m1.Matches("abcz"));
1449 EXPECT_FALSE(m1.Matches(NULL));
1450
1451 const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z"));
1452 EXPECT_TRUE(m2.Matches("azbz"));
1453 EXPECT_FALSE(m2.Matches("az1"));
1454 EXPECT_FALSE(m2.Matches("1az"));
1455 }
1456
TEST(MatchesRegexTest,CanDescribeSelf)1457 TEST(MatchesRegexTest, CanDescribeSelf) {
1458 Matcher<const std::string> m1 = MatchesRegex(string("Hi.*"));
1459 EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1));
1460
1461 Matcher<const char*> m2 = MatchesRegex(new RE("a.*"));
1462 EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2));
1463 }
1464
1465 // Tests ContainsRegex().
1466
TEST(ContainsRegexTest,MatchesStringContainingGivenRegex)1467 TEST(ContainsRegexTest, MatchesStringContainingGivenRegex) {
1468 const Matcher<const char*> m1 = ContainsRegex(string("a.*z"));
1469 EXPECT_TRUE(m1.Matches("az"));
1470 EXPECT_TRUE(m1.Matches("0abcz1"));
1471 EXPECT_FALSE(m1.Matches(NULL));
1472
1473 const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z"));
1474 EXPECT_TRUE(m2.Matches("azbz"));
1475 EXPECT_TRUE(m2.Matches("az1"));
1476 EXPECT_FALSE(m2.Matches("1a"));
1477 }
1478
TEST(ContainsRegexTest,CanDescribeSelf)1479 TEST(ContainsRegexTest, CanDescribeSelf) {
1480 Matcher<const std::string> m1 = ContainsRegex("Hi.*");
1481 EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1));
1482
1483 Matcher<const char*> m2 = ContainsRegex(new RE("a.*"));
1484 EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2));
1485 }
1486
1487 // Tests for wide strings.
1488 #if GTEST_HAS_STD_WSTRING
TEST(StdWideStrEqTest,MatchesEqual)1489 TEST(StdWideStrEqTest, MatchesEqual) {
1490 Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello"));
1491 EXPECT_TRUE(m.Matches(L"Hello"));
1492 EXPECT_FALSE(m.Matches(L"hello"));
1493 EXPECT_FALSE(m.Matches(NULL));
1494
1495 Matcher<const ::std::wstring&> m2 = StrEq(L"Hello");
1496 EXPECT_TRUE(m2.Matches(L"Hello"));
1497 EXPECT_FALSE(m2.Matches(L"Hi"));
1498
1499 Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1500 EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1501 EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1502
1503 ::std::wstring str(L"01204500800");
1504 str[3] = L'\0';
1505 Matcher<const ::std::wstring&> m4 = StrEq(str);
1506 EXPECT_TRUE(m4.Matches(str));
1507 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1508 Matcher<const ::std::wstring&> m5 = StrEq(str);
1509 EXPECT_TRUE(m5.Matches(str));
1510 }
1511
TEST(StdWideStrEqTest,CanDescribeSelf)1512 TEST(StdWideStrEqTest, CanDescribeSelf) {
1513 Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1514 EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
1515 Describe(m));
1516
1517 Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1518 EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1519 Describe(m2));
1520
1521 ::std::wstring str(L"01204500800");
1522 str[3] = L'\0';
1523 Matcher<const ::std::wstring&> m4 = StrEq(str);
1524 EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1525 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1526 Matcher<const ::std::wstring&> m5 = StrEq(str);
1527 EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1528 }
1529
TEST(StdWideStrNeTest,MatchesUnequalString)1530 TEST(StdWideStrNeTest, MatchesUnequalString) {
1531 Matcher<const wchar_t*> m = StrNe(L"Hello");
1532 EXPECT_TRUE(m.Matches(L""));
1533 EXPECT_TRUE(m.Matches(NULL));
1534 EXPECT_FALSE(m.Matches(L"Hello"));
1535
1536 Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello"));
1537 EXPECT_TRUE(m2.Matches(L"hello"));
1538 EXPECT_FALSE(m2.Matches(L"Hello"));
1539 }
1540
TEST(StdWideStrNeTest,CanDescribeSelf)1541 TEST(StdWideStrNeTest, CanDescribeSelf) {
1542 Matcher<const wchar_t*> m = StrNe(L"Hi");
1543 EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
1544 }
1545
TEST(StdWideStrCaseEqTest,MatchesEqualStringIgnoringCase)1546 TEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1547 Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello"));
1548 EXPECT_TRUE(m.Matches(L"Hello"));
1549 EXPECT_TRUE(m.Matches(L"hello"));
1550 EXPECT_FALSE(m.Matches(L"Hi"));
1551 EXPECT_FALSE(m.Matches(NULL));
1552
1553 Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello");
1554 EXPECT_TRUE(m2.Matches(L"hello"));
1555 EXPECT_FALSE(m2.Matches(L"Hi"));
1556 }
1557
TEST(StdWideStrCaseEqTest,MatchesEqualStringWith0IgnoringCase)1558 TEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1559 ::std::wstring str1(L"oabocdooeoo");
1560 ::std::wstring str2(L"OABOCDOOEOO");
1561 Matcher<const ::std::wstring&> m0 = StrCaseEq(str1);
1562 EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0')));
1563
1564 str1[3] = str2[3] = L'\0';
1565 Matcher<const ::std::wstring&> m1 = StrCaseEq(str1);
1566 EXPECT_TRUE(m1.Matches(str2));
1567
1568 str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1569 str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1570 Matcher<const ::std::wstring&> m2 = StrCaseEq(str1);
1571 str1[9] = str2[9] = L'\0';
1572 EXPECT_FALSE(m2.Matches(str2));
1573
1574 Matcher<const ::std::wstring&> m3 = StrCaseEq(str1);
1575 EXPECT_TRUE(m3.Matches(str2));
1576
1577 EXPECT_FALSE(m3.Matches(str2 + L"x"));
1578 str2.append(1, L'\0');
1579 EXPECT_FALSE(m3.Matches(str2));
1580 EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9)));
1581 }
1582
TEST(StdWideStrCaseEqTest,CanDescribeSelf)1583 TEST(StdWideStrCaseEqTest, CanDescribeSelf) {
1584 Matcher< ::std::wstring> m = StrCaseEq(L"Hi");
1585 EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1586 }
1587
TEST(StdWideStrCaseNeTest,MatchesUnequalStringIgnoringCase)1588 TEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1589 Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1590 EXPECT_TRUE(m.Matches(L"Hi"));
1591 EXPECT_TRUE(m.Matches(NULL));
1592 EXPECT_FALSE(m.Matches(L"Hello"));
1593 EXPECT_FALSE(m.Matches(L"hello"));
1594
1595 Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello"));
1596 EXPECT_TRUE(m2.Matches(L""));
1597 EXPECT_FALSE(m2.Matches(L"Hello"));
1598 }
1599
TEST(StdWideStrCaseNeTest,CanDescribeSelf)1600 TEST(StdWideStrCaseNeTest, CanDescribeSelf) {
1601 Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
1602 EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
1603 }
1604
1605 // Tests that HasSubstr() works for matching wstring-typed values.
TEST(StdWideHasSubstrTest,WorksForStringClasses)1606 TEST(StdWideHasSubstrTest, WorksForStringClasses) {
1607 const Matcher< ::std::wstring> m1 = HasSubstr(L"foo");
1608 EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food.")));
1609 EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo")));
1610
1611 const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo");
1612 EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food.")));
1613 EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo")));
1614 }
1615
1616 // Tests that HasSubstr() works for matching C-wide-string-typed values.
TEST(StdWideHasSubstrTest,WorksForCStrings)1617 TEST(StdWideHasSubstrTest, WorksForCStrings) {
1618 const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1619 EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1620 EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1621 EXPECT_FALSE(m1.Matches(NULL));
1622
1623 const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1624 EXPECT_TRUE(m2.Matches(L"I love food."));
1625 EXPECT_FALSE(m2.Matches(L"tofo"));
1626 EXPECT_FALSE(m2.Matches(NULL));
1627 }
1628
1629 // Tests that HasSubstr(s) describes itself properly.
TEST(StdWideHasSubstrTest,CanDescribeSelf)1630 TEST(StdWideHasSubstrTest, CanDescribeSelf) {
1631 Matcher< ::std::wstring> m = HasSubstr(L"foo\n\"");
1632 EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1633 }
1634
1635 // Tests StartsWith(s).
1636
TEST(StdWideStartsWithTest,MatchesStringWithGivenPrefix)1637 TEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) {
1638 const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L""));
1639 EXPECT_TRUE(m1.Matches(L"Hi"));
1640 EXPECT_TRUE(m1.Matches(L""));
1641 EXPECT_FALSE(m1.Matches(NULL));
1642
1643 const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi");
1644 EXPECT_TRUE(m2.Matches(L"Hi"));
1645 EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1646 EXPECT_TRUE(m2.Matches(L"High"));
1647 EXPECT_FALSE(m2.Matches(L"H"));
1648 EXPECT_FALSE(m2.Matches(L" Hi"));
1649 }
1650
TEST(StdWideStartsWithTest,CanDescribeSelf)1651 TEST(StdWideStartsWithTest, CanDescribeSelf) {
1652 Matcher<const ::std::wstring> m = StartsWith(L"Hi");
1653 EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1654 }
1655
1656 // Tests EndsWith(s).
1657
TEST(StdWideEndsWithTest,MatchesStringWithGivenSuffix)1658 TEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) {
1659 const Matcher<const wchar_t*> m1 = EndsWith(L"");
1660 EXPECT_TRUE(m1.Matches(L"Hi"));
1661 EXPECT_TRUE(m1.Matches(L""));
1662 EXPECT_FALSE(m1.Matches(NULL));
1663
1664 const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi"));
1665 EXPECT_TRUE(m2.Matches(L"Hi"));
1666 EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1667 EXPECT_TRUE(m2.Matches(L"Super Hi"));
1668 EXPECT_FALSE(m2.Matches(L"i"));
1669 EXPECT_FALSE(m2.Matches(L"Hi "));
1670 }
1671
TEST(StdWideEndsWithTest,CanDescribeSelf)1672 TEST(StdWideEndsWithTest, CanDescribeSelf) {
1673 Matcher<const ::std::wstring> m = EndsWith(L"Hi");
1674 EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1675 }
1676
1677 #endif // GTEST_HAS_STD_WSTRING
1678
1679 #if GTEST_HAS_GLOBAL_WSTRING
TEST(GlobalWideStrEqTest,MatchesEqual)1680 TEST(GlobalWideStrEqTest, MatchesEqual) {
1681 Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello"));
1682 EXPECT_TRUE(m.Matches(L"Hello"));
1683 EXPECT_FALSE(m.Matches(L"hello"));
1684 EXPECT_FALSE(m.Matches(NULL));
1685
1686 Matcher<const ::wstring&> m2 = StrEq(L"Hello");
1687 EXPECT_TRUE(m2.Matches(L"Hello"));
1688 EXPECT_FALSE(m2.Matches(L"Hi"));
1689
1690 Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1691 EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1692 EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1693
1694 ::wstring str(L"01204500800");
1695 str[3] = L'\0';
1696 Matcher<const ::wstring&> m4 = StrEq(str);
1697 EXPECT_TRUE(m4.Matches(str));
1698 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1699 Matcher<const ::wstring&> m5 = StrEq(str);
1700 EXPECT_TRUE(m5.Matches(str));
1701 }
1702
TEST(GlobalWideStrEqTest,CanDescribeSelf)1703 TEST(GlobalWideStrEqTest, CanDescribeSelf) {
1704 Matcher< ::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1705 EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
1706 Describe(m));
1707
1708 Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1709 EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1710 Describe(m2));
1711
1712 ::wstring str(L"01204500800");
1713 str[3] = L'\0';
1714 Matcher<const ::wstring&> m4 = StrEq(str);
1715 EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1716 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1717 Matcher<const ::wstring&> m5 = StrEq(str);
1718 EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1719 }
1720
TEST(GlobalWideStrNeTest,MatchesUnequalString)1721 TEST(GlobalWideStrNeTest, MatchesUnequalString) {
1722 Matcher<const wchar_t*> m = StrNe(L"Hello");
1723 EXPECT_TRUE(m.Matches(L""));
1724 EXPECT_TRUE(m.Matches(NULL));
1725 EXPECT_FALSE(m.Matches(L"Hello"));
1726
1727 Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello"));
1728 EXPECT_TRUE(m2.Matches(L"hello"));
1729 EXPECT_FALSE(m2.Matches(L"Hello"));
1730 }
1731
TEST(GlobalWideStrNeTest,CanDescribeSelf)1732 TEST(GlobalWideStrNeTest, CanDescribeSelf) {
1733 Matcher<const wchar_t*> m = StrNe(L"Hi");
1734 EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
1735 }
1736
TEST(GlobalWideStrCaseEqTest,MatchesEqualStringIgnoringCase)1737 TEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1738 Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello"));
1739 EXPECT_TRUE(m.Matches(L"Hello"));
1740 EXPECT_TRUE(m.Matches(L"hello"));
1741 EXPECT_FALSE(m.Matches(L"Hi"));
1742 EXPECT_FALSE(m.Matches(NULL));
1743
1744 Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello");
1745 EXPECT_TRUE(m2.Matches(L"hello"));
1746 EXPECT_FALSE(m2.Matches(L"Hi"));
1747 }
1748
TEST(GlobalWideStrCaseEqTest,MatchesEqualStringWith0IgnoringCase)1749 TEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1750 ::wstring str1(L"oabocdooeoo");
1751 ::wstring str2(L"OABOCDOOEOO");
1752 Matcher<const ::wstring&> m0 = StrCaseEq(str1);
1753 EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0')));
1754
1755 str1[3] = str2[3] = L'\0';
1756 Matcher<const ::wstring&> m1 = StrCaseEq(str1);
1757 EXPECT_TRUE(m1.Matches(str2));
1758
1759 str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1760 str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1761 Matcher<const ::wstring&> m2 = StrCaseEq(str1);
1762 str1[9] = str2[9] = L'\0';
1763 EXPECT_FALSE(m2.Matches(str2));
1764
1765 Matcher<const ::wstring&> m3 = StrCaseEq(str1);
1766 EXPECT_TRUE(m3.Matches(str2));
1767
1768 EXPECT_FALSE(m3.Matches(str2 + L"x"));
1769 str2.append(1, L'\0');
1770 EXPECT_FALSE(m3.Matches(str2));
1771 EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9)));
1772 }
1773
TEST(GlobalWideStrCaseEqTest,CanDescribeSelf)1774 TEST(GlobalWideStrCaseEqTest, CanDescribeSelf) {
1775 Matcher< ::wstring> m = StrCaseEq(L"Hi");
1776 EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1777 }
1778
TEST(GlobalWideStrCaseNeTest,MatchesUnequalStringIgnoringCase)1779 TEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1780 Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1781 EXPECT_TRUE(m.Matches(L"Hi"));
1782 EXPECT_TRUE(m.Matches(NULL));
1783 EXPECT_FALSE(m.Matches(L"Hello"));
1784 EXPECT_FALSE(m.Matches(L"hello"));
1785
1786 Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello"));
1787 EXPECT_TRUE(m2.Matches(L""));
1788 EXPECT_FALSE(m2.Matches(L"Hello"));
1789 }
1790
TEST(GlobalWideStrCaseNeTest,CanDescribeSelf)1791 TEST(GlobalWideStrCaseNeTest, CanDescribeSelf) {
1792 Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
1793 EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
1794 }
1795
1796 // Tests that HasSubstr() works for matching wstring-typed values.
TEST(GlobalWideHasSubstrTest,WorksForStringClasses)1797 TEST(GlobalWideHasSubstrTest, WorksForStringClasses) {
1798 const Matcher< ::wstring> m1 = HasSubstr(L"foo");
1799 EXPECT_TRUE(m1.Matches(::wstring(L"I love food.")));
1800 EXPECT_FALSE(m1.Matches(::wstring(L"tofo")));
1801
1802 const Matcher<const ::wstring&> m2 = HasSubstr(L"foo");
1803 EXPECT_TRUE(m2.Matches(::wstring(L"I love food.")));
1804 EXPECT_FALSE(m2.Matches(::wstring(L"tofo")));
1805 }
1806
1807 // Tests that HasSubstr() works for matching C-wide-string-typed values.
TEST(GlobalWideHasSubstrTest,WorksForCStrings)1808 TEST(GlobalWideHasSubstrTest, WorksForCStrings) {
1809 const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1810 EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1811 EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1812 EXPECT_FALSE(m1.Matches(NULL));
1813
1814 const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1815 EXPECT_TRUE(m2.Matches(L"I love food."));
1816 EXPECT_FALSE(m2.Matches(L"tofo"));
1817 EXPECT_FALSE(m2.Matches(NULL));
1818 }
1819
1820 // Tests that HasSubstr(s) describes itself properly.
TEST(GlobalWideHasSubstrTest,CanDescribeSelf)1821 TEST(GlobalWideHasSubstrTest, CanDescribeSelf) {
1822 Matcher< ::wstring> m = HasSubstr(L"foo\n\"");
1823 EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1824 }
1825
1826 // Tests StartsWith(s).
1827
TEST(GlobalWideStartsWithTest,MatchesStringWithGivenPrefix)1828 TEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) {
1829 const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L""));
1830 EXPECT_TRUE(m1.Matches(L"Hi"));
1831 EXPECT_TRUE(m1.Matches(L""));
1832 EXPECT_FALSE(m1.Matches(NULL));
1833
1834 const Matcher<const ::wstring&> m2 = StartsWith(L"Hi");
1835 EXPECT_TRUE(m2.Matches(L"Hi"));
1836 EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1837 EXPECT_TRUE(m2.Matches(L"High"));
1838 EXPECT_FALSE(m2.Matches(L"H"));
1839 EXPECT_FALSE(m2.Matches(L" Hi"));
1840 }
1841
TEST(GlobalWideStartsWithTest,CanDescribeSelf)1842 TEST(GlobalWideStartsWithTest, CanDescribeSelf) {
1843 Matcher<const ::wstring> m = StartsWith(L"Hi");
1844 EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1845 }
1846
1847 // Tests EndsWith(s).
1848
TEST(GlobalWideEndsWithTest,MatchesStringWithGivenSuffix)1849 TEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) {
1850 const Matcher<const wchar_t*> m1 = EndsWith(L"");
1851 EXPECT_TRUE(m1.Matches(L"Hi"));
1852 EXPECT_TRUE(m1.Matches(L""));
1853 EXPECT_FALSE(m1.Matches(NULL));
1854
1855 const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi"));
1856 EXPECT_TRUE(m2.Matches(L"Hi"));
1857 EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1858 EXPECT_TRUE(m2.Matches(L"Super Hi"));
1859 EXPECT_FALSE(m2.Matches(L"i"));
1860 EXPECT_FALSE(m2.Matches(L"Hi "));
1861 }
1862
TEST(GlobalWideEndsWithTest,CanDescribeSelf)1863 TEST(GlobalWideEndsWithTest, CanDescribeSelf) {
1864 Matcher<const ::wstring> m = EndsWith(L"Hi");
1865 EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1866 }
1867
1868 #endif // GTEST_HAS_GLOBAL_WSTRING
1869
1870
1871 typedef ::std::tr1::tuple<long, int> Tuple2; // NOLINT
1872
1873 // Tests that Eq() matches a 2-tuple where the first field == the
1874 // second field.
TEST(Eq2Test,MatchesEqualArguments)1875 TEST(Eq2Test, MatchesEqualArguments) {
1876 Matcher<const Tuple2&> m = Eq();
1877 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1878 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1879 }
1880
1881 // Tests that Eq() describes itself properly.
TEST(Eq2Test,CanDescribeSelf)1882 TEST(Eq2Test, CanDescribeSelf) {
1883 Matcher<const Tuple2&> m = Eq();
1884 EXPECT_EQ("are an equal pair", Describe(m));
1885 }
1886
1887 // Tests that Ge() matches a 2-tuple where the first field >= the
1888 // second field.
TEST(Ge2Test,MatchesGreaterThanOrEqualArguments)1889 TEST(Ge2Test, MatchesGreaterThanOrEqualArguments) {
1890 Matcher<const Tuple2&> m = Ge();
1891 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1892 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1893 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1894 }
1895
1896 // Tests that Ge() describes itself properly.
TEST(Ge2Test,CanDescribeSelf)1897 TEST(Ge2Test, CanDescribeSelf) {
1898 Matcher<const Tuple2&> m = Ge();
1899 EXPECT_EQ("are a pair where the first >= the second", Describe(m));
1900 }
1901
1902 // Tests that Gt() matches a 2-tuple where the first field > the
1903 // second field.
TEST(Gt2Test,MatchesGreaterThanArguments)1904 TEST(Gt2Test, MatchesGreaterThanArguments) {
1905 Matcher<const Tuple2&> m = Gt();
1906 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1907 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1908 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1909 }
1910
1911 // Tests that Gt() describes itself properly.
TEST(Gt2Test,CanDescribeSelf)1912 TEST(Gt2Test, CanDescribeSelf) {
1913 Matcher<const Tuple2&> m = Gt();
1914 EXPECT_EQ("are a pair where the first > the second", Describe(m));
1915 }
1916
1917 // Tests that Le() matches a 2-tuple where the first field <= the
1918 // second field.
TEST(Le2Test,MatchesLessThanOrEqualArguments)1919 TEST(Le2Test, MatchesLessThanOrEqualArguments) {
1920 Matcher<const Tuple2&> m = Le();
1921 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1922 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1923 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1924 }
1925
1926 // Tests that Le() describes itself properly.
TEST(Le2Test,CanDescribeSelf)1927 TEST(Le2Test, CanDescribeSelf) {
1928 Matcher<const Tuple2&> m = Le();
1929 EXPECT_EQ("are a pair where the first <= the second", Describe(m));
1930 }
1931
1932 // Tests that Lt() matches a 2-tuple where the first field < the
1933 // second field.
TEST(Lt2Test,MatchesLessThanArguments)1934 TEST(Lt2Test, MatchesLessThanArguments) {
1935 Matcher<const Tuple2&> m = Lt();
1936 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1937 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1938 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1939 }
1940
1941 // Tests that Lt() describes itself properly.
TEST(Lt2Test,CanDescribeSelf)1942 TEST(Lt2Test, CanDescribeSelf) {
1943 Matcher<const Tuple2&> m = Lt();
1944 EXPECT_EQ("are a pair where the first < the second", Describe(m));
1945 }
1946
1947 // Tests that Ne() matches a 2-tuple where the first field != the
1948 // second field.
TEST(Ne2Test,MatchesUnequalArguments)1949 TEST(Ne2Test, MatchesUnequalArguments) {
1950 Matcher<const Tuple2&> m = Ne();
1951 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1952 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1953 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1954 }
1955
1956 // Tests that Ne() describes itself properly.
TEST(Ne2Test,CanDescribeSelf)1957 TEST(Ne2Test, CanDescribeSelf) {
1958 Matcher<const Tuple2&> m = Ne();
1959 EXPECT_EQ("are an unequal pair", Describe(m));
1960 }
1961
1962 // Tests that Not(m) matches any value that doesn't match m.
TEST(NotTest,NegatesMatcher)1963 TEST(NotTest, NegatesMatcher) {
1964 Matcher<int> m;
1965 m = Not(Eq(2));
1966 EXPECT_TRUE(m.Matches(3));
1967 EXPECT_FALSE(m.Matches(2));
1968 }
1969
1970 // Tests that Not(m) describes itself properly.
TEST(NotTest,CanDescribeSelf)1971 TEST(NotTest, CanDescribeSelf) {
1972 Matcher<int> m = Not(Eq(5));
1973 EXPECT_EQ("isn't equal to 5", Describe(m));
1974 }
1975
1976 // Tests that monomorphic matchers are safely cast by the Not matcher.
TEST(NotTest,NotMatcherSafelyCastsMonomorphicMatchers)1977 TEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {
1978 // greater_than_5 is a monomorphic matcher.
1979 Matcher<int> greater_than_5 = Gt(5);
1980
1981 Matcher<const int&> m = Not(greater_than_5);
1982 Matcher<int&> m2 = Not(greater_than_5);
1983 Matcher<int&> m3 = Not(m);
1984 }
1985
1986 // Helper to allow easy testing of AllOf matchers with num parameters.
AllOfMatches(int num,const Matcher<int> & m)1987 void AllOfMatches(int num, const Matcher<int>& m) {
1988 SCOPED_TRACE(Describe(m));
1989 EXPECT_TRUE(m.Matches(0));
1990 for (int i = 1; i <= num; ++i) {
1991 EXPECT_FALSE(m.Matches(i));
1992 }
1993 EXPECT_TRUE(m.Matches(num + 1));
1994 }
1995
1996 // Tests that AllOf(m1, ..., mn) matches any value that matches all of
1997 // the given matchers.
TEST(AllOfTest,MatchesWhenAllMatch)1998 TEST(AllOfTest, MatchesWhenAllMatch) {
1999 Matcher<int> m;
2000 m = AllOf(Le(2), Ge(1));
2001 EXPECT_TRUE(m.Matches(1));
2002 EXPECT_TRUE(m.Matches(2));
2003 EXPECT_FALSE(m.Matches(0));
2004 EXPECT_FALSE(m.Matches(3));
2005
2006 m = AllOf(Gt(0), Ne(1), Ne(2));
2007 EXPECT_TRUE(m.Matches(3));
2008 EXPECT_FALSE(m.Matches(2));
2009 EXPECT_FALSE(m.Matches(1));
2010 EXPECT_FALSE(m.Matches(0));
2011
2012 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
2013 EXPECT_TRUE(m.Matches(4));
2014 EXPECT_FALSE(m.Matches(3));
2015 EXPECT_FALSE(m.Matches(2));
2016 EXPECT_FALSE(m.Matches(1));
2017 EXPECT_FALSE(m.Matches(0));
2018
2019 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
2020 EXPECT_TRUE(m.Matches(0));
2021 EXPECT_TRUE(m.Matches(1));
2022 EXPECT_FALSE(m.Matches(3));
2023
2024 // The following tests for varying number of sub-matchers. Due to the way
2025 // the sub-matchers are handled it is enough to test every sub-matcher once
2026 // with sub-matchers using the same matcher type. Varying matcher types are
2027 // checked for above.
2028 AllOfMatches(2, AllOf(Ne(1), Ne(2)));
2029 AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3)));
2030 AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4)));
2031 AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5)));
2032 AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6)));
2033 AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7)));
2034 AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
2035 Ne(8)));
2036 AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
2037 Ne(8), Ne(9)));
2038 AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2039 Ne(9), Ne(10)));
2040 }
2041
2042 #if GTEST_LANG_CXX11
2043 // Tests the variadic version of the AllOfMatcher.
TEST(AllOfTest,VariadicMatchesWhenAllMatch)2044 TEST(AllOfTest, VariadicMatchesWhenAllMatch) {
2045 // Make sure AllOf is defined in the right namespace and does not depend on
2046 // ADL.
2047 ::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2048 Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2049 Ne(9), Ne(10), Ne(11));
2050 EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11))))))))))"));
2051 AllOfMatches(11, m);
2052 AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2053 Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15),
2054 Ne(16), Ne(17), Ne(18), Ne(19), Ne(20), Ne(21), Ne(22),
2055 Ne(23), Ne(24), Ne(25), Ne(26), Ne(27), Ne(28), Ne(29),
2056 Ne(30), Ne(31), Ne(32), Ne(33), Ne(34), Ne(35), Ne(36),
2057 Ne(37), Ne(38), Ne(39), Ne(40), Ne(41), Ne(42), Ne(43),
2058 Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49),
2059 Ne(50)));
2060 }
2061
2062 #endif // GTEST_LANG_CXX11
2063
2064 // Tests that AllOf(m1, ..., mn) describes itself properly.
TEST(AllOfTest,CanDescribeSelf)2065 TEST(AllOfTest, CanDescribeSelf) {
2066 Matcher<int> m;
2067 m = AllOf(Le(2), Ge(1));
2068 EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m));
2069
2070 m = AllOf(Gt(0), Ne(1), Ne(2));
2071 EXPECT_EQ("(is > 0) and "
2072 "((isn't equal to 1) and "
2073 "(isn't equal to 2))",
2074 Describe(m));
2075
2076
2077 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
2078 EXPECT_EQ("((is > 0) and "
2079 "(isn't equal to 1)) and "
2080 "((isn't equal to 2) and "
2081 "(isn't equal to 3))",
2082 Describe(m));
2083
2084
2085 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
2086 EXPECT_EQ("((is >= 0) and "
2087 "(is < 10)) and "
2088 "((isn't equal to 3) and "
2089 "((isn't equal to 5) and "
2090 "(isn't equal to 7)))",
2091 Describe(m));
2092 }
2093
2094 // Tests that AllOf(m1, ..., mn) describes its negation properly.
TEST(AllOfTest,CanDescribeNegation)2095 TEST(AllOfTest, CanDescribeNegation) {
2096 Matcher<int> m;
2097 m = AllOf(Le(2), Ge(1));
2098 EXPECT_EQ("(isn't <= 2) or "
2099 "(isn't >= 1)",
2100 DescribeNegation(m));
2101
2102 m = AllOf(Gt(0), Ne(1), Ne(2));
2103 EXPECT_EQ("(isn't > 0) or "
2104 "((is equal to 1) or "
2105 "(is equal to 2))",
2106 DescribeNegation(m));
2107
2108
2109 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
2110 EXPECT_EQ("((isn't > 0) or "
2111 "(is equal to 1)) or "
2112 "((is equal to 2) or "
2113 "(is equal to 3))",
2114 DescribeNegation(m));
2115
2116
2117 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
2118 EXPECT_EQ("((isn't >= 0) or "
2119 "(isn't < 10)) or "
2120 "((is equal to 3) or "
2121 "((is equal to 5) or "
2122 "(is equal to 7)))",
2123 DescribeNegation(m));
2124 }
2125
2126 // Tests that monomorphic matchers are safely cast by the AllOf matcher.
TEST(AllOfTest,AllOfMatcherSafelyCastsMonomorphicMatchers)2127 TEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
2128 // greater_than_5 and less_than_10 are monomorphic matchers.
2129 Matcher<int> greater_than_5 = Gt(5);
2130 Matcher<int> less_than_10 = Lt(10);
2131
2132 Matcher<const int&> m = AllOf(greater_than_5, less_than_10);
2133 Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);
2134 Matcher<int&> m3 = AllOf(greater_than_5, m2);
2135
2136 // Tests that BothOf works when composing itself.
2137 Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);
2138 Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);
2139 }
2140
TEST(AllOfTest,ExplainsResult)2141 TEST(AllOfTest, ExplainsResult) {
2142 Matcher<int> m;
2143
2144 // Successful match. Both matchers need to explain. The second
2145 // matcher doesn't give an explanation, so only the first matcher's
2146 // explanation is printed.
2147 m = AllOf(GreaterThan(10), Lt(30));
2148 EXPECT_EQ("which is 15 more than 10", Explain(m, 25));
2149
2150 // Successful match. Both matchers need to explain.
2151 m = AllOf(GreaterThan(10), GreaterThan(20));
2152 EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20",
2153 Explain(m, 30));
2154
2155 // Successful match. All matchers need to explain. The second
2156 // matcher doesn't given an explanation.
2157 m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20));
2158 EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20",
2159 Explain(m, 25));
2160
2161 // Successful match. All matchers need to explain.
2162 m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2163 EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, "
2164 "and which is 10 more than 30",
2165 Explain(m, 40));
2166
2167 // Failed match. The first matcher, which failed, needs to
2168 // explain.
2169 m = AllOf(GreaterThan(10), GreaterThan(20));
2170 EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2171
2172 // Failed match. The second matcher, which failed, needs to
2173 // explain. Since it doesn't given an explanation, nothing is
2174 // printed.
2175 m = AllOf(GreaterThan(10), Lt(30));
2176 EXPECT_EQ("", Explain(m, 40));
2177
2178 // Failed match. The second matcher, which failed, needs to
2179 // explain.
2180 m = AllOf(GreaterThan(10), GreaterThan(20));
2181 EXPECT_EQ("which is 5 less than 20", Explain(m, 15));
2182 }
2183
2184 // Helper to allow easy testing of AnyOf matchers with num parameters.
AnyOfMatches(int num,const Matcher<int> & m)2185 void AnyOfMatches(int num, const Matcher<int>& m) {
2186 SCOPED_TRACE(Describe(m));
2187 EXPECT_FALSE(m.Matches(0));
2188 for (int i = 1; i <= num; ++i) {
2189 EXPECT_TRUE(m.Matches(i));
2190 }
2191 EXPECT_FALSE(m.Matches(num + 1));
2192 }
2193
2194 // Tests that AnyOf(m1, ..., mn) matches any value that matches at
2195 // least one of the given matchers.
TEST(AnyOfTest,MatchesWhenAnyMatches)2196 TEST(AnyOfTest, MatchesWhenAnyMatches) {
2197 Matcher<int> m;
2198 m = AnyOf(Le(1), Ge(3));
2199 EXPECT_TRUE(m.Matches(1));
2200 EXPECT_TRUE(m.Matches(4));
2201 EXPECT_FALSE(m.Matches(2));
2202
2203 m = AnyOf(Lt(0), Eq(1), Eq(2));
2204 EXPECT_TRUE(m.Matches(-1));
2205 EXPECT_TRUE(m.Matches(1));
2206 EXPECT_TRUE(m.Matches(2));
2207 EXPECT_FALSE(m.Matches(0));
2208
2209 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2210 EXPECT_TRUE(m.Matches(-1));
2211 EXPECT_TRUE(m.Matches(1));
2212 EXPECT_TRUE(m.Matches(2));
2213 EXPECT_TRUE(m.Matches(3));
2214 EXPECT_FALSE(m.Matches(0));
2215
2216 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2217 EXPECT_TRUE(m.Matches(0));
2218 EXPECT_TRUE(m.Matches(11));
2219 EXPECT_TRUE(m.Matches(3));
2220 EXPECT_FALSE(m.Matches(2));
2221
2222 // The following tests for varying number of sub-matchers. Due to the way
2223 // the sub-matchers are handled it is enough to test every sub-matcher once
2224 // with sub-matchers using the same matcher type. Varying matcher types are
2225 // checked for above.
2226 AnyOfMatches(2, AnyOf(1, 2));
2227 AnyOfMatches(3, AnyOf(1, 2, 3));
2228 AnyOfMatches(4, AnyOf(1, 2, 3, 4));
2229 AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5));
2230 AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6));
2231 AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7));
2232 AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8));
2233 AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9));
2234 AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
2235 }
2236
2237 #if GTEST_LANG_CXX11
2238 // Tests the variadic version of the AnyOfMatcher.
TEST(AnyOfTest,VariadicMatchesWhenAnyMatches)2239 TEST(AnyOfTest, VariadicMatchesWhenAnyMatches) {
2240 // Also make sure AnyOf is defined in the right namespace and does not depend
2241 // on ADL.
2242 Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2243
2244 EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11))))))))))"));
2245 AnyOfMatches(11, m);
2246 AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
2247 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
2248 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
2249 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
2250 41, 42, 43, 44, 45, 46, 47, 48, 49, 50));
2251 }
2252
2253 #endif // GTEST_LANG_CXX11
2254
2255 // Tests that AnyOf(m1, ..., mn) describes itself properly.
TEST(AnyOfTest,CanDescribeSelf)2256 TEST(AnyOfTest, CanDescribeSelf) {
2257 Matcher<int> m;
2258 m = AnyOf(Le(1), Ge(3));
2259 EXPECT_EQ("(is <= 1) or (is >= 3)",
2260 Describe(m));
2261
2262 m = AnyOf(Lt(0), Eq(1), Eq(2));
2263 EXPECT_EQ("(is < 0) or "
2264 "((is equal to 1) or (is equal to 2))",
2265 Describe(m));
2266
2267 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2268 EXPECT_EQ("((is < 0) or "
2269 "(is equal to 1)) or "
2270 "((is equal to 2) or "
2271 "(is equal to 3))",
2272 Describe(m));
2273
2274 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2275 EXPECT_EQ("((is <= 0) or "
2276 "(is > 10)) or "
2277 "((is equal to 3) or "
2278 "((is equal to 5) or "
2279 "(is equal to 7)))",
2280 Describe(m));
2281 }
2282
2283 // Tests that AnyOf(m1, ..., mn) describes its negation properly.
TEST(AnyOfTest,CanDescribeNegation)2284 TEST(AnyOfTest, CanDescribeNegation) {
2285 Matcher<int> m;
2286 m = AnyOf(Le(1), Ge(3));
2287 EXPECT_EQ("(isn't <= 1) and (isn't >= 3)",
2288 DescribeNegation(m));
2289
2290 m = AnyOf(Lt(0), Eq(1), Eq(2));
2291 EXPECT_EQ("(isn't < 0) and "
2292 "((isn't equal to 1) and (isn't equal to 2))",
2293 DescribeNegation(m));
2294
2295 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2296 EXPECT_EQ("((isn't < 0) and "
2297 "(isn't equal to 1)) and "
2298 "((isn't equal to 2) and "
2299 "(isn't equal to 3))",
2300 DescribeNegation(m));
2301
2302 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2303 EXPECT_EQ("((isn't <= 0) and "
2304 "(isn't > 10)) and "
2305 "((isn't equal to 3) and "
2306 "((isn't equal to 5) and "
2307 "(isn't equal to 7)))",
2308 DescribeNegation(m));
2309 }
2310
2311 // Tests that monomorphic matchers are safely cast by the AnyOf matcher.
TEST(AnyOfTest,AnyOfMatcherSafelyCastsMonomorphicMatchers)2312 TEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
2313 // greater_than_5 and less_than_10 are monomorphic matchers.
2314 Matcher<int> greater_than_5 = Gt(5);
2315 Matcher<int> less_than_10 = Lt(10);
2316
2317 Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);
2318 Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);
2319 Matcher<int&> m3 = AnyOf(greater_than_5, m2);
2320
2321 // Tests that EitherOf works when composing itself.
2322 Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);
2323 Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);
2324 }
2325
TEST(AnyOfTest,ExplainsResult)2326 TEST(AnyOfTest, ExplainsResult) {
2327 Matcher<int> m;
2328
2329 // Failed match. Both matchers need to explain. The second
2330 // matcher doesn't give an explanation, so only the first matcher's
2331 // explanation is printed.
2332 m = AnyOf(GreaterThan(10), Lt(0));
2333 EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2334
2335 // Failed match. Both matchers need to explain.
2336 m = AnyOf(GreaterThan(10), GreaterThan(20));
2337 EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20",
2338 Explain(m, 5));
2339
2340 // Failed match. All matchers need to explain. The second
2341 // matcher doesn't given an explanation.
2342 m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30));
2343 EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30",
2344 Explain(m, 5));
2345
2346 // Failed match. All matchers need to explain.
2347 m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2348 EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, "
2349 "and which is 25 less than 30",
2350 Explain(m, 5));
2351
2352 // Successful match. The first matcher, which succeeded, needs to
2353 // explain.
2354 m = AnyOf(GreaterThan(10), GreaterThan(20));
2355 EXPECT_EQ("which is 5 more than 10", Explain(m, 15));
2356
2357 // Successful match. The second matcher, which succeeded, needs to
2358 // explain. Since it doesn't given an explanation, nothing is
2359 // printed.
2360 m = AnyOf(GreaterThan(10), Lt(30));
2361 EXPECT_EQ("", Explain(m, 0));
2362
2363 // Successful match. The second matcher, which succeeded, needs to
2364 // explain.
2365 m = AnyOf(GreaterThan(30), GreaterThan(20));
2366 EXPECT_EQ("which is 5 more than 20", Explain(m, 25));
2367 }
2368
2369 // The following predicate function and predicate functor are for
2370 // testing the Truly(predicate) matcher.
2371
2372 // Returns non-zero if the input is positive. Note that the return
2373 // type of this function is not bool. It's OK as Truly() accepts any
2374 // unary function or functor whose return type can be implicitly
2375 // converted to bool.
IsPositive(double x)2376 int IsPositive(double x) {
2377 return x > 0 ? 1 : 0;
2378 }
2379
2380 // This functor returns true if the input is greater than the given
2381 // number.
2382 class IsGreaterThan {
2383 public:
IsGreaterThan(int threshold)2384 explicit IsGreaterThan(int threshold) : threshold_(threshold) {}
2385
operator ()(int n) const2386 bool operator()(int n) const { return n > threshold_; }
2387
2388 private:
2389 int threshold_;
2390 };
2391
2392 // For testing Truly().
2393 const int foo = 0;
2394
2395 // This predicate returns true iff the argument references foo and has
2396 // a zero value.
ReferencesFooAndIsZero(const int & n)2397 bool ReferencesFooAndIsZero(const int& n) {
2398 return (&n == &foo) && (n == 0);
2399 }
2400
2401 // Tests that Truly(predicate) matches what satisfies the given
2402 // predicate.
TEST(TrulyTest,MatchesWhatSatisfiesThePredicate)2403 TEST(TrulyTest, MatchesWhatSatisfiesThePredicate) {
2404 Matcher<double> m = Truly(IsPositive);
2405 EXPECT_TRUE(m.Matches(2.0));
2406 EXPECT_FALSE(m.Matches(-1.5));
2407 }
2408
2409 // Tests that Truly(predicate_functor) works too.
TEST(TrulyTest,CanBeUsedWithFunctor)2410 TEST(TrulyTest, CanBeUsedWithFunctor) {
2411 Matcher<int> m = Truly(IsGreaterThan(5));
2412 EXPECT_TRUE(m.Matches(6));
2413 EXPECT_FALSE(m.Matches(4));
2414 }
2415
2416 // A class that can be implicitly converted to bool.
2417 class ConvertibleToBool {
2418 public:
ConvertibleToBool(int number)2419 explicit ConvertibleToBool(int number) : number_(number) {}
operator bool() const2420 operator bool() const { return number_ != 0; }
2421
2422 private:
2423 int number_;
2424 };
2425
IsNotZero(int number)2426 ConvertibleToBool IsNotZero(int number) {
2427 return ConvertibleToBool(number);
2428 }
2429
2430 // Tests that the predicate used in Truly() may return a class that's
2431 // implicitly convertible to bool, even when the class has no
2432 // operator!().
TEST(TrulyTest,PredicateCanReturnAClassConvertibleToBool)2433 TEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) {
2434 Matcher<int> m = Truly(IsNotZero);
2435 EXPECT_TRUE(m.Matches(1));
2436 EXPECT_FALSE(m.Matches(0));
2437 }
2438
2439 // Tests that Truly(predicate) can describe itself properly.
TEST(TrulyTest,CanDescribeSelf)2440 TEST(TrulyTest, CanDescribeSelf) {
2441 Matcher<double> m = Truly(IsPositive);
2442 EXPECT_EQ("satisfies the given predicate",
2443 Describe(m));
2444 }
2445
2446 // Tests that Truly(predicate) works when the matcher takes its
2447 // argument by reference.
TEST(TrulyTest,WorksForByRefArguments)2448 TEST(TrulyTest, WorksForByRefArguments) {
2449 Matcher<const int&> m = Truly(ReferencesFooAndIsZero);
2450 EXPECT_TRUE(m.Matches(foo));
2451 int n = 0;
2452 EXPECT_FALSE(m.Matches(n));
2453 }
2454
2455 // Tests that Matches(m) is a predicate satisfied by whatever that
2456 // matches matcher m.
TEST(MatchesTest,IsSatisfiedByWhatMatchesTheMatcher)2457 TEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) {
2458 EXPECT_TRUE(Matches(Ge(0))(1));
2459 EXPECT_FALSE(Matches(Eq('a'))('b'));
2460 }
2461
2462 // Tests that Matches(m) works when the matcher takes its argument by
2463 // reference.
TEST(MatchesTest,WorksOnByRefArguments)2464 TEST(MatchesTest, WorksOnByRefArguments) {
2465 int m = 0, n = 0;
2466 EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n));
2467 EXPECT_FALSE(Matches(Ref(m))(n));
2468 }
2469
2470 // Tests that a Matcher on non-reference type can be used in
2471 // Matches().
TEST(MatchesTest,WorksWithMatcherOnNonRefType)2472 TEST(MatchesTest, WorksWithMatcherOnNonRefType) {
2473 Matcher<int> eq5 = Eq(5);
2474 EXPECT_TRUE(Matches(eq5)(5));
2475 EXPECT_FALSE(Matches(eq5)(2));
2476 }
2477
2478 // Tests Value(value, matcher). Since Value() is a simple wrapper for
2479 // Matches(), which has been tested already, we don't spend a lot of
2480 // effort on testing Value().
TEST(ValueTest,WorksWithPolymorphicMatcher)2481 TEST(ValueTest, WorksWithPolymorphicMatcher) {
2482 EXPECT_TRUE(Value("hi", StartsWith("h")));
2483 EXPECT_FALSE(Value(5, Gt(10)));
2484 }
2485
TEST(ValueTest,WorksWithMonomorphicMatcher)2486 TEST(ValueTest, WorksWithMonomorphicMatcher) {
2487 const Matcher<int> is_zero = Eq(0);
2488 EXPECT_TRUE(Value(0, is_zero));
2489 EXPECT_FALSE(Value('a', is_zero));
2490
2491 int n = 0;
2492 const Matcher<const int&> ref_n = Ref(n);
2493 EXPECT_TRUE(Value(n, ref_n));
2494 EXPECT_FALSE(Value(1, ref_n));
2495 }
2496
TEST(ExplainMatchResultTest,WorksWithPolymorphicMatcher)2497 TEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) {
2498 StringMatchResultListener listener1;
2499 EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1));
2500 EXPECT_EQ("% 2 == 0", listener1.str());
2501
2502 StringMatchResultListener listener2;
2503 EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2));
2504 EXPECT_EQ("", listener2.str());
2505 }
2506
TEST(ExplainMatchResultTest,WorksWithMonomorphicMatcher)2507 TEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {
2508 const Matcher<int> is_even = PolymorphicIsEven();
2509 StringMatchResultListener listener1;
2510 EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1));
2511 EXPECT_EQ("% 2 == 0", listener1.str());
2512
2513 const Matcher<const double&> is_zero = Eq(0);
2514 StringMatchResultListener listener2;
2515 EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2));
2516 EXPECT_EQ("", listener2.str());
2517 }
2518
2519 MATCHER_P(Really, inner_matcher, "") {
2520 return ExplainMatchResult(inner_matcher, arg, result_listener);
2521 }
2522
TEST(ExplainMatchResultTest,WorksInsideMATCHER)2523 TEST(ExplainMatchResultTest, WorksInsideMATCHER) {
2524 EXPECT_THAT(0, Really(Eq(0)));
2525 }
2526
TEST(AllArgsTest,WorksForTuple)2527 TEST(AllArgsTest, WorksForTuple) {
2528 EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt()));
2529 EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt())));
2530 }
2531
TEST(AllArgsTest,WorksForNonTuple)2532 TEST(AllArgsTest, WorksForNonTuple) {
2533 EXPECT_THAT(42, AllArgs(Gt(0)));
2534 EXPECT_THAT('a', Not(AllArgs(Eq('b'))));
2535 }
2536
2537 class AllArgsHelper {
2538 public:
AllArgsHelper()2539 AllArgsHelper() {}
2540
2541 MOCK_METHOD2(Helper, int(char x, int y));
2542
2543 private:
2544 GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper);
2545 };
2546
TEST(AllArgsTest,WorksInWithClause)2547 TEST(AllArgsTest, WorksInWithClause) {
2548 AllArgsHelper helper;
2549 ON_CALL(helper, Helper(_, _))
2550 .With(AllArgs(Lt()))
2551 .WillByDefault(Return(1));
2552 EXPECT_CALL(helper, Helper(_, _));
2553 EXPECT_CALL(helper, Helper(_, _))
2554 .With(AllArgs(Gt()))
2555 .WillOnce(Return(2));
2556
2557 EXPECT_EQ(1, helper.Helper('\1', 2));
2558 EXPECT_EQ(2, helper.Helper('a', 1));
2559 }
2560
2561 // Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2562 // matches the matcher.
TEST(MatcherAssertionTest,WorksWhenMatcherIsSatisfied)2563 TEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {
2564 ASSERT_THAT(5, Ge(2)) << "This should succeed.";
2565 ASSERT_THAT("Foo", EndsWith("oo"));
2566 EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too.";
2567 EXPECT_THAT("Hello", StartsWith("Hell"));
2568 }
2569
2570 // Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2571 // doesn't match the matcher.
TEST(MatcherAssertionTest,WorksWhenMatcherIsNotSatisfied)2572 TEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {
2573 // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(),
2574 // which cannot reference auto variables.
2575 static unsigned short n; // NOLINT
2576 n = 5;
2577
2578 // VC++ prior to version 8.0 SP1 has a bug where it will not see any
2579 // functions declared in the namespace scope from within nested classes.
2580 // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all
2581 // namespace-level functions invoked inside them need to be explicitly
2582 // resolved.
2583 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)),
2584 "Value of: n\n"
2585 "Expected: is > 10\n"
2586 " Actual: 5" + OfType("unsigned short"));
2587 n = 0;
2588 EXPECT_NONFATAL_FAILURE(
2589 EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))),
2590 "Value of: n\n"
2591 "Expected: (is <= 7) and (is >= 5)\n"
2592 " Actual: 0" + OfType("unsigned short"));
2593 }
2594
2595 // Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument
2596 // has a reference type.
TEST(MatcherAssertionTest,WorksForByRefArguments)2597 TEST(MatcherAssertionTest, WorksForByRefArguments) {
2598 // We use a static variable here as EXPECT_FATAL_FAILURE() cannot
2599 // reference auto variables.
2600 static int n;
2601 n = 0;
2602 EXPECT_THAT(n, AllOf(Le(7), Ref(n)));
2603 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
2604 "Value of: n\n"
2605 "Expected: does not reference the variable @");
2606 // Tests the "Actual" part.
2607 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
2608 "Actual: 0" + OfType("int") + ", which is located @");
2609 }
2610
2611 #if !GTEST_OS_SYMBIAN
2612 // Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is
2613 // monomorphic.
2614
2615 // ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's
2616 // Symbian compiler: it tries to compile
2617 // template<T, U> class MatcherCastImpl { ...
2618 // virtual bool MatchAndExplain(T x, ...) const {
2619 // return source_matcher_.MatchAndExplain(static_cast<U>(x), ...);
2620 // with U == string and T == const char*
2621 // With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... )
2622 // the compiler silently crashes with no output.
2623 // If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x)
2624 // the code compiles but the converted string is bogus.
TEST(MatcherAssertionTest,WorksForMonomorphicMatcher)2625 TEST(MatcherAssertionTest, WorksForMonomorphicMatcher) {
2626 Matcher<const char*> starts_with_he = StartsWith("he");
2627 ASSERT_THAT("hello", starts_with_he);
2628
2629 Matcher<const string&> ends_with_ok = EndsWith("ok");
2630 ASSERT_THAT("book", ends_with_ok);
2631 const string bad = "bad";
2632 EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok),
2633 "Value of: bad\n"
2634 "Expected: ends with \"ok\"\n"
2635 " Actual: \"bad\"");
2636 Matcher<int> is_greater_than_5 = Gt(5);
2637 EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5),
2638 "Value of: 5\n"
2639 "Expected: is > 5\n"
2640 " Actual: 5" + OfType("int"));
2641 }
2642 #endif // !GTEST_OS_SYMBIAN
2643
2644 // Tests floating-point matchers.
2645 template <typename RawType>
2646 class FloatingPointTest : public testing::Test {
2647 protected:
2648 typedef testing::internal::FloatingPoint<RawType> Floating;
2649 typedef typename Floating::Bits Bits;
2650
FloatingPointTest()2651 FloatingPointTest()
2652 : max_ulps_(Floating::kMaxUlps),
2653 zero_bits_(Floating(0).bits()),
2654 one_bits_(Floating(1).bits()),
2655 infinity_bits_(Floating(Floating::Infinity()).bits()),
2656 close_to_positive_zero_(
2657 Floating::ReinterpretBits(zero_bits_ + max_ulps_/2)),
2658 close_to_negative_zero_(
2659 -Floating::ReinterpretBits(zero_bits_ + max_ulps_ - max_ulps_/2)),
2660 further_from_negative_zero_(-Floating::ReinterpretBits(
2661 zero_bits_ + max_ulps_ + 1 - max_ulps_/2)),
2662 close_to_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_)),
2663 further_from_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_ + 1)),
2664 infinity_(Floating::Infinity()),
2665 close_to_infinity_(
2666 Floating::ReinterpretBits(infinity_bits_ - max_ulps_)),
2667 further_from_infinity_(
2668 Floating::ReinterpretBits(infinity_bits_ - max_ulps_ - 1)),
2669 max_(Floating::Max()),
2670 nan1_(Floating::ReinterpretBits(Floating::kExponentBitMask | 1)),
2671 nan2_(Floating::ReinterpretBits(Floating::kExponentBitMask | 200)) {
2672 }
2673
TestSize()2674 void TestSize() {
2675 EXPECT_EQ(sizeof(RawType), sizeof(Bits));
2676 }
2677
2678 // A battery of tests for FloatingEqMatcher::Matches.
2679 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
TestMatches(testing::internal::FloatingEqMatcher<RawType> (* matcher_maker)(RawType))2680 void TestMatches(
2681 testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) {
2682 Matcher<RawType> m1 = matcher_maker(0.0);
2683 EXPECT_TRUE(m1.Matches(-0.0));
2684 EXPECT_TRUE(m1.Matches(close_to_positive_zero_));
2685 EXPECT_TRUE(m1.Matches(close_to_negative_zero_));
2686 EXPECT_FALSE(m1.Matches(1.0));
2687
2688 Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_);
2689 EXPECT_FALSE(m2.Matches(further_from_negative_zero_));
2690
2691 Matcher<RawType> m3 = matcher_maker(1.0);
2692 EXPECT_TRUE(m3.Matches(close_to_one_));
2693 EXPECT_FALSE(m3.Matches(further_from_one_));
2694
2695 // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above.
2696 EXPECT_FALSE(m3.Matches(0.0));
2697
2698 Matcher<RawType> m4 = matcher_maker(-infinity_);
2699 EXPECT_TRUE(m4.Matches(-close_to_infinity_));
2700
2701 Matcher<RawType> m5 = matcher_maker(infinity_);
2702 EXPECT_TRUE(m5.Matches(close_to_infinity_));
2703
2704 // This is interesting as the representations of infinity_ and nan1_
2705 // are only 1 DLP apart.
2706 EXPECT_FALSE(m5.Matches(nan1_));
2707
2708 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2709 // some cases.
2710 Matcher<const RawType&> m6 = matcher_maker(0.0);
2711 EXPECT_TRUE(m6.Matches(-0.0));
2712 EXPECT_TRUE(m6.Matches(close_to_positive_zero_));
2713 EXPECT_FALSE(m6.Matches(1.0));
2714
2715 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2716 // cases.
2717 Matcher<RawType&> m7 = matcher_maker(0.0);
2718 RawType x = 0.0;
2719 EXPECT_TRUE(m7.Matches(x));
2720 x = 0.01f;
2721 EXPECT_FALSE(m7.Matches(x));
2722 }
2723
2724 // Pre-calculated numbers to be used by the tests.
2725
2726 const size_t max_ulps_;
2727
2728 const Bits zero_bits_; // The bits that represent 0.0.
2729 const Bits one_bits_; // The bits that represent 1.0.
2730 const Bits infinity_bits_; // The bits that represent +infinity.
2731
2732 // Some numbers close to 0.0.
2733 const RawType close_to_positive_zero_;
2734 const RawType close_to_negative_zero_;
2735 const RawType further_from_negative_zero_;
2736
2737 // Some numbers close to 1.0.
2738 const RawType close_to_one_;
2739 const RawType further_from_one_;
2740
2741 // Some numbers close to +infinity.
2742 const RawType infinity_;
2743 const RawType close_to_infinity_;
2744 const RawType further_from_infinity_;
2745
2746 // Maximum representable value that's not infinity.
2747 const RawType max_;
2748
2749 // Some NaNs.
2750 const RawType nan1_;
2751 const RawType nan2_;
2752 };
2753
2754 // Tests floating-point matchers with fixed epsilons.
2755 template <typename RawType>
2756 class FloatingPointNearTest : public FloatingPointTest<RawType> {
2757 protected:
2758 typedef FloatingPointTest<RawType> ParentType;
2759
2760 // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon.
2761 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
TestNearMatches(testing::internal::FloatingEqMatcher<RawType> (* matcher_maker)(RawType,RawType))2762 void TestNearMatches(
2763 testing::internal::FloatingEqMatcher<RawType>
2764 (*matcher_maker)(RawType, RawType)) {
2765 Matcher<RawType> m1 = matcher_maker(0.0, 0.0);
2766 EXPECT_TRUE(m1.Matches(0.0));
2767 EXPECT_TRUE(m1.Matches(-0.0));
2768 EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_));
2769 EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_));
2770 EXPECT_FALSE(m1.Matches(1.0));
2771
2772 Matcher<RawType> m2 = matcher_maker(0.0, 1.0);
2773 EXPECT_TRUE(m2.Matches(0.0));
2774 EXPECT_TRUE(m2.Matches(-0.0));
2775 EXPECT_TRUE(m2.Matches(1.0));
2776 EXPECT_TRUE(m2.Matches(-1.0));
2777 EXPECT_FALSE(m2.Matches(ParentType::close_to_one_));
2778 EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_));
2779
2780 // Check that inf matches inf, regardless of the of the specified max
2781 // absolute error.
2782 Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0);
2783 EXPECT_TRUE(m3.Matches(ParentType::infinity_));
2784 EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_));
2785 EXPECT_FALSE(m3.Matches(-ParentType::infinity_));
2786
2787 Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0);
2788 EXPECT_TRUE(m4.Matches(-ParentType::infinity_));
2789 EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_));
2790 EXPECT_FALSE(m4.Matches(ParentType::infinity_));
2791
2792 // Test various overflow scenarios.
2793 Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_);
2794 EXPECT_TRUE(m5.Matches(ParentType::max_));
2795 EXPECT_FALSE(m5.Matches(-ParentType::max_));
2796
2797 Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_);
2798 EXPECT_FALSE(m6.Matches(ParentType::max_));
2799 EXPECT_TRUE(m6.Matches(-ParentType::max_));
2800
2801 Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0);
2802 EXPECT_TRUE(m7.Matches(ParentType::max_));
2803 EXPECT_FALSE(m7.Matches(-ParentType::max_));
2804
2805 Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0);
2806 EXPECT_FALSE(m8.Matches(ParentType::max_));
2807 EXPECT_TRUE(m8.Matches(-ParentType::max_));
2808
2809 // The difference between max() and -max() normally overflows to infinity,
2810 // but it should still match if the max_abs_error is also infinity.
2811 Matcher<RawType> m9 = matcher_maker(
2812 ParentType::max_, ParentType::infinity_);
2813 EXPECT_TRUE(m8.Matches(-ParentType::max_));
2814
2815 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2816 // some cases.
2817 Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0);
2818 EXPECT_TRUE(m10.Matches(-0.0));
2819 EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_));
2820 EXPECT_FALSE(m10.Matches(ParentType::close_to_one_));
2821
2822 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2823 // cases.
2824 Matcher<RawType&> m11 = matcher_maker(0.0, 1.0);
2825 RawType x = 0.0;
2826 EXPECT_TRUE(m11.Matches(x));
2827 x = 1.0f;
2828 EXPECT_TRUE(m11.Matches(x));
2829 x = -1.0f;
2830 EXPECT_TRUE(m11.Matches(x));
2831 x = 1.1f;
2832 EXPECT_FALSE(m11.Matches(x));
2833 x = -1.1f;
2834 EXPECT_FALSE(m11.Matches(x));
2835 }
2836 };
2837
2838 // Instantiate FloatingPointTest for testing floats.
2839 typedef FloatingPointTest<float> FloatTest;
2840
TEST_F(FloatTest,FloatEqApproximatelyMatchesFloats)2841 TEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) {
2842 TestMatches(&FloatEq);
2843 }
2844
TEST_F(FloatTest,NanSensitiveFloatEqApproximatelyMatchesFloats)2845 TEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) {
2846 TestMatches(&NanSensitiveFloatEq);
2847 }
2848
TEST_F(FloatTest,FloatEqCannotMatchNaN)2849 TEST_F(FloatTest, FloatEqCannotMatchNaN) {
2850 // FloatEq never matches NaN.
2851 Matcher<float> m = FloatEq(nan1_);
2852 EXPECT_FALSE(m.Matches(nan1_));
2853 EXPECT_FALSE(m.Matches(nan2_));
2854 EXPECT_FALSE(m.Matches(1.0));
2855 }
2856
TEST_F(FloatTest,NanSensitiveFloatEqCanMatchNaN)2857 TEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {
2858 // NanSensitiveFloatEq will match NaN.
2859 Matcher<float> m = NanSensitiveFloatEq(nan1_);
2860 EXPECT_TRUE(m.Matches(nan1_));
2861 EXPECT_TRUE(m.Matches(nan2_));
2862 EXPECT_FALSE(m.Matches(1.0));
2863 }
2864
TEST_F(FloatTest,FloatEqCanDescribeSelf)2865 TEST_F(FloatTest, FloatEqCanDescribeSelf) {
2866 Matcher<float> m1 = FloatEq(2.0f);
2867 EXPECT_EQ("is approximately 2", Describe(m1));
2868 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2869
2870 Matcher<float> m2 = FloatEq(0.5f);
2871 EXPECT_EQ("is approximately 0.5", Describe(m2));
2872 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2873
2874 Matcher<float> m3 = FloatEq(nan1_);
2875 EXPECT_EQ("never matches", Describe(m3));
2876 EXPECT_EQ("is anything", DescribeNegation(m3));
2877 }
2878
TEST_F(FloatTest,NanSensitiveFloatEqCanDescribeSelf)2879 TEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) {
2880 Matcher<float> m1 = NanSensitiveFloatEq(2.0f);
2881 EXPECT_EQ("is approximately 2", Describe(m1));
2882 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2883
2884 Matcher<float> m2 = NanSensitiveFloatEq(0.5f);
2885 EXPECT_EQ("is approximately 0.5", Describe(m2));
2886 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2887
2888 Matcher<float> m3 = NanSensitiveFloatEq(nan1_);
2889 EXPECT_EQ("is NaN", Describe(m3));
2890 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2891 }
2892
2893 // Instantiate FloatingPointTest for testing floats with a user-specified
2894 // max absolute error.
2895 typedef FloatingPointNearTest<float> FloatNearTest;
2896
TEST_F(FloatNearTest,FloatNearMatches)2897 TEST_F(FloatNearTest, FloatNearMatches) {
2898 TestNearMatches(&FloatNear);
2899 }
2900
TEST_F(FloatNearTest,NanSensitiveFloatNearApproximatelyMatchesFloats)2901 TEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) {
2902 TestNearMatches(&NanSensitiveFloatNear);
2903 }
2904
TEST_F(FloatNearTest,FloatNearCanDescribeSelf)2905 TEST_F(FloatNearTest, FloatNearCanDescribeSelf) {
2906 Matcher<float> m1 = FloatNear(2.0f, 0.5f);
2907 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2908 EXPECT_EQ(
2909 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2910
2911 Matcher<float> m2 = FloatNear(0.5f, 0.5f);
2912 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2913 EXPECT_EQ(
2914 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2915
2916 Matcher<float> m3 = FloatNear(nan1_, 0.0);
2917 EXPECT_EQ("never matches", Describe(m3));
2918 EXPECT_EQ("is anything", DescribeNegation(m3));
2919 }
2920
TEST_F(FloatNearTest,NanSensitiveFloatNearCanDescribeSelf)2921 TEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) {
2922 Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f);
2923 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2924 EXPECT_EQ(
2925 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2926
2927 Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f);
2928 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2929 EXPECT_EQ(
2930 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2931
2932 Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f);
2933 EXPECT_EQ("is NaN", Describe(m3));
2934 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2935 }
2936
TEST_F(FloatNearTest,FloatNearCannotMatchNaN)2937 TEST_F(FloatNearTest, FloatNearCannotMatchNaN) {
2938 // FloatNear never matches NaN.
2939 Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f);
2940 EXPECT_FALSE(m.Matches(nan1_));
2941 EXPECT_FALSE(m.Matches(nan2_));
2942 EXPECT_FALSE(m.Matches(1.0));
2943 }
2944
TEST_F(FloatNearTest,NanSensitiveFloatNearCanMatchNaN)2945 TEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) {
2946 // NanSensitiveFloatNear will match NaN.
2947 Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f);
2948 EXPECT_TRUE(m.Matches(nan1_));
2949 EXPECT_TRUE(m.Matches(nan2_));
2950 EXPECT_FALSE(m.Matches(1.0));
2951 }
2952
2953 // Instantiate FloatingPointTest for testing doubles.
2954 typedef FloatingPointTest<double> DoubleTest;
2955
TEST_F(DoubleTest,DoubleEqApproximatelyMatchesDoubles)2956 TEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) {
2957 TestMatches(&DoubleEq);
2958 }
2959
TEST_F(DoubleTest,NanSensitiveDoubleEqApproximatelyMatchesDoubles)2960 TEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) {
2961 TestMatches(&NanSensitiveDoubleEq);
2962 }
2963
TEST_F(DoubleTest,DoubleEqCannotMatchNaN)2964 TEST_F(DoubleTest, DoubleEqCannotMatchNaN) {
2965 // DoubleEq never matches NaN.
2966 Matcher<double> m = DoubleEq(nan1_);
2967 EXPECT_FALSE(m.Matches(nan1_));
2968 EXPECT_FALSE(m.Matches(nan2_));
2969 EXPECT_FALSE(m.Matches(1.0));
2970 }
2971
TEST_F(DoubleTest,NanSensitiveDoubleEqCanMatchNaN)2972 TEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {
2973 // NanSensitiveDoubleEq will match NaN.
2974 Matcher<double> m = NanSensitiveDoubleEq(nan1_);
2975 EXPECT_TRUE(m.Matches(nan1_));
2976 EXPECT_TRUE(m.Matches(nan2_));
2977 EXPECT_FALSE(m.Matches(1.0));
2978 }
2979
TEST_F(DoubleTest,DoubleEqCanDescribeSelf)2980 TEST_F(DoubleTest, DoubleEqCanDescribeSelf) {
2981 Matcher<double> m1 = DoubleEq(2.0);
2982 EXPECT_EQ("is approximately 2", Describe(m1));
2983 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2984
2985 Matcher<double> m2 = DoubleEq(0.5);
2986 EXPECT_EQ("is approximately 0.5", Describe(m2));
2987 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2988
2989 Matcher<double> m3 = DoubleEq(nan1_);
2990 EXPECT_EQ("never matches", Describe(m3));
2991 EXPECT_EQ("is anything", DescribeNegation(m3));
2992 }
2993
TEST_F(DoubleTest,NanSensitiveDoubleEqCanDescribeSelf)2994 TEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) {
2995 Matcher<double> m1 = NanSensitiveDoubleEq(2.0);
2996 EXPECT_EQ("is approximately 2", Describe(m1));
2997 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2998
2999 Matcher<double> m2 = NanSensitiveDoubleEq(0.5);
3000 EXPECT_EQ("is approximately 0.5", Describe(m2));
3001 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
3002
3003 Matcher<double> m3 = NanSensitiveDoubleEq(nan1_);
3004 EXPECT_EQ("is NaN", Describe(m3));
3005 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
3006 }
3007
3008 // Instantiate FloatingPointTest for testing floats with a user-specified
3009 // max absolute error.
3010 typedef FloatingPointNearTest<double> DoubleNearTest;
3011
TEST_F(DoubleNearTest,DoubleNearMatches)3012 TEST_F(DoubleNearTest, DoubleNearMatches) {
3013 TestNearMatches(&DoubleNear);
3014 }
3015
TEST_F(DoubleNearTest,NanSensitiveDoubleNearApproximatelyMatchesDoubles)3016 TEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) {
3017 TestNearMatches(&NanSensitiveDoubleNear);
3018 }
3019
TEST_F(DoubleNearTest,DoubleNearCanDescribeSelf)3020 TEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) {
3021 Matcher<double> m1 = DoubleNear(2.0, 0.5);
3022 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3023 EXPECT_EQ(
3024 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3025
3026 Matcher<double> m2 = DoubleNear(0.5, 0.5);
3027 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3028 EXPECT_EQ(
3029 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3030
3031 Matcher<double> m3 = DoubleNear(nan1_, 0.0);
3032 EXPECT_EQ("never matches", Describe(m3));
3033 EXPECT_EQ("is anything", DescribeNegation(m3));
3034 }
3035
TEST_F(DoubleNearTest,NanSensitiveDoubleNearCanDescribeSelf)3036 TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) {
3037 Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5);
3038 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3039 EXPECT_EQ(
3040 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3041
3042 Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5);
3043 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3044 EXPECT_EQ(
3045 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3046
3047 Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1);
3048 EXPECT_EQ("is NaN", Describe(m3));
3049 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
3050 }
3051
TEST_F(DoubleNearTest,DoubleNearCannotMatchNaN)3052 TEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) {
3053 // DoubleNear never matches NaN.
3054 Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1);
3055 EXPECT_FALSE(m.Matches(nan1_));
3056 EXPECT_FALSE(m.Matches(nan2_));
3057 EXPECT_FALSE(m.Matches(1.0));
3058 }
3059
TEST_F(DoubleNearTest,NanSensitiveDoubleNearCanMatchNaN)3060 TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) {
3061 // NanSensitiveDoubleNear will match NaN.
3062 Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1);
3063 EXPECT_TRUE(m.Matches(nan1_));
3064 EXPECT_TRUE(m.Matches(nan2_));
3065 EXPECT_FALSE(m.Matches(1.0));
3066 }
3067
TEST(PointeeTest,RawPointer)3068 TEST(PointeeTest, RawPointer) {
3069 const Matcher<int*> m = Pointee(Ge(0));
3070
3071 int n = 1;
3072 EXPECT_TRUE(m.Matches(&n));
3073 n = -1;
3074 EXPECT_FALSE(m.Matches(&n));
3075 EXPECT_FALSE(m.Matches(NULL));
3076 }
3077
TEST(PointeeTest,RawPointerToConst)3078 TEST(PointeeTest, RawPointerToConst) {
3079 const Matcher<const double*> m = Pointee(Ge(0));
3080
3081 double x = 1;
3082 EXPECT_TRUE(m.Matches(&x));
3083 x = -1;
3084 EXPECT_FALSE(m.Matches(&x));
3085 EXPECT_FALSE(m.Matches(NULL));
3086 }
3087
TEST(PointeeTest,ReferenceToConstRawPointer)3088 TEST(PointeeTest, ReferenceToConstRawPointer) {
3089 const Matcher<int* const &> m = Pointee(Ge(0));
3090
3091 int n = 1;
3092 EXPECT_TRUE(m.Matches(&n));
3093 n = -1;
3094 EXPECT_FALSE(m.Matches(&n));
3095 EXPECT_FALSE(m.Matches(NULL));
3096 }
3097
TEST(PointeeTest,ReferenceToNonConstRawPointer)3098 TEST(PointeeTest, ReferenceToNonConstRawPointer) {
3099 const Matcher<double* &> m = Pointee(Ge(0));
3100
3101 double x = 1.0;
3102 double* p = &x;
3103 EXPECT_TRUE(m.Matches(p));
3104 x = -1;
3105 EXPECT_FALSE(m.Matches(p));
3106 p = NULL;
3107 EXPECT_FALSE(m.Matches(p));
3108 }
3109
3110 // Minimal const-propagating pointer.
3111 template <typename T>
3112 class ConstPropagatingPtr {
3113 public:
3114 typedef T element_type;
3115
ConstPropagatingPtr()3116 ConstPropagatingPtr() : val_() {}
ConstPropagatingPtr(T * t)3117 explicit ConstPropagatingPtr(T* t) : val_(t) {}
ConstPropagatingPtr(const ConstPropagatingPtr & other)3118 ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {}
3119
get()3120 T* get() { return val_; }
operator *()3121 T& operator*() { return *val_; }
3122 // Most smart pointers return non-const T* and T& from the next methods.
get() const3123 const T* get() const { return val_; }
operator *() const3124 const T& operator*() const { return *val_; }
3125
3126 private:
3127 T* val_;
3128 };
3129
TEST(PointeeTest,WorksWithConstPropagatingPointers)3130 TEST(PointeeTest, WorksWithConstPropagatingPointers) {
3131 const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5));
3132 int three = 3;
3133 const ConstPropagatingPtr<int> co(&three);
3134 ConstPropagatingPtr<int> o(&three);
3135 EXPECT_TRUE(m.Matches(o));
3136 EXPECT_TRUE(m.Matches(co));
3137 *o = 6;
3138 EXPECT_FALSE(m.Matches(o));
3139 EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>()));
3140 }
3141
TEST(PointeeTest,NeverMatchesNull)3142 TEST(PointeeTest, NeverMatchesNull) {
3143 const Matcher<const char*> m = Pointee(_);
3144 EXPECT_FALSE(m.Matches(NULL));
3145 }
3146
3147 // Tests that we can write Pointee(value) instead of Pointee(Eq(value)).
TEST(PointeeTest,MatchesAgainstAValue)3148 TEST(PointeeTest, MatchesAgainstAValue) {
3149 const Matcher<int*> m = Pointee(5);
3150
3151 int n = 5;
3152 EXPECT_TRUE(m.Matches(&n));
3153 n = -1;
3154 EXPECT_FALSE(m.Matches(&n));
3155 EXPECT_FALSE(m.Matches(NULL));
3156 }
3157
TEST(PointeeTest,CanDescribeSelf)3158 TEST(PointeeTest, CanDescribeSelf) {
3159 const Matcher<int*> m = Pointee(Gt(3));
3160 EXPECT_EQ("points to a value that is > 3", Describe(m));
3161 EXPECT_EQ("does not point to a value that is > 3",
3162 DescribeNegation(m));
3163 }
3164
TEST(PointeeTest,CanExplainMatchResult)3165 TEST(PointeeTest, CanExplainMatchResult) {
3166 const Matcher<const string*> m = Pointee(StartsWith("Hi"));
3167
3168 EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL)));
3169
3170 const Matcher<long*> m2 = Pointee(GreaterThan(1)); // NOLINT
3171 long n = 3; // NOLINT
3172 EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1",
3173 Explain(m2, &n));
3174 }
3175
TEST(PointeeTest,AlwaysExplainsPointee)3176 TEST(PointeeTest, AlwaysExplainsPointee) {
3177 const Matcher<int*> m = Pointee(0);
3178 int n = 42;
3179 EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n));
3180 }
3181
3182 // An uncopyable class.
3183 class Uncopyable {
3184 public:
Uncopyable(int a_value)3185 explicit Uncopyable(int a_value) : value_(a_value) {}
3186
value() const3187 int value() const { return value_; }
3188 private:
3189 const int value_;
3190 GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable);
3191 };
3192
3193 // Returns true iff x.value() is positive.
ValueIsPositive(const Uncopyable & x)3194 bool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; }
3195
3196 // A user-defined struct for testing Field().
3197 struct AStruct {
AStructtesting::gmock_matchers_test::AStruct3198 AStruct() : x(0), y(1.0), z(5), p(NULL) {}
AStructtesting::gmock_matchers_test::AStruct3199 AStruct(const AStruct& rhs)
3200 : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {}
3201
3202 int x; // A non-const field.
3203 const double y; // A const field.
3204 Uncopyable z; // An uncopyable field.
3205 const char* p; // A pointer field.
3206
3207 private:
3208 GTEST_DISALLOW_ASSIGN_(AStruct);
3209 };
3210
3211 // A derived struct for testing Field().
3212 struct DerivedStruct : public AStruct {
3213 char ch;
3214
3215 private:
3216 GTEST_DISALLOW_ASSIGN_(DerivedStruct);
3217 };
3218
3219 // Tests that Field(&Foo::field, ...) works when field is non-const.
TEST(FieldTest,WorksForNonConstField)3220 TEST(FieldTest, WorksForNonConstField) {
3221 Matcher<AStruct> m = Field(&AStruct::x, Ge(0));
3222
3223 AStruct a;
3224 EXPECT_TRUE(m.Matches(a));
3225 a.x = -1;
3226 EXPECT_FALSE(m.Matches(a));
3227 }
3228
3229 // Tests that Field(&Foo::field, ...) works when field is const.
TEST(FieldTest,WorksForConstField)3230 TEST(FieldTest, WorksForConstField) {
3231 AStruct a;
3232
3233 Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0));
3234 EXPECT_TRUE(m.Matches(a));
3235 m = Field(&AStruct::y, Le(0.0));
3236 EXPECT_FALSE(m.Matches(a));
3237 }
3238
3239 // Tests that Field(&Foo::field, ...) works when field is not copyable.
TEST(FieldTest,WorksForUncopyableField)3240 TEST(FieldTest, WorksForUncopyableField) {
3241 AStruct a;
3242
3243 Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive));
3244 EXPECT_TRUE(m.Matches(a));
3245 m = Field(&AStruct::z, Not(Truly(ValueIsPositive)));
3246 EXPECT_FALSE(m.Matches(a));
3247 }
3248
3249 // Tests that Field(&Foo::field, ...) works when field is a pointer.
TEST(FieldTest,WorksForPointerField)3250 TEST(FieldTest, WorksForPointerField) {
3251 // Matching against NULL.
3252 Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL));
3253 AStruct a;
3254 EXPECT_TRUE(m.Matches(a));
3255 a.p = "hi";
3256 EXPECT_FALSE(m.Matches(a));
3257
3258 // Matching a pointer that is not NULL.
3259 m = Field(&AStruct::p, StartsWith("hi"));
3260 a.p = "hill";
3261 EXPECT_TRUE(m.Matches(a));
3262 a.p = "hole";
3263 EXPECT_FALSE(m.Matches(a));
3264 }
3265
3266 // Tests that Field() works when the object is passed by reference.
TEST(FieldTest,WorksForByRefArgument)3267 TEST(FieldTest, WorksForByRefArgument) {
3268 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3269
3270 AStruct a;
3271 EXPECT_TRUE(m.Matches(a));
3272 a.x = -1;
3273 EXPECT_FALSE(m.Matches(a));
3274 }
3275
3276 // Tests that Field(&Foo::field, ...) works when the argument's type
3277 // is a sub-type of Foo.
TEST(FieldTest,WorksForArgumentOfSubType)3278 TEST(FieldTest, WorksForArgumentOfSubType) {
3279 // Note that the matcher expects DerivedStruct but we say AStruct
3280 // inside Field().
3281 Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0));
3282
3283 DerivedStruct d;
3284 EXPECT_TRUE(m.Matches(d));
3285 d.x = -1;
3286 EXPECT_FALSE(m.Matches(d));
3287 }
3288
3289 // Tests that Field(&Foo::field, m) works when field's type and m's
3290 // argument type are compatible but not the same.
TEST(FieldTest,WorksForCompatibleMatcherType)3291 TEST(FieldTest, WorksForCompatibleMatcherType) {
3292 // The field is an int, but the inner matcher expects a signed char.
3293 Matcher<const AStruct&> m = Field(&AStruct::x,
3294 Matcher<signed char>(Ge(0)));
3295
3296 AStruct a;
3297 EXPECT_TRUE(m.Matches(a));
3298 a.x = -1;
3299 EXPECT_FALSE(m.Matches(a));
3300 }
3301
3302 // Tests that Field() can describe itself.
TEST(FieldTest,CanDescribeSelf)3303 TEST(FieldTest, CanDescribeSelf) {
3304 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3305
3306 EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3307 EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
3308 }
3309
3310 // Tests that Field() can explain the match result.
TEST(FieldTest,CanExplainMatchResult)3311 TEST(FieldTest, CanExplainMatchResult) {
3312 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3313
3314 AStruct a;
3315 a.x = 1;
3316 EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a));
3317
3318 m = Field(&AStruct::x, GreaterThan(0));
3319 EXPECT_EQ(
3320 "whose given field is 1" + OfType("int") + ", which is 1 more than 0",
3321 Explain(m, a));
3322 }
3323
3324 // Tests that Field() works when the argument is a pointer to const.
TEST(FieldForPointerTest,WorksForPointerToConst)3325 TEST(FieldForPointerTest, WorksForPointerToConst) {
3326 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3327
3328 AStruct a;
3329 EXPECT_TRUE(m.Matches(&a));
3330 a.x = -1;
3331 EXPECT_FALSE(m.Matches(&a));
3332 }
3333
3334 // Tests that Field() works when the argument is a pointer to non-const.
TEST(FieldForPointerTest,WorksForPointerToNonConst)3335 TEST(FieldForPointerTest, WorksForPointerToNonConst) {
3336 Matcher<AStruct*> m = Field(&AStruct::x, Ge(0));
3337
3338 AStruct a;
3339 EXPECT_TRUE(m.Matches(&a));
3340 a.x = -1;
3341 EXPECT_FALSE(m.Matches(&a));
3342 }
3343
3344 // Tests that Field() works when the argument is a reference to a const pointer.
TEST(FieldForPointerTest,WorksForReferenceToConstPointer)3345 TEST(FieldForPointerTest, WorksForReferenceToConstPointer) {
3346 Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0));
3347
3348 AStruct a;
3349 EXPECT_TRUE(m.Matches(&a));
3350 a.x = -1;
3351 EXPECT_FALSE(m.Matches(&a));
3352 }
3353
3354 // Tests that Field() does not match the NULL pointer.
TEST(FieldForPointerTest,DoesNotMatchNull)3355 TEST(FieldForPointerTest, DoesNotMatchNull) {
3356 Matcher<const AStruct*> m = Field(&AStruct::x, _);
3357 EXPECT_FALSE(m.Matches(NULL));
3358 }
3359
3360 // Tests that Field(&Foo::field, ...) works when the argument's type
3361 // is a sub-type of const Foo*.
TEST(FieldForPointerTest,WorksForArgumentOfSubType)3362 TEST(FieldForPointerTest, WorksForArgumentOfSubType) {
3363 // Note that the matcher expects DerivedStruct but we say AStruct
3364 // inside Field().
3365 Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0));
3366
3367 DerivedStruct d;
3368 EXPECT_TRUE(m.Matches(&d));
3369 d.x = -1;
3370 EXPECT_FALSE(m.Matches(&d));
3371 }
3372
3373 // Tests that Field() can describe itself when used to match a pointer.
TEST(FieldForPointerTest,CanDescribeSelf)3374 TEST(FieldForPointerTest, CanDescribeSelf) {
3375 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3376
3377 EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3378 EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
3379 }
3380
3381 // Tests that Field() can explain the result of matching a pointer.
TEST(FieldForPointerTest,CanExplainMatchResult)3382 TEST(FieldForPointerTest, CanExplainMatchResult) {
3383 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3384
3385 AStruct a;
3386 a.x = 1;
3387 EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL)));
3388 EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"),
3389 Explain(m, &a));
3390
3391 m = Field(&AStruct::x, GreaterThan(0));
3392 EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") +
3393 ", which is 1 more than 0", Explain(m, &a));
3394 }
3395
3396 // A user-defined class for testing Property().
3397 class AClass {
3398 public:
AClass()3399 AClass() : n_(0) {}
3400
3401 // A getter that returns a non-reference.
n() const3402 int n() const { return n_; }
3403
set_n(int new_n)3404 void set_n(int new_n) { n_ = new_n; }
3405
3406 // A getter that returns a reference to const.
s() const3407 const string& s() const { return s_; }
3408
set_s(const string & new_s)3409 void set_s(const string& new_s) { s_ = new_s; }
3410
3411 // A getter that returns a reference to non-const.
x() const3412 double& x() const { return x_; }
3413 private:
3414 int n_;
3415 string s_;
3416
3417 static double x_;
3418 };
3419
3420 double AClass::x_ = 0.0;
3421
3422 // A derived class for testing Property().
3423 class DerivedClass : public AClass {
3424 private:
3425 int k_;
3426 };
3427
3428 // Tests that Property(&Foo::property, ...) works when property()
3429 // returns a non-reference.
TEST(PropertyTest,WorksForNonReferenceProperty)3430 TEST(PropertyTest, WorksForNonReferenceProperty) {
3431 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3432
3433 AClass a;
3434 a.set_n(1);
3435 EXPECT_TRUE(m.Matches(a));
3436
3437 a.set_n(-1);
3438 EXPECT_FALSE(m.Matches(a));
3439 }
3440
3441 // Tests that Property(&Foo::property, ...) works when property()
3442 // returns a reference to const.
TEST(PropertyTest,WorksForReferenceToConstProperty)3443 TEST(PropertyTest, WorksForReferenceToConstProperty) {
3444 Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi"));
3445
3446 AClass a;
3447 a.set_s("hill");
3448 EXPECT_TRUE(m.Matches(a));
3449
3450 a.set_s("hole");
3451 EXPECT_FALSE(m.Matches(a));
3452 }
3453
3454 // Tests that Property(&Foo::property, ...) works when property()
3455 // returns a reference to non-const.
TEST(PropertyTest,WorksForReferenceToNonConstProperty)3456 TEST(PropertyTest, WorksForReferenceToNonConstProperty) {
3457 double x = 0.0;
3458 AClass a;
3459
3460 Matcher<const AClass&> m = Property(&AClass::x, Ref(x));
3461 EXPECT_FALSE(m.Matches(a));
3462
3463 m = Property(&AClass::x, Not(Ref(x)));
3464 EXPECT_TRUE(m.Matches(a));
3465 }
3466
3467 // Tests that Property(&Foo::property, ...) works when the argument is
3468 // passed by value.
TEST(PropertyTest,WorksForByValueArgument)3469 TEST(PropertyTest, WorksForByValueArgument) {
3470 Matcher<AClass> m = Property(&AClass::s, StartsWith("hi"));
3471
3472 AClass a;
3473 a.set_s("hill");
3474 EXPECT_TRUE(m.Matches(a));
3475
3476 a.set_s("hole");
3477 EXPECT_FALSE(m.Matches(a));
3478 }
3479
3480 // Tests that Property(&Foo::property, ...) works when the argument's
3481 // type is a sub-type of Foo.
TEST(PropertyTest,WorksForArgumentOfSubType)3482 TEST(PropertyTest, WorksForArgumentOfSubType) {
3483 // The matcher expects a DerivedClass, but inside the Property() we
3484 // say AClass.
3485 Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0));
3486
3487 DerivedClass d;
3488 d.set_n(1);
3489 EXPECT_TRUE(m.Matches(d));
3490
3491 d.set_n(-1);
3492 EXPECT_FALSE(m.Matches(d));
3493 }
3494
3495 // Tests that Property(&Foo::property, m) works when property()'s type
3496 // and m's argument type are compatible but different.
TEST(PropertyTest,WorksForCompatibleMatcherType)3497 TEST(PropertyTest, WorksForCompatibleMatcherType) {
3498 // n() returns an int but the inner matcher expects a signed char.
3499 Matcher<const AClass&> m = Property(&AClass::n,
3500 Matcher<signed char>(Ge(0)));
3501
3502 AClass a;
3503 EXPECT_TRUE(m.Matches(a));
3504 a.set_n(-1);
3505 EXPECT_FALSE(m.Matches(a));
3506 }
3507
3508 // Tests that Property() can describe itself.
TEST(PropertyTest,CanDescribeSelf)3509 TEST(PropertyTest, CanDescribeSelf) {
3510 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3511
3512 EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3513 EXPECT_EQ("is an object whose given property isn't >= 0",
3514 DescribeNegation(m));
3515 }
3516
3517 // Tests that Property() can explain the match result.
TEST(PropertyTest,CanExplainMatchResult)3518 TEST(PropertyTest, CanExplainMatchResult) {
3519 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3520
3521 AClass a;
3522 a.set_n(1);
3523 EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a));
3524
3525 m = Property(&AClass::n, GreaterThan(0));
3526 EXPECT_EQ(
3527 "whose given property is 1" + OfType("int") + ", which is 1 more than 0",
3528 Explain(m, a));
3529 }
3530
3531 // Tests that Property() works when the argument is a pointer to const.
TEST(PropertyForPointerTest,WorksForPointerToConst)3532 TEST(PropertyForPointerTest, WorksForPointerToConst) {
3533 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3534
3535 AClass a;
3536 a.set_n(1);
3537 EXPECT_TRUE(m.Matches(&a));
3538
3539 a.set_n(-1);
3540 EXPECT_FALSE(m.Matches(&a));
3541 }
3542
3543 // Tests that Property() works when the argument is a pointer to non-const.
TEST(PropertyForPointerTest,WorksForPointerToNonConst)3544 TEST(PropertyForPointerTest, WorksForPointerToNonConst) {
3545 Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi"));
3546
3547 AClass a;
3548 a.set_s("hill");
3549 EXPECT_TRUE(m.Matches(&a));
3550
3551 a.set_s("hole");
3552 EXPECT_FALSE(m.Matches(&a));
3553 }
3554
3555 // Tests that Property() works when the argument is a reference to a
3556 // const pointer.
TEST(PropertyForPointerTest,WorksForReferenceToConstPointer)3557 TEST(PropertyForPointerTest, WorksForReferenceToConstPointer) {
3558 Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi"));
3559
3560 AClass a;
3561 a.set_s("hill");
3562 EXPECT_TRUE(m.Matches(&a));
3563
3564 a.set_s("hole");
3565 EXPECT_FALSE(m.Matches(&a));
3566 }
3567
3568 // Tests that Property() does not match the NULL pointer.
TEST(PropertyForPointerTest,WorksForReferenceToNonConstProperty)3569 TEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) {
3570 Matcher<const AClass*> m = Property(&AClass::x, _);
3571 EXPECT_FALSE(m.Matches(NULL));
3572 }
3573
3574 // Tests that Property(&Foo::property, ...) works when the argument's
3575 // type is a sub-type of const Foo*.
TEST(PropertyForPointerTest,WorksForArgumentOfSubType)3576 TEST(PropertyForPointerTest, WorksForArgumentOfSubType) {
3577 // The matcher expects a DerivedClass, but inside the Property() we
3578 // say AClass.
3579 Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0));
3580
3581 DerivedClass d;
3582 d.set_n(1);
3583 EXPECT_TRUE(m.Matches(&d));
3584
3585 d.set_n(-1);
3586 EXPECT_FALSE(m.Matches(&d));
3587 }
3588
3589 // Tests that Property() can describe itself when used to match a pointer.
TEST(PropertyForPointerTest,CanDescribeSelf)3590 TEST(PropertyForPointerTest, CanDescribeSelf) {
3591 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3592
3593 EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3594 EXPECT_EQ("is an object whose given property isn't >= 0",
3595 DescribeNegation(m));
3596 }
3597
3598 // Tests that Property() can explain the result of matching a pointer.
TEST(PropertyForPointerTest,CanExplainMatchResult)3599 TEST(PropertyForPointerTest, CanExplainMatchResult) {
3600 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3601
3602 AClass a;
3603 a.set_n(1);
3604 EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL)));
3605 EXPECT_EQ(
3606 "which points to an object whose given property is 1" + OfType("int"),
3607 Explain(m, &a));
3608
3609 m = Property(&AClass::n, GreaterThan(0));
3610 EXPECT_EQ("which points to an object whose given property is 1" +
3611 OfType("int") + ", which is 1 more than 0",
3612 Explain(m, &a));
3613 }
3614
3615 // Tests ResultOf.
3616
3617 // Tests that ResultOf(f, ...) compiles and works as expected when f is a
3618 // function pointer.
IntToStringFunction(int input)3619 string IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; }
3620
TEST(ResultOfTest,WorksForFunctionPointers)3621 TEST(ResultOfTest, WorksForFunctionPointers) {
3622 Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo")));
3623
3624 EXPECT_TRUE(matcher.Matches(1));
3625 EXPECT_FALSE(matcher.Matches(2));
3626 }
3627
3628 // Tests that ResultOf() can describe itself.
TEST(ResultOfTest,CanDescribeItself)3629 TEST(ResultOfTest, CanDescribeItself) {
3630 Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo"));
3631
3632 EXPECT_EQ("is mapped by the given callable to a value that "
3633 "is equal to \"foo\"", Describe(matcher));
3634 EXPECT_EQ("is mapped by the given callable to a value that "
3635 "isn't equal to \"foo\"", DescribeNegation(matcher));
3636 }
3637
3638 // Tests that ResultOf() can explain the match result.
IntFunction(int input)3639 int IntFunction(int input) { return input == 42 ? 80 : 90; }
3640
TEST(ResultOfTest,CanExplainMatchResult)3641 TEST(ResultOfTest, CanExplainMatchResult) {
3642 Matcher<int> matcher = ResultOf(&IntFunction, Ge(85));
3643 EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"),
3644 Explain(matcher, 36));
3645
3646 matcher = ResultOf(&IntFunction, GreaterThan(85));
3647 EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") +
3648 ", which is 5 more than 85", Explain(matcher, 36));
3649 }
3650
3651 // Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3652 // returns a non-reference.
TEST(ResultOfTest,WorksForNonReferenceResults)3653 TEST(ResultOfTest, WorksForNonReferenceResults) {
3654 Matcher<int> matcher = ResultOf(&IntFunction, Eq(80));
3655
3656 EXPECT_TRUE(matcher.Matches(42));
3657 EXPECT_FALSE(matcher.Matches(36));
3658 }
3659
3660 // Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3661 // returns a reference to non-const.
DoubleFunction(double & input)3662 double& DoubleFunction(double& input) { return input; } // NOLINT
3663
RefUncopyableFunction(Uncopyable & obj)3664 Uncopyable& RefUncopyableFunction(Uncopyable& obj) { // NOLINT
3665 return obj;
3666 }
3667
TEST(ResultOfTest,WorksForReferenceToNonConstResults)3668 TEST(ResultOfTest, WorksForReferenceToNonConstResults) {
3669 double x = 3.14;
3670 double x2 = x;
3671 Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x));
3672
3673 EXPECT_TRUE(matcher.Matches(x));
3674 EXPECT_FALSE(matcher.Matches(x2));
3675
3676 // Test that ResultOf works with uncopyable objects
3677 Uncopyable obj(0);
3678 Uncopyable obj2(0);
3679 Matcher<Uncopyable&> matcher2 =
3680 ResultOf(&RefUncopyableFunction, Ref(obj));
3681
3682 EXPECT_TRUE(matcher2.Matches(obj));
3683 EXPECT_FALSE(matcher2.Matches(obj2));
3684 }
3685
3686 // Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3687 // returns a reference to const.
StringFunction(const string & input)3688 const string& StringFunction(const string& input) { return input; }
3689
TEST(ResultOfTest,WorksForReferenceToConstResults)3690 TEST(ResultOfTest, WorksForReferenceToConstResults) {
3691 string s = "foo";
3692 string s2 = s;
3693 Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s));
3694
3695 EXPECT_TRUE(matcher.Matches(s));
3696 EXPECT_FALSE(matcher.Matches(s2));
3697 }
3698
3699 // Tests that ResultOf(f, m) works when f(x) and m's
3700 // argument types are compatible but different.
TEST(ResultOfTest,WorksForCompatibleMatcherTypes)3701 TEST(ResultOfTest, WorksForCompatibleMatcherTypes) {
3702 // IntFunction() returns int but the inner matcher expects a signed char.
3703 Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85)));
3704
3705 EXPECT_TRUE(matcher.Matches(36));
3706 EXPECT_FALSE(matcher.Matches(42));
3707 }
3708
3709 // Tests that the program aborts when ResultOf is passed
3710 // a NULL function pointer.
TEST(ResultOfDeathTest,DiesOnNullFunctionPointers)3711 TEST(ResultOfDeathTest, DiesOnNullFunctionPointers) {
3712 EXPECT_DEATH_IF_SUPPORTED(
3713 ResultOf(static_cast<string(*)(int dummy)>(NULL), Eq(string("foo"))),
3714 "NULL function pointer is passed into ResultOf\\(\\)\\.");
3715 }
3716
3717 // Tests that ResultOf(f, ...) compiles and works as expected when f is a
3718 // function reference.
TEST(ResultOfTest,WorksForFunctionReferences)3719 TEST(ResultOfTest, WorksForFunctionReferences) {
3720 Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo"));
3721 EXPECT_TRUE(matcher.Matches(1));
3722 EXPECT_FALSE(matcher.Matches(2));
3723 }
3724
3725 // Tests that ResultOf(f, ...) compiles and works as expected when f is a
3726 // function object.
3727 struct Functor : public ::std::unary_function<int, string> {
operator ()testing::gmock_matchers_test::Functor3728 result_type operator()(argument_type input) const {
3729 return IntToStringFunction(input);
3730 }
3731 };
3732
TEST(ResultOfTest,WorksForFunctors)3733 TEST(ResultOfTest, WorksForFunctors) {
3734 Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo")));
3735
3736 EXPECT_TRUE(matcher.Matches(1));
3737 EXPECT_FALSE(matcher.Matches(2));
3738 }
3739
3740 // Tests that ResultOf(f, ...) compiles and works as expected when f is a
3741 // functor with more then one operator() defined. ResultOf() must work
3742 // for each defined operator().
3743 struct PolymorphicFunctor {
3744 typedef int result_type;
operator ()testing::gmock_matchers_test::PolymorphicFunctor3745 int operator()(int n) { return n; }
operator ()testing::gmock_matchers_test::PolymorphicFunctor3746 int operator()(const char* s) { return static_cast<int>(strlen(s)); }
3747 };
3748
TEST(ResultOfTest,WorksForPolymorphicFunctors)3749 TEST(ResultOfTest, WorksForPolymorphicFunctors) {
3750 Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5));
3751
3752 EXPECT_TRUE(matcher_int.Matches(10));
3753 EXPECT_FALSE(matcher_int.Matches(2));
3754
3755 Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5));
3756
3757 EXPECT_TRUE(matcher_string.Matches("long string"));
3758 EXPECT_FALSE(matcher_string.Matches("shrt"));
3759 }
3760
ReferencingFunction(const int & n)3761 const int* ReferencingFunction(const int& n) { return &n; }
3762
3763 struct ReferencingFunctor {
3764 typedef const int* result_type;
operator ()testing::gmock_matchers_test::ReferencingFunctor3765 result_type operator()(const int& n) { return &n; }
3766 };
3767
TEST(ResultOfTest,WorksForReferencingCallables)3768 TEST(ResultOfTest, WorksForReferencingCallables) {
3769 const int n = 1;
3770 const int n2 = 1;
3771 Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n));
3772 EXPECT_TRUE(matcher2.Matches(n));
3773 EXPECT_FALSE(matcher2.Matches(n2));
3774
3775 Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n));
3776 EXPECT_TRUE(matcher3.Matches(n));
3777 EXPECT_FALSE(matcher3.Matches(n2));
3778 }
3779
3780 class DivisibleByImpl {
3781 public:
DivisibleByImpl(int a_divider)3782 explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {}
3783
3784 // For testing using ExplainMatchResultTo() with polymorphic matchers.
3785 template <typename T>
MatchAndExplain(const T & n,MatchResultListener * listener) const3786 bool MatchAndExplain(const T& n, MatchResultListener* listener) const {
3787 *listener << "which is " << (n % divider_) << " modulo "
3788 << divider_;
3789 return (n % divider_) == 0;
3790 }
3791
DescribeTo(ostream * os) const3792 void DescribeTo(ostream* os) const {
3793 *os << "is divisible by " << divider_;
3794 }
3795
DescribeNegationTo(ostream * os) const3796 void DescribeNegationTo(ostream* os) const {
3797 *os << "is not divisible by " << divider_;
3798 }
3799
set_divider(int a_divider)3800 void set_divider(int a_divider) { divider_ = a_divider; }
divider() const3801 int divider() const { return divider_; }
3802
3803 private:
3804 int divider_;
3805 };
3806
DivisibleBy(int n)3807 PolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {
3808 return MakePolymorphicMatcher(DivisibleByImpl(n));
3809 }
3810
3811 // Tests that when AllOf() fails, only the first failing matcher is
3812 // asked to explain why.
TEST(ExplainMatchResultTest,AllOf_False_False)3813 TEST(ExplainMatchResultTest, AllOf_False_False) {
3814 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
3815 EXPECT_EQ("which is 1 modulo 4", Explain(m, 5));
3816 }
3817
3818 // Tests that when AllOf() fails, only the first failing matcher is
3819 // asked to explain why.
TEST(ExplainMatchResultTest,AllOf_False_True)3820 TEST(ExplainMatchResultTest, AllOf_False_True) {
3821 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
3822 EXPECT_EQ("which is 2 modulo 4", Explain(m, 6));
3823 }
3824
3825 // Tests that when AllOf() fails, only the first failing matcher is
3826 // asked to explain why.
TEST(ExplainMatchResultTest,AllOf_True_False)3827 TEST(ExplainMatchResultTest, AllOf_True_False) {
3828 const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3));
3829 EXPECT_EQ("which is 2 modulo 3", Explain(m, 5));
3830 }
3831
3832 // Tests that when AllOf() succeeds, all matchers are asked to explain
3833 // why.
TEST(ExplainMatchResultTest,AllOf_True_True)3834 TEST(ExplainMatchResultTest, AllOf_True_True) {
3835 const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3));
3836 EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6));
3837 }
3838
TEST(ExplainMatchResultTest,AllOf_True_True_2)3839 TEST(ExplainMatchResultTest, AllOf_True_True_2) {
3840 const Matcher<int> m = AllOf(Ge(2), Le(3));
3841 EXPECT_EQ("", Explain(m, 2));
3842 }
3843
TEST(ExplainmatcherResultTest,MonomorphicMatcher)3844 TEST(ExplainmatcherResultTest, MonomorphicMatcher) {
3845 const Matcher<int> m = GreaterThan(5);
3846 EXPECT_EQ("which is 1 more than 5", Explain(m, 6));
3847 }
3848
3849 // The following two tests verify that values without a public copy
3850 // ctor can be used as arguments to matchers like Eq(), Ge(), and etc
3851 // with the help of ByRef().
3852
3853 class NotCopyable {
3854 public:
NotCopyable(int a_value)3855 explicit NotCopyable(int a_value) : value_(a_value) {}
3856
value() const3857 int value() const { return value_; }
3858
operator ==(const NotCopyable & rhs) const3859 bool operator==(const NotCopyable& rhs) const {
3860 return value() == rhs.value();
3861 }
3862
operator >=(const NotCopyable & rhs) const3863 bool operator>=(const NotCopyable& rhs) const {
3864 return value() >= rhs.value();
3865 }
3866 private:
3867 int value_;
3868
3869 GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable);
3870 };
3871
TEST(ByRefTest,AllowsNotCopyableConstValueInMatchers)3872 TEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) {
3873 const NotCopyable const_value1(1);
3874 const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1));
3875
3876 const NotCopyable n1(1), n2(2);
3877 EXPECT_TRUE(m.Matches(n1));
3878 EXPECT_FALSE(m.Matches(n2));
3879 }
3880
TEST(ByRefTest,AllowsNotCopyableValueInMatchers)3881 TEST(ByRefTest, AllowsNotCopyableValueInMatchers) {
3882 NotCopyable value2(2);
3883 const Matcher<NotCopyable&> m = Ge(ByRef(value2));
3884
3885 NotCopyable n1(1), n2(2);
3886 EXPECT_FALSE(m.Matches(n1));
3887 EXPECT_TRUE(m.Matches(n2));
3888 }
3889
TEST(IsEmptyTest,ImplementsIsEmpty)3890 TEST(IsEmptyTest, ImplementsIsEmpty) {
3891 vector<int> container;
3892 EXPECT_THAT(container, IsEmpty());
3893 container.push_back(0);
3894 EXPECT_THAT(container, Not(IsEmpty()));
3895 container.push_back(1);
3896 EXPECT_THAT(container, Not(IsEmpty()));
3897 }
3898
TEST(IsEmptyTest,WorksWithString)3899 TEST(IsEmptyTest, WorksWithString) {
3900 string text;
3901 EXPECT_THAT(text, IsEmpty());
3902 text = "foo";
3903 EXPECT_THAT(text, Not(IsEmpty()));
3904 text = string("\0", 1);
3905 EXPECT_THAT(text, Not(IsEmpty()));
3906 }
3907
TEST(IsEmptyTest,CanDescribeSelf)3908 TEST(IsEmptyTest, CanDescribeSelf) {
3909 Matcher<vector<int> > m = IsEmpty();
3910 EXPECT_EQ("is empty", Describe(m));
3911 EXPECT_EQ("isn't empty", DescribeNegation(m));
3912 }
3913
TEST(IsEmptyTest,ExplainsResult)3914 TEST(IsEmptyTest, ExplainsResult) {
3915 Matcher<vector<int> > m = IsEmpty();
3916 vector<int> container;
3917 EXPECT_EQ("", Explain(m, container));
3918 container.push_back(0);
3919 EXPECT_EQ("whose size is 1", Explain(m, container));
3920 }
3921
TEST(SizeIsTest,ImplementsSizeIs)3922 TEST(SizeIsTest, ImplementsSizeIs) {
3923 vector<int> container;
3924 EXPECT_THAT(container, SizeIs(0));
3925 EXPECT_THAT(container, Not(SizeIs(1)));
3926 container.push_back(0);
3927 EXPECT_THAT(container, Not(SizeIs(0)));
3928 EXPECT_THAT(container, SizeIs(1));
3929 container.push_back(0);
3930 EXPECT_THAT(container, Not(SizeIs(0)));
3931 EXPECT_THAT(container, SizeIs(2));
3932 }
3933
TEST(SizeIsTest,WorksWithMap)3934 TEST(SizeIsTest, WorksWithMap) {
3935 map<string, int> container;
3936 EXPECT_THAT(container, SizeIs(0));
3937 EXPECT_THAT(container, Not(SizeIs(1)));
3938 container.insert(make_pair("foo", 1));
3939 EXPECT_THAT(container, Not(SizeIs(0)));
3940 EXPECT_THAT(container, SizeIs(1));
3941 container.insert(make_pair("bar", 2));
3942 EXPECT_THAT(container, Not(SizeIs(0)));
3943 EXPECT_THAT(container, SizeIs(2));
3944 }
3945
TEST(SizeIsTest,WorksWithReferences)3946 TEST(SizeIsTest, WorksWithReferences) {
3947 vector<int> container;
3948 Matcher<const vector<int>&> m = SizeIs(1);
3949 EXPECT_THAT(container, Not(m));
3950 container.push_back(0);
3951 EXPECT_THAT(container, m);
3952 }
3953
TEST(SizeIsTest,CanDescribeSelf)3954 TEST(SizeIsTest, CanDescribeSelf) {
3955 Matcher<vector<int> > m = SizeIs(2);
3956 EXPECT_EQ("size is equal to 2", Describe(m));
3957 EXPECT_EQ("size isn't equal to 2", DescribeNegation(m));
3958 }
3959
TEST(SizeIsTest,ExplainsResult)3960 TEST(SizeIsTest, ExplainsResult) {
3961 Matcher<vector<int> > m1 = SizeIs(2);
3962 Matcher<vector<int> > m2 = SizeIs(Lt(2u));
3963 Matcher<vector<int> > m3 = SizeIs(AnyOf(0, 3));
3964 Matcher<vector<int> > m4 = SizeIs(GreaterThan(1));
3965 vector<int> container;
3966 EXPECT_EQ("whose size 0 doesn't match", Explain(m1, container));
3967 EXPECT_EQ("whose size 0 matches", Explain(m2, container));
3968 EXPECT_EQ("whose size 0 matches", Explain(m3, container));
3969 EXPECT_EQ("whose size 0 doesn't match, which is 1 less than 1",
3970 Explain(m4, container));
3971 container.push_back(0);
3972 container.push_back(0);
3973 EXPECT_EQ("whose size 2 matches", Explain(m1, container));
3974 EXPECT_EQ("whose size 2 doesn't match", Explain(m2, container));
3975 EXPECT_EQ("whose size 2 doesn't match", Explain(m3, container));
3976 EXPECT_EQ("whose size 2 matches, which is 1 more than 1",
3977 Explain(m4, container));
3978 }
3979
3980 #if GTEST_HAS_TYPED_TEST
3981 // Tests ContainerEq with different container types, and
3982 // different element types.
3983
3984 template <typename T>
3985 class ContainerEqTest : public testing::Test {};
3986
3987 typedef testing::Types<
3988 set<int>,
3989 vector<size_t>,
3990 multiset<size_t>,
3991 list<int> >
3992 ContainerEqTestTypes;
3993
3994 TYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes);
3995
3996 // Tests that the filled container is equal to itself.
TYPED_TEST(ContainerEqTest,EqualsSelf)3997 TYPED_TEST(ContainerEqTest, EqualsSelf) {
3998 static const int vals[] = {1, 1, 2, 3, 5, 8};
3999 TypeParam my_set(vals, vals + 6);
4000 const Matcher<TypeParam> m = ContainerEq(my_set);
4001 EXPECT_TRUE(m.Matches(my_set));
4002 EXPECT_EQ("", Explain(m, my_set));
4003 }
4004
4005 // Tests that missing values are reported.
TYPED_TEST(ContainerEqTest,ValueMissing)4006 TYPED_TEST(ContainerEqTest, ValueMissing) {
4007 static const int vals[] = {1, 1, 2, 3, 5, 8};
4008 static const int test_vals[] = {2, 1, 8, 5};
4009 TypeParam my_set(vals, vals + 6);
4010 TypeParam test_set(test_vals, test_vals + 4);
4011 const Matcher<TypeParam> m = ContainerEq(my_set);
4012 EXPECT_FALSE(m.Matches(test_set));
4013 EXPECT_EQ("which doesn't have these expected elements: 3",
4014 Explain(m, test_set));
4015 }
4016
4017 // Tests that added values are reported.
TYPED_TEST(ContainerEqTest,ValueAdded)4018 TYPED_TEST(ContainerEqTest, ValueAdded) {
4019 static const int vals[] = {1, 1, 2, 3, 5, 8};
4020 static const int test_vals[] = {1, 2, 3, 5, 8, 46};
4021 TypeParam my_set(vals, vals + 6);
4022 TypeParam test_set(test_vals, test_vals + 6);
4023 const Matcher<const TypeParam&> m = ContainerEq(my_set);
4024 EXPECT_FALSE(m.Matches(test_set));
4025 EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set));
4026 }
4027
4028 // Tests that added and missing values are reported together.
TYPED_TEST(ContainerEqTest,ValueAddedAndRemoved)4029 TYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) {
4030 static const int vals[] = {1, 1, 2, 3, 5, 8};
4031 static const int test_vals[] = {1, 2, 3, 8, 46};
4032 TypeParam my_set(vals, vals + 6);
4033 TypeParam test_set(test_vals, test_vals + 5);
4034 const Matcher<TypeParam> m = ContainerEq(my_set);
4035 EXPECT_FALSE(m.Matches(test_set));
4036 EXPECT_EQ("which has these unexpected elements: 46,\n"
4037 "and doesn't have these expected elements: 5",
4038 Explain(m, test_set));
4039 }
4040
4041 // Tests duplicated value -- expect no explanation.
TYPED_TEST(ContainerEqTest,DuplicateDifference)4042 TYPED_TEST(ContainerEqTest, DuplicateDifference) {
4043 static const int vals[] = {1, 1, 2, 3, 5, 8};
4044 static const int test_vals[] = {1, 2, 3, 5, 8};
4045 TypeParam my_set(vals, vals + 6);
4046 TypeParam test_set(test_vals, test_vals + 5);
4047 const Matcher<const TypeParam&> m = ContainerEq(my_set);
4048 // Depending on the container, match may be true or false
4049 // But in any case there should be no explanation.
4050 EXPECT_EQ("", Explain(m, test_set));
4051 }
4052 #endif // GTEST_HAS_TYPED_TEST
4053
4054 // Tests that mutliple missing values are reported.
4055 // Using just vector here, so order is predicatble.
TEST(ContainerEqExtraTest,MultipleValuesMissing)4056 TEST(ContainerEqExtraTest, MultipleValuesMissing) {
4057 static const int vals[] = {1, 1, 2, 3, 5, 8};
4058 static const int test_vals[] = {2, 1, 5};
4059 vector<int> my_set(vals, vals + 6);
4060 vector<int> test_set(test_vals, test_vals + 3);
4061 const Matcher<vector<int> > m = ContainerEq(my_set);
4062 EXPECT_FALSE(m.Matches(test_set));
4063 EXPECT_EQ("which doesn't have these expected elements: 3, 8",
4064 Explain(m, test_set));
4065 }
4066
4067 // Tests that added values are reported.
4068 // Using just vector here, so order is predicatble.
TEST(ContainerEqExtraTest,MultipleValuesAdded)4069 TEST(ContainerEqExtraTest, MultipleValuesAdded) {
4070 static const int vals[] = {1, 1, 2, 3, 5, 8};
4071 static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46};
4072 list<size_t> my_set(vals, vals + 6);
4073 list<size_t> test_set(test_vals, test_vals + 7);
4074 const Matcher<const list<size_t>&> m = ContainerEq(my_set);
4075 EXPECT_FALSE(m.Matches(test_set));
4076 EXPECT_EQ("which has these unexpected elements: 92, 46",
4077 Explain(m, test_set));
4078 }
4079
4080 // Tests that added and missing values are reported together.
TEST(ContainerEqExtraTest,MultipleValuesAddedAndRemoved)4081 TEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) {
4082 static const int vals[] = {1, 1, 2, 3, 5, 8};
4083 static const int test_vals[] = {1, 2, 3, 92, 46};
4084 list<size_t> my_set(vals, vals + 6);
4085 list<size_t> test_set(test_vals, test_vals + 5);
4086 const Matcher<const list<size_t> > m = ContainerEq(my_set);
4087 EXPECT_FALSE(m.Matches(test_set));
4088 EXPECT_EQ("which has these unexpected elements: 92, 46,\n"
4089 "and doesn't have these expected elements: 5, 8",
4090 Explain(m, test_set));
4091 }
4092
4093 // Tests to see that duplicate elements are detected,
4094 // but (as above) not reported in the explanation.
TEST(ContainerEqExtraTest,MultiSetOfIntDuplicateDifference)4095 TEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) {
4096 static const int vals[] = {1, 1, 2, 3, 5, 8};
4097 static const int test_vals[] = {1, 2, 3, 5, 8};
4098 vector<int> my_set(vals, vals + 6);
4099 vector<int> test_set(test_vals, test_vals + 5);
4100 const Matcher<vector<int> > m = ContainerEq(my_set);
4101 EXPECT_TRUE(m.Matches(my_set));
4102 EXPECT_FALSE(m.Matches(test_set));
4103 // There is nothing to report when both sets contain all the same values.
4104 EXPECT_EQ("", Explain(m, test_set));
4105 }
4106
4107 // Tests that ContainerEq works for non-trivial associative containers,
4108 // like maps.
TEST(ContainerEqExtraTest,WorksForMaps)4109 TEST(ContainerEqExtraTest, WorksForMaps) {
4110 map<int, std::string> my_map;
4111 my_map[0] = "a";
4112 my_map[1] = "b";
4113
4114 map<int, std::string> test_map;
4115 test_map[0] = "aa";
4116 test_map[1] = "b";
4117
4118 const Matcher<const map<int, std::string>&> m = ContainerEq(my_map);
4119 EXPECT_TRUE(m.Matches(my_map));
4120 EXPECT_FALSE(m.Matches(test_map));
4121
4122 EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n"
4123 "and doesn't have these expected elements: (0, \"a\")",
4124 Explain(m, test_map));
4125 }
4126
TEST(ContainerEqExtraTest,WorksForNativeArray)4127 TEST(ContainerEqExtraTest, WorksForNativeArray) {
4128 int a1[] = { 1, 2, 3 };
4129 int a2[] = { 1, 2, 3 };
4130 int b[] = { 1, 2, 4 };
4131
4132 EXPECT_THAT(a1, ContainerEq(a2));
4133 EXPECT_THAT(a1, Not(ContainerEq(b)));
4134 }
4135
TEST(ContainerEqExtraTest,WorksForTwoDimensionalNativeArray)4136 TEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) {
4137 const char a1[][3] = { "hi", "lo" };
4138 const char a2[][3] = { "hi", "lo" };
4139 const char b[][3] = { "lo", "hi" };
4140
4141 // Tests using ContainerEq() in the first dimension.
4142 EXPECT_THAT(a1, ContainerEq(a2));
4143 EXPECT_THAT(a1, Not(ContainerEq(b)));
4144
4145 // Tests using ContainerEq() in the second dimension.
4146 EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1])));
4147 EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1])));
4148 }
4149
TEST(ContainerEqExtraTest,WorksForNativeArrayAsTuple)4150 TEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) {
4151 const int a1[] = { 1, 2, 3 };
4152 const int a2[] = { 1, 2, 3 };
4153 const int b[] = { 1, 2, 3, 4 };
4154
4155 const int* const p1 = a1;
4156 EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2));
4157 EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b)));
4158
4159 const int c[] = { 1, 3, 2 };
4160 EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c)));
4161 }
4162
TEST(ContainerEqExtraTest,CopiesNativeArrayParameter)4163 TEST(ContainerEqExtraTest, CopiesNativeArrayParameter) {
4164 std::string a1[][3] = {
4165 { "hi", "hello", "ciao" },
4166 { "bye", "see you", "ciao" }
4167 };
4168
4169 std::string a2[][3] = {
4170 { "hi", "hello", "ciao" },
4171 { "bye", "see you", "ciao" }
4172 };
4173
4174 const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2);
4175 EXPECT_THAT(a1, m);
4176
4177 a2[0][0] = "ha";
4178 EXPECT_THAT(a1, m);
4179 }
4180
TEST(WhenSortedByTest,WorksForEmptyContainer)4181 TEST(WhenSortedByTest, WorksForEmptyContainer) {
4182 const vector<int> numbers;
4183 EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre()));
4184 EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1))));
4185 }
4186
TEST(WhenSortedByTest,WorksForNonEmptyContainer)4187 TEST(WhenSortedByTest, WorksForNonEmptyContainer) {
4188 vector<unsigned> numbers;
4189 numbers.push_back(3);
4190 numbers.push_back(1);
4191 numbers.push_back(2);
4192 numbers.push_back(2);
4193 EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(),
4194 ElementsAre(3, 2, 2, 1)));
4195 EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(),
4196 ElementsAre(1, 2, 2, 3))));
4197 }
4198
TEST(WhenSortedByTest,WorksForNonVectorContainer)4199 TEST(WhenSortedByTest, WorksForNonVectorContainer) {
4200 list<string> words;
4201 words.push_back("say");
4202 words.push_back("hello");
4203 words.push_back("world");
4204 EXPECT_THAT(words, WhenSortedBy(less<string>(),
4205 ElementsAre("hello", "say", "world")));
4206 EXPECT_THAT(words, Not(WhenSortedBy(less<string>(),
4207 ElementsAre("say", "hello", "world"))));
4208 }
4209
TEST(WhenSortedByTest,WorksForNativeArray)4210 TEST(WhenSortedByTest, WorksForNativeArray) {
4211 const int numbers[] = { 1, 3, 2, 4 };
4212 const int sorted_numbers[] = { 1, 2, 3, 4 };
4213 EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4)));
4214 EXPECT_THAT(numbers, WhenSortedBy(less<int>(),
4215 ElementsAreArray(sorted_numbers)));
4216 EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4))));
4217 }
4218
TEST(WhenSortedByTest,CanDescribeSelf)4219 TEST(WhenSortedByTest, CanDescribeSelf) {
4220 const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2));
4221 EXPECT_EQ("(when sorted) has 2 elements where\n"
4222 "element #0 is equal to 1,\n"
4223 "element #1 is equal to 2",
4224 Describe(m));
4225 EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n"
4226 "element #0 isn't equal to 1, or\n"
4227 "element #1 isn't equal to 2",
4228 DescribeNegation(m));
4229 }
4230
TEST(WhenSortedByTest,ExplainsMatchResult)4231 TEST(WhenSortedByTest, ExplainsMatchResult) {
4232 const int a[] = { 2, 1 };
4233 EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match",
4234 Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a));
4235 EXPECT_EQ("which is { 1, 2 } when sorted",
4236 Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a));
4237 }
4238
4239 // WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't
4240 // need to test it as exhaustively as we test the latter.
4241
TEST(WhenSortedTest,WorksForEmptyContainer)4242 TEST(WhenSortedTest, WorksForEmptyContainer) {
4243 const vector<int> numbers;
4244 EXPECT_THAT(numbers, WhenSorted(ElementsAre()));
4245 EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1))));
4246 }
4247
TEST(WhenSortedTest,WorksForNonEmptyContainer)4248 TEST(WhenSortedTest, WorksForNonEmptyContainer) {
4249 list<string> words;
4250 words.push_back("3");
4251 words.push_back("1");
4252 words.push_back("2");
4253 words.push_back("2");
4254 EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3")));
4255 EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2"))));
4256 }
4257
TEST(WhenSortedTest,WorksForMapTypes)4258 TEST(WhenSortedTest, WorksForMapTypes) {
4259 map<string, int> word_counts;
4260 word_counts["and"] = 1;
4261 word_counts["the"] = 1;
4262 word_counts["buffalo"] = 2;
4263 EXPECT_THAT(word_counts, WhenSorted(ElementsAre(
4264 Pair("and", 1), Pair("buffalo", 2), Pair("the", 1))));
4265 EXPECT_THAT(word_counts, Not(WhenSorted(ElementsAre(
4266 Pair("and", 1), Pair("the", 1), Pair("buffalo", 2)))));
4267 }
4268
TEST(WhenSortedTest,WorksForMultiMapTypes)4269 TEST(WhenSortedTest, WorksForMultiMapTypes) {
4270 multimap<int, int> ifib;
4271 ifib.insert(make_pair(8, 6));
4272 ifib.insert(make_pair(2, 3));
4273 ifib.insert(make_pair(1, 1));
4274 ifib.insert(make_pair(3, 4));
4275 ifib.insert(make_pair(1, 2));
4276 ifib.insert(make_pair(5, 5));
4277 EXPECT_THAT(ifib, WhenSorted(ElementsAre(Pair(1, 1),
4278 Pair(1, 2),
4279 Pair(2, 3),
4280 Pair(3, 4),
4281 Pair(5, 5),
4282 Pair(8, 6))));
4283 EXPECT_THAT(ifib, Not(WhenSorted(ElementsAre(Pair(8, 6),
4284 Pair(2, 3),
4285 Pair(1, 1),
4286 Pair(3, 4),
4287 Pair(1, 2),
4288 Pair(5, 5)))));
4289 }
4290
TEST(WhenSortedTest,WorksForPolymorphicMatcher)4291 TEST(WhenSortedTest, WorksForPolymorphicMatcher) {
4292 std::deque<int> d;
4293 d.push_back(2);
4294 d.push_back(1);
4295 EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2)));
4296 EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1))));
4297 }
4298
TEST(WhenSortedTest,WorksForVectorConstRefMatcher)4299 TEST(WhenSortedTest, WorksForVectorConstRefMatcher) {
4300 std::deque<int> d;
4301 d.push_back(2);
4302 d.push_back(1);
4303 Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2);
4304 EXPECT_THAT(d, WhenSorted(vector_match));
4305 Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1);
4306 EXPECT_THAT(d, Not(WhenSorted(not_vector_match)));
4307 }
4308
4309 // Deliberately bare pseudo-container.
4310 // Offers only begin() and end() accessors, yielding InputIterator.
4311 template <typename T>
4312 class Streamlike {
4313 private:
4314 class ConstIter;
4315 public:
4316 typedef ConstIter const_iterator;
4317 typedef T value_type;
4318
4319 template <typename InIter>
Streamlike(InIter first,InIter last)4320 Streamlike(InIter first, InIter last) : remainder_(first, last) {}
4321
begin() const4322 const_iterator begin() const {
4323 return const_iterator(this, remainder_.begin());
4324 }
end() const4325 const_iterator end() const {
4326 return const_iterator(this, remainder_.end());
4327 }
4328
4329 private:
4330 class ConstIter : public std::iterator<std::input_iterator_tag,
4331 value_type,
4332 ptrdiff_t,
4333 const value_type&,
4334 const value_type*> {
4335 public:
ConstIter(const Streamlike * s,typename std::list<value_type>::iterator pos)4336 ConstIter(const Streamlike* s,
4337 typename std::list<value_type>::iterator pos)
4338 : s_(s), pos_(pos) {}
4339
operator *() const4340 const value_type& operator*() const { return *pos_; }
operator ->() const4341 const value_type* operator->() const { return &*pos_; }
operator ++()4342 ConstIter& operator++() {
4343 s_->remainder_.erase(pos_++);
4344 return *this;
4345 }
4346
4347 // *iter++ is required to work (see std::istreambuf_iterator).
4348 // (void)iter++ is also required to work.
4349 class PostIncrProxy {
4350 public:
PostIncrProxy(const value_type & value)4351 explicit PostIncrProxy(const value_type& value) : value_(value) {}
operator *() const4352 value_type operator*() const { return value_; }
4353 private:
4354 value_type value_;
4355 };
operator ++(int)4356 PostIncrProxy operator++(int) {
4357 PostIncrProxy proxy(**this);
4358 ++(*this);
4359 return proxy;
4360 }
4361
operator ==(const ConstIter & a,const ConstIter & b)4362 friend bool operator==(const ConstIter& a, const ConstIter& b) {
4363 return a.s_ == b.s_ && a.pos_ == b.pos_;
4364 }
operator !=(const ConstIter & a,const ConstIter & b)4365 friend bool operator!=(const ConstIter& a, const ConstIter& b) {
4366 return !(a == b);
4367 }
4368
4369 private:
4370 const Streamlike* s_;
4371 typename std::list<value_type>::iterator pos_;
4372 };
4373
operator <<(std::ostream & os,const Streamlike & s)4374 friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) {
4375 os << "[";
4376 typedef typename std::list<value_type>::const_iterator Iter;
4377 const char* sep = "";
4378 for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) {
4379 os << sep << *it;
4380 sep = ",";
4381 }
4382 os << "]";
4383 return os;
4384 }
4385
4386 mutable std::list<value_type> remainder_; // modified by iteration
4387 };
4388
TEST(StreamlikeTest,Iteration)4389 TEST(StreamlikeTest, Iteration) {
4390 const int a[5] = { 2, 1, 4, 5, 3 };
4391 Streamlike<int> s(a, a + 5);
4392 Streamlike<int>::const_iterator it = s.begin();
4393 const int* ip = a;
4394 while (it != s.end()) {
4395 SCOPED_TRACE(ip - a);
4396 EXPECT_EQ(*ip++, *it++);
4397 }
4398 }
4399
TEST(WhenSortedTest,WorksForStreamlike)4400 TEST(WhenSortedTest, WorksForStreamlike) {
4401 // Streamlike 'container' provides only minimal iterator support.
4402 // Its iterators are tagged with input_iterator_tag.
4403 const int a[5] = { 2, 1, 4, 5, 3 };
4404 Streamlike<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4405 EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5)));
4406 EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4407 }
4408
TEST(WhenSortedTest,WorksForVectorConstRefMatcherOnStreamlike)4409 TEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) {
4410 const int a[] = { 2, 1, 4, 5, 3 };
4411 Streamlike<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4412 Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5);
4413 EXPECT_THAT(s, WhenSorted(vector_match));
4414 EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4415 }
4416
4417 // Tests using ElementsAre() and ElementsAreArray() with stream-like
4418 // "containers".
4419
TEST(ElemensAreStreamTest,WorksForStreamlike)4420 TEST(ElemensAreStreamTest, WorksForStreamlike) {
4421 const int a[5] = { 1, 2, 3, 4, 5 };
4422 Streamlike<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4423 EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5));
4424 EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3)));
4425 }
4426
TEST(ElemensAreArrayStreamTest,WorksForStreamlike)4427 TEST(ElemensAreArrayStreamTest, WorksForStreamlike) {
4428 const int a[5] = { 1, 2, 3, 4, 5 };
4429 Streamlike<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4430
4431 vector<int> expected;
4432 expected.push_back(1);
4433 expected.push_back(2);
4434 expected.push_back(3);
4435 expected.push_back(4);
4436 expected.push_back(5);
4437 EXPECT_THAT(s, ElementsAreArray(expected));
4438
4439 expected[3] = 0;
4440 EXPECT_THAT(s, Not(ElementsAreArray(expected)));
4441 }
4442
4443 // Tests for UnorderedElementsAreArray()
4444
TEST(UnorderedElementsAreArrayTest,SucceedsWhenExpected)4445 TEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) {
4446 const int a[] = { 0, 1, 2, 3, 4 };
4447 std::vector<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4448 do {
4449 StringMatchResultListener listener;
4450 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a),
4451 s, &listener)) << listener.str();
4452 } while (std::next_permutation(s.begin(), s.end()));
4453 }
4454
TEST(UnorderedElementsAreArrayTest,VectorBool)4455 TEST(UnorderedElementsAreArrayTest, VectorBool) {
4456 const bool a[] = { 0, 1, 0, 1, 1 };
4457 const bool b[] = { 1, 0, 1, 1, 0 };
4458 std::vector<bool> expected(a, a + GMOCK_ARRAY_SIZE_(a));
4459 std::vector<bool> actual(b, b + GMOCK_ARRAY_SIZE_(b));
4460 StringMatchResultListener listener;
4461 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected),
4462 actual, &listener)) << listener.str();
4463 }
4464
TEST(UnorderedElementsAreArrayTest,WorksForStreamlike)4465 TEST(UnorderedElementsAreArrayTest, WorksForStreamlike) {
4466 // Streamlike 'container' provides only minimal iterator support.
4467 // Its iterators are tagged with input_iterator_tag, and it has no
4468 // size() or empty() methods.
4469 const int a[5] = { 2, 1, 4, 5, 3 };
4470 Streamlike<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4471
4472 ::std::vector<int> expected;
4473 expected.push_back(1);
4474 expected.push_back(2);
4475 expected.push_back(3);
4476 expected.push_back(4);
4477 expected.push_back(5);
4478 EXPECT_THAT(s, UnorderedElementsAreArray(expected));
4479
4480 expected.push_back(6);
4481 EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected)));
4482 }
4483
4484 #if GTEST_LANG_CXX11
4485
TEST(UnorderedElementsAreArrayTest,TakesInitializerList)4486 TEST(UnorderedElementsAreArrayTest, TakesInitializerList) {
4487 const int a[5] = { 2, 1, 4, 5, 3 };
4488 EXPECT_THAT(a, UnorderedElementsAreArray({ 1, 2, 3, 4, 5 }));
4489 EXPECT_THAT(a, Not(UnorderedElementsAreArray({ 1, 2, 3, 4, 6 })));
4490 }
4491
TEST(UnorderedElementsAreArrayTest,TakesInitializerListOfCStrings)4492 TEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) {
4493 const string a[5] = { "a", "b", "c", "d", "e" };
4494 EXPECT_THAT(a, UnorderedElementsAreArray({ "a", "b", "c", "d", "e" }));
4495 EXPECT_THAT(a, Not(UnorderedElementsAreArray({ "a", "b", "c", "d", "ef" })));
4496 }
4497
TEST(UnorderedElementsAreArrayTest,TakesInitializerListOfSameTypedMatchers)4498 TEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) {
4499 const int a[5] = { 2, 1, 4, 5, 3 };
4500 EXPECT_THAT(a, UnorderedElementsAreArray(
4501 { Eq(1), Eq(2), Eq(3), Eq(4), Eq(5) }));
4502 EXPECT_THAT(a, Not(UnorderedElementsAreArray(
4503 { Eq(1), Eq(2), Eq(3), Eq(4), Eq(6) })));
4504 }
4505
TEST(UnorderedElementsAreArrayTest,TakesInitializerListOfDifferentTypedMatchers)4506 TEST(UnorderedElementsAreArrayTest,
4507 TakesInitializerListOfDifferentTypedMatchers) {
4508 const int a[5] = { 2, 1, 4, 5, 3 };
4509 // The compiler cannot infer the type of the initializer list if its
4510 // elements have different types. We must explicitly specify the
4511 // unified element type in this case.
4512 EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int> >(
4513 { Eq(1), Ne(-2), Ge(3), Le(4), Eq(5) }));
4514 EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int> >(
4515 { Eq(1), Ne(-2), Ge(3), Le(4), Eq(6) })));
4516 }
4517
4518 #endif // GTEST_LANG_CXX11
4519
4520 class UnorderedElementsAreTest : public testing::Test {
4521 protected:
4522 typedef std::vector<int> IntVec;
4523 };
4524
TEST_F(UnorderedElementsAreTest,SucceedsWhenExpected)4525 TEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) {
4526 const int a[] = { 1, 2, 3 };
4527 std::vector<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4528 do {
4529 StringMatchResultListener listener;
4530 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4531 s, &listener)) << listener.str();
4532 } while (std::next_permutation(s.begin(), s.end()));
4533 }
4534
TEST_F(UnorderedElementsAreTest,FailsWhenAnElementMatchesNoMatcher)4535 TEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) {
4536 const int a[] = { 1, 2, 3 };
4537 std::vector<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4538 std::vector<Matcher<int> > mv;
4539 mv.push_back(1);
4540 mv.push_back(2);
4541 mv.push_back(2);
4542 // The element with value '3' matches nothing: fail fast.
4543 StringMatchResultListener listener;
4544 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4545 s, &listener)) << listener.str();
4546 }
4547
TEST_F(UnorderedElementsAreTest,WorksForStreamlike)4548 TEST_F(UnorderedElementsAreTest, WorksForStreamlike) {
4549 // Streamlike 'container' provides only minimal iterator support.
4550 // Its iterators are tagged with input_iterator_tag, and it has no
4551 // size() or empty() methods.
4552 const int a[5] = { 2, 1, 4, 5, 3 };
4553 Streamlike<int> s(a, a + GMOCK_ARRAY_SIZE_(a));
4554
4555 EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5));
4556 EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5)));
4557 }
4558
4559 // One naive implementation of the matcher runs in O(N!) time, which is too
4560 // slow for many real-world inputs. This test shows that our matcher can match
4561 // 100 inputs very quickly (a few milliseconds). An O(100!) is 10^158
4562 // iterations and obviously effectively incomputable.
4563 // [ RUN ] UnorderedElementsAreTest.Performance
4564 // [ OK ] UnorderedElementsAreTest.Performance (4 ms)
TEST_F(UnorderedElementsAreTest,Performance)4565 TEST_F(UnorderedElementsAreTest, Performance) {
4566 std::vector<int> s;
4567 std::vector<Matcher<int> > mv;
4568 for (int i = 0; i < 100; ++i) {
4569 s.push_back(i);
4570 mv.push_back(_);
4571 }
4572 mv[50] = Eq(0);
4573 StringMatchResultListener listener;
4574 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4575 s, &listener)) << listener.str();
4576 }
4577
4578 // Another variant of 'Performance' with similar expectations.
4579 // [ RUN ] UnorderedElementsAreTest.PerformanceHalfStrict
4580 // [ OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms)
TEST_F(UnorderedElementsAreTest,PerformanceHalfStrict)4581 TEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) {
4582 std::vector<int> s;
4583 std::vector<Matcher<int> > mv;
4584 for (int i = 0; i < 100; ++i) {
4585 s.push_back(i);
4586 if (i & 1) {
4587 mv.push_back(_);
4588 } else {
4589 mv.push_back(i);
4590 }
4591 }
4592 StringMatchResultListener listener;
4593 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4594 s, &listener)) << listener.str();
4595 }
4596
TEST_F(UnorderedElementsAreTest,FailMessageCountWrong)4597 TEST_F(UnorderedElementsAreTest, FailMessageCountWrong) {
4598 std::vector<int> v;
4599 v.push_back(4);
4600 StringMatchResultListener listener;
4601 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4602 v, &listener)) << listener.str();
4603 EXPECT_THAT(listener.str(), Eq("which has 1 element"));
4604 }
4605
TEST_F(UnorderedElementsAreTest,FailMessageCountWrongZero)4606 TEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) {
4607 std::vector<int> v;
4608 StringMatchResultListener listener;
4609 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4610 v, &listener)) << listener.str();
4611 EXPECT_THAT(listener.str(), Eq(""));
4612 }
4613
TEST_F(UnorderedElementsAreTest,FailMessageUnmatchedMatchers)4614 TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) {
4615 std::vector<int> v;
4616 v.push_back(1);
4617 v.push_back(1);
4618 StringMatchResultListener listener;
4619 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4620 v, &listener)) << listener.str();
4621 EXPECT_THAT(
4622 listener.str(),
4623 Eq("where the following matchers don't match any elements:\n"
4624 "matcher #1: is equal to 2"));
4625 }
4626
TEST_F(UnorderedElementsAreTest,FailMessageUnmatchedElements)4627 TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) {
4628 std::vector<int> v;
4629 v.push_back(1);
4630 v.push_back(2);
4631 StringMatchResultListener listener;
4632 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1),
4633 v, &listener)) << listener.str();
4634 EXPECT_THAT(
4635 listener.str(),
4636 Eq("where the following elements don't match any matchers:\n"
4637 "element #1: 2"));
4638 }
4639
TEST_F(UnorderedElementsAreTest,FailMessageUnmatchedMatcherAndElement)4640 TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) {
4641 std::vector<int> v;
4642 v.push_back(2);
4643 v.push_back(3);
4644 StringMatchResultListener listener;
4645 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4646 v, &listener)) << listener.str();
4647 EXPECT_THAT(
4648 listener.str(),
4649 Eq("where"
4650 " the following matchers don't match any elements:\n"
4651 "matcher #0: is equal to 1\n"
4652 "and"
4653 " where"
4654 " the following elements don't match any matchers:\n"
4655 "element #1: 3"));
4656 }
4657
4658 // Test helper for formatting element, matcher index pairs in expectations.
EMString(int element,int matcher)4659 static string EMString(int element, int matcher) {
4660 stringstream ss;
4661 ss << "(element #" << element << ", matcher #" << matcher << ")";
4662 return ss.str();
4663 }
4664
TEST_F(UnorderedElementsAreTest,FailMessageImperfectMatchOnly)4665 TEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) {
4666 // A situation where all elements and matchers have a match
4667 // associated with them, but the max matching is not perfect.
4668 std::vector<string> v;
4669 v.push_back("a");
4670 v.push_back("b");
4671 v.push_back("c");
4672 StringMatchResultListener listener;
4673 EXPECT_FALSE(ExplainMatchResult(
4674 UnorderedElementsAre("a", "a", AnyOf("b", "c")), v, &listener))
4675 << listener.str();
4676
4677 string prefix =
4678 "where no permutation of the elements can satisfy all matchers, "
4679 "and the closest match is 2 of 3 matchers with the "
4680 "pairings:\n";
4681
4682 // We have to be a bit loose here, because there are 4 valid max matches.
4683 EXPECT_THAT(
4684 listener.str(),
4685 AnyOf(prefix + "{\n " + EMString(0, 0) +
4686 ",\n " + EMString(1, 2) + "\n}",
4687 prefix + "{\n " + EMString(0, 1) +
4688 ",\n " + EMString(1, 2) + "\n}",
4689 prefix + "{\n " + EMString(0, 0) +
4690 ",\n " + EMString(2, 2) + "\n}",
4691 prefix + "{\n " + EMString(0, 1) +
4692 ",\n " + EMString(2, 2) + "\n}"));
4693 }
4694
TEST_F(UnorderedElementsAreTest,Describe)4695 TEST_F(UnorderedElementsAreTest, Describe) {
4696 EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()),
4697 Eq("is empty"));
4698 EXPECT_THAT(
4699 Describe<IntVec>(UnorderedElementsAre(345)),
4700 Eq("has 1 element and that element is equal to 345"));
4701 EXPECT_THAT(
4702 Describe<IntVec>(UnorderedElementsAre(111, 222, 333)),
4703 Eq("has 3 elements and there exists some permutation "
4704 "of elements such that:\n"
4705 " - element #0 is equal to 111, and\n"
4706 " - element #1 is equal to 222, and\n"
4707 " - element #2 is equal to 333"));
4708 }
4709
TEST_F(UnorderedElementsAreTest,DescribeNegation)4710 TEST_F(UnorderedElementsAreTest, DescribeNegation) {
4711 EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()),
4712 Eq("isn't empty"));
4713 EXPECT_THAT(
4714 DescribeNegation<IntVec>(UnorderedElementsAre(345)),
4715 Eq("doesn't have 1 element, or has 1 element that isn't equal to 345"));
4716 EXPECT_THAT(
4717 DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)),
4718 Eq("doesn't have 3 elements, or there exists no permutation "
4719 "of elements such that:\n"
4720 " - element #0 is equal to 123, and\n"
4721 " - element #1 is equal to 234, and\n"
4722 " - element #2 is equal to 345"));
4723 }
4724
4725 namespace {
4726
4727 // Used as a check on the more complex max flow method used in the
4728 // real testing::internal::FindMaxBipartiteMatching. This method is
4729 // compatible but runs in worst-case factorial time, so we only
4730 // use it in testing for small problem sizes.
4731 template <typename Graph>
4732 class BacktrackingMaxBPMState {
4733 public:
4734 // Does not take ownership of 'g'.
BacktrackingMaxBPMState(const Graph * g)4735 explicit BacktrackingMaxBPMState(const Graph* g) : graph_(g) { }
4736
Compute()4737 ElementMatcherPairs Compute() {
4738 if (graph_->LhsSize() == 0 || graph_->RhsSize() == 0) {
4739 return best_so_far_;
4740 }
4741 lhs_used_.assign(graph_->LhsSize(), kUnused);
4742 rhs_used_.assign(graph_->RhsSize(), kUnused);
4743 for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {
4744 matches_.clear();
4745 RecurseInto(irhs);
4746 if (best_so_far_.size() == graph_->RhsSize())
4747 break;
4748 }
4749 return best_so_far_;
4750 }
4751
4752 private:
4753 static const size_t kUnused = static_cast<size_t>(-1);
4754
PushMatch(size_t lhs,size_t rhs)4755 void PushMatch(size_t lhs, size_t rhs) {
4756 matches_.push_back(ElementMatcherPair(lhs, rhs));
4757 lhs_used_[lhs] = rhs;
4758 rhs_used_[rhs] = lhs;
4759 if (matches_.size() > best_so_far_.size()) {
4760 best_so_far_ = matches_;
4761 }
4762 }
4763
PopMatch()4764 void PopMatch() {
4765 const ElementMatcherPair& back = matches_.back();
4766 lhs_used_[back.first] = kUnused;
4767 rhs_used_[back.second] = kUnused;
4768 matches_.pop_back();
4769 }
4770
RecurseInto(size_t irhs)4771 bool RecurseInto(size_t irhs) {
4772 if (rhs_used_[irhs] != kUnused) {
4773 return true;
4774 }
4775 for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {
4776 if (lhs_used_[ilhs] != kUnused) {
4777 continue;
4778 }
4779 if (!graph_->HasEdge(ilhs, irhs)) {
4780 continue;
4781 }
4782 PushMatch(ilhs, irhs);
4783 if (best_so_far_.size() == graph_->RhsSize()) {
4784 return false;
4785 }
4786 for (size_t mi = irhs + 1; mi < graph_->RhsSize(); ++mi) {
4787 if (!RecurseInto(mi)) return false;
4788 }
4789 PopMatch();
4790 }
4791 return true;
4792 }
4793
4794 const Graph* graph_; // not owned
4795 std::vector<size_t> lhs_used_;
4796 std::vector<size_t> rhs_used_;
4797 ElementMatcherPairs matches_;
4798 ElementMatcherPairs best_so_far_;
4799 };
4800
4801 template <typename Graph>
4802 const size_t BacktrackingMaxBPMState<Graph>::kUnused;
4803
4804 } // namespace
4805
4806 // Implement a simple backtracking algorithm to determine if it is possible
4807 // to find one element per matcher, without reusing elements.
4808 template <typename Graph>
4809 ElementMatcherPairs
FindBacktrackingMaxBPM(const Graph & g)4810 FindBacktrackingMaxBPM(const Graph& g) {
4811 return BacktrackingMaxBPMState<Graph>(&g).Compute();
4812 }
4813
4814 class BacktrackingBPMTest : public ::testing::Test { };
4815
4816 // Tests the MaxBipartiteMatching algorithm with square matrices.
4817 // The single int param is the # of nodes on each of the left and right sides.
4818 class BipartiteTest : public ::testing::TestWithParam<int> { };
4819
4820 // Verify all match graphs up to some moderate number of edges.
TEST_P(BipartiteTest,Exhaustive)4821 TEST_P(BipartiteTest, Exhaustive) {
4822 int nodes = GetParam();
4823 MatchMatrix graph(nodes, nodes);
4824 do {
4825 ElementMatcherPairs matches =
4826 internal::FindMaxBipartiteMatching(graph);
4827 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), matches.size())
4828 << "graph: " << graph.DebugString();
4829 // Check that all elements of matches are in the graph.
4830 // Check that elements of first and second are unique.
4831 std::vector<bool> seen_element(graph.LhsSize());
4832 std::vector<bool> seen_matcher(graph.RhsSize());
4833 SCOPED_TRACE(PrintToString(matches));
4834 for (size_t i = 0; i < matches.size(); ++i) {
4835 size_t ilhs = matches[i].first;
4836 size_t irhs = matches[i].second;
4837 EXPECT_TRUE(graph.HasEdge(ilhs, irhs));
4838 EXPECT_FALSE(seen_element[ilhs]);
4839 EXPECT_FALSE(seen_matcher[irhs]);
4840 seen_element[ilhs] = true;
4841 seen_matcher[irhs] = true;
4842 }
4843 } while (graph.NextGraph());
4844 }
4845
4846 INSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteTest,
4847 ::testing::Range(0, 5));
4848
4849 // Parameterized by a pair interpreted as (LhsSize, RhsSize).
4850 class BipartiteNonSquareTest
4851 : public ::testing::TestWithParam<std::pair<size_t, size_t> > {
4852 };
4853
TEST_F(BipartiteNonSquareTest,SimpleBacktracking)4854 TEST_F(BipartiteNonSquareTest, SimpleBacktracking) {
4855 // .......
4856 // 0:-----\ :
4857 // 1:---\ | :
4858 // 2:---\ | :
4859 // 3:-\ | | :
4860 // :.......:
4861 // 0 1 2
4862 MatchMatrix g(4, 3);
4863 static const int kEdges[][2] = { {0, 2}, {1, 1}, {2, 1}, {3, 0} };
4864 for (size_t i = 0; i < GMOCK_ARRAY_SIZE_(kEdges); ++i) {
4865 g.SetEdge(kEdges[i][0], kEdges[i][1], true);
4866 }
4867 EXPECT_THAT(FindBacktrackingMaxBPM(g),
4868 ElementsAre(Pair(3, 0),
4869 Pair(AnyOf(1, 2), 1),
4870 Pair(0, 2))) << g.DebugString();
4871 }
4872
4873 // Verify a few nonsquare matrices.
TEST_P(BipartiteNonSquareTest,Exhaustive)4874 TEST_P(BipartiteNonSquareTest, Exhaustive) {
4875 size_t nlhs = GetParam().first;
4876 size_t nrhs = GetParam().second;
4877 MatchMatrix graph(nlhs, nrhs);
4878 do {
4879 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
4880 internal::FindMaxBipartiteMatching(graph).size())
4881 << "graph: " << graph.DebugString()
4882 << "\nbacktracking: "
4883 << PrintToString(FindBacktrackingMaxBPM(graph))
4884 << "\nmax flow: "
4885 << PrintToString(internal::FindMaxBipartiteMatching(graph));
4886 } while (graph.NextGraph());
4887 }
4888
4889 INSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteNonSquareTest,
4890 testing::Values(
4891 std::make_pair(1, 2),
4892 std::make_pair(2, 1),
4893 std::make_pair(3, 2),
4894 std::make_pair(2, 3),
4895 std::make_pair(4, 1),
4896 std::make_pair(1, 4),
4897 std::make_pair(4, 3),
4898 std::make_pair(3, 4)));
4899
4900 class BipartiteRandomTest
4901 : public ::testing::TestWithParam<std::pair<int, int> > {
4902 };
4903
4904 // Verifies a large sample of larger graphs.
TEST_P(BipartiteRandomTest,LargerNets)4905 TEST_P(BipartiteRandomTest, LargerNets) {
4906 int nodes = GetParam().first;
4907 int iters = GetParam().second;
4908 MatchMatrix graph(nodes, nodes);
4909
4910 testing::internal::Int32 seed = GTEST_FLAG(random_seed);
4911 if (seed == 0) {
4912 seed = static_cast<testing::internal::Int32>(time(NULL));
4913 }
4914
4915 for (; iters > 0; --iters, ++seed) {
4916 srand(static_cast<int>(seed));
4917 graph.Randomize();
4918 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
4919 internal::FindMaxBipartiteMatching(graph).size())
4920 << " graph: " << graph.DebugString()
4921 << "\nTo reproduce the failure, rerun the test with the flag"
4922 " --" << GTEST_FLAG_PREFIX_ << "random_seed=" << seed;
4923 }
4924 }
4925
4926 // Test argument is a std::pair<int, int> representing (nodes, iters).
4927 INSTANTIATE_TEST_CASE_P(Samples, BipartiteRandomTest,
4928 testing::Values(
4929 std::make_pair(5, 10000),
4930 std::make_pair(6, 5000),
4931 std::make_pair(7, 2000),
4932 std::make_pair(8, 500),
4933 std::make_pair(9, 100)));
4934
4935 // Tests IsReadableTypeName().
4936
TEST(IsReadableTypeNameTest,ReturnsTrueForShortNames)4937 TEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) {
4938 EXPECT_TRUE(IsReadableTypeName("int"));
4939 EXPECT_TRUE(IsReadableTypeName("const unsigned char*"));
4940 EXPECT_TRUE(IsReadableTypeName("MyMap<int, void*>"));
4941 EXPECT_TRUE(IsReadableTypeName("void (*)(int, bool)"));
4942 }
4943
TEST(IsReadableTypeNameTest,ReturnsTrueForLongNonTemplateNonFunctionNames)4944 TEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) {
4945 EXPECT_TRUE(IsReadableTypeName("my_long_namespace::MyClassName"));
4946 EXPECT_TRUE(IsReadableTypeName("int [5][6][7][8][9][10][11]"));
4947 EXPECT_TRUE(IsReadableTypeName("my_namespace::MyOuterClass::MyInnerClass"));
4948 }
4949
TEST(IsReadableTypeNameTest,ReturnsFalseForLongTemplateNames)4950 TEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) {
4951 EXPECT_FALSE(
4952 IsReadableTypeName("basic_string<char, std::char_traits<char> >"));
4953 EXPECT_FALSE(IsReadableTypeName("std::vector<int, std::alloc_traits<int> >"));
4954 }
4955
TEST(IsReadableTypeNameTest,ReturnsFalseForLongFunctionTypeNames)4956 TEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) {
4957 EXPECT_FALSE(IsReadableTypeName("void (&)(int, bool, char, float)"));
4958 }
4959
4960 // Tests JoinAsTuple().
4961
TEST(JoinAsTupleTest,JoinsEmptyTuple)4962 TEST(JoinAsTupleTest, JoinsEmptyTuple) {
4963 EXPECT_EQ("", JoinAsTuple(Strings()));
4964 }
4965
TEST(JoinAsTupleTest,JoinsOneTuple)4966 TEST(JoinAsTupleTest, JoinsOneTuple) {
4967 const char* fields[] = { "1" };
4968 EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1)));
4969 }
4970
TEST(JoinAsTupleTest,JoinsTwoTuple)4971 TEST(JoinAsTupleTest, JoinsTwoTuple) {
4972 const char* fields[] = { "1", "a" };
4973 EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2)));
4974 }
4975
TEST(JoinAsTupleTest,JoinsTenTuple)4976 TEST(JoinAsTupleTest, JoinsTenTuple) {
4977 const char* fields[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
4978 EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)",
4979 JoinAsTuple(Strings(fields, fields + 10)));
4980 }
4981
4982 // Tests FormatMatcherDescription().
4983
TEST(FormatMatcherDescriptionTest,WorksForEmptyDescription)4984 TEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) {
4985 EXPECT_EQ("is even",
4986 FormatMatcherDescription(false, "IsEven", Strings()));
4987 EXPECT_EQ("not (is even)",
4988 FormatMatcherDescription(true, "IsEven", Strings()));
4989
4990 const char* params[] = { "5" };
4991 EXPECT_EQ("equals 5",
4992 FormatMatcherDescription(false, "Equals",
4993 Strings(params, params + 1)));
4994
4995 const char* params2[] = { "5", "8" };
4996 EXPECT_EQ("is in range (5, 8)",
4997 FormatMatcherDescription(false, "IsInRange",
4998 Strings(params2, params2 + 2)));
4999 }
5000
5001 // Tests PolymorphicMatcher::mutable_impl().
TEST(PolymorphicMatcherTest,CanAccessMutableImpl)5002 TEST(PolymorphicMatcherTest, CanAccessMutableImpl) {
5003 PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
5004 DivisibleByImpl& impl = m.mutable_impl();
5005 EXPECT_EQ(42, impl.divider());
5006
5007 impl.set_divider(0);
5008 EXPECT_EQ(0, m.mutable_impl().divider());
5009 }
5010
5011 // Tests PolymorphicMatcher::impl().
TEST(PolymorphicMatcherTest,CanAccessImpl)5012 TEST(PolymorphicMatcherTest, CanAccessImpl) {
5013 const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
5014 const DivisibleByImpl& impl = m.impl();
5015 EXPECT_EQ(42, impl.divider());
5016 }
5017
TEST(MatcherTupleTest,ExplainsMatchFailure)5018 TEST(MatcherTupleTest, ExplainsMatchFailure) {
5019 stringstream ss1;
5020 ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)),
5021 make_tuple('a', 10), &ss1);
5022 EXPECT_EQ("", ss1.str()); // Successful match.
5023
5024 stringstream ss2;
5025 ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5026 make_tuple(2, 'b'), &ss2);
5027 EXPECT_EQ(" Expected arg #0: is > 5\n"
5028 " Actual: 2, which is 3 less than 5\n"
5029 " Expected arg #1: is equal to 'a' (97, 0x61)\n"
5030 " Actual: 'b' (98, 0x62)\n",
5031 ss2.str()); // Failed match where both arguments need explanation.
5032
5033 stringstream ss3;
5034 ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5035 make_tuple(2, 'a'), &ss3);
5036 EXPECT_EQ(" Expected arg #0: is > 5\n"
5037 " Actual: 2, which is 3 less than 5\n",
5038 ss3.str()); // Failed match where only one argument needs
5039 // explanation.
5040 }
5041
5042 // Tests Each().
5043
TEST(EachTest,ExplainsMatchResultCorrectly)5044 TEST(EachTest, ExplainsMatchResultCorrectly) {
5045 set<int> a; // empty
5046
5047 Matcher<set<int> > m = Each(2);
5048 EXPECT_EQ("", Explain(m, a));
5049
5050 Matcher<const int(&)[1]> n = Each(1); // NOLINT
5051
5052 const int b[1] = { 1 };
5053 EXPECT_EQ("", Explain(n, b));
5054
5055 n = Each(3);
5056 EXPECT_EQ("whose element #0 doesn't match", Explain(n, b));
5057
5058 a.insert(1);
5059 a.insert(2);
5060 a.insert(3);
5061 m = Each(GreaterThan(0));
5062 EXPECT_EQ("", Explain(m, a));
5063
5064 m = Each(GreaterThan(10));
5065 EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10",
5066 Explain(m, a));
5067 }
5068
TEST(EachTest,DescribesItselfCorrectly)5069 TEST(EachTest, DescribesItselfCorrectly) {
5070 Matcher<vector<int> > m = Each(1);
5071 EXPECT_EQ("only contains elements that is equal to 1", Describe(m));
5072
5073 Matcher<vector<int> > m2 = Not(m);
5074 EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2));
5075 }
5076
TEST(EachTest,MatchesVectorWhenAllElementsMatch)5077 TEST(EachTest, MatchesVectorWhenAllElementsMatch) {
5078 vector<int> some_vector;
5079 EXPECT_THAT(some_vector, Each(1));
5080 some_vector.push_back(3);
5081 EXPECT_THAT(some_vector, Not(Each(1)));
5082 EXPECT_THAT(some_vector, Each(3));
5083 some_vector.push_back(1);
5084 some_vector.push_back(2);
5085 EXPECT_THAT(some_vector, Not(Each(3)));
5086 EXPECT_THAT(some_vector, Each(Lt(3.5)));
5087
5088 vector<string> another_vector;
5089 another_vector.push_back("fee");
5090 EXPECT_THAT(another_vector, Each(string("fee")));
5091 another_vector.push_back("fie");
5092 another_vector.push_back("foe");
5093 another_vector.push_back("fum");
5094 EXPECT_THAT(another_vector, Not(Each(string("fee"))));
5095 }
5096
TEST(EachTest,MatchesMapWhenAllElementsMatch)5097 TEST(EachTest, MatchesMapWhenAllElementsMatch) {
5098 map<const char*, int> my_map;
5099 const char* bar = "a string";
5100 my_map[bar] = 2;
5101 EXPECT_THAT(my_map, Each(make_pair(bar, 2)));
5102
5103 map<string, int> another_map;
5104 EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
5105 another_map["fee"] = 1;
5106 EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
5107 another_map["fie"] = 2;
5108 another_map["foe"] = 3;
5109 another_map["fum"] = 4;
5110 EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1))));
5111 EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1))));
5112 EXPECT_THAT(another_map, Each(Pair(_, Gt(0))));
5113 }
5114
TEST(EachTest,AcceptsMatcher)5115 TEST(EachTest, AcceptsMatcher) {
5116 const int a[] = { 1, 2, 3 };
5117 EXPECT_THAT(a, Each(Gt(0)));
5118 EXPECT_THAT(a, Not(Each(Gt(1))));
5119 }
5120
TEST(EachTest,WorksForNativeArrayAsTuple)5121 TEST(EachTest, WorksForNativeArrayAsTuple) {
5122 const int a[] = { 1, 2 };
5123 const int* const pointer = a;
5124 EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0)));
5125 EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1))));
5126 }
5127
5128 // For testing Pointwise().
5129 class IsHalfOfMatcher {
5130 public:
5131 template <typename T1, typename T2>
MatchAndExplain(const tuple<T1,T2> & a_pair,MatchResultListener * listener) const5132 bool MatchAndExplain(const tuple<T1, T2>& a_pair,
5133 MatchResultListener* listener) const {
5134 if (get<0>(a_pair) == get<1>(a_pair)/2) {
5135 *listener << "where the second is " << get<1>(a_pair);
5136 return true;
5137 } else {
5138 *listener << "where the second/2 is " << get<1>(a_pair)/2;
5139 return false;
5140 }
5141 }
5142
DescribeTo(ostream * os) const5143 void DescribeTo(ostream* os) const {
5144 *os << "are a pair where the first is half of the second";
5145 }
5146
DescribeNegationTo(ostream * os) const5147 void DescribeNegationTo(ostream* os) const {
5148 *os << "are a pair where the first isn't half of the second";
5149 }
5150 };
5151
IsHalfOf()5152 PolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() {
5153 return MakePolymorphicMatcher(IsHalfOfMatcher());
5154 }
5155
TEST(PointwiseTest,DescribesSelf)5156 TEST(PointwiseTest, DescribesSelf) {
5157 vector<int> rhs;
5158 rhs.push_back(1);
5159 rhs.push_back(2);
5160 rhs.push_back(3);
5161 const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs);
5162 EXPECT_EQ("contains 3 values, where each value and its corresponding value "
5163 "in { 1, 2, 3 } are a pair where the first is half of the second",
5164 Describe(m));
5165 EXPECT_EQ("doesn't contain exactly 3 values, or contains a value x at some "
5166 "index i where x and the i-th value of { 1, 2, 3 } are a pair "
5167 "where the first isn't half of the second",
5168 DescribeNegation(m));
5169 }
5170
TEST(PointwiseTest,MakesCopyOfRhs)5171 TEST(PointwiseTest, MakesCopyOfRhs) {
5172 list<signed char> rhs;
5173 rhs.push_back(2);
5174 rhs.push_back(4);
5175
5176 int lhs[] = { 1, 2 };
5177 const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs);
5178 EXPECT_THAT(lhs, m);
5179
5180 // Changing rhs now shouldn't affect m, which made a copy of rhs.
5181 rhs.push_back(6);
5182 EXPECT_THAT(lhs, m);
5183 }
5184
TEST(PointwiseTest,WorksForLhsNativeArray)5185 TEST(PointwiseTest, WorksForLhsNativeArray) {
5186 const int lhs[] = { 1, 2, 3 };
5187 vector<int> rhs;
5188 rhs.push_back(2);
5189 rhs.push_back(4);
5190 rhs.push_back(6);
5191 EXPECT_THAT(lhs, Pointwise(Lt(), rhs));
5192 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5193 }
5194
TEST(PointwiseTest,WorksForRhsNativeArray)5195 TEST(PointwiseTest, WorksForRhsNativeArray) {
5196 const int rhs[] = { 1, 2, 3 };
5197 vector<int> lhs;
5198 lhs.push_back(2);
5199 lhs.push_back(4);
5200 lhs.push_back(6);
5201 EXPECT_THAT(lhs, Pointwise(Gt(), rhs));
5202 EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs)));
5203 }
5204
TEST(PointwiseTest,RejectsWrongSize)5205 TEST(PointwiseTest, RejectsWrongSize) {
5206 const double lhs[2] = { 1, 2 };
5207 const int rhs[1] = { 0 };
5208 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5209 EXPECT_EQ("which contains 2 values",
5210 Explain(Pointwise(Gt(), rhs), lhs));
5211
5212 const int rhs2[3] = { 0, 1, 2 };
5213 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2)));
5214 }
5215
TEST(PointwiseTest,RejectsWrongContent)5216 TEST(PointwiseTest, RejectsWrongContent) {
5217 const double lhs[3] = { 1, 2, 3 };
5218 const int rhs[3] = { 2, 6, 4 };
5219 EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs)));
5220 EXPECT_EQ("where the value pair (2, 6) at index #1 don't match, "
5221 "where the second/2 is 3",
5222 Explain(Pointwise(IsHalfOf(), rhs), lhs));
5223 }
5224
TEST(PointwiseTest,AcceptsCorrectContent)5225 TEST(PointwiseTest, AcceptsCorrectContent) {
5226 const double lhs[3] = { 1, 2, 3 };
5227 const int rhs[3] = { 2, 4, 6 };
5228 EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs));
5229 EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs));
5230 }
5231
TEST(PointwiseTest,AllowsMonomorphicInnerMatcher)5232 TEST(PointwiseTest, AllowsMonomorphicInnerMatcher) {
5233 const double lhs[3] = { 1, 2, 3 };
5234 const int rhs[3] = { 2, 4, 6 };
5235 const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();
5236 EXPECT_THAT(lhs, Pointwise(m1, rhs));
5237 EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs));
5238
5239 // This type works as a tuple<const double&, const int&> can be
5240 // implicitly cast to tuple<double, int>.
5241 const Matcher<tuple<double, int> > m2 = IsHalfOf();
5242 EXPECT_THAT(lhs, Pointwise(m2, rhs));
5243 EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs));
5244 }
5245
5246 } // namespace gmock_matchers_test
5247 } // namespace testing
5248