• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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