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