blob: 494c85f40d6599b8bd2ed1a257cbbf536d7c4ce4 [file] [log] [blame]
shiqiane35fdd92008-12-10 05:08:54 +00001// 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
zhanyong.wan53e08c42010-09-14 05:38:21 +000036#include "gmock/gmock-matchers.h"
zhanyong.wan320814a2013-03-01 00:20:30 +000037#include "gmock/gmock-more-matchers.h"
shiqiane35fdd92008-12-10 05:08:54 +000038
39#include <string.h>
zhanyong.wanfb25d532013-07-28 08:24:00 +000040#include <time.h>
zhanyong.wana9a59e02013-03-27 16:14:55 +000041#include <deque>
shiqiane35fdd92008-12-10 05:08:54 +000042#include <functional>
zhanyong.wana862f1d2010-03-15 21:23:04 +000043#include <iostream>
zhanyong.wana9a59e02013-03-27 16:14:55 +000044#include <iterator>
zhanyong.wan616180e2013-06-18 18:49:51 +000045#include <limits>
zhanyong.wan6a896b52009-01-16 01:13:50 +000046#include <list>
47#include <map>
48#include <set>
shiqiane35fdd92008-12-10 05:08:54 +000049#include <sstream>
zhanyong.wan6a896b52009-01-16 01:13:50 +000050#include <string>
zhanyong.wanf5e1ce52009-09-16 07:02:02 +000051#include <utility>
zhanyong.wan6a896b52009-01-16 01:13:50 +000052#include <vector>
zhanyong.wan53e08c42010-09-14 05:38:21 +000053#include "gmock/gmock.h"
54#include "gtest/gtest.h"
55#include "gtest/gtest-spi.h"
shiqiane35fdd92008-12-10 05:08:54 +000056
kosak5b9cbbb2014-11-17 00:28:55 +000057#if GTEST_HAS_STD_FORWARD_LIST_
kosakb6a34882014-03-12 21:06:46 +000058# include <forward_list> // NOLINT
59#endif
60
shiqiane35fdd92008-12-10 05:08:54 +000061namespace testing {
zhanyong.wan4a5330d2009-02-19 00:36:44 +000062
63namespace internal {
vladlosev587c1b32011-05-20 00:42:22 +000064GTEST_API_ string JoinAsTuple(const Strings& fields);
zhanyong.wan4a5330d2009-02-19 00:36:44 +000065} // namespace internal
66
shiqiane35fdd92008-12-10 05:08:54 +000067namespace gmock_matchers_test {
68
zhanyong.wan898725c2011-09-16 16:45:39 +000069using std::greater;
70using std::less;
zhanyong.wanab5b77c2010-05-17 19:32:48 +000071using std::list;
zhanyong.wanb1c7f932010-03-24 17:35:11 +000072using std::make_pair;
zhanyong.wanb5937da2009-07-16 20:26:41 +000073using std::map;
74using std::multimap;
zhanyong.wanab5b77c2010-05-17 19:32:48 +000075using std::multiset;
76using std::ostream;
zhanyong.wanb1c7f932010-03-24 17:35:11 +000077using std::pair;
zhanyong.wan33605ba2010-04-22 23:37:47 +000078using std::set;
shiqiane35fdd92008-12-10 05:08:54 +000079using std::stringstream;
zhanyong.wan33605ba2010-04-22 23:37:47 +000080using std::vector;
shiqiane35fdd92008-12-10 05:08:54 +000081using testing::A;
zhanyong.wanbf550852009-06-09 06:09:53 +000082using testing::AllArgs;
shiqiane35fdd92008-12-10 05:08:54 +000083using testing::AllOf;
84using testing::An;
85using testing::AnyOf;
86using testing::ByRef;
zhanyong.wanb1c7f932010-03-24 17:35:11 +000087using testing::ContainsRegex;
shiqiane35fdd92008-12-10 05:08:54 +000088using testing::DoubleEq;
zhanyong.wan616180e2013-06-18 18:49:51 +000089using testing::DoubleNear;
shiqiane35fdd92008-12-10 05:08:54 +000090using testing::EndsWith;
91using testing::Eq;
zhanyong.wanb1c7f932010-03-24 17:35:11 +000092using testing::ExplainMatchResult;
shiqiane35fdd92008-12-10 05:08:54 +000093using testing::Field;
94using testing::FloatEq;
zhanyong.wan616180e2013-06-18 18:49:51 +000095using testing::FloatNear;
shiqiane35fdd92008-12-10 05:08:54 +000096using testing::Ge;
97using testing::Gt;
98using testing::HasSubstr;
zhanyong.wan320814a2013-03-01 00:20:30 +000099using testing::IsEmpty;
zhanyong.wan2d970ee2009-09-24 21:41:36 +0000100using testing::IsNull;
zhanyong.wanb5937da2009-07-16 20:26:41 +0000101using testing::Key;
shiqiane35fdd92008-12-10 05:08:54 +0000102using testing::Le;
103using testing::Lt;
104using testing::MakeMatcher;
105using testing::MakePolymorphicMatcher;
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000106using testing::MatchResultListener;
shiqiane35fdd92008-12-10 05:08:54 +0000107using testing::Matcher;
108using testing::MatcherCast;
109using testing::MatcherInterface;
110using testing::Matches;
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000111using testing::MatchesRegex;
shiqiane35fdd92008-12-10 05:08:54 +0000112using testing::NanSensitiveDoubleEq;
zhanyong.wan616180e2013-06-18 18:49:51 +0000113using testing::NanSensitiveDoubleNear;
shiqiane35fdd92008-12-10 05:08:54 +0000114using testing::NanSensitiveFloatEq;
zhanyong.wan616180e2013-06-18 18:49:51 +0000115using testing::NanSensitiveFloatNear;
shiqiane35fdd92008-12-10 05:08:54 +0000116using testing::Ne;
117using testing::Not;
118using testing::NotNull;
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000119using testing::Pair;
shiqiane35fdd92008-12-10 05:08:54 +0000120using testing::Pointee;
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000121using testing::Pointwise;
shiqiane35fdd92008-12-10 05:08:54 +0000122using testing::PolymorphicMatcher;
123using testing::Property;
124using testing::Ref;
125using testing::ResultOf;
zhanyong.wana31d9ce2013-03-01 01:50:17 +0000126using testing::SizeIs;
shiqiane35fdd92008-12-10 05:08:54 +0000127using testing::StartsWith;
128using testing::StrCaseEq;
129using testing::StrCaseNe;
130using testing::StrEq;
131using testing::StrNe;
kosak2336e9c2014-07-28 22:57:30 +0000132using testing::StringMatchResultListener;
shiqiane35fdd92008-12-10 05:08:54 +0000133using testing::Truly;
134using testing::TypedEq;
kosak2336e9c2014-07-28 22:57:30 +0000135using testing::UnorderedPointwise;
zhanyong.wanb8243162009-06-04 05:48:20 +0000136using testing::Value;
zhanyong.wan898725c2011-09-16 16:45:39 +0000137using testing::WhenSorted;
138using testing::WhenSortedBy;
shiqiane35fdd92008-12-10 05:08:54 +0000139using testing::_;
kosak2336e9c2014-07-28 22:57:30 +0000140using testing::get;
zhanyong.wana862f1d2010-03-15 21:23:04 +0000141using testing::internal::DummyMatchResultListener;
zhanyong.wanfb25d532013-07-28 08:24:00 +0000142using testing::internal::ElementMatcherPair;
143using testing::internal::ElementMatcherPairs;
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000144using testing::internal::ExplainMatchFailureTupleTo;
shiqiane35fdd92008-12-10 05:08:54 +0000145using testing::internal::FloatingEqMatcher;
zhanyong.wanb4140802010-06-08 22:53:57 +0000146using testing::internal::FormatMatcherDescription;
zhanyong.wan736baa82010-09-27 17:44:16 +0000147using testing::internal::IsReadableTypeName;
zhanyong.wan4a5330d2009-02-19 00:36:44 +0000148using testing::internal::JoinAsTuple;
zhanyong.wanfb25d532013-07-28 08:24:00 +0000149using testing::internal::MatchMatrix;
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000150using testing::internal::RE;
zhanyong.wana862f1d2010-03-15 21:23:04 +0000151using testing::internal::StreamMatchResultListener;
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000152using testing::internal::Strings;
vladlosev79b83502009-11-18 00:43:37 +0000153using testing::internal::linked_ptr;
vladloseve56daa72009-11-18 01:08:08 +0000154using testing::internal::scoped_ptr;
shiqiane35fdd92008-12-10 05:08:54 +0000155using testing::internal::string;
kosak2336e9c2014-07-28 22:57:30 +0000156using testing::make_tuple;
157using testing::tuple;
shiqiane35fdd92008-12-10 05:08:54 +0000158
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000159// For testing ExplainMatchResultTo().
160class GreaterThanMatcher : public MatcherInterface<int> {
161 public:
162 explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}
163
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000164 virtual void DescribeTo(ostream* os) const {
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000165 *os << "is > " << rhs_;
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000166 }
167
zhanyong.wandb22c222010-01-28 21:52:29 +0000168 virtual bool MatchAndExplain(int lhs,
169 MatchResultListener* listener) const {
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000170 const int diff = lhs - rhs_;
171 if (diff > 0) {
zhanyong.wan676e8cc2010-03-16 20:01:51 +0000172 *listener << "which is " << diff << " more than " << rhs_;
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000173 } else if (diff == 0) {
zhanyong.wan676e8cc2010-03-16 20:01:51 +0000174 *listener << "which is the same as " << rhs_;
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000175 } else {
zhanyong.wan676e8cc2010-03-16 20:01:51 +0000176 *listener << "which is " << -diff << " less than " << rhs_;
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000177 }
zhanyong.wandb22c222010-01-28 21:52:29 +0000178
179 return lhs > rhs_;
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000180 }
zhanyong.wan32de5f52009-12-23 00:13:23 +0000181
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000182 private:
zhanyong.wan32de5f52009-12-23 00:13:23 +0000183 int rhs_;
zhanyong.wanf5e1ce52009-09-16 07:02:02 +0000184};
185
186Matcher<int> GreaterThan(int n) {
187 return MakeMatcher(new GreaterThanMatcher(n));
188}
189
zhanyong.wan736baa82010-09-27 17:44:16 +0000190string OfType(const string& type_name) {
191#if GTEST_HAS_RTTI
192 return " (of type " + type_name + ")";
193#else
194 return "";
195#endif
196}
197
shiqiane35fdd92008-12-10 05:08:54 +0000198// Returns the description of the given matcher.
199template <typename T>
200string Describe(const Matcher<T>& m) {
201 stringstream ss;
202 m.DescribeTo(&ss);
203 return ss.str();
204}
205
206// Returns the description of the negation of the given matcher.
207template <typename T>
208string DescribeNegation(const Matcher<T>& m) {
209 stringstream ss;
210 m.DescribeNegationTo(&ss);
211 return ss.str();
212}
213
214// Returns the reason why x matches, or doesn't match, m.
215template <typename MatcherType, typename Value>
216string Explain(const MatcherType& m, const Value& x) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000217 StringMatchResultListener listener;
218 ExplainMatchResult(m, x, &listener);
219 return listener.str();
shiqiane35fdd92008-12-10 05:08:54 +0000220}
221
zhanyong.wana862f1d2010-03-15 21:23:04 +0000222TEST(MatchResultListenerTest, StreamingWorks) {
223 StringMatchResultListener listener;
224 listener << "hi" << 5;
225 EXPECT_EQ("hi5", listener.str());
226
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +0000227 listener.Clear();
228 EXPECT_EQ("", listener.str());
229
230 listener << 42;
231 EXPECT_EQ("42", listener.str());
232
zhanyong.wana862f1d2010-03-15 21:23:04 +0000233 // Streaming shouldn't crash when the underlying ostream is NULL.
234 DummyMatchResultListener dummy;
235 dummy << "hi" << 5;
236}
237
238TEST(MatchResultListenerTest, CanAccessUnderlyingStream) {
239 EXPECT_TRUE(DummyMatchResultListener().stream() == NULL);
240 EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL);
241
242 EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream());
243}
244
245TEST(MatchResultListenerTest, IsInterestedWorks) {
246 EXPECT_TRUE(StringMatchResultListener().IsInterested());
247 EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested());
248
249 EXPECT_FALSE(DummyMatchResultListener().IsInterested());
250 EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested());
251}
252
shiqiane35fdd92008-12-10 05:08:54 +0000253// Makes sure that the MatcherInterface<T> interface doesn't
254// change.
255class EvenMatcherImpl : public MatcherInterface<int> {
256 public:
zhanyong.wandb22c222010-01-28 21:52:29 +0000257 virtual bool MatchAndExplain(int x,
258 MatchResultListener* /* listener */) const {
259 return x % 2 == 0;
260 }
shiqiane35fdd92008-12-10 05:08:54 +0000261
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000262 virtual void DescribeTo(ostream* os) const {
shiqiane35fdd92008-12-10 05:08:54 +0000263 *os << "is an even number";
264 }
265
266 // We deliberately don't define DescribeNegationTo() and
267 // ExplainMatchResultTo() here, to make sure the definition of these
268 // two methods is optional.
269};
270
zhanyong.wana862f1d2010-03-15 21:23:04 +0000271// Makes sure that the MatcherInterface API doesn't change.
272TEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) {
shiqiane35fdd92008-12-10 05:08:54 +0000273 EvenMatcherImpl m;
274}
275
zhanyong.wan82113312010-01-08 21:55:40 +0000276// Tests implementing a monomorphic matcher using MatchAndExplain().
277
278class NewEvenMatcherImpl : public MatcherInterface<int> {
279 public:
280 virtual bool MatchAndExplain(int x, MatchResultListener* listener) const {
281 const bool match = x % 2 == 0;
282 // Verifies that we can stream to a listener directly.
283 *listener << "value % " << 2;
284 if (listener->stream() != NULL) {
285 // Verifies that we can stream to a listener's underlying stream
286 // too.
287 *listener->stream() << " == " << (x % 2);
288 }
289 return match;
290 }
291
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000292 virtual void DescribeTo(ostream* os) const {
zhanyong.wan82113312010-01-08 21:55:40 +0000293 *os << "is an even number";
294 }
295};
296
297TEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) {
298 Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl);
299 EXPECT_TRUE(m.Matches(2));
300 EXPECT_FALSE(m.Matches(3));
301 EXPECT_EQ("value % 2 == 0", Explain(m, 2));
302 EXPECT_EQ("value % 2 == 1", Explain(m, 3));
303}
304
shiqiane35fdd92008-12-10 05:08:54 +0000305// Tests default-constructing a matcher.
306TEST(MatcherTest, CanBeDefaultConstructed) {
307 Matcher<double> m;
308}
309
310// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*.
311TEST(MatcherTest, CanBeConstructedFromMatcherInterface) {
312 const MatcherInterface<int>* impl = new EvenMatcherImpl;
313 Matcher<int> m(impl);
314 EXPECT_TRUE(m.Matches(4));
315 EXPECT_FALSE(m.Matches(5));
316}
317
318// Tests that value can be used in place of Eq(value).
319TEST(MatcherTest, CanBeImplicitlyConstructedFromValue) {
320 Matcher<int> m1 = 5;
321 EXPECT_TRUE(m1.Matches(5));
322 EXPECT_FALSE(m1.Matches(6));
323}
324
325// Tests that NULL can be used in place of Eq(NULL).
326TEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) {
327 Matcher<int*> m1 = NULL;
328 EXPECT_TRUE(m1.Matches(NULL));
329 int n = 0;
330 EXPECT_FALSE(m1.Matches(&n));
331}
332
333// Tests that matchers are copyable.
334TEST(MatcherTest, IsCopyable) {
335 // Tests the copy constructor.
336 Matcher<bool> m1 = Eq(false);
337 EXPECT_TRUE(m1.Matches(false));
338 EXPECT_FALSE(m1.Matches(true));
339
340 // Tests the assignment operator.
341 m1 = Eq(true);
342 EXPECT_TRUE(m1.Matches(true));
343 EXPECT_FALSE(m1.Matches(false));
344}
345
346// Tests that Matcher<T>::DescribeTo() calls
347// MatcherInterface<T>::DescribeTo().
348TEST(MatcherTest, CanDescribeItself) {
349 EXPECT_EQ("is an even number",
350 Describe(Matcher<int>(new EvenMatcherImpl)));
351}
352
zhanyong.wan82113312010-01-08 21:55:40 +0000353// Tests Matcher<T>::MatchAndExplain().
354TEST(MatcherTest, MatchAndExplain) {
355 Matcher<int> m = GreaterThan(0);
zhanyong.wan34b034c2010-03-05 21:23:23 +0000356 StringMatchResultListener listener1;
zhanyong.wan82113312010-01-08 21:55:40 +0000357 EXPECT_TRUE(m.MatchAndExplain(42, &listener1));
zhanyong.wan676e8cc2010-03-16 20:01:51 +0000358 EXPECT_EQ("which is 42 more than 0", listener1.str());
zhanyong.wan82113312010-01-08 21:55:40 +0000359
zhanyong.wan34b034c2010-03-05 21:23:23 +0000360 StringMatchResultListener listener2;
zhanyong.wan82113312010-01-08 21:55:40 +0000361 EXPECT_FALSE(m.MatchAndExplain(-9, &listener2));
zhanyong.wan676e8cc2010-03-16 20:01:51 +0000362 EXPECT_EQ("which is 9 less than 0", listener2.str());
zhanyong.wan82113312010-01-08 21:55:40 +0000363}
364
shiqiane35fdd92008-12-10 05:08:54 +0000365// Tests that a C-string literal can be implicitly converted to a
366// Matcher<string> or Matcher<const string&>.
367TEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {
368 Matcher<string> m1 = "hi";
369 EXPECT_TRUE(m1.Matches("hi"));
370 EXPECT_FALSE(m1.Matches("hello"));
371
372 Matcher<const string&> m2 = "hi";
373 EXPECT_TRUE(m2.Matches("hi"));
374 EXPECT_FALSE(m2.Matches("hello"));
375}
376
377// Tests that a string object can be implicitly converted to a
378// Matcher<string> or Matcher<const string&>.
379TEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) {
380 Matcher<string> m1 = string("hi");
381 EXPECT_TRUE(m1.Matches("hi"));
382 EXPECT_FALSE(m1.Matches("hello"));
383
384 Matcher<const string&> m2 = string("hi");
385 EXPECT_TRUE(m2.Matches("hi"));
386 EXPECT_FALSE(m2.Matches("hello"));
387}
388
zhanyong.wan1f122a02013-03-25 16:27:03 +0000389#if GTEST_HAS_STRING_PIECE_
390// Tests that a C-string literal can be implicitly converted to a
391// Matcher<StringPiece> or Matcher<const StringPiece&>.
392TEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {
393 Matcher<StringPiece> m1 = "cats";
394 EXPECT_TRUE(m1.Matches("cats"));
395 EXPECT_FALSE(m1.Matches("dogs"));
396
397 Matcher<const StringPiece&> m2 = "cats";
398 EXPECT_TRUE(m2.Matches("cats"));
399 EXPECT_FALSE(m2.Matches("dogs"));
400}
401
402// Tests that a string object can be implicitly converted to a
403// Matcher<StringPiece> or Matcher<const StringPiece&>.
404TEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromString) {
405 Matcher<StringPiece> m1 = string("cats");
406 EXPECT_TRUE(m1.Matches("cats"));
407 EXPECT_FALSE(m1.Matches("dogs"));
408
409 Matcher<const StringPiece&> m2 = string("cats");
410 EXPECT_TRUE(m2.Matches("cats"));
411 EXPECT_FALSE(m2.Matches("dogs"));
412}
413
414// Tests that a StringPiece object can be implicitly converted to a
415// Matcher<StringPiece> or Matcher<const StringPiece&>.
416TEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromStringPiece) {
417 Matcher<StringPiece> m1 = StringPiece("cats");
418 EXPECT_TRUE(m1.Matches("cats"));
419 EXPECT_FALSE(m1.Matches("dogs"));
420
421 Matcher<const StringPiece&> m2 = StringPiece("cats");
422 EXPECT_TRUE(m2.Matches("cats"));
423 EXPECT_FALSE(m2.Matches("dogs"));
424}
425#endif // GTEST_HAS_STRING_PIECE_
426
shiqiane35fdd92008-12-10 05:08:54 +0000427// Tests that MakeMatcher() constructs a Matcher<T> from a
428// MatcherInterface* without requiring the user to explicitly
429// write the type.
430TEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) {
431 const MatcherInterface<int>* dummy_impl = NULL;
432 Matcher<int> m = MakeMatcher(dummy_impl);
433}
434
zhanyong.wan82113312010-01-08 21:55:40 +0000435// Tests that MakePolymorphicMatcher() can construct a polymorphic
436// matcher from its implementation using the old API.
zhanyong.wan33605ba2010-04-22 23:37:47 +0000437const int g_bar = 1;
shiqiane35fdd92008-12-10 05:08:54 +0000438class ReferencesBarOrIsZeroImpl {
439 public:
440 template <typename T>
zhanyong.wandb22c222010-01-28 21:52:29 +0000441 bool MatchAndExplain(const T& x,
442 MatchResultListener* /* listener */) const {
shiqiane35fdd92008-12-10 05:08:54 +0000443 const void* p = &x;
zhanyong.wan33605ba2010-04-22 23:37:47 +0000444 return p == &g_bar || x == 0;
shiqiane35fdd92008-12-10 05:08:54 +0000445 }
446
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000447 void DescribeTo(ostream* os) const { *os << "g_bar or zero"; }
shiqiane35fdd92008-12-10 05:08:54 +0000448
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000449 void DescribeNegationTo(ostream* os) const {
zhanyong.wan33605ba2010-04-22 23:37:47 +0000450 *os << "doesn't reference g_bar and is not zero";
shiqiane35fdd92008-12-10 05:08:54 +0000451 }
452};
453
454// This function verifies that MakePolymorphicMatcher() returns a
455// PolymorphicMatcher<T> where T is the argument's type.
456PolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() {
457 return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl());
458}
459
zhanyong.wan82113312010-01-08 21:55:40 +0000460TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) {
shiqiane35fdd92008-12-10 05:08:54 +0000461 // Using a polymorphic matcher to match a reference type.
462 Matcher<const int&> m1 = ReferencesBarOrIsZero();
463 EXPECT_TRUE(m1.Matches(0));
464 // Verifies that the identity of a by-reference argument is preserved.
zhanyong.wan33605ba2010-04-22 23:37:47 +0000465 EXPECT_TRUE(m1.Matches(g_bar));
shiqiane35fdd92008-12-10 05:08:54 +0000466 EXPECT_FALSE(m1.Matches(1));
zhanyong.wan33605ba2010-04-22 23:37:47 +0000467 EXPECT_EQ("g_bar or zero", Describe(m1));
shiqiane35fdd92008-12-10 05:08:54 +0000468
469 // Using a polymorphic matcher to match a value type.
470 Matcher<double> m2 = ReferencesBarOrIsZero();
471 EXPECT_TRUE(m2.Matches(0.0));
472 EXPECT_FALSE(m2.Matches(0.1));
zhanyong.wan33605ba2010-04-22 23:37:47 +0000473 EXPECT_EQ("g_bar or zero", Describe(m2));
shiqiane35fdd92008-12-10 05:08:54 +0000474}
475
zhanyong.wan82113312010-01-08 21:55:40 +0000476// Tests implementing a polymorphic matcher using MatchAndExplain().
477
478class PolymorphicIsEvenImpl {
479 public:
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000480 void DescribeTo(ostream* os) const { *os << "is even"; }
zhanyong.wan82113312010-01-08 21:55:40 +0000481
zhanyong.wanab5b77c2010-05-17 19:32:48 +0000482 void DescribeNegationTo(ostream* os) const {
zhanyong.wan82113312010-01-08 21:55:40 +0000483 *os << "is odd";
484 }
zhanyong.wan82113312010-01-08 21:55:40 +0000485
zhanyong.wandb22c222010-01-28 21:52:29 +0000486 template <typename T>
487 bool MatchAndExplain(const T& x, MatchResultListener* listener) const {
488 // Verifies that we can stream to the listener directly.
489 *listener << "% " << 2;
490 if (listener->stream() != NULL) {
491 // Verifies that we can stream to the listener's underlying stream
492 // too.
493 *listener->stream() << " == " << (x % 2);
494 }
495 return (x % 2) == 0;
zhanyong.wan82113312010-01-08 21:55:40 +0000496 }
zhanyong.wandb22c222010-01-28 21:52:29 +0000497};
zhanyong.wan82113312010-01-08 21:55:40 +0000498
499PolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() {
500 return MakePolymorphicMatcher(PolymorphicIsEvenImpl());
501}
502
503TEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) {
504 // Using PolymorphicIsEven() as a Matcher<int>.
505 const Matcher<int> m1 = PolymorphicIsEven();
506 EXPECT_TRUE(m1.Matches(42));
507 EXPECT_FALSE(m1.Matches(43));
508 EXPECT_EQ("is even", Describe(m1));
509
510 const Matcher<int> not_m1 = Not(m1);
511 EXPECT_EQ("is odd", Describe(not_m1));
512
513 EXPECT_EQ("% 2 == 0", Explain(m1, 42));
514
515 // Using PolymorphicIsEven() as a Matcher<char>.
516 const Matcher<char> m2 = PolymorphicIsEven();
517 EXPECT_TRUE(m2.Matches('\x42'));
518 EXPECT_FALSE(m2.Matches('\x43'));
519 EXPECT_EQ("is even", Describe(m2));
520
521 const Matcher<char> not_m2 = Not(m2);
522 EXPECT_EQ("is odd", Describe(not_m2));
523
524 EXPECT_EQ("% 2 == 0", Explain(m2, '\x42'));
525}
526
shiqiane35fdd92008-12-10 05:08:54 +0000527// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher.
528TEST(MatcherCastTest, FromPolymorphicMatcher) {
529 Matcher<int> m = MatcherCast<int>(Eq(5));
530 EXPECT_TRUE(m.Matches(5));
531 EXPECT_FALSE(m.Matches(6));
532}
533
534// For testing casting matchers between compatible types.
535class IntValue {
536 public:
537 // An int can be statically (although not implicitly) cast to a
538 // IntValue.
zhanyong.wan32de5f52009-12-23 00:13:23 +0000539 explicit IntValue(int a_value) : value_(a_value) {}
shiqiane35fdd92008-12-10 05:08:54 +0000540
541 int value() const { return value_; }
542 private:
543 int value_;
544};
545
546// For testing casting matchers between compatible types.
547bool IsPositiveIntValue(const IntValue& foo) {
548 return foo.value() > 0;
549}
550
551// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T
552// can be statically converted to U.
553TEST(MatcherCastTest, FromCompatibleType) {
554 Matcher<double> m1 = Eq(2.0);
555 Matcher<int> m2 = MatcherCast<int>(m1);
556 EXPECT_TRUE(m2.Matches(2));
557 EXPECT_FALSE(m2.Matches(3));
558
559 Matcher<IntValue> m3 = Truly(IsPositiveIntValue);
560 Matcher<int> m4 = MatcherCast<int>(m3);
561 // In the following, the arguments 1 and 0 are statically converted
562 // to IntValue objects, and then tested by the IsPositiveIntValue()
563 // predicate.
564 EXPECT_TRUE(m4.Matches(1));
565 EXPECT_FALSE(m4.Matches(0));
566}
567
568// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>.
569TEST(MatcherCastTest, FromConstReferenceToNonReference) {
570 Matcher<const int&> m1 = Eq(0);
571 Matcher<int> m2 = MatcherCast<int>(m1);
572 EXPECT_TRUE(m2.Matches(0));
573 EXPECT_FALSE(m2.Matches(1));
574}
575
576// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>.
577TEST(MatcherCastTest, FromReferenceToNonReference) {
578 Matcher<int&> m1 = Eq(0);
579 Matcher<int> m2 = MatcherCast<int>(m1);
580 EXPECT_TRUE(m2.Matches(0));
581 EXPECT_FALSE(m2.Matches(1));
582}
583
584// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
585TEST(MatcherCastTest, FromNonReferenceToConstReference) {
586 Matcher<int> m1 = Eq(0);
587 Matcher<const int&> m2 = MatcherCast<const int&>(m1);
588 EXPECT_TRUE(m2.Matches(0));
589 EXPECT_FALSE(m2.Matches(1));
590}
591
592// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>.
593TEST(MatcherCastTest, FromNonReferenceToReference) {
594 Matcher<int> m1 = Eq(0);
595 Matcher<int&> m2 = MatcherCast<int&>(m1);
596 int n = 0;
597 EXPECT_TRUE(m2.Matches(n));
598 n = 1;
599 EXPECT_FALSE(m2.Matches(n));
600}
601
602// Tests that MatcherCast<T>(m) works when m is a Matcher<T>.
603TEST(MatcherCastTest, FromSameType) {
604 Matcher<int> m1 = Eq(0);
605 Matcher<int> m2 = MatcherCast<int>(m1);
606 EXPECT_TRUE(m2.Matches(0));
607 EXPECT_FALSE(m2.Matches(1));
608}
609
kosak506340a2014-11-17 01:47:54 +0000610// Implicitly convertible from any type.
jgm79a367e2012-04-10 16:02:11 +0000611struct ConvertibleFromAny {
612 ConvertibleFromAny(int a_value) : value(a_value) {}
613 template <typename T>
kosak506340a2014-11-17 01:47:54 +0000614 ConvertibleFromAny(const T& /*a_value*/) : value(-1) {
jgm79a367e2012-04-10 16:02:11 +0000615 ADD_FAILURE() << "Conversion constructor called";
616 }
617 int value;
618};
619
620bool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) {
621 return a.value == b.value;
622}
623
624ostream& operator<<(ostream& os, const ConvertibleFromAny& a) {
625 return os << a.value;
626}
627
628TEST(MatcherCastTest, ConversionConstructorIsUsed) {
629 Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1);
630 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
631 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
632}
633
634TEST(MatcherCastTest, FromConvertibleFromAny) {
635 Matcher<ConvertibleFromAny> m =
636 MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
637 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
638 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
639}
640
kosak5f2a6ca2013-12-03 01:43:07 +0000641struct IntReferenceWrapper {
642 IntReferenceWrapper(const int& a_value) : value(&a_value) {}
643 const int* value;
644};
645
646bool operator==(const IntReferenceWrapper& a, const IntReferenceWrapper& b) {
647 return a.value == b.value;
648}
649
650TEST(MatcherCastTest, ValueIsNotCopied) {
651 int n = 42;
652 Matcher<IntReferenceWrapper> m = MatcherCast<IntReferenceWrapper>(n);
653 // Verify that the matcher holds a reference to n, not to its temporary copy.
654 EXPECT_TRUE(m.Matches(n));
655}
656
billydonahue1f5fdea2014-05-19 17:54:51 +0000657class Base {
658 public:
659 virtual ~Base() {}
660 Base() {}
661 private:
662 GTEST_DISALLOW_COPY_AND_ASSIGN_(Base);
663};
664
665class Derived : public Base {
666 public:
667 Derived() : Base() {}
668 int i;
669};
670
671class OtherDerived : public Base {};
zhanyong.wan18490652009-05-11 18:54:08 +0000672
673// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher.
674TEST(SafeMatcherCastTest, FromPolymorphicMatcher) {
675 Matcher<char> m2 = SafeMatcherCast<char>(Eq(32));
676 EXPECT_TRUE(m2.Matches(' '));
677 EXPECT_FALSE(m2.Matches('\n'));
678}
679
zhanyong.wan16cf4732009-05-14 20:55:30 +0000680// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where
681// T and U are arithmetic types and T can be losslessly converted to
682// U.
683TEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) {
zhanyong.wan18490652009-05-11 18:54:08 +0000684 Matcher<double> m1 = DoubleEq(1.0);
zhanyong.wan16cf4732009-05-14 20:55:30 +0000685 Matcher<float> m2 = SafeMatcherCast<float>(m1);
686 EXPECT_TRUE(m2.Matches(1.0f));
687 EXPECT_FALSE(m2.Matches(2.0f));
688
689 Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a'));
690 EXPECT_TRUE(m3.Matches('a'));
691 EXPECT_FALSE(m3.Matches('b'));
zhanyong.wan18490652009-05-11 18:54:08 +0000692}
693
694// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U
695// are pointers or references to a derived and a base class, correspondingly.
696TEST(SafeMatcherCastTest, FromBaseClass) {
697 Derived d, d2;
698 Matcher<Base*> m1 = Eq(&d);
699 Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1);
700 EXPECT_TRUE(m2.Matches(&d));
701 EXPECT_FALSE(m2.Matches(&d2));
702
703 Matcher<Base&> m3 = Ref(d);
704 Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3);
705 EXPECT_TRUE(m4.Matches(d));
706 EXPECT_FALSE(m4.Matches(d2));
707}
708
709// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>.
710TEST(SafeMatcherCastTest, FromConstReferenceToReference) {
711 int n = 0;
712 Matcher<const int&> m1 = Ref(n);
713 Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
714 int n1 = 0;
715 EXPECT_TRUE(m2.Matches(n));
716 EXPECT_FALSE(m2.Matches(n1));
717}
718
719// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
720TEST(SafeMatcherCastTest, FromNonReferenceToConstReference) {
721 Matcher<int> m1 = Eq(0);
722 Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1);
723 EXPECT_TRUE(m2.Matches(0));
724 EXPECT_FALSE(m2.Matches(1));
725}
726
727// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>.
728TEST(SafeMatcherCastTest, FromNonReferenceToReference) {
729 Matcher<int> m1 = Eq(0);
730 Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
731 int n = 0;
732 EXPECT_TRUE(m2.Matches(n));
733 n = 1;
734 EXPECT_FALSE(m2.Matches(n));
735}
736
737// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>.
738TEST(SafeMatcherCastTest, FromSameType) {
739 Matcher<int> m1 = Eq(0);
740 Matcher<int> m2 = SafeMatcherCast<int>(m1);
741 EXPECT_TRUE(m2.Matches(0));
742 EXPECT_FALSE(m2.Matches(1));
743}
744
jgm79a367e2012-04-10 16:02:11 +0000745TEST(SafeMatcherCastTest, ConversionConstructorIsUsed) {
746 Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1);
747 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
748 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
749}
750
751TEST(SafeMatcherCastTest, FromConvertibleFromAny) {
752 Matcher<ConvertibleFromAny> m =
753 SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
754 EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
755 EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
756}
757
kosak5f2a6ca2013-12-03 01:43:07 +0000758TEST(SafeMatcherCastTest, ValueIsNotCopied) {
759 int n = 42;
760 Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n);
761 // Verify that the matcher holds a reference to n, not to its temporary copy.
762 EXPECT_TRUE(m.Matches(n));
763}
764
shiqiane35fdd92008-12-10 05:08:54 +0000765// Tests that A<T>() matches any value of type T.
766TEST(ATest, MatchesAnyValue) {
767 // Tests a matcher for a value type.
768 Matcher<double> m1 = A<double>();
769 EXPECT_TRUE(m1.Matches(91.43));
770 EXPECT_TRUE(m1.Matches(-15.32));
771
772 // Tests a matcher for a reference type.
773 int a = 2;
774 int b = -6;
775 Matcher<int&> m2 = A<int&>();
776 EXPECT_TRUE(m2.Matches(a));
777 EXPECT_TRUE(m2.Matches(b));
778}
779
zhanyong.wanf4274522013-04-24 02:49:43 +0000780TEST(ATest, WorksForDerivedClass) {
781 Base base;
782 Derived derived;
783 EXPECT_THAT(&base, A<Base*>());
784 // This shouldn't compile: EXPECT_THAT(&base, A<Derived*>());
785 EXPECT_THAT(&derived, A<Base*>());
786 EXPECT_THAT(&derived, A<Derived*>());
787}
788
shiqiane35fdd92008-12-10 05:08:54 +0000789// Tests that A<T>() describes itself properly.
790TEST(ATest, CanDescribeSelf) {
791 EXPECT_EQ("is anything", Describe(A<bool>()));
792}
793
794// Tests that An<T>() matches any value of type T.
795TEST(AnTest, MatchesAnyValue) {
796 // Tests a matcher for a value type.
797 Matcher<int> m1 = An<int>();
798 EXPECT_TRUE(m1.Matches(9143));
799 EXPECT_TRUE(m1.Matches(-1532));
800
801 // Tests a matcher for a reference type.
802 int a = 2;
803 int b = -6;
804 Matcher<int&> m2 = An<int&>();
805 EXPECT_TRUE(m2.Matches(a));
806 EXPECT_TRUE(m2.Matches(b));
807}
808
809// Tests that An<T>() describes itself properly.
810TEST(AnTest, CanDescribeSelf) {
811 EXPECT_EQ("is anything", Describe(An<int>()));
812}
813
814// Tests that _ can be used as a matcher for any type and matches any
815// value of that type.
816TEST(UnderscoreTest, MatchesAnyValue) {
817 // Uses _ as a matcher for a value type.
818 Matcher<int> m1 = _;
819 EXPECT_TRUE(m1.Matches(123));
820 EXPECT_TRUE(m1.Matches(-242));
821
822 // Uses _ as a matcher for a reference type.
823 bool a = false;
824 const bool b = true;
825 Matcher<const bool&> m2 = _;
826 EXPECT_TRUE(m2.Matches(a));
827 EXPECT_TRUE(m2.Matches(b));
828}
829
830// Tests that _ describes itself properly.
831TEST(UnderscoreTest, CanDescribeSelf) {
832 Matcher<int> m = _;
833 EXPECT_EQ("is anything", Describe(m));
834}
835
836// Tests that Eq(x) matches any value equal to x.
837TEST(EqTest, MatchesEqualValue) {
838 // 2 C-strings with same content but different addresses.
839 const char a1[] = "hi";
840 const char a2[] = "hi";
841
842 Matcher<const char*> m1 = Eq(a1);
843 EXPECT_TRUE(m1.Matches(a1));
844 EXPECT_FALSE(m1.Matches(a2));
845}
846
847// Tests that Eq(v) describes itself properly.
848
849class Unprintable {
850 public:
851 Unprintable() : c_('a') {}
852
zhanyong.wan32de5f52009-12-23 00:13:23 +0000853 bool operator==(const Unprintable& /* rhs */) { return true; }
shiqiane35fdd92008-12-10 05:08:54 +0000854 private:
855 char c_;
856};
857
858TEST(EqTest, CanDescribeSelf) {
859 Matcher<Unprintable> m = Eq(Unprintable());
860 EXPECT_EQ("is equal to 1-byte object <61>", Describe(m));
861}
862
863// Tests that Eq(v) can be used to match any type that supports
864// comparing with type T, where T is v's type.
865TEST(EqTest, IsPolymorphic) {
866 Matcher<int> m1 = Eq(1);
867 EXPECT_TRUE(m1.Matches(1));
868 EXPECT_FALSE(m1.Matches(2));
869
870 Matcher<char> m2 = Eq(1);
871 EXPECT_TRUE(m2.Matches('\1'));
872 EXPECT_FALSE(m2.Matches('a'));
873}
874
875// Tests that TypedEq<T>(v) matches values of type T that's equal to v.
876TEST(TypedEqTest, ChecksEqualityForGivenType) {
877 Matcher<char> m1 = TypedEq<char>('a');
878 EXPECT_TRUE(m1.Matches('a'));
879 EXPECT_FALSE(m1.Matches('b'));
880
881 Matcher<int> m2 = TypedEq<int>(6);
882 EXPECT_TRUE(m2.Matches(6));
883 EXPECT_FALSE(m2.Matches(7));
884}
885
886// Tests that TypedEq(v) describes itself properly.
887TEST(TypedEqTest, CanDescribeSelf) {
888 EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2)));
889}
890
891// Tests that TypedEq<T>(v) has type Matcher<T>.
892
893// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T
894// is a "bare" type (i.e. not in the form of const U or U&). If v's
895// type is not T, the compiler will generate a message about
896// "undefined referece".
897template <typename T>
898struct Type {
zhanyong.wan32de5f52009-12-23 00:13:23 +0000899 static bool IsTypeOf(const T& /* v */) { return true; }
shiqiane35fdd92008-12-10 05:08:54 +0000900
901 template <typename T2>
902 static void IsTypeOf(T2 v);
903};
904
905TEST(TypedEqTest, HasSpecifiedType) {
906 // Verfies that the type of TypedEq<T>(v) is Matcher<T>.
907 Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5));
908 Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5));
909}
910
911// Tests that Ge(v) matches anything >= v.
912TEST(GeTest, ImplementsGreaterThanOrEqual) {
913 Matcher<int> m1 = Ge(0);
914 EXPECT_TRUE(m1.Matches(1));
915 EXPECT_TRUE(m1.Matches(0));
916 EXPECT_FALSE(m1.Matches(-1));
917}
918
919// Tests that Ge(v) describes itself properly.
920TEST(GeTest, CanDescribeSelf) {
921 Matcher<int> m = Ge(5);
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000922 EXPECT_EQ("is >= 5", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +0000923}
924
925// Tests that Gt(v) matches anything > v.
926TEST(GtTest, ImplementsGreaterThan) {
927 Matcher<double> m1 = Gt(0);
928 EXPECT_TRUE(m1.Matches(1.0));
929 EXPECT_FALSE(m1.Matches(0.0));
930 EXPECT_FALSE(m1.Matches(-1.0));
931}
932
933// Tests that Gt(v) describes itself properly.
934TEST(GtTest, CanDescribeSelf) {
935 Matcher<int> m = Gt(5);
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000936 EXPECT_EQ("is > 5", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +0000937}
938
939// Tests that Le(v) matches anything <= v.
940TEST(LeTest, ImplementsLessThanOrEqual) {
941 Matcher<char> m1 = Le('b');
942 EXPECT_TRUE(m1.Matches('a'));
943 EXPECT_TRUE(m1.Matches('b'));
944 EXPECT_FALSE(m1.Matches('c'));
945}
946
947// Tests that Le(v) describes itself properly.
948TEST(LeTest, CanDescribeSelf) {
949 Matcher<int> m = Le(5);
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000950 EXPECT_EQ("is <= 5", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +0000951}
952
953// Tests that Lt(v) matches anything < v.
954TEST(LtTest, ImplementsLessThan) {
955 Matcher<const string&> m1 = Lt("Hello");
956 EXPECT_TRUE(m1.Matches("Abc"));
957 EXPECT_FALSE(m1.Matches("Hello"));
958 EXPECT_FALSE(m1.Matches("Hello, world!"));
959}
960
961// Tests that Lt(v) describes itself properly.
962TEST(LtTest, CanDescribeSelf) {
963 Matcher<int> m = Lt(5);
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000964 EXPECT_EQ("is < 5", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +0000965}
966
967// Tests that Ne(v) matches anything != v.
968TEST(NeTest, ImplementsNotEqual) {
969 Matcher<int> m1 = Ne(0);
970 EXPECT_TRUE(m1.Matches(1));
971 EXPECT_TRUE(m1.Matches(-1));
972 EXPECT_FALSE(m1.Matches(0));
973}
974
975// Tests that Ne(v) describes itself properly.
976TEST(NeTest, CanDescribeSelf) {
977 Matcher<int> m = Ne(5);
zhanyong.wanb1c7f932010-03-24 17:35:11 +0000978 EXPECT_EQ("isn't equal to 5", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +0000979}
980
zhanyong.wan2d970ee2009-09-24 21:41:36 +0000981// Tests that IsNull() matches any NULL pointer of any type.
982TEST(IsNullTest, MatchesNullPointer) {
983 Matcher<int*> m1 = IsNull();
984 int* p1 = NULL;
985 int n = 0;
986 EXPECT_TRUE(m1.Matches(p1));
987 EXPECT_FALSE(m1.Matches(&n));
988
989 Matcher<const char*> m2 = IsNull();
990 const char* p2 = NULL;
991 EXPECT_TRUE(m2.Matches(p2));
992 EXPECT_FALSE(m2.Matches("hi"));
993
zhanyong.wan95b12332009-09-25 18:55:50 +0000994#if !GTEST_OS_SYMBIAN
995 // Nokia's Symbian compiler generates:
996 // gmock-matchers.h: ambiguous access to overloaded function
997 // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)'
998 // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing::
999 // MatcherInterface<void *> *)'
1000 // gmock-matchers.h: (point of instantiation: 'testing::
1001 // gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()')
1002 // gmock-matchers.h: (instantiating: 'testing::PolymorphicMatc
zhanyong.wan2d970ee2009-09-24 21:41:36 +00001003 Matcher<void*> m3 = IsNull();
1004 void* p3 = NULL;
1005 EXPECT_TRUE(m3.Matches(p3));
1006 EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef)));
zhanyong.wan95b12332009-09-25 18:55:50 +00001007#endif
zhanyong.wan2d970ee2009-09-24 21:41:36 +00001008}
1009
vladlosev79b83502009-11-18 00:43:37 +00001010TEST(IsNullTest, LinkedPtr) {
1011 const Matcher<linked_ptr<int> > m = IsNull();
1012 const linked_ptr<int> null_p;
1013 const linked_ptr<int> non_null_p(new int);
1014
1015 EXPECT_TRUE(m.Matches(null_p));
1016 EXPECT_FALSE(m.Matches(non_null_p));
1017}
1018
1019TEST(IsNullTest, ReferenceToConstLinkedPtr) {
1020 const Matcher<const linked_ptr<double>&> m = IsNull();
1021 const linked_ptr<double> null_p;
1022 const linked_ptr<double> non_null_p(new double);
1023
1024 EXPECT_TRUE(m.Matches(null_p));
1025 EXPECT_FALSE(m.Matches(non_null_p));
1026}
1027
kosak6305ff52015-04-28 22:36:31 +00001028#if GTEST_LANG_CXX11
1029TEST(IsNullTest, StdFunction) {
1030 const Matcher<std::function<void()>> m = IsNull();
1031
1032 EXPECT_TRUE(m.Matches(std::function<void()>()));
1033 EXPECT_FALSE(m.Matches([]{}));
1034}
1035#endif // GTEST_LANG_CXX11
1036
vladloseve56daa72009-11-18 01:08:08 +00001037TEST(IsNullTest, ReferenceToConstScopedPtr) {
1038 const Matcher<const scoped_ptr<double>&> m = IsNull();
1039 const scoped_ptr<double> null_p;
1040 const scoped_ptr<double> non_null_p(new double);
1041
1042 EXPECT_TRUE(m.Matches(null_p));
1043 EXPECT_FALSE(m.Matches(non_null_p));
1044}
1045
zhanyong.wan2d970ee2009-09-24 21:41:36 +00001046// Tests that IsNull() describes itself properly.
1047TEST(IsNullTest, CanDescribeSelf) {
1048 Matcher<int*> m = IsNull();
1049 EXPECT_EQ("is NULL", Describe(m));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001050 EXPECT_EQ("isn't NULL", DescribeNegation(m));
zhanyong.wan2d970ee2009-09-24 21:41:36 +00001051}
1052
shiqiane35fdd92008-12-10 05:08:54 +00001053// Tests that NotNull() matches any non-NULL pointer of any type.
1054TEST(NotNullTest, MatchesNonNullPointer) {
1055 Matcher<int*> m1 = NotNull();
1056 int* p1 = NULL;
1057 int n = 0;
1058 EXPECT_FALSE(m1.Matches(p1));
1059 EXPECT_TRUE(m1.Matches(&n));
1060
1061 Matcher<const char*> m2 = NotNull();
1062 const char* p2 = NULL;
1063 EXPECT_FALSE(m2.Matches(p2));
1064 EXPECT_TRUE(m2.Matches("hi"));
1065}
1066
vladlosev79b83502009-11-18 00:43:37 +00001067TEST(NotNullTest, LinkedPtr) {
1068 const Matcher<linked_ptr<int> > m = NotNull();
1069 const linked_ptr<int> null_p;
1070 const linked_ptr<int> non_null_p(new int);
1071
1072 EXPECT_FALSE(m.Matches(null_p));
1073 EXPECT_TRUE(m.Matches(non_null_p));
1074}
1075
1076TEST(NotNullTest, ReferenceToConstLinkedPtr) {
1077 const Matcher<const linked_ptr<double>&> m = NotNull();
1078 const linked_ptr<double> null_p;
1079 const linked_ptr<double> non_null_p(new double);
1080
1081 EXPECT_FALSE(m.Matches(null_p));
1082 EXPECT_TRUE(m.Matches(non_null_p));
1083}
1084
kosak6305ff52015-04-28 22:36:31 +00001085#if GTEST_LANG_CXX11
1086TEST(NotNullTest, StdFunction) {
1087 const Matcher<std::function<void()>> m = NotNull();
1088
1089 EXPECT_TRUE(m.Matches([]{}));
1090 EXPECT_FALSE(m.Matches(std::function<void()>()));
1091}
1092#endif // GTEST_LANG_CXX11
1093
vladloseve56daa72009-11-18 01:08:08 +00001094TEST(NotNullTest, ReferenceToConstScopedPtr) {
1095 const Matcher<const scoped_ptr<double>&> m = NotNull();
1096 const scoped_ptr<double> null_p;
1097 const scoped_ptr<double> non_null_p(new double);
1098
1099 EXPECT_FALSE(m.Matches(null_p));
1100 EXPECT_TRUE(m.Matches(non_null_p));
1101}
1102
shiqiane35fdd92008-12-10 05:08:54 +00001103// Tests that NotNull() describes itself properly.
1104TEST(NotNullTest, CanDescribeSelf) {
1105 Matcher<int*> m = NotNull();
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001106 EXPECT_EQ("isn't NULL", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001107}
1108
1109// Tests that Ref(variable) matches an argument that references
1110// 'variable'.
1111TEST(RefTest, MatchesSameVariable) {
1112 int a = 0;
1113 int b = 0;
1114 Matcher<int&> m = Ref(a);
1115 EXPECT_TRUE(m.Matches(a));
1116 EXPECT_FALSE(m.Matches(b));
1117}
1118
1119// Tests that Ref(variable) describes itself properly.
1120TEST(RefTest, CanDescribeSelf) {
1121 int n = 5;
1122 Matcher<int&> m = Ref(n);
1123 stringstream ss;
1124 ss << "references the variable @" << &n << " 5";
1125 EXPECT_EQ(string(ss.str()), Describe(m));
1126}
1127
1128// Test that Ref(non_const_varialbe) can be used as a matcher for a
1129// const reference.
1130TEST(RefTest, CanBeUsedAsMatcherForConstReference) {
1131 int a = 0;
1132 int b = 0;
1133 Matcher<const int&> m = Ref(a);
1134 EXPECT_TRUE(m.Matches(a));
1135 EXPECT_FALSE(m.Matches(b));
1136}
1137
1138// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be
1139// used wherever Ref(base) can be used (Ref(derived) is a sub-type
1140// of Ref(base), but not vice versa.
1141
shiqiane35fdd92008-12-10 05:08:54 +00001142TEST(RefTest, IsCovariant) {
1143 Base base, base2;
1144 Derived derived;
1145 Matcher<const Base&> m1 = Ref(base);
1146 EXPECT_TRUE(m1.Matches(base));
1147 EXPECT_FALSE(m1.Matches(base2));
1148 EXPECT_FALSE(m1.Matches(derived));
1149
1150 m1 = Ref(derived);
1151 EXPECT_TRUE(m1.Matches(derived));
1152 EXPECT_FALSE(m1.Matches(base));
1153 EXPECT_FALSE(m1.Matches(base2));
1154}
1155
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001156TEST(RefTest, ExplainsResult) {
1157 int n = 0;
1158 EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n),
1159 StartsWith("which is located @"));
1160
1161 int m = 0;
1162 EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m),
1163 StartsWith("which is located @"));
1164}
1165
shiqiane35fdd92008-12-10 05:08:54 +00001166// Tests string comparison matchers.
1167
1168TEST(StrEqTest, MatchesEqualString) {
1169 Matcher<const char*> m = StrEq(string("Hello"));
1170 EXPECT_TRUE(m.Matches("Hello"));
1171 EXPECT_FALSE(m.Matches("hello"));
1172 EXPECT_FALSE(m.Matches(NULL));
1173
1174 Matcher<const string&> m2 = StrEq("Hello");
1175 EXPECT_TRUE(m2.Matches("Hello"));
1176 EXPECT_FALSE(m2.Matches("Hi"));
1177}
1178
1179TEST(StrEqTest, CanDescribeSelf) {
vladlosevaa432202011-04-01 21:58:42 +00001180 Matcher<string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3");
1181 EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"",
shiqiane35fdd92008-12-10 05:08:54 +00001182 Describe(m));
1183
1184 string str("01204500800");
1185 str[3] = '\0';
1186 Matcher<string> m2 = StrEq(str);
1187 EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2));
1188 str[0] = str[6] = str[7] = str[9] = str[10] = '\0';
1189 Matcher<string> m3 = StrEq(str);
1190 EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3));
1191}
1192
1193TEST(StrNeTest, MatchesUnequalString) {
1194 Matcher<const char*> m = StrNe("Hello");
1195 EXPECT_TRUE(m.Matches(""));
1196 EXPECT_TRUE(m.Matches(NULL));
1197 EXPECT_FALSE(m.Matches("Hello"));
1198
1199 Matcher<string> m2 = StrNe(string("Hello"));
1200 EXPECT_TRUE(m2.Matches("hello"));
1201 EXPECT_FALSE(m2.Matches("Hello"));
1202}
1203
1204TEST(StrNeTest, CanDescribeSelf) {
1205 Matcher<const char*> m = StrNe("Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001206 EXPECT_EQ("isn't equal to \"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001207}
1208
1209TEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) {
1210 Matcher<const char*> m = StrCaseEq(string("Hello"));
1211 EXPECT_TRUE(m.Matches("Hello"));
1212 EXPECT_TRUE(m.Matches("hello"));
1213 EXPECT_FALSE(m.Matches("Hi"));
1214 EXPECT_FALSE(m.Matches(NULL));
1215
1216 Matcher<const string&> m2 = StrCaseEq("Hello");
1217 EXPECT_TRUE(m2.Matches("hello"));
1218 EXPECT_FALSE(m2.Matches("Hi"));
1219}
1220
1221TEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1222 string str1("oabocdooeoo");
1223 string str2("OABOCDOOEOO");
1224 Matcher<const string&> m0 = StrCaseEq(str1);
1225 EXPECT_FALSE(m0.Matches(str2 + string(1, '\0')));
1226
1227 str1[3] = str2[3] = '\0';
1228 Matcher<const string&> m1 = StrCaseEq(str1);
1229 EXPECT_TRUE(m1.Matches(str2));
1230
1231 str1[0] = str1[6] = str1[7] = str1[10] = '\0';
1232 str2[0] = str2[6] = str2[7] = str2[10] = '\0';
1233 Matcher<const string&> m2 = StrCaseEq(str1);
1234 str1[9] = str2[9] = '\0';
1235 EXPECT_FALSE(m2.Matches(str2));
1236
1237 Matcher<const string&> m3 = StrCaseEq(str1);
1238 EXPECT_TRUE(m3.Matches(str2));
1239
1240 EXPECT_FALSE(m3.Matches(str2 + "x"));
1241 str2.append(1, '\0');
1242 EXPECT_FALSE(m3.Matches(str2));
1243 EXPECT_FALSE(m3.Matches(string(str2, 0, 9)));
1244}
1245
1246TEST(StrCaseEqTest, CanDescribeSelf) {
1247 Matcher<string> m = StrCaseEq("Hi");
1248 EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m));
1249}
1250
1251TEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1252 Matcher<const char*> m = StrCaseNe("Hello");
1253 EXPECT_TRUE(m.Matches("Hi"));
1254 EXPECT_TRUE(m.Matches(NULL));
1255 EXPECT_FALSE(m.Matches("Hello"));
1256 EXPECT_FALSE(m.Matches("hello"));
1257
1258 Matcher<string> m2 = StrCaseNe(string("Hello"));
1259 EXPECT_TRUE(m2.Matches(""));
1260 EXPECT_FALSE(m2.Matches("Hello"));
1261}
1262
1263TEST(StrCaseNeTest, CanDescribeSelf) {
1264 Matcher<const char*> m = StrCaseNe("Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001265 EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001266}
1267
1268// Tests that HasSubstr() works for matching string-typed values.
1269TEST(HasSubstrTest, WorksForStringClasses) {
1270 const Matcher<string> m1 = HasSubstr("foo");
1271 EXPECT_TRUE(m1.Matches(string("I love food.")));
1272 EXPECT_FALSE(m1.Matches(string("tofo")));
1273
1274 const Matcher<const std::string&> m2 = HasSubstr("foo");
1275 EXPECT_TRUE(m2.Matches(std::string("I love food.")));
1276 EXPECT_FALSE(m2.Matches(std::string("tofo")));
1277}
1278
1279// Tests that HasSubstr() works for matching C-string-typed values.
1280TEST(HasSubstrTest, WorksForCStrings) {
1281 const Matcher<char*> m1 = HasSubstr("foo");
1282 EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food.")));
1283 EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo")));
1284 EXPECT_FALSE(m1.Matches(NULL));
1285
1286 const Matcher<const char*> m2 = HasSubstr("foo");
1287 EXPECT_TRUE(m2.Matches("I love food."));
1288 EXPECT_FALSE(m2.Matches("tofo"));
1289 EXPECT_FALSE(m2.Matches(NULL));
1290}
1291
1292// Tests that HasSubstr(s) describes itself properly.
1293TEST(HasSubstrTest, CanDescribeSelf) {
1294 Matcher<string> m = HasSubstr("foo\n\"");
1295 EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m));
1296}
1297
zhanyong.wanb5937da2009-07-16 20:26:41 +00001298TEST(KeyTest, CanDescribeSelf) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001299 Matcher<const pair<std::string, int>&> m = Key("foo");
zhanyong.wanb5937da2009-07-16 20:26:41 +00001300 EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001301 EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m));
1302}
1303
1304TEST(KeyTest, ExplainsResult) {
1305 Matcher<pair<int, bool> > m = Key(GreaterThan(10));
1306 EXPECT_EQ("whose first field is a value which is 5 less than 10",
1307 Explain(m, make_pair(5, true)));
1308 EXPECT_EQ("whose first field is a value which is 5 more than 10",
1309 Explain(m, make_pair(15, true)));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001310}
1311
1312TEST(KeyTest, MatchesCorrectly) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001313 pair<int, std::string> p(25, "foo");
zhanyong.wanb5937da2009-07-16 20:26:41 +00001314 EXPECT_THAT(p, Key(25));
1315 EXPECT_THAT(p, Not(Key(42)));
1316 EXPECT_THAT(p, Key(Ge(20)));
1317 EXPECT_THAT(p, Not(Key(Lt(25))));
1318}
1319
1320TEST(KeyTest, SafelyCastsInnerMatcher) {
1321 Matcher<int> is_positive = Gt(0);
1322 Matcher<int> is_negative = Lt(0);
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001323 pair<char, bool> p('a', true);
zhanyong.wanb5937da2009-07-16 20:26:41 +00001324 EXPECT_THAT(p, Key(is_positive));
1325 EXPECT_THAT(p, Not(Key(is_negative)));
1326}
1327
1328TEST(KeyTest, InsideContainsUsingMap) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001329 map<int, char> container;
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001330 container.insert(make_pair(1, 'a'));
1331 container.insert(make_pair(2, 'b'));
1332 container.insert(make_pair(4, 'c'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001333 EXPECT_THAT(container, Contains(Key(1)));
1334 EXPECT_THAT(container, Not(Contains(Key(3))));
1335}
1336
1337TEST(KeyTest, InsideContainsUsingMultimap) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001338 multimap<int, char> container;
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001339 container.insert(make_pair(1, 'a'));
1340 container.insert(make_pair(2, 'b'));
1341 container.insert(make_pair(4, 'c'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001342
1343 EXPECT_THAT(container, Not(Contains(Key(25))));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001344 container.insert(make_pair(25, 'd'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001345 EXPECT_THAT(container, Contains(Key(25)));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001346 container.insert(make_pair(25, 'e'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001347 EXPECT_THAT(container, Contains(Key(25)));
1348
1349 EXPECT_THAT(container, Contains(Key(1)));
1350 EXPECT_THAT(container, Not(Contains(Key(3))));
1351}
1352
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001353TEST(PairTest, Typing) {
1354 // Test verifies the following type conversions can be compiled.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001355 Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42);
1356 Matcher<const pair<const char*, int> > m2 = Pair("foo", 42);
1357 Matcher<pair<const char*, int> > m3 = Pair("foo", 42);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001358
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001359 Matcher<pair<int, const std::string> > m4 = Pair(25, "42");
1360 Matcher<pair<const std::string, int> > m5 = Pair("25", 42);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001361}
1362
1363TEST(PairTest, CanDescribeSelf) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001364 Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001365 EXPECT_EQ("has a first field that is equal to \"foo\""
1366 ", and has a second field that is equal to 42",
1367 Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001368 EXPECT_EQ("has a first field that isn't equal to \"foo\""
1369 ", or has a second field that isn't equal to 42",
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001370 DescribeNegation(m1));
1371 // Double and triple negation (1 or 2 times not and description of negation).
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001372 Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42));
1373 EXPECT_EQ("has a first field that isn't equal to 13"
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001374 ", and has a second field that is equal to 42",
1375 DescribeNegation(m2));
1376}
1377
1378TEST(PairTest, CanExplainMatchResultTo) {
zhanyong.wan82113312010-01-08 21:55:40 +00001379 // If neither field matches, Pair() should explain about the first
1380 // field.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001381 const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001382 EXPECT_EQ("whose first field does not match, which is 1 less than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001383 Explain(m, make_pair(-1, -2)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001384
zhanyong.wan82113312010-01-08 21:55:40 +00001385 // If the first field matches but the second doesn't, Pair() should
1386 // explain about the second field.
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001387 EXPECT_EQ("whose second field does not match, which is 2 less than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001388 Explain(m, make_pair(1, -2)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001389
zhanyong.wan82113312010-01-08 21:55:40 +00001390 // If the first field doesn't match but the second does, Pair()
1391 // should explain about the first field.
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001392 EXPECT_EQ("whose first field does not match, which is 1 less than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001393 Explain(m, make_pair(-1, 2)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001394
zhanyong.wan82113312010-01-08 21:55:40 +00001395 // If both fields match, Pair() should explain about them both.
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001396 EXPECT_EQ("whose both fields match, where the first field is a value "
1397 "which is 1 more than 0, and the second field is a value "
1398 "which is 2 more than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001399 Explain(m, make_pair(1, 2)));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001400
1401 // If only the first match has an explanation, only this explanation should
1402 // be printed.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001403 const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0);
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001404 EXPECT_EQ("whose both fields match, where the first field is a value "
1405 "which is 1 more than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001406 Explain(explain_first, make_pair(1, 0)));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001407
1408 // If only the second match has an explanation, only this explanation should
1409 // be printed.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001410 const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001411 EXPECT_EQ("whose both fields match, where the second field is a value "
1412 "which is 1 more than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001413 Explain(explain_second, make_pair(0, 1)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001414}
1415
1416TEST(PairTest, MatchesCorrectly) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001417 pair<int, std::string> p(25, "foo");
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001418
1419 // Both fields match.
1420 EXPECT_THAT(p, Pair(25, "foo"));
1421 EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o")));
1422
1423 // 'first' doesnt' match, but 'second' matches.
1424 EXPECT_THAT(p, Not(Pair(42, "foo")));
1425 EXPECT_THAT(p, Not(Pair(Lt(25), "foo")));
1426
1427 // 'first' matches, but 'second' doesn't match.
1428 EXPECT_THAT(p, Not(Pair(25, "bar")));
1429 EXPECT_THAT(p, Not(Pair(25, Not("foo"))));
1430
1431 // Neither field matches.
1432 EXPECT_THAT(p, Not(Pair(13, "bar")));
1433 EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a"))));
1434}
1435
1436TEST(PairTest, SafelyCastsInnerMatchers) {
1437 Matcher<int> is_positive = Gt(0);
1438 Matcher<int> is_negative = Lt(0);
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001439 pair<char, bool> p('a', true);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001440 EXPECT_THAT(p, Pair(is_positive, _));
1441 EXPECT_THAT(p, Not(Pair(is_negative, _)));
1442 EXPECT_THAT(p, Pair(_, is_positive));
1443 EXPECT_THAT(p, Not(Pair(_, is_negative)));
1444}
1445
1446TEST(PairTest, InsideContainsUsingMap) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001447 map<int, char> container;
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001448 container.insert(make_pair(1, 'a'));
1449 container.insert(make_pair(2, 'b'));
1450 container.insert(make_pair(4, 'c'));
zhanyong.wan95b12332009-09-25 18:55:50 +00001451 EXPECT_THAT(container, Contains(Pair(1, 'a')));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001452 EXPECT_THAT(container, Contains(Pair(1, _)));
zhanyong.wan95b12332009-09-25 18:55:50 +00001453 EXPECT_THAT(container, Contains(Pair(_, 'a')));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001454 EXPECT_THAT(container, Not(Contains(Pair(3, _))));
1455}
1456
shiqiane35fdd92008-12-10 05:08:54 +00001457// Tests StartsWith(s).
1458
1459TEST(StartsWithTest, MatchesStringWithGivenPrefix) {
1460 const Matcher<const char*> m1 = StartsWith(string(""));
1461 EXPECT_TRUE(m1.Matches("Hi"));
1462 EXPECT_TRUE(m1.Matches(""));
1463 EXPECT_FALSE(m1.Matches(NULL));
1464
1465 const Matcher<const string&> m2 = StartsWith("Hi");
1466 EXPECT_TRUE(m2.Matches("Hi"));
1467 EXPECT_TRUE(m2.Matches("Hi Hi!"));
1468 EXPECT_TRUE(m2.Matches("High"));
1469 EXPECT_FALSE(m2.Matches("H"));
1470 EXPECT_FALSE(m2.Matches(" Hi"));
1471}
1472
1473TEST(StartsWithTest, CanDescribeSelf) {
1474 Matcher<const std::string> m = StartsWith("Hi");
1475 EXPECT_EQ("starts with \"Hi\"", Describe(m));
1476}
1477
1478// Tests EndsWith(s).
1479
1480TEST(EndsWithTest, MatchesStringWithGivenSuffix) {
1481 const Matcher<const char*> m1 = EndsWith("");
1482 EXPECT_TRUE(m1.Matches("Hi"));
1483 EXPECT_TRUE(m1.Matches(""));
1484 EXPECT_FALSE(m1.Matches(NULL));
1485
1486 const Matcher<const string&> m2 = EndsWith(string("Hi"));
1487 EXPECT_TRUE(m2.Matches("Hi"));
1488 EXPECT_TRUE(m2.Matches("Wow Hi Hi"));
1489 EXPECT_TRUE(m2.Matches("Super Hi"));
1490 EXPECT_FALSE(m2.Matches("i"));
1491 EXPECT_FALSE(m2.Matches("Hi "));
1492}
1493
1494TEST(EndsWithTest, CanDescribeSelf) {
1495 Matcher<const std::string> m = EndsWith("Hi");
1496 EXPECT_EQ("ends with \"Hi\"", Describe(m));
1497}
1498
shiqiane35fdd92008-12-10 05:08:54 +00001499// Tests MatchesRegex().
1500
1501TEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) {
1502 const Matcher<const char*> m1 = MatchesRegex("a.*z");
1503 EXPECT_TRUE(m1.Matches("az"));
1504 EXPECT_TRUE(m1.Matches("abcz"));
1505 EXPECT_FALSE(m1.Matches(NULL));
1506
1507 const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z"));
1508 EXPECT_TRUE(m2.Matches("azbz"));
1509 EXPECT_FALSE(m2.Matches("az1"));
1510 EXPECT_FALSE(m2.Matches("1az"));
1511}
1512
1513TEST(MatchesRegexTest, CanDescribeSelf) {
1514 Matcher<const std::string> m1 = MatchesRegex(string("Hi.*"));
1515 EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1));
1516
zhanyong.wand14aaed2010-01-14 05:36:32 +00001517 Matcher<const char*> m2 = MatchesRegex(new RE("a.*"));
1518 EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2));
shiqiane35fdd92008-12-10 05:08:54 +00001519}
1520
1521// Tests ContainsRegex().
1522
1523TEST(ContainsRegexTest, MatchesStringContainingGivenRegex) {
1524 const Matcher<const char*> m1 = ContainsRegex(string("a.*z"));
1525 EXPECT_TRUE(m1.Matches("az"));
1526 EXPECT_TRUE(m1.Matches("0abcz1"));
1527 EXPECT_FALSE(m1.Matches(NULL));
1528
1529 const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z"));
1530 EXPECT_TRUE(m2.Matches("azbz"));
1531 EXPECT_TRUE(m2.Matches("az1"));
1532 EXPECT_FALSE(m2.Matches("1a"));
1533}
1534
1535TEST(ContainsRegexTest, CanDescribeSelf) {
1536 Matcher<const std::string> m1 = ContainsRegex("Hi.*");
1537 EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1));
1538
zhanyong.wand14aaed2010-01-14 05:36:32 +00001539 Matcher<const char*> m2 = ContainsRegex(new RE("a.*"));
1540 EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2));
shiqiane35fdd92008-12-10 05:08:54 +00001541}
shiqiane35fdd92008-12-10 05:08:54 +00001542
1543// Tests for wide strings.
1544#if GTEST_HAS_STD_WSTRING
1545TEST(StdWideStrEqTest, MatchesEqual) {
1546 Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello"));
1547 EXPECT_TRUE(m.Matches(L"Hello"));
1548 EXPECT_FALSE(m.Matches(L"hello"));
1549 EXPECT_FALSE(m.Matches(NULL));
1550
1551 Matcher<const ::std::wstring&> m2 = StrEq(L"Hello");
1552 EXPECT_TRUE(m2.Matches(L"Hello"));
1553 EXPECT_FALSE(m2.Matches(L"Hi"));
1554
1555 Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1556 EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1557 EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1558
1559 ::std::wstring str(L"01204500800");
1560 str[3] = L'\0';
1561 Matcher<const ::std::wstring&> m4 = StrEq(str);
1562 EXPECT_TRUE(m4.Matches(str));
1563 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1564 Matcher<const ::std::wstring&> m5 = StrEq(str);
1565 EXPECT_TRUE(m5.Matches(str));
1566}
1567
1568TEST(StdWideStrEqTest, CanDescribeSelf) {
vladlosevaa432202011-04-01 21:58:42 +00001569 Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1570 EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
shiqiane35fdd92008-12-10 05:08:54 +00001571 Describe(m));
1572
1573 Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1574 EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1575 Describe(m2));
1576
1577 ::std::wstring str(L"01204500800");
1578 str[3] = L'\0';
1579 Matcher<const ::std::wstring&> m4 = StrEq(str);
1580 EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1581 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1582 Matcher<const ::std::wstring&> m5 = StrEq(str);
1583 EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1584}
1585
1586TEST(StdWideStrNeTest, MatchesUnequalString) {
1587 Matcher<const wchar_t*> m = StrNe(L"Hello");
1588 EXPECT_TRUE(m.Matches(L""));
1589 EXPECT_TRUE(m.Matches(NULL));
1590 EXPECT_FALSE(m.Matches(L"Hello"));
1591
1592 Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello"));
1593 EXPECT_TRUE(m2.Matches(L"hello"));
1594 EXPECT_FALSE(m2.Matches(L"Hello"));
1595}
1596
1597TEST(StdWideStrNeTest, CanDescribeSelf) {
1598 Matcher<const wchar_t*> m = StrNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001599 EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001600}
1601
1602TEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1603 Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello"));
1604 EXPECT_TRUE(m.Matches(L"Hello"));
1605 EXPECT_TRUE(m.Matches(L"hello"));
1606 EXPECT_FALSE(m.Matches(L"Hi"));
1607 EXPECT_FALSE(m.Matches(NULL));
1608
1609 Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello");
1610 EXPECT_TRUE(m2.Matches(L"hello"));
1611 EXPECT_FALSE(m2.Matches(L"Hi"));
1612}
1613
1614TEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1615 ::std::wstring str1(L"oabocdooeoo");
1616 ::std::wstring str2(L"OABOCDOOEOO");
1617 Matcher<const ::std::wstring&> m0 = StrCaseEq(str1);
1618 EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0')));
1619
1620 str1[3] = str2[3] = L'\0';
1621 Matcher<const ::std::wstring&> m1 = StrCaseEq(str1);
1622 EXPECT_TRUE(m1.Matches(str2));
1623
1624 str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1625 str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1626 Matcher<const ::std::wstring&> m2 = StrCaseEq(str1);
1627 str1[9] = str2[9] = L'\0';
1628 EXPECT_FALSE(m2.Matches(str2));
1629
1630 Matcher<const ::std::wstring&> m3 = StrCaseEq(str1);
1631 EXPECT_TRUE(m3.Matches(str2));
1632
1633 EXPECT_FALSE(m3.Matches(str2 + L"x"));
1634 str2.append(1, L'\0');
1635 EXPECT_FALSE(m3.Matches(str2));
1636 EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9)));
1637}
1638
1639TEST(StdWideStrCaseEqTest, CanDescribeSelf) {
1640 Matcher< ::std::wstring> m = StrCaseEq(L"Hi");
1641 EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1642}
1643
1644TEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1645 Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1646 EXPECT_TRUE(m.Matches(L"Hi"));
1647 EXPECT_TRUE(m.Matches(NULL));
1648 EXPECT_FALSE(m.Matches(L"Hello"));
1649 EXPECT_FALSE(m.Matches(L"hello"));
1650
1651 Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello"));
1652 EXPECT_TRUE(m2.Matches(L""));
1653 EXPECT_FALSE(m2.Matches(L"Hello"));
1654}
1655
1656TEST(StdWideStrCaseNeTest, CanDescribeSelf) {
1657 Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001658 EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001659}
1660
1661// Tests that HasSubstr() works for matching wstring-typed values.
1662TEST(StdWideHasSubstrTest, WorksForStringClasses) {
1663 const Matcher< ::std::wstring> m1 = HasSubstr(L"foo");
1664 EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food.")));
1665 EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo")));
1666
1667 const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo");
1668 EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food.")));
1669 EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo")));
1670}
1671
1672// Tests that HasSubstr() works for matching C-wide-string-typed values.
1673TEST(StdWideHasSubstrTest, WorksForCStrings) {
1674 const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1675 EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1676 EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1677 EXPECT_FALSE(m1.Matches(NULL));
1678
1679 const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1680 EXPECT_TRUE(m2.Matches(L"I love food."));
1681 EXPECT_FALSE(m2.Matches(L"tofo"));
1682 EXPECT_FALSE(m2.Matches(NULL));
1683}
1684
1685// Tests that HasSubstr(s) describes itself properly.
1686TEST(StdWideHasSubstrTest, CanDescribeSelf) {
1687 Matcher< ::std::wstring> m = HasSubstr(L"foo\n\"");
1688 EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1689}
1690
1691// Tests StartsWith(s).
1692
1693TEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) {
1694 const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L""));
1695 EXPECT_TRUE(m1.Matches(L"Hi"));
1696 EXPECT_TRUE(m1.Matches(L""));
1697 EXPECT_FALSE(m1.Matches(NULL));
1698
1699 const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi");
1700 EXPECT_TRUE(m2.Matches(L"Hi"));
1701 EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1702 EXPECT_TRUE(m2.Matches(L"High"));
1703 EXPECT_FALSE(m2.Matches(L"H"));
1704 EXPECT_FALSE(m2.Matches(L" Hi"));
1705}
1706
1707TEST(StdWideStartsWithTest, CanDescribeSelf) {
1708 Matcher<const ::std::wstring> m = StartsWith(L"Hi");
1709 EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1710}
1711
1712// Tests EndsWith(s).
1713
1714TEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) {
1715 const Matcher<const wchar_t*> m1 = EndsWith(L"");
1716 EXPECT_TRUE(m1.Matches(L"Hi"));
1717 EXPECT_TRUE(m1.Matches(L""));
1718 EXPECT_FALSE(m1.Matches(NULL));
1719
1720 const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi"));
1721 EXPECT_TRUE(m2.Matches(L"Hi"));
1722 EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1723 EXPECT_TRUE(m2.Matches(L"Super Hi"));
1724 EXPECT_FALSE(m2.Matches(L"i"));
1725 EXPECT_FALSE(m2.Matches(L"Hi "));
1726}
1727
1728TEST(StdWideEndsWithTest, CanDescribeSelf) {
1729 Matcher<const ::std::wstring> m = EndsWith(L"Hi");
1730 EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1731}
1732
1733#endif // GTEST_HAS_STD_WSTRING
1734
1735#if GTEST_HAS_GLOBAL_WSTRING
1736TEST(GlobalWideStrEqTest, MatchesEqual) {
1737 Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello"));
1738 EXPECT_TRUE(m.Matches(L"Hello"));
1739 EXPECT_FALSE(m.Matches(L"hello"));
1740 EXPECT_FALSE(m.Matches(NULL));
1741
1742 Matcher<const ::wstring&> m2 = StrEq(L"Hello");
1743 EXPECT_TRUE(m2.Matches(L"Hello"));
1744 EXPECT_FALSE(m2.Matches(L"Hi"));
1745
1746 Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1747 EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1748 EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1749
1750 ::wstring str(L"01204500800");
1751 str[3] = L'\0';
1752 Matcher<const ::wstring&> m4 = StrEq(str);
1753 EXPECT_TRUE(m4.Matches(str));
1754 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1755 Matcher<const ::wstring&> m5 = StrEq(str);
1756 EXPECT_TRUE(m5.Matches(str));
1757}
1758
1759TEST(GlobalWideStrEqTest, CanDescribeSelf) {
vladlosevaa432202011-04-01 21:58:42 +00001760 Matcher< ::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1761 EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
shiqiane35fdd92008-12-10 05:08:54 +00001762 Describe(m));
1763
1764 Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1765 EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1766 Describe(m2));
1767
1768 ::wstring str(L"01204500800");
1769 str[3] = L'\0';
1770 Matcher<const ::wstring&> m4 = StrEq(str);
1771 EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1772 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1773 Matcher<const ::wstring&> m5 = StrEq(str);
1774 EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1775}
1776
1777TEST(GlobalWideStrNeTest, MatchesUnequalString) {
1778 Matcher<const wchar_t*> m = StrNe(L"Hello");
1779 EXPECT_TRUE(m.Matches(L""));
1780 EXPECT_TRUE(m.Matches(NULL));
1781 EXPECT_FALSE(m.Matches(L"Hello"));
1782
1783 Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello"));
1784 EXPECT_TRUE(m2.Matches(L"hello"));
1785 EXPECT_FALSE(m2.Matches(L"Hello"));
1786}
1787
1788TEST(GlobalWideStrNeTest, CanDescribeSelf) {
1789 Matcher<const wchar_t*> m = StrNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001790 EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001791}
1792
1793TEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1794 Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello"));
1795 EXPECT_TRUE(m.Matches(L"Hello"));
1796 EXPECT_TRUE(m.Matches(L"hello"));
1797 EXPECT_FALSE(m.Matches(L"Hi"));
1798 EXPECT_FALSE(m.Matches(NULL));
1799
1800 Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello");
1801 EXPECT_TRUE(m2.Matches(L"hello"));
1802 EXPECT_FALSE(m2.Matches(L"Hi"));
1803}
1804
1805TEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1806 ::wstring str1(L"oabocdooeoo");
1807 ::wstring str2(L"OABOCDOOEOO");
1808 Matcher<const ::wstring&> m0 = StrCaseEq(str1);
1809 EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0')));
1810
1811 str1[3] = str2[3] = L'\0';
1812 Matcher<const ::wstring&> m1 = StrCaseEq(str1);
1813 EXPECT_TRUE(m1.Matches(str2));
1814
1815 str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1816 str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1817 Matcher<const ::wstring&> m2 = StrCaseEq(str1);
1818 str1[9] = str2[9] = L'\0';
1819 EXPECT_FALSE(m2.Matches(str2));
1820
1821 Matcher<const ::wstring&> m3 = StrCaseEq(str1);
1822 EXPECT_TRUE(m3.Matches(str2));
1823
1824 EXPECT_FALSE(m3.Matches(str2 + L"x"));
1825 str2.append(1, L'\0');
1826 EXPECT_FALSE(m3.Matches(str2));
1827 EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9)));
1828}
1829
1830TEST(GlobalWideStrCaseEqTest, CanDescribeSelf) {
1831 Matcher< ::wstring> m = StrCaseEq(L"Hi");
1832 EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1833}
1834
1835TEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1836 Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1837 EXPECT_TRUE(m.Matches(L"Hi"));
1838 EXPECT_TRUE(m.Matches(NULL));
1839 EXPECT_FALSE(m.Matches(L"Hello"));
1840 EXPECT_FALSE(m.Matches(L"hello"));
1841
1842 Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello"));
1843 EXPECT_TRUE(m2.Matches(L""));
1844 EXPECT_FALSE(m2.Matches(L"Hello"));
1845}
1846
1847TEST(GlobalWideStrCaseNeTest, CanDescribeSelf) {
1848 Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001849 EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001850}
1851
1852// Tests that HasSubstr() works for matching wstring-typed values.
1853TEST(GlobalWideHasSubstrTest, WorksForStringClasses) {
1854 const Matcher< ::wstring> m1 = HasSubstr(L"foo");
1855 EXPECT_TRUE(m1.Matches(::wstring(L"I love food.")));
1856 EXPECT_FALSE(m1.Matches(::wstring(L"tofo")));
1857
1858 const Matcher<const ::wstring&> m2 = HasSubstr(L"foo");
1859 EXPECT_TRUE(m2.Matches(::wstring(L"I love food.")));
1860 EXPECT_FALSE(m2.Matches(::wstring(L"tofo")));
1861}
1862
1863// Tests that HasSubstr() works for matching C-wide-string-typed values.
1864TEST(GlobalWideHasSubstrTest, WorksForCStrings) {
1865 const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1866 EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1867 EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1868 EXPECT_FALSE(m1.Matches(NULL));
1869
1870 const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1871 EXPECT_TRUE(m2.Matches(L"I love food."));
1872 EXPECT_FALSE(m2.Matches(L"tofo"));
1873 EXPECT_FALSE(m2.Matches(NULL));
1874}
1875
1876// Tests that HasSubstr(s) describes itself properly.
1877TEST(GlobalWideHasSubstrTest, CanDescribeSelf) {
1878 Matcher< ::wstring> m = HasSubstr(L"foo\n\"");
1879 EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1880}
1881
1882// Tests StartsWith(s).
1883
1884TEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) {
1885 const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L""));
1886 EXPECT_TRUE(m1.Matches(L"Hi"));
1887 EXPECT_TRUE(m1.Matches(L""));
1888 EXPECT_FALSE(m1.Matches(NULL));
1889
1890 const Matcher<const ::wstring&> m2 = StartsWith(L"Hi");
1891 EXPECT_TRUE(m2.Matches(L"Hi"));
1892 EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1893 EXPECT_TRUE(m2.Matches(L"High"));
1894 EXPECT_FALSE(m2.Matches(L"H"));
1895 EXPECT_FALSE(m2.Matches(L" Hi"));
1896}
1897
1898TEST(GlobalWideStartsWithTest, CanDescribeSelf) {
1899 Matcher<const ::wstring> m = StartsWith(L"Hi");
1900 EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1901}
1902
1903// Tests EndsWith(s).
1904
1905TEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) {
1906 const Matcher<const wchar_t*> m1 = EndsWith(L"");
1907 EXPECT_TRUE(m1.Matches(L"Hi"));
1908 EXPECT_TRUE(m1.Matches(L""));
1909 EXPECT_FALSE(m1.Matches(NULL));
1910
1911 const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi"));
1912 EXPECT_TRUE(m2.Matches(L"Hi"));
1913 EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1914 EXPECT_TRUE(m2.Matches(L"Super Hi"));
1915 EXPECT_FALSE(m2.Matches(L"i"));
1916 EXPECT_FALSE(m2.Matches(L"Hi "));
1917}
1918
1919TEST(GlobalWideEndsWithTest, CanDescribeSelf) {
1920 Matcher<const ::wstring> m = EndsWith(L"Hi");
1921 EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1922}
1923
1924#endif // GTEST_HAS_GLOBAL_WSTRING
1925
1926
kosakbd018832014-04-02 20:30:00 +00001927typedef ::testing::tuple<long, int> Tuple2; // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00001928
1929// Tests that Eq() matches a 2-tuple where the first field == the
1930// second field.
1931TEST(Eq2Test, MatchesEqualArguments) {
1932 Matcher<const Tuple2&> m = Eq();
1933 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1934 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1935}
1936
1937// Tests that Eq() describes itself properly.
1938TEST(Eq2Test, CanDescribeSelf) {
1939 Matcher<const Tuple2&> m = Eq();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001940 EXPECT_EQ("are an equal pair", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001941}
1942
1943// Tests that Ge() matches a 2-tuple where the first field >= the
1944// second field.
1945TEST(Ge2Test, MatchesGreaterThanOrEqualArguments) {
1946 Matcher<const Tuple2&> m = Ge();
1947 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1948 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1949 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1950}
1951
1952// Tests that Ge() describes itself properly.
1953TEST(Ge2Test, CanDescribeSelf) {
1954 Matcher<const Tuple2&> m = Ge();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001955 EXPECT_EQ("are a pair where the first >= the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001956}
1957
1958// Tests that Gt() matches a 2-tuple where the first field > the
1959// second field.
1960TEST(Gt2Test, MatchesGreaterThanArguments) {
1961 Matcher<const Tuple2&> m = Gt();
1962 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1963 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1964 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1965}
1966
1967// Tests that Gt() describes itself properly.
1968TEST(Gt2Test, CanDescribeSelf) {
1969 Matcher<const Tuple2&> m = Gt();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001970 EXPECT_EQ("are a pair where the first > the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001971}
1972
1973// Tests that Le() matches a 2-tuple where the first field <= the
1974// second field.
1975TEST(Le2Test, MatchesLessThanOrEqualArguments) {
1976 Matcher<const Tuple2&> m = Le();
1977 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1978 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1979 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1980}
1981
1982// Tests that Le() describes itself properly.
1983TEST(Le2Test, CanDescribeSelf) {
1984 Matcher<const Tuple2&> m = Le();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001985 EXPECT_EQ("are a pair where the first <= the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001986}
1987
1988// Tests that Lt() matches a 2-tuple where the first field < the
1989// second field.
1990TEST(Lt2Test, MatchesLessThanArguments) {
1991 Matcher<const Tuple2&> m = Lt();
1992 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1993 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1994 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1995}
1996
1997// Tests that Lt() describes itself properly.
1998TEST(Lt2Test, CanDescribeSelf) {
1999 Matcher<const Tuple2&> m = Lt();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00002000 EXPECT_EQ("are a pair where the first < the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00002001}
2002
2003// Tests that Ne() matches a 2-tuple where the first field != the
2004// second field.
2005TEST(Ne2Test, MatchesUnequalArguments) {
2006 Matcher<const Tuple2&> m = Ne();
2007 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
2008 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
2009 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
2010}
2011
2012// Tests that Ne() describes itself properly.
2013TEST(Ne2Test, CanDescribeSelf) {
2014 Matcher<const Tuple2&> m = Ne();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00002015 EXPECT_EQ("are an unequal pair", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00002016}
2017
2018// Tests that Not(m) matches any value that doesn't match m.
2019TEST(NotTest, NegatesMatcher) {
2020 Matcher<int> m;
2021 m = Not(Eq(2));
2022 EXPECT_TRUE(m.Matches(3));
2023 EXPECT_FALSE(m.Matches(2));
2024}
2025
2026// Tests that Not(m) describes itself properly.
2027TEST(NotTest, CanDescribeSelf) {
2028 Matcher<int> m = Not(Eq(5));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002029 EXPECT_EQ("isn't equal to 5", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00002030}
2031
zhanyong.wan18490652009-05-11 18:54:08 +00002032// Tests that monomorphic matchers are safely cast by the Not matcher.
2033TEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {
2034 // greater_than_5 is a monomorphic matcher.
2035 Matcher<int> greater_than_5 = Gt(5);
2036
2037 Matcher<const int&> m = Not(greater_than_5);
2038 Matcher<int&> m2 = Not(greater_than_5);
2039 Matcher<int&> m3 = Not(m);
2040}
2041
zhanyong.wan02c15052010-06-09 19:21:30 +00002042// Helper to allow easy testing of AllOf matchers with num parameters.
2043void AllOfMatches(int num, const Matcher<int>& m) {
2044 SCOPED_TRACE(Describe(m));
2045 EXPECT_TRUE(m.Matches(0));
2046 for (int i = 1; i <= num; ++i) {
2047 EXPECT_FALSE(m.Matches(i));
2048 }
2049 EXPECT_TRUE(m.Matches(num + 1));
2050}
2051
shiqiane35fdd92008-12-10 05:08:54 +00002052// Tests that AllOf(m1, ..., mn) matches any value that matches all of
2053// the given matchers.
2054TEST(AllOfTest, MatchesWhenAllMatch) {
2055 Matcher<int> m;
2056 m = AllOf(Le(2), Ge(1));
2057 EXPECT_TRUE(m.Matches(1));
2058 EXPECT_TRUE(m.Matches(2));
2059 EXPECT_FALSE(m.Matches(0));
2060 EXPECT_FALSE(m.Matches(3));
2061
2062 m = AllOf(Gt(0), Ne(1), Ne(2));
2063 EXPECT_TRUE(m.Matches(3));
2064 EXPECT_FALSE(m.Matches(2));
2065 EXPECT_FALSE(m.Matches(1));
2066 EXPECT_FALSE(m.Matches(0));
2067
2068 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
2069 EXPECT_TRUE(m.Matches(4));
2070 EXPECT_FALSE(m.Matches(3));
2071 EXPECT_FALSE(m.Matches(2));
2072 EXPECT_FALSE(m.Matches(1));
2073 EXPECT_FALSE(m.Matches(0));
2074
2075 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
2076 EXPECT_TRUE(m.Matches(0));
2077 EXPECT_TRUE(m.Matches(1));
2078 EXPECT_FALSE(m.Matches(3));
zhanyong.wan02c15052010-06-09 19:21:30 +00002079
2080 // The following tests for varying number of sub-matchers. Due to the way
2081 // the sub-matchers are handled it is enough to test every sub-matcher once
2082 // with sub-matchers using the same matcher type. Varying matcher types are
2083 // checked for above.
2084 AllOfMatches(2, AllOf(Ne(1), Ne(2)));
2085 AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3)));
2086 AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4)));
2087 AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5)));
2088 AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6)));
2089 AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7)));
2090 AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
2091 Ne(8)));
2092 AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
2093 Ne(8), Ne(9)));
2094 AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2095 Ne(9), Ne(10)));
shiqiane35fdd92008-12-10 05:08:54 +00002096}
2097
zhanyong.wan616180e2013-06-18 18:49:51 +00002098#if GTEST_LANG_CXX11
2099// Tests the variadic version of the AllOfMatcher.
2100TEST(AllOfTest, VariadicMatchesWhenAllMatch) {
2101 // Make sure AllOf is defined in the right namespace and does not depend on
2102 // ADL.
2103 ::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2104 Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2105 Ne(9), Ne(10), Ne(11));
2106 EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11))))))))))"));
2107 AllOfMatches(11, m);
2108 AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2109 Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15),
2110 Ne(16), Ne(17), Ne(18), Ne(19), Ne(20), Ne(21), Ne(22),
2111 Ne(23), Ne(24), Ne(25), Ne(26), Ne(27), Ne(28), Ne(29),
2112 Ne(30), Ne(31), Ne(32), Ne(33), Ne(34), Ne(35), Ne(36),
2113 Ne(37), Ne(38), Ne(39), Ne(40), Ne(41), Ne(42), Ne(43),
2114 Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49),
2115 Ne(50)));
2116}
2117
2118#endif // GTEST_LANG_CXX11
2119
shiqiane35fdd92008-12-10 05:08:54 +00002120// Tests that AllOf(m1, ..., mn) describes itself properly.
2121TEST(AllOfTest, CanDescribeSelf) {
2122 Matcher<int> m;
2123 m = AllOf(Le(2), Ge(1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002124 EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00002125
2126 m = AllOf(Gt(0), Ne(1), Ne(2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002127 EXPECT_EQ("(is > 0) and "
2128 "((isn't equal to 1) and "
2129 "(isn't equal to 2))",
shiqiane35fdd92008-12-10 05:08:54 +00002130 Describe(m));
2131
2132
2133 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
jgm79a367e2012-04-10 16:02:11 +00002134 EXPECT_EQ("((is > 0) and "
2135 "(isn't equal to 1)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002136 "((isn't equal to 2) and "
jgm79a367e2012-04-10 16:02:11 +00002137 "(isn't equal to 3))",
shiqiane35fdd92008-12-10 05:08:54 +00002138 Describe(m));
2139
2140
2141 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
jgm79a367e2012-04-10 16:02:11 +00002142 EXPECT_EQ("((is >= 0) and "
2143 "(is < 10)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002144 "((isn't equal to 3) and "
2145 "((isn't equal to 5) and "
jgm79a367e2012-04-10 16:02:11 +00002146 "(isn't equal to 7)))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002147 Describe(m));
2148}
2149
2150// Tests that AllOf(m1, ..., mn) describes its negation properly.
2151TEST(AllOfTest, CanDescribeNegation) {
2152 Matcher<int> m;
2153 m = AllOf(Le(2), Ge(1));
2154 EXPECT_EQ("(isn't <= 2) or "
2155 "(isn't >= 1)",
2156 DescribeNegation(m));
2157
2158 m = AllOf(Gt(0), Ne(1), Ne(2));
2159 EXPECT_EQ("(isn't > 0) or "
2160 "((is equal to 1) or "
2161 "(is equal to 2))",
2162 DescribeNegation(m));
2163
2164
2165 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
jgm79a367e2012-04-10 16:02:11 +00002166 EXPECT_EQ("((isn't > 0) or "
2167 "(is equal to 1)) or "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002168 "((is equal to 2) or "
jgm79a367e2012-04-10 16:02:11 +00002169 "(is equal to 3))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002170 DescribeNegation(m));
2171
2172
2173 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
jgm79a367e2012-04-10 16:02:11 +00002174 EXPECT_EQ("((isn't >= 0) or "
2175 "(isn't < 10)) or "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002176 "((is equal to 3) or "
2177 "((is equal to 5) or "
jgm79a367e2012-04-10 16:02:11 +00002178 "(is equal to 7)))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002179 DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00002180}
2181
zhanyong.wan18490652009-05-11 18:54:08 +00002182// Tests that monomorphic matchers are safely cast by the AllOf matcher.
2183TEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
2184 // greater_than_5 and less_than_10 are monomorphic matchers.
2185 Matcher<int> greater_than_5 = Gt(5);
2186 Matcher<int> less_than_10 = Lt(10);
2187
2188 Matcher<const int&> m = AllOf(greater_than_5, less_than_10);
2189 Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);
2190 Matcher<int&> m3 = AllOf(greater_than_5, m2);
2191
2192 // Tests that BothOf works when composing itself.
2193 Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);
2194 Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);
2195}
2196
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002197TEST(AllOfTest, ExplainsResult) {
2198 Matcher<int> m;
2199
2200 // Successful match. Both matchers need to explain. The second
2201 // matcher doesn't give an explanation, so only the first matcher's
2202 // explanation is printed.
2203 m = AllOf(GreaterThan(10), Lt(30));
2204 EXPECT_EQ("which is 15 more than 10", Explain(m, 25));
2205
2206 // Successful match. Both matchers need to explain.
2207 m = AllOf(GreaterThan(10), GreaterThan(20));
2208 EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20",
2209 Explain(m, 30));
2210
2211 // Successful match. All matchers need to explain. The second
2212 // matcher doesn't given an explanation.
2213 m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20));
2214 EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20",
2215 Explain(m, 25));
2216
2217 // Successful match. All matchers need to explain.
2218 m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2219 EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, "
2220 "and which is 10 more than 30",
2221 Explain(m, 40));
2222
2223 // Failed match. The first matcher, which failed, needs to
2224 // explain.
2225 m = AllOf(GreaterThan(10), GreaterThan(20));
2226 EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2227
2228 // Failed match. The second matcher, which failed, needs to
2229 // explain. Since it doesn't given an explanation, nothing is
2230 // printed.
2231 m = AllOf(GreaterThan(10), Lt(30));
2232 EXPECT_EQ("", Explain(m, 40));
2233
2234 // Failed match. The second matcher, which failed, needs to
2235 // explain.
2236 m = AllOf(GreaterThan(10), GreaterThan(20));
2237 EXPECT_EQ("which is 5 less than 20", Explain(m, 15));
2238}
2239
zhanyong.wan02c15052010-06-09 19:21:30 +00002240// Helper to allow easy testing of AnyOf matchers with num parameters.
2241void AnyOfMatches(int num, const Matcher<int>& m) {
2242 SCOPED_TRACE(Describe(m));
2243 EXPECT_FALSE(m.Matches(0));
2244 for (int i = 1; i <= num; ++i) {
2245 EXPECT_TRUE(m.Matches(i));
2246 }
2247 EXPECT_FALSE(m.Matches(num + 1));
2248}
2249
shiqiane35fdd92008-12-10 05:08:54 +00002250// Tests that AnyOf(m1, ..., mn) matches any value that matches at
2251// least one of the given matchers.
2252TEST(AnyOfTest, MatchesWhenAnyMatches) {
2253 Matcher<int> m;
2254 m = AnyOf(Le(1), Ge(3));
2255 EXPECT_TRUE(m.Matches(1));
2256 EXPECT_TRUE(m.Matches(4));
2257 EXPECT_FALSE(m.Matches(2));
2258
2259 m = AnyOf(Lt(0), Eq(1), Eq(2));
2260 EXPECT_TRUE(m.Matches(-1));
2261 EXPECT_TRUE(m.Matches(1));
2262 EXPECT_TRUE(m.Matches(2));
2263 EXPECT_FALSE(m.Matches(0));
2264
2265 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2266 EXPECT_TRUE(m.Matches(-1));
2267 EXPECT_TRUE(m.Matches(1));
2268 EXPECT_TRUE(m.Matches(2));
2269 EXPECT_TRUE(m.Matches(3));
2270 EXPECT_FALSE(m.Matches(0));
2271
2272 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2273 EXPECT_TRUE(m.Matches(0));
2274 EXPECT_TRUE(m.Matches(11));
2275 EXPECT_TRUE(m.Matches(3));
2276 EXPECT_FALSE(m.Matches(2));
zhanyong.wan02c15052010-06-09 19:21:30 +00002277
2278 // The following tests for varying number of sub-matchers. Due to the way
2279 // the sub-matchers are handled it is enough to test every sub-matcher once
2280 // with sub-matchers using the same matcher type. Varying matcher types are
2281 // checked for above.
2282 AnyOfMatches(2, AnyOf(1, 2));
2283 AnyOfMatches(3, AnyOf(1, 2, 3));
2284 AnyOfMatches(4, AnyOf(1, 2, 3, 4));
2285 AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5));
2286 AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6));
2287 AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7));
2288 AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8));
2289 AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9));
2290 AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
shiqiane35fdd92008-12-10 05:08:54 +00002291}
2292
zhanyong.wan616180e2013-06-18 18:49:51 +00002293#if GTEST_LANG_CXX11
2294// Tests the variadic version of the AnyOfMatcher.
2295TEST(AnyOfTest, VariadicMatchesWhenAnyMatches) {
2296 // Also make sure AnyOf is defined in the right namespace and does not depend
2297 // on ADL.
2298 Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2299
2300 EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11))))))))))"));
2301 AnyOfMatches(11, m);
2302 AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
2303 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
2304 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
2305 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
2306 41, 42, 43, 44, 45, 46, 47, 48, 49, 50));
2307}
2308
2309#endif // GTEST_LANG_CXX11
2310
shiqiane35fdd92008-12-10 05:08:54 +00002311// Tests that AnyOf(m1, ..., mn) describes itself properly.
2312TEST(AnyOfTest, CanDescribeSelf) {
2313 Matcher<int> m;
2314 m = AnyOf(Le(1), Ge(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002315 EXPECT_EQ("(is <= 1) or (is >= 3)",
shiqiane35fdd92008-12-10 05:08:54 +00002316 Describe(m));
2317
2318 m = AnyOf(Lt(0), Eq(1), Eq(2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002319 EXPECT_EQ("(is < 0) or "
shiqiane35fdd92008-12-10 05:08:54 +00002320 "((is equal to 1) or (is equal to 2))",
2321 Describe(m));
2322
2323 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
jgm79a367e2012-04-10 16:02:11 +00002324 EXPECT_EQ("((is < 0) or "
2325 "(is equal to 1)) or "
shiqiane35fdd92008-12-10 05:08:54 +00002326 "((is equal to 2) or "
jgm79a367e2012-04-10 16:02:11 +00002327 "(is equal to 3))",
shiqiane35fdd92008-12-10 05:08:54 +00002328 Describe(m));
2329
2330 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
jgm79a367e2012-04-10 16:02:11 +00002331 EXPECT_EQ("((is <= 0) or "
2332 "(is > 10)) or "
shiqiane35fdd92008-12-10 05:08:54 +00002333 "((is equal to 3) or "
2334 "((is equal to 5) or "
jgm79a367e2012-04-10 16:02:11 +00002335 "(is equal to 7)))",
shiqiane35fdd92008-12-10 05:08:54 +00002336 Describe(m));
2337}
2338
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002339// Tests that AnyOf(m1, ..., mn) describes its negation properly.
2340TEST(AnyOfTest, CanDescribeNegation) {
2341 Matcher<int> m;
2342 m = AnyOf(Le(1), Ge(3));
2343 EXPECT_EQ("(isn't <= 1) and (isn't >= 3)",
2344 DescribeNegation(m));
2345
2346 m = AnyOf(Lt(0), Eq(1), Eq(2));
2347 EXPECT_EQ("(isn't < 0) and "
2348 "((isn't equal to 1) and (isn't equal to 2))",
2349 DescribeNegation(m));
2350
2351 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
jgm79a367e2012-04-10 16:02:11 +00002352 EXPECT_EQ("((isn't < 0) and "
2353 "(isn't equal to 1)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002354 "((isn't equal to 2) and "
jgm79a367e2012-04-10 16:02:11 +00002355 "(isn't equal to 3))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002356 DescribeNegation(m));
2357
2358 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
jgm79a367e2012-04-10 16:02:11 +00002359 EXPECT_EQ("((isn't <= 0) and "
2360 "(isn't > 10)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002361 "((isn't equal to 3) and "
2362 "((isn't equal to 5) and "
jgm79a367e2012-04-10 16:02:11 +00002363 "(isn't equal to 7)))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002364 DescribeNegation(m));
2365}
2366
zhanyong.wan18490652009-05-11 18:54:08 +00002367// Tests that monomorphic matchers are safely cast by the AnyOf matcher.
2368TEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
2369 // greater_than_5 and less_than_10 are monomorphic matchers.
2370 Matcher<int> greater_than_5 = Gt(5);
2371 Matcher<int> less_than_10 = Lt(10);
2372
2373 Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);
2374 Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);
2375 Matcher<int&> m3 = AnyOf(greater_than_5, m2);
2376
2377 // Tests that EitherOf works when composing itself.
2378 Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);
2379 Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);
2380}
2381
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002382TEST(AnyOfTest, ExplainsResult) {
2383 Matcher<int> m;
2384
2385 // Failed match. Both matchers need to explain. The second
2386 // matcher doesn't give an explanation, so only the first matcher's
2387 // explanation is printed.
2388 m = AnyOf(GreaterThan(10), Lt(0));
2389 EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2390
2391 // Failed match. Both matchers need to explain.
2392 m = AnyOf(GreaterThan(10), GreaterThan(20));
2393 EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20",
2394 Explain(m, 5));
2395
2396 // Failed match. All matchers need to explain. The second
2397 // matcher doesn't given an explanation.
2398 m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30));
2399 EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30",
2400 Explain(m, 5));
2401
2402 // Failed match. All matchers need to explain.
2403 m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2404 EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, "
2405 "and which is 25 less than 30",
2406 Explain(m, 5));
2407
2408 // Successful match. The first matcher, which succeeded, needs to
2409 // explain.
2410 m = AnyOf(GreaterThan(10), GreaterThan(20));
2411 EXPECT_EQ("which is 5 more than 10", Explain(m, 15));
2412
2413 // Successful match. The second matcher, which succeeded, needs to
2414 // explain. Since it doesn't given an explanation, nothing is
2415 // printed.
2416 m = AnyOf(GreaterThan(10), Lt(30));
2417 EXPECT_EQ("", Explain(m, 0));
2418
2419 // Successful match. The second matcher, which succeeded, needs to
2420 // explain.
2421 m = AnyOf(GreaterThan(30), GreaterThan(20));
2422 EXPECT_EQ("which is 5 more than 20", Explain(m, 25));
2423}
2424
shiqiane35fdd92008-12-10 05:08:54 +00002425// The following predicate function and predicate functor are for
2426// testing the Truly(predicate) matcher.
2427
2428// Returns non-zero if the input is positive. Note that the return
2429// type of this function is not bool. It's OK as Truly() accepts any
2430// unary function or functor whose return type can be implicitly
2431// converted to bool.
2432int IsPositive(double x) {
2433 return x > 0 ? 1 : 0;
2434}
2435
2436// This functor returns true if the input is greater than the given
2437// number.
2438class IsGreaterThan {
2439 public:
2440 explicit IsGreaterThan(int threshold) : threshold_(threshold) {}
2441
2442 bool operator()(int n) const { return n > threshold_; }
zhanyong.wan32de5f52009-12-23 00:13:23 +00002443
shiqiane35fdd92008-12-10 05:08:54 +00002444 private:
zhanyong.wan32de5f52009-12-23 00:13:23 +00002445 int threshold_;
shiqiane35fdd92008-12-10 05:08:54 +00002446};
2447
2448// For testing Truly().
2449const int foo = 0;
2450
2451// This predicate returns true iff the argument references foo and has
2452// a zero value.
2453bool ReferencesFooAndIsZero(const int& n) {
2454 return (&n == &foo) && (n == 0);
2455}
2456
2457// Tests that Truly(predicate) matches what satisfies the given
2458// predicate.
2459TEST(TrulyTest, MatchesWhatSatisfiesThePredicate) {
2460 Matcher<double> m = Truly(IsPositive);
2461 EXPECT_TRUE(m.Matches(2.0));
2462 EXPECT_FALSE(m.Matches(-1.5));
2463}
2464
2465// Tests that Truly(predicate_functor) works too.
2466TEST(TrulyTest, CanBeUsedWithFunctor) {
2467 Matcher<int> m = Truly(IsGreaterThan(5));
2468 EXPECT_TRUE(m.Matches(6));
2469 EXPECT_FALSE(m.Matches(4));
2470}
2471
zhanyong.wan8d3dc0c2011-04-14 19:37:06 +00002472// A class that can be implicitly converted to bool.
2473class ConvertibleToBool {
2474 public:
2475 explicit ConvertibleToBool(int number) : number_(number) {}
2476 operator bool() const { return number_ != 0; }
2477
2478 private:
2479 int number_;
2480};
2481
2482ConvertibleToBool IsNotZero(int number) {
2483 return ConvertibleToBool(number);
2484}
2485
2486// Tests that the predicate used in Truly() may return a class that's
2487// implicitly convertible to bool, even when the class has no
2488// operator!().
2489TEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) {
2490 Matcher<int> m = Truly(IsNotZero);
2491 EXPECT_TRUE(m.Matches(1));
2492 EXPECT_FALSE(m.Matches(0));
2493}
2494
shiqiane35fdd92008-12-10 05:08:54 +00002495// Tests that Truly(predicate) can describe itself properly.
2496TEST(TrulyTest, CanDescribeSelf) {
2497 Matcher<double> m = Truly(IsPositive);
2498 EXPECT_EQ("satisfies the given predicate",
2499 Describe(m));
2500}
2501
2502// Tests that Truly(predicate) works when the matcher takes its
2503// argument by reference.
2504TEST(TrulyTest, WorksForByRefArguments) {
2505 Matcher<const int&> m = Truly(ReferencesFooAndIsZero);
2506 EXPECT_TRUE(m.Matches(foo));
2507 int n = 0;
2508 EXPECT_FALSE(m.Matches(n));
2509}
2510
2511// Tests that Matches(m) is a predicate satisfied by whatever that
2512// matches matcher m.
2513TEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) {
2514 EXPECT_TRUE(Matches(Ge(0))(1));
2515 EXPECT_FALSE(Matches(Eq('a'))('b'));
2516}
2517
2518// Tests that Matches(m) works when the matcher takes its argument by
2519// reference.
2520TEST(MatchesTest, WorksOnByRefArguments) {
2521 int m = 0, n = 0;
2522 EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n));
2523 EXPECT_FALSE(Matches(Ref(m))(n));
2524}
2525
2526// Tests that a Matcher on non-reference type can be used in
2527// Matches().
2528TEST(MatchesTest, WorksWithMatcherOnNonRefType) {
2529 Matcher<int> eq5 = Eq(5);
2530 EXPECT_TRUE(Matches(eq5)(5));
2531 EXPECT_FALSE(Matches(eq5)(2));
2532}
2533
zhanyong.wanb8243162009-06-04 05:48:20 +00002534// Tests Value(value, matcher). Since Value() is a simple wrapper for
2535// Matches(), which has been tested already, we don't spend a lot of
2536// effort on testing Value().
2537TEST(ValueTest, WorksWithPolymorphicMatcher) {
2538 EXPECT_TRUE(Value("hi", StartsWith("h")));
2539 EXPECT_FALSE(Value(5, Gt(10)));
2540}
2541
2542TEST(ValueTest, WorksWithMonomorphicMatcher) {
2543 const Matcher<int> is_zero = Eq(0);
2544 EXPECT_TRUE(Value(0, is_zero));
2545 EXPECT_FALSE(Value('a', is_zero));
2546
2547 int n = 0;
2548 const Matcher<const int&> ref_n = Ref(n);
2549 EXPECT_TRUE(Value(n, ref_n));
2550 EXPECT_FALSE(Value(1, ref_n));
2551}
2552
zhanyong.wana862f1d2010-03-15 21:23:04 +00002553TEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) {
zhanyong.wan34b034c2010-03-05 21:23:23 +00002554 StringMatchResultListener listener1;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002555 EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002556 EXPECT_EQ("% 2 == 0", listener1.str());
2557
2558 StringMatchResultListener listener2;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002559 EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002560 EXPECT_EQ("", listener2.str());
2561}
2562
zhanyong.wana862f1d2010-03-15 21:23:04 +00002563TEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {
zhanyong.wan34b034c2010-03-05 21:23:23 +00002564 const Matcher<int> is_even = PolymorphicIsEven();
2565 StringMatchResultListener listener1;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002566 EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002567 EXPECT_EQ("% 2 == 0", listener1.str());
2568
2569 const Matcher<const double&> is_zero = Eq(0);
2570 StringMatchResultListener listener2;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002571 EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002572 EXPECT_EQ("", listener2.str());
2573}
2574
zhanyong.wana862f1d2010-03-15 21:23:04 +00002575MATCHER_P(Really, inner_matcher, "") {
2576 return ExplainMatchResult(inner_matcher, arg, result_listener);
2577}
2578
2579TEST(ExplainMatchResultTest, WorksInsideMATCHER) {
2580 EXPECT_THAT(0, Really(Eq(0)));
2581}
2582
zhanyong.wanbf550852009-06-09 06:09:53 +00002583TEST(AllArgsTest, WorksForTuple) {
2584 EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt()));
2585 EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt())));
2586}
2587
2588TEST(AllArgsTest, WorksForNonTuple) {
2589 EXPECT_THAT(42, AllArgs(Gt(0)));
2590 EXPECT_THAT('a', Not(AllArgs(Eq('b'))));
2591}
2592
2593class AllArgsHelper {
2594 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +00002595 AllArgsHelper() {}
2596
zhanyong.wanbf550852009-06-09 06:09:53 +00002597 MOCK_METHOD2(Helper, int(char x, int y));
zhanyong.wan32de5f52009-12-23 00:13:23 +00002598
2599 private:
2600 GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper);
zhanyong.wanbf550852009-06-09 06:09:53 +00002601};
2602
2603TEST(AllArgsTest, WorksInWithClause) {
2604 AllArgsHelper helper;
2605 ON_CALL(helper, Helper(_, _))
2606 .With(AllArgs(Lt()))
2607 .WillByDefault(Return(1));
2608 EXPECT_CALL(helper, Helper(_, _));
2609 EXPECT_CALL(helper, Helper(_, _))
2610 .With(AllArgs(Gt()))
2611 .WillOnce(Return(2));
2612
2613 EXPECT_EQ(1, helper.Helper('\1', 2));
2614 EXPECT_EQ(2, helper.Helper('a', 1));
2615}
2616
shiqiane35fdd92008-12-10 05:08:54 +00002617// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2618// matches the matcher.
2619TEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {
2620 ASSERT_THAT(5, Ge(2)) << "This should succeed.";
2621 ASSERT_THAT("Foo", EndsWith("oo"));
2622 EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too.";
2623 EXPECT_THAT("Hello", StartsWith("Hell"));
2624}
2625
2626// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2627// doesn't match the matcher.
2628TEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {
2629 // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(),
2630 // which cannot reference auto variables.
zhanyong.wan736baa82010-09-27 17:44:16 +00002631 static unsigned short n; // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00002632 n = 5;
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002633
2634 // VC++ prior to version 8.0 SP1 has a bug where it will not see any
2635 // functions declared in the namespace scope from within nested classes.
2636 // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all
2637 // namespace-level functions invoked inside them need to be explicitly
2638 // resolved.
2639 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)),
shiqiane35fdd92008-12-10 05:08:54 +00002640 "Value of: n\n"
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002641 "Expected: is > 10\n"
zhanyong.wan736baa82010-09-27 17:44:16 +00002642 " Actual: 5" + OfType("unsigned short"));
shiqiane35fdd92008-12-10 05:08:54 +00002643 n = 0;
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002644 EXPECT_NONFATAL_FAILURE(
2645 EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))),
2646 "Value of: n\n"
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002647 "Expected: (is <= 7) and (is >= 5)\n"
zhanyong.wan736baa82010-09-27 17:44:16 +00002648 " Actual: 0" + OfType("unsigned short"));
shiqiane35fdd92008-12-10 05:08:54 +00002649}
2650
2651// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument
2652// has a reference type.
2653TEST(MatcherAssertionTest, WorksForByRefArguments) {
2654 // We use a static variable here as EXPECT_FATAL_FAILURE() cannot
2655 // reference auto variables.
2656 static int n;
2657 n = 0;
2658 EXPECT_THAT(n, AllOf(Le(7), Ref(n)));
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002659 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
shiqiane35fdd92008-12-10 05:08:54 +00002660 "Value of: n\n"
2661 "Expected: does not reference the variable @");
2662 // Tests the "Actual" part.
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002663 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
zhanyong.wan736baa82010-09-27 17:44:16 +00002664 "Actual: 0" + OfType("int") + ", which is located @");
shiqiane35fdd92008-12-10 05:08:54 +00002665}
2666
zhanyong.wan95b12332009-09-25 18:55:50 +00002667#if !GTEST_OS_SYMBIAN
shiqiane35fdd92008-12-10 05:08:54 +00002668// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is
2669// monomorphic.
zhanyong.wan95b12332009-09-25 18:55:50 +00002670
2671// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's
2672// Symbian compiler: it tries to compile
2673// template<T, U> class MatcherCastImpl { ...
zhanyong.wandb22c222010-01-28 21:52:29 +00002674// virtual bool MatchAndExplain(T x, ...) const {
2675// return source_matcher_.MatchAndExplain(static_cast<U>(x), ...);
zhanyong.wan95b12332009-09-25 18:55:50 +00002676// with U == string and T == const char*
2677// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... )
2678// the compiler silently crashes with no output.
2679// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x)
2680// the code compiles but the converted string is bogus.
shiqiane35fdd92008-12-10 05:08:54 +00002681TEST(MatcherAssertionTest, WorksForMonomorphicMatcher) {
2682 Matcher<const char*> starts_with_he = StartsWith("he");
2683 ASSERT_THAT("hello", starts_with_he);
2684
2685 Matcher<const string&> ends_with_ok = EndsWith("ok");
2686 ASSERT_THAT("book", ends_with_ok);
zhanyong.wan736baa82010-09-27 17:44:16 +00002687 const string bad = "bad";
2688 EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok),
2689 "Value of: bad\n"
2690 "Expected: ends with \"ok\"\n"
2691 " Actual: \"bad\"");
shiqiane35fdd92008-12-10 05:08:54 +00002692 Matcher<int> is_greater_than_5 = Gt(5);
2693 EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5),
2694 "Value of: 5\n"
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002695 "Expected: is > 5\n"
zhanyong.wan736baa82010-09-27 17:44:16 +00002696 " Actual: 5" + OfType("int"));
shiqiane35fdd92008-12-10 05:08:54 +00002697}
zhanyong.wan95b12332009-09-25 18:55:50 +00002698#endif // !GTEST_OS_SYMBIAN
shiqiane35fdd92008-12-10 05:08:54 +00002699
2700// Tests floating-point matchers.
2701template <typename RawType>
2702class FloatingPointTest : public testing::Test {
2703 protected:
zhanyong.wan35877b72013-09-18 17:51:08 +00002704 typedef testing::internal::FloatingPoint<RawType> Floating;
shiqiane35fdd92008-12-10 05:08:54 +00002705 typedef typename Floating::Bits Bits;
2706
zhanyong.wan35877b72013-09-18 17:51:08 +00002707 FloatingPointTest()
2708 : max_ulps_(Floating::kMaxUlps),
2709 zero_bits_(Floating(0).bits()),
2710 one_bits_(Floating(1).bits()),
2711 infinity_bits_(Floating(Floating::Infinity()).bits()),
2712 close_to_positive_zero_(
2713 Floating::ReinterpretBits(zero_bits_ + max_ulps_/2)),
2714 close_to_negative_zero_(
2715 -Floating::ReinterpretBits(zero_bits_ + max_ulps_ - max_ulps_/2)),
2716 further_from_negative_zero_(-Floating::ReinterpretBits(
2717 zero_bits_ + max_ulps_ + 1 - max_ulps_/2)),
2718 close_to_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_)),
2719 further_from_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_ + 1)),
2720 infinity_(Floating::Infinity()),
2721 close_to_infinity_(
2722 Floating::ReinterpretBits(infinity_bits_ - max_ulps_)),
2723 further_from_infinity_(
2724 Floating::ReinterpretBits(infinity_bits_ - max_ulps_ - 1)),
2725 max_(Floating::Max()),
2726 nan1_(Floating::ReinterpretBits(Floating::kExponentBitMask | 1)),
2727 nan2_(Floating::ReinterpretBits(Floating::kExponentBitMask | 200)) {
shiqiane35fdd92008-12-10 05:08:54 +00002728 }
2729
2730 void TestSize() {
2731 EXPECT_EQ(sizeof(RawType), sizeof(Bits));
2732 }
2733
2734 // A battery of tests for FloatingEqMatcher::Matches.
2735 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
2736 void TestMatches(
2737 testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) {
2738 Matcher<RawType> m1 = matcher_maker(0.0);
2739 EXPECT_TRUE(m1.Matches(-0.0));
2740 EXPECT_TRUE(m1.Matches(close_to_positive_zero_));
2741 EXPECT_TRUE(m1.Matches(close_to_negative_zero_));
2742 EXPECT_FALSE(m1.Matches(1.0));
2743
2744 Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_);
2745 EXPECT_FALSE(m2.Matches(further_from_negative_zero_));
2746
2747 Matcher<RawType> m3 = matcher_maker(1.0);
2748 EXPECT_TRUE(m3.Matches(close_to_one_));
2749 EXPECT_FALSE(m3.Matches(further_from_one_));
2750
2751 // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above.
2752 EXPECT_FALSE(m3.Matches(0.0));
2753
2754 Matcher<RawType> m4 = matcher_maker(-infinity_);
2755 EXPECT_TRUE(m4.Matches(-close_to_infinity_));
2756
2757 Matcher<RawType> m5 = matcher_maker(infinity_);
2758 EXPECT_TRUE(m5.Matches(close_to_infinity_));
2759
2760 // This is interesting as the representations of infinity_ and nan1_
2761 // are only 1 DLP apart.
2762 EXPECT_FALSE(m5.Matches(nan1_));
2763
2764 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2765 // some cases.
2766 Matcher<const RawType&> m6 = matcher_maker(0.0);
2767 EXPECT_TRUE(m6.Matches(-0.0));
2768 EXPECT_TRUE(m6.Matches(close_to_positive_zero_));
2769 EXPECT_FALSE(m6.Matches(1.0));
2770
2771 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2772 // cases.
2773 Matcher<RawType&> m7 = matcher_maker(0.0);
2774 RawType x = 0.0;
2775 EXPECT_TRUE(m7.Matches(x));
2776 x = 0.01f;
2777 EXPECT_FALSE(m7.Matches(x));
2778 }
2779
2780 // Pre-calculated numbers to be used by the tests.
2781
zhanyong.wan35877b72013-09-18 17:51:08 +00002782 const size_t max_ulps_;
shiqiane35fdd92008-12-10 05:08:54 +00002783
zhanyong.wan35877b72013-09-18 17:51:08 +00002784 const Bits zero_bits_; // The bits that represent 0.0.
2785 const Bits one_bits_; // The bits that represent 1.0.
2786 const Bits infinity_bits_; // The bits that represent +infinity.
shiqiane35fdd92008-12-10 05:08:54 +00002787
zhanyong.wan35877b72013-09-18 17:51:08 +00002788 // Some numbers close to 0.0.
2789 const RawType close_to_positive_zero_;
2790 const RawType close_to_negative_zero_;
2791 const RawType further_from_negative_zero_;
shiqiane35fdd92008-12-10 05:08:54 +00002792
zhanyong.wan35877b72013-09-18 17:51:08 +00002793 // Some numbers close to 1.0.
2794 const RawType close_to_one_;
2795 const RawType further_from_one_;
2796
2797 // Some numbers close to +infinity.
2798 const RawType infinity_;
2799 const RawType close_to_infinity_;
2800 const RawType further_from_infinity_;
2801
2802 // Maximum representable value that's not infinity.
2803 const RawType max_;
2804
2805 // Some NaNs.
2806 const RawType nan1_;
2807 const RawType nan2_;
shiqiane35fdd92008-12-10 05:08:54 +00002808};
2809
zhanyong.wan616180e2013-06-18 18:49:51 +00002810// Tests floating-point matchers with fixed epsilons.
2811template <typename RawType>
2812class FloatingPointNearTest : public FloatingPointTest<RawType> {
2813 protected:
2814 typedef FloatingPointTest<RawType> ParentType;
2815
2816 // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon.
2817 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
2818 void TestNearMatches(
2819 testing::internal::FloatingEqMatcher<RawType>
2820 (*matcher_maker)(RawType, RawType)) {
2821 Matcher<RawType> m1 = matcher_maker(0.0, 0.0);
2822 EXPECT_TRUE(m1.Matches(0.0));
2823 EXPECT_TRUE(m1.Matches(-0.0));
2824 EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_));
2825 EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_));
2826 EXPECT_FALSE(m1.Matches(1.0));
2827
2828 Matcher<RawType> m2 = matcher_maker(0.0, 1.0);
2829 EXPECT_TRUE(m2.Matches(0.0));
2830 EXPECT_TRUE(m2.Matches(-0.0));
2831 EXPECT_TRUE(m2.Matches(1.0));
2832 EXPECT_TRUE(m2.Matches(-1.0));
2833 EXPECT_FALSE(m2.Matches(ParentType::close_to_one_));
2834 EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_));
2835
2836 // Check that inf matches inf, regardless of the of the specified max
2837 // absolute error.
2838 Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0);
2839 EXPECT_TRUE(m3.Matches(ParentType::infinity_));
2840 EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_));
2841 EXPECT_FALSE(m3.Matches(-ParentType::infinity_));
2842
2843 Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0);
2844 EXPECT_TRUE(m4.Matches(-ParentType::infinity_));
2845 EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_));
2846 EXPECT_FALSE(m4.Matches(ParentType::infinity_));
2847
2848 // Test various overflow scenarios.
zhanyong.wan35877b72013-09-18 17:51:08 +00002849 Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_);
2850 EXPECT_TRUE(m5.Matches(ParentType::max_));
2851 EXPECT_FALSE(m5.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002852
zhanyong.wan35877b72013-09-18 17:51:08 +00002853 Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_);
2854 EXPECT_FALSE(m6.Matches(ParentType::max_));
2855 EXPECT_TRUE(m6.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002856
zhanyong.wan35877b72013-09-18 17:51:08 +00002857 Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0);
2858 EXPECT_TRUE(m7.Matches(ParentType::max_));
2859 EXPECT_FALSE(m7.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002860
zhanyong.wan35877b72013-09-18 17:51:08 +00002861 Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0);
2862 EXPECT_FALSE(m8.Matches(ParentType::max_));
2863 EXPECT_TRUE(m8.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002864
2865 // The difference between max() and -max() normally overflows to infinity,
2866 // but it should still match if the max_abs_error is also infinity.
2867 Matcher<RawType> m9 = matcher_maker(
zhanyong.wan35877b72013-09-18 17:51:08 +00002868 ParentType::max_, ParentType::infinity_);
2869 EXPECT_TRUE(m8.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002870
2871 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2872 // some cases.
2873 Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0);
2874 EXPECT_TRUE(m10.Matches(-0.0));
2875 EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_));
2876 EXPECT_FALSE(m10.Matches(ParentType::close_to_one_));
2877
2878 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2879 // cases.
2880 Matcher<RawType&> m11 = matcher_maker(0.0, 1.0);
2881 RawType x = 0.0;
2882 EXPECT_TRUE(m11.Matches(x));
2883 x = 1.0f;
2884 EXPECT_TRUE(m11.Matches(x));
2885 x = -1.0f;
2886 EXPECT_TRUE(m11.Matches(x));
2887 x = 1.1f;
2888 EXPECT_FALSE(m11.Matches(x));
2889 x = -1.1f;
2890 EXPECT_FALSE(m11.Matches(x));
2891 }
2892};
2893
shiqiane35fdd92008-12-10 05:08:54 +00002894// Instantiate FloatingPointTest for testing floats.
2895typedef FloatingPointTest<float> FloatTest;
2896
2897TEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) {
2898 TestMatches(&FloatEq);
2899}
2900
2901TEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) {
2902 TestMatches(&NanSensitiveFloatEq);
2903}
2904
2905TEST_F(FloatTest, FloatEqCannotMatchNaN) {
2906 // FloatEq never matches NaN.
2907 Matcher<float> m = FloatEq(nan1_);
2908 EXPECT_FALSE(m.Matches(nan1_));
2909 EXPECT_FALSE(m.Matches(nan2_));
2910 EXPECT_FALSE(m.Matches(1.0));
2911}
2912
2913TEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {
2914 // NanSensitiveFloatEq will match NaN.
2915 Matcher<float> m = NanSensitiveFloatEq(nan1_);
2916 EXPECT_TRUE(m.Matches(nan1_));
2917 EXPECT_TRUE(m.Matches(nan2_));
2918 EXPECT_FALSE(m.Matches(1.0));
2919}
2920
2921TEST_F(FloatTest, FloatEqCanDescribeSelf) {
2922 Matcher<float> m1 = FloatEq(2.0f);
2923 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002924 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00002925
2926 Matcher<float> m2 = FloatEq(0.5f);
2927 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002928 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00002929
2930 Matcher<float> m3 = FloatEq(nan1_);
2931 EXPECT_EQ("never matches", Describe(m3));
2932 EXPECT_EQ("is anything", DescribeNegation(m3));
2933}
2934
2935TEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) {
2936 Matcher<float> m1 = NanSensitiveFloatEq(2.0f);
2937 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002938 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00002939
2940 Matcher<float> m2 = NanSensitiveFloatEq(0.5f);
2941 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002942 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00002943
2944 Matcher<float> m3 = NanSensitiveFloatEq(nan1_);
2945 EXPECT_EQ("is NaN", Describe(m3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002946 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
shiqiane35fdd92008-12-10 05:08:54 +00002947}
2948
zhanyong.wan616180e2013-06-18 18:49:51 +00002949// Instantiate FloatingPointTest for testing floats with a user-specified
2950// max absolute error.
2951typedef FloatingPointNearTest<float> FloatNearTest;
2952
2953TEST_F(FloatNearTest, FloatNearMatches) {
2954 TestNearMatches(&FloatNear);
2955}
2956
2957TEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) {
2958 TestNearMatches(&NanSensitiveFloatNear);
2959}
2960
2961TEST_F(FloatNearTest, FloatNearCanDescribeSelf) {
2962 Matcher<float> m1 = FloatNear(2.0f, 0.5f);
2963 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2964 EXPECT_EQ(
2965 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2966
2967 Matcher<float> m2 = FloatNear(0.5f, 0.5f);
2968 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2969 EXPECT_EQ(
2970 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2971
2972 Matcher<float> m3 = FloatNear(nan1_, 0.0);
2973 EXPECT_EQ("never matches", Describe(m3));
2974 EXPECT_EQ("is anything", DescribeNegation(m3));
2975}
2976
2977TEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) {
2978 Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f);
2979 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2980 EXPECT_EQ(
2981 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2982
2983 Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f);
2984 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2985 EXPECT_EQ(
2986 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2987
2988 Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f);
2989 EXPECT_EQ("is NaN", Describe(m3));
2990 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2991}
2992
2993TEST_F(FloatNearTest, FloatNearCannotMatchNaN) {
2994 // FloatNear never matches NaN.
2995 Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f);
2996 EXPECT_FALSE(m.Matches(nan1_));
2997 EXPECT_FALSE(m.Matches(nan2_));
2998 EXPECT_FALSE(m.Matches(1.0));
2999}
3000
3001TEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) {
3002 // NanSensitiveFloatNear will match NaN.
3003 Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f);
3004 EXPECT_TRUE(m.Matches(nan1_));
3005 EXPECT_TRUE(m.Matches(nan2_));
3006 EXPECT_FALSE(m.Matches(1.0));
3007}
3008
shiqiane35fdd92008-12-10 05:08:54 +00003009// Instantiate FloatingPointTest for testing doubles.
3010typedef FloatingPointTest<double> DoubleTest;
3011
3012TEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) {
3013 TestMatches(&DoubleEq);
3014}
3015
3016TEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) {
3017 TestMatches(&NanSensitiveDoubleEq);
3018}
3019
3020TEST_F(DoubleTest, DoubleEqCannotMatchNaN) {
3021 // DoubleEq never matches NaN.
3022 Matcher<double> m = DoubleEq(nan1_);
3023 EXPECT_FALSE(m.Matches(nan1_));
3024 EXPECT_FALSE(m.Matches(nan2_));
3025 EXPECT_FALSE(m.Matches(1.0));
3026}
3027
3028TEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {
3029 // NanSensitiveDoubleEq will match NaN.
3030 Matcher<double> m = NanSensitiveDoubleEq(nan1_);
3031 EXPECT_TRUE(m.Matches(nan1_));
3032 EXPECT_TRUE(m.Matches(nan2_));
3033 EXPECT_FALSE(m.Matches(1.0));
3034}
3035
3036TEST_F(DoubleTest, DoubleEqCanDescribeSelf) {
3037 Matcher<double> m1 = DoubleEq(2.0);
3038 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003039 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00003040
3041 Matcher<double> m2 = DoubleEq(0.5);
3042 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003043 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00003044
3045 Matcher<double> m3 = DoubleEq(nan1_);
3046 EXPECT_EQ("never matches", Describe(m3));
3047 EXPECT_EQ("is anything", DescribeNegation(m3));
3048}
3049
3050TEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) {
3051 Matcher<double> m1 = NanSensitiveDoubleEq(2.0);
3052 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003053 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00003054
3055 Matcher<double> m2 = NanSensitiveDoubleEq(0.5);
3056 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003057 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00003058
3059 Matcher<double> m3 = NanSensitiveDoubleEq(nan1_);
3060 EXPECT_EQ("is NaN", Describe(m3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003061 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
shiqiane35fdd92008-12-10 05:08:54 +00003062}
3063
zhanyong.wan616180e2013-06-18 18:49:51 +00003064// Instantiate FloatingPointTest for testing floats with a user-specified
3065// max absolute error.
3066typedef FloatingPointNearTest<double> DoubleNearTest;
3067
3068TEST_F(DoubleNearTest, DoubleNearMatches) {
3069 TestNearMatches(&DoubleNear);
3070}
3071
3072TEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) {
3073 TestNearMatches(&NanSensitiveDoubleNear);
3074}
3075
3076TEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) {
3077 Matcher<double> m1 = DoubleNear(2.0, 0.5);
3078 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3079 EXPECT_EQ(
3080 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3081
3082 Matcher<double> m2 = DoubleNear(0.5, 0.5);
3083 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3084 EXPECT_EQ(
3085 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3086
3087 Matcher<double> m3 = DoubleNear(nan1_, 0.0);
3088 EXPECT_EQ("never matches", Describe(m3));
3089 EXPECT_EQ("is anything", DescribeNegation(m3));
3090}
3091
kosak6b817802015-01-08 02:38:14 +00003092TEST_F(DoubleNearTest, ExplainsResultWhenMatchFails) {
3093 EXPECT_EQ("", Explain(DoubleNear(2.0, 0.1), 2.05));
3094 EXPECT_EQ("which is 0.2 from 2", Explain(DoubleNear(2.0, 0.1), 2.2));
3095 EXPECT_EQ("which is -0.3 from 2", Explain(DoubleNear(2.0, 0.1), 1.7));
3096
3097 const string explanation = Explain(DoubleNear(2.1, 1e-10), 2.1 + 1.2e-10);
3098 // Different C++ implementations may print floating-point numbers
3099 // slightly differently.
3100 EXPECT_TRUE(explanation == "which is 1.2e-10 from 2.1" || // GCC
3101 explanation == "which is 1.2e-010 from 2.1") // MSVC
3102 << " where explanation is \"" << explanation << "\".";
3103}
3104
zhanyong.wan616180e2013-06-18 18:49:51 +00003105TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) {
3106 Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5);
3107 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3108 EXPECT_EQ(
3109 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3110
3111 Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5);
3112 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3113 EXPECT_EQ(
3114 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3115
3116 Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1);
3117 EXPECT_EQ("is NaN", Describe(m3));
3118 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
3119}
3120
3121TEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) {
3122 // DoubleNear never matches NaN.
3123 Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1);
3124 EXPECT_FALSE(m.Matches(nan1_));
3125 EXPECT_FALSE(m.Matches(nan2_));
3126 EXPECT_FALSE(m.Matches(1.0));
3127}
3128
3129TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) {
3130 // NanSensitiveDoubleNear will match NaN.
3131 Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1);
3132 EXPECT_TRUE(m.Matches(nan1_));
3133 EXPECT_TRUE(m.Matches(nan2_));
3134 EXPECT_FALSE(m.Matches(1.0));
3135}
3136
shiqiane35fdd92008-12-10 05:08:54 +00003137TEST(PointeeTest, RawPointer) {
3138 const Matcher<int*> m = Pointee(Ge(0));
3139
3140 int n = 1;
3141 EXPECT_TRUE(m.Matches(&n));
3142 n = -1;
3143 EXPECT_FALSE(m.Matches(&n));
3144 EXPECT_FALSE(m.Matches(NULL));
3145}
3146
3147TEST(PointeeTest, RawPointerToConst) {
3148 const Matcher<const double*> m = Pointee(Ge(0));
3149
3150 double x = 1;
3151 EXPECT_TRUE(m.Matches(&x));
3152 x = -1;
3153 EXPECT_FALSE(m.Matches(&x));
3154 EXPECT_FALSE(m.Matches(NULL));
3155}
3156
3157TEST(PointeeTest, ReferenceToConstRawPointer) {
3158 const Matcher<int* const &> m = Pointee(Ge(0));
3159
3160 int n = 1;
3161 EXPECT_TRUE(m.Matches(&n));
3162 n = -1;
3163 EXPECT_FALSE(m.Matches(&n));
3164 EXPECT_FALSE(m.Matches(NULL));
3165}
3166
3167TEST(PointeeTest, ReferenceToNonConstRawPointer) {
3168 const Matcher<double* &> m = Pointee(Ge(0));
3169
3170 double x = 1.0;
3171 double* p = &x;
3172 EXPECT_TRUE(m.Matches(p));
3173 x = -1;
3174 EXPECT_FALSE(m.Matches(p));
3175 p = NULL;
3176 EXPECT_FALSE(m.Matches(p));
3177}
3178
billydonahue1f5fdea2014-05-19 17:54:51 +00003179
3180MATCHER_P(FieldIIs, inner_matcher, "") {
3181 return ExplainMatchResult(inner_matcher, arg.i, result_listener);
3182}
3183
3184TEST(WhenDynamicCastToTest, SameType) {
3185 Derived derived;
3186 derived.i = 4;
3187
3188 // Right type. A pointer is passed down.
3189 Base* as_base_ptr = &derived;
3190 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull())));
3191 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4))));
3192 EXPECT_THAT(as_base_ptr,
3193 Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5)))));
3194}
3195
3196TEST(WhenDynamicCastToTest, WrongTypes) {
3197 Base base;
3198 Derived derived;
3199 OtherDerived other_derived;
3200
3201 // Wrong types. NULL is passed.
3202 EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
3203 EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull()));
3204 Base* as_base_ptr = &derived;
3205 EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_))));
3206 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull()));
3207 as_base_ptr = &other_derived;
3208 EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
3209 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
3210}
3211
3212TEST(WhenDynamicCastToTest, AlreadyNull) {
3213 // Already NULL.
3214 Base* as_base_ptr = NULL;
3215 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
3216}
3217
3218struct AmbiguousCastTypes {
3219 class VirtualDerived : public virtual Base {};
3220 class DerivedSub1 : public VirtualDerived {};
3221 class DerivedSub2 : public VirtualDerived {};
3222 class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {};
3223};
3224
3225TEST(WhenDynamicCastToTest, AmbiguousCast) {
3226 AmbiguousCastTypes::DerivedSub1 sub1;
3227 AmbiguousCastTypes::ManyDerivedInHierarchy many_derived;
3228 // Multiply derived from Base. dynamic_cast<> returns NULL.
3229 Base* as_base_ptr =
3230 static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived);
3231 EXPECT_THAT(as_base_ptr,
3232 WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull()));
3233 as_base_ptr = &sub1;
3234 EXPECT_THAT(
3235 as_base_ptr,
3236 WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull())));
3237}
3238
3239TEST(WhenDynamicCastToTest, Describe) {
3240 Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
3241#if GTEST_HAS_RTTI
3242 const string prefix =
3243 "when dynamic_cast to " + internal::GetTypeName<Derived*>() + ", ";
3244#else // GTEST_HAS_RTTI
3245 const string prefix = "when dynamic_cast, ";
3246#endif // GTEST_HAS_RTTI
3247 EXPECT_EQ(prefix + "points to a value that is anything", Describe(matcher));
3248 EXPECT_EQ(prefix + "does not point to a value that is anything",
3249 DescribeNegation(matcher));
3250}
3251
3252TEST(WhenDynamicCastToTest, Explain) {
3253 Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
3254 Base* null = NULL;
3255 EXPECT_THAT(Explain(matcher, null), HasSubstr("NULL"));
3256 Derived derived;
3257 EXPECT_TRUE(matcher.Matches(&derived));
3258 EXPECT_THAT(Explain(matcher, &derived), HasSubstr("which points to "));
3259
3260 // With references, the matcher itself can fail. Test for that one.
3261 Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_);
3262 EXPECT_THAT(Explain(ref_matcher, derived),
3263 HasSubstr("which cannot be dynamic_cast"));
3264}
3265
3266TEST(WhenDynamicCastToTest, GoodReference) {
3267 Derived derived;
3268 derived.i = 4;
3269 Base& as_base_ref = derived;
3270 EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4)));
3271 EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5))));
3272}
3273
3274TEST(WhenDynamicCastToTest, BadReference) {
3275 Derived derived;
3276 Base& as_base_ref = derived;
3277 EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_)));
3278}
3279
vladlosevada23472012-08-14 15:38:49 +00003280// Minimal const-propagating pointer.
3281template <typename T>
3282class ConstPropagatingPtr {
3283 public:
3284 typedef T element_type;
3285
3286 ConstPropagatingPtr() : val_() {}
3287 explicit ConstPropagatingPtr(T* t) : val_(t) {}
3288 ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {}
3289
3290 T* get() { return val_; }
3291 T& operator*() { return *val_; }
3292 // Most smart pointers return non-const T* and T& from the next methods.
3293 const T* get() const { return val_; }
3294 const T& operator*() const { return *val_; }
3295
3296 private:
3297 T* val_;
3298};
3299
3300TEST(PointeeTest, WorksWithConstPropagatingPointers) {
3301 const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5));
3302 int three = 3;
3303 const ConstPropagatingPtr<int> co(&three);
3304 ConstPropagatingPtr<int> o(&three);
3305 EXPECT_TRUE(m.Matches(o));
3306 EXPECT_TRUE(m.Matches(co));
3307 *o = 6;
3308 EXPECT_FALSE(m.Matches(o));
3309 EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>()));
3310}
3311
shiqiane35fdd92008-12-10 05:08:54 +00003312TEST(PointeeTest, NeverMatchesNull) {
3313 const Matcher<const char*> m = Pointee(_);
3314 EXPECT_FALSE(m.Matches(NULL));
3315}
3316
3317// Tests that we can write Pointee(value) instead of Pointee(Eq(value)).
3318TEST(PointeeTest, MatchesAgainstAValue) {
3319 const Matcher<int*> m = Pointee(5);
3320
3321 int n = 5;
3322 EXPECT_TRUE(m.Matches(&n));
3323 n = -1;
3324 EXPECT_FALSE(m.Matches(&n));
3325 EXPECT_FALSE(m.Matches(NULL));
3326}
3327
3328TEST(PointeeTest, CanDescribeSelf) {
3329 const Matcher<int*> m = Pointee(Gt(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003330 EXPECT_EQ("points to a value that is > 3", Describe(m));
3331 EXPECT_EQ("does not point to a value that is > 3",
shiqiane35fdd92008-12-10 05:08:54 +00003332 DescribeNegation(m));
3333}
3334
shiqiane35fdd92008-12-10 05:08:54 +00003335TEST(PointeeTest, CanExplainMatchResult) {
3336 const Matcher<const string*> m = Pointee(StartsWith("Hi"));
3337
3338 EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL)));
3339
zhanyong.wan736baa82010-09-27 17:44:16 +00003340 const Matcher<long*> m2 = Pointee(GreaterThan(1)); // NOLINT
3341 long n = 3; // NOLINT
3342 EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1",
zhanyong.wan676e8cc2010-03-16 20:01:51 +00003343 Explain(m2, &n));
3344}
3345
3346TEST(PointeeTest, AlwaysExplainsPointee) {
3347 const Matcher<int*> m = Pointee(0);
3348 int n = 42;
zhanyong.wan736baa82010-09-27 17:44:16 +00003349 EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n));
shiqiane35fdd92008-12-10 05:08:54 +00003350}
3351
3352// An uncopyable class.
3353class Uncopyable {
3354 public:
billydonahue1f5fdea2014-05-19 17:54:51 +00003355 Uncopyable() : value_(-1) {}
zhanyong.wan32de5f52009-12-23 00:13:23 +00003356 explicit Uncopyable(int a_value) : value_(a_value) {}
shiqiane35fdd92008-12-10 05:08:54 +00003357
3358 int value() const { return value_; }
billydonahue1f5fdea2014-05-19 17:54:51 +00003359 void set_value(int i) { value_ = i; }
3360
shiqiane35fdd92008-12-10 05:08:54 +00003361 private:
billydonahue1f5fdea2014-05-19 17:54:51 +00003362 int value_;
shiqiane35fdd92008-12-10 05:08:54 +00003363 GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable);
3364};
3365
3366// Returns true iff x.value() is positive.
3367bool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; }
3368
billydonahue1f5fdea2014-05-19 17:54:51 +00003369MATCHER_P(UncopyableIs, inner_matcher, "") {
3370 return ExplainMatchResult(inner_matcher, arg.value(), result_listener);
3371}
3372
shiqiane35fdd92008-12-10 05:08:54 +00003373// A user-defined struct for testing Field().
3374struct AStruct {
3375 AStruct() : x(0), y(1.0), z(5), p(NULL) {}
3376 AStruct(const AStruct& rhs)
3377 : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {}
3378
3379 int x; // A non-const field.
3380 const double y; // A const field.
3381 Uncopyable z; // An uncopyable field.
3382 const char* p; // A pointer field.
zhanyong.wan32de5f52009-12-23 00:13:23 +00003383
3384 private:
3385 GTEST_DISALLOW_ASSIGN_(AStruct);
shiqiane35fdd92008-12-10 05:08:54 +00003386};
3387
3388// A derived struct for testing Field().
3389struct DerivedStruct : public AStruct {
3390 char ch;
zhanyong.wan32de5f52009-12-23 00:13:23 +00003391
3392 private:
3393 GTEST_DISALLOW_ASSIGN_(DerivedStruct);
shiqiane35fdd92008-12-10 05:08:54 +00003394};
3395
3396// Tests that Field(&Foo::field, ...) works when field is non-const.
3397TEST(FieldTest, WorksForNonConstField) {
3398 Matcher<AStruct> m = Field(&AStruct::x, Ge(0));
3399
3400 AStruct a;
3401 EXPECT_TRUE(m.Matches(a));
3402 a.x = -1;
3403 EXPECT_FALSE(m.Matches(a));
3404}
3405
3406// Tests that Field(&Foo::field, ...) works when field is const.
3407TEST(FieldTest, WorksForConstField) {
3408 AStruct a;
3409
3410 Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0));
3411 EXPECT_TRUE(m.Matches(a));
3412 m = Field(&AStruct::y, Le(0.0));
3413 EXPECT_FALSE(m.Matches(a));
3414}
3415
3416// Tests that Field(&Foo::field, ...) works when field is not copyable.
3417TEST(FieldTest, WorksForUncopyableField) {
3418 AStruct a;
3419
3420 Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive));
3421 EXPECT_TRUE(m.Matches(a));
3422 m = Field(&AStruct::z, Not(Truly(ValueIsPositive)));
3423 EXPECT_FALSE(m.Matches(a));
3424}
3425
3426// Tests that Field(&Foo::field, ...) works when field is a pointer.
3427TEST(FieldTest, WorksForPointerField) {
3428 // Matching against NULL.
3429 Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL));
3430 AStruct a;
3431 EXPECT_TRUE(m.Matches(a));
3432 a.p = "hi";
3433 EXPECT_FALSE(m.Matches(a));
3434
3435 // Matching a pointer that is not NULL.
3436 m = Field(&AStruct::p, StartsWith("hi"));
3437 a.p = "hill";
3438 EXPECT_TRUE(m.Matches(a));
3439 a.p = "hole";
3440 EXPECT_FALSE(m.Matches(a));
3441}
3442
3443// Tests that Field() works when the object is passed by reference.
3444TEST(FieldTest, WorksForByRefArgument) {
3445 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3446
3447 AStruct a;
3448 EXPECT_TRUE(m.Matches(a));
3449 a.x = -1;
3450 EXPECT_FALSE(m.Matches(a));
3451}
3452
3453// Tests that Field(&Foo::field, ...) works when the argument's type
3454// is a sub-type of Foo.
3455TEST(FieldTest, WorksForArgumentOfSubType) {
3456 // Note that the matcher expects DerivedStruct but we say AStruct
3457 // inside Field().
3458 Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0));
3459
3460 DerivedStruct d;
3461 EXPECT_TRUE(m.Matches(d));
3462 d.x = -1;
3463 EXPECT_FALSE(m.Matches(d));
3464}
3465
3466// Tests that Field(&Foo::field, m) works when field's type and m's
3467// argument type are compatible but not the same.
3468TEST(FieldTest, WorksForCompatibleMatcherType) {
3469 // The field is an int, but the inner matcher expects a signed char.
3470 Matcher<const AStruct&> m = Field(&AStruct::x,
3471 Matcher<signed char>(Ge(0)));
3472
3473 AStruct a;
3474 EXPECT_TRUE(m.Matches(a));
3475 a.x = -1;
3476 EXPECT_FALSE(m.Matches(a));
3477}
3478
3479// Tests that Field() can describe itself.
3480TEST(FieldTest, CanDescribeSelf) {
3481 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3482
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003483 EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3484 EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003485}
3486
3487// Tests that Field() can explain the match result.
3488TEST(FieldTest, CanExplainMatchResult) {
3489 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3490
3491 AStruct a;
3492 a.x = 1;
zhanyong.wan736baa82010-09-27 17:44:16 +00003493 EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003494
3495 m = Field(&AStruct::x, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003496 EXPECT_EQ(
3497 "whose given field is 1" + OfType("int") + ", which is 1 more than 0",
3498 Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003499}
3500
3501// Tests that Field() works when the argument is a pointer to const.
3502TEST(FieldForPointerTest, WorksForPointerToConst) {
3503 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3504
3505 AStruct a;
3506 EXPECT_TRUE(m.Matches(&a));
3507 a.x = -1;
3508 EXPECT_FALSE(m.Matches(&a));
3509}
3510
3511// Tests that Field() works when the argument is a pointer to non-const.
3512TEST(FieldForPointerTest, WorksForPointerToNonConst) {
3513 Matcher<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
zhanyong.wan6953a722010-01-13 05:15:07 +00003521// Tests that Field() works when the argument is a reference to a const pointer.
3522TEST(FieldForPointerTest, WorksForReferenceToConstPointer) {
3523 Matcher<AStruct* const&> 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
shiqiane35fdd92008-12-10 05:08:54 +00003531// Tests that Field() does not match the NULL pointer.
3532TEST(FieldForPointerTest, DoesNotMatchNull) {
3533 Matcher<const AStruct*> m = Field(&AStruct::x, _);
3534 EXPECT_FALSE(m.Matches(NULL));
3535}
3536
3537// Tests that Field(&Foo::field, ...) works when the argument's type
3538// is a sub-type of const Foo*.
3539TEST(FieldForPointerTest, WorksForArgumentOfSubType) {
3540 // Note that the matcher expects DerivedStruct but we say AStruct
3541 // inside Field().
3542 Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0));
3543
3544 DerivedStruct d;
3545 EXPECT_TRUE(m.Matches(&d));
3546 d.x = -1;
3547 EXPECT_FALSE(m.Matches(&d));
3548}
3549
3550// Tests that Field() can describe itself when used to match a pointer.
3551TEST(FieldForPointerTest, CanDescribeSelf) {
3552 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3553
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003554 EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3555 EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003556}
3557
3558// Tests that Field() can explain the result of matching a pointer.
3559TEST(FieldForPointerTest, CanExplainMatchResult) {
3560 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3561
3562 AStruct a;
3563 a.x = 1;
3564 EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL)));
zhanyong.wan736baa82010-09-27 17:44:16 +00003565 EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"),
3566 Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003567
3568 m = Field(&AStruct::x, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003569 EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") +
3570 ", which is 1 more than 0", Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003571}
3572
3573// A user-defined class for testing Property().
3574class AClass {
3575 public:
3576 AClass() : n_(0) {}
3577
3578 // A getter that returns a non-reference.
3579 int n() const { return n_; }
3580
3581 void set_n(int new_n) { n_ = new_n; }
3582
3583 // A getter that returns a reference to const.
3584 const string& s() const { return s_; }
3585
3586 void set_s(const string& new_s) { s_ = new_s; }
3587
3588 // A getter that returns a reference to non-const.
3589 double& x() const { return x_; }
3590 private:
3591 int n_;
3592 string s_;
3593
3594 static double x_;
3595};
3596
3597double AClass::x_ = 0.0;
3598
3599// A derived class for testing Property().
3600class DerivedClass : public AClass {
kosak6414d802013-12-03 23:19:36 +00003601 public:
3602 int k() const { return k_; }
shiqiane35fdd92008-12-10 05:08:54 +00003603 private:
3604 int k_;
3605};
3606
3607// Tests that Property(&Foo::property, ...) works when property()
3608// returns a non-reference.
3609TEST(PropertyTest, WorksForNonReferenceProperty) {
3610 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3611
3612 AClass a;
3613 a.set_n(1);
3614 EXPECT_TRUE(m.Matches(a));
3615
3616 a.set_n(-1);
3617 EXPECT_FALSE(m.Matches(a));
3618}
3619
3620// Tests that Property(&Foo::property, ...) works when property()
3621// returns a reference to const.
3622TEST(PropertyTest, WorksForReferenceToConstProperty) {
3623 Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi"));
3624
3625 AClass a;
3626 a.set_s("hill");
3627 EXPECT_TRUE(m.Matches(a));
3628
3629 a.set_s("hole");
3630 EXPECT_FALSE(m.Matches(a));
3631}
3632
3633// Tests that Property(&Foo::property, ...) works when property()
3634// returns a reference to non-const.
3635TEST(PropertyTest, WorksForReferenceToNonConstProperty) {
3636 double x = 0.0;
3637 AClass a;
3638
3639 Matcher<const AClass&> m = Property(&AClass::x, Ref(x));
3640 EXPECT_FALSE(m.Matches(a));
3641
3642 m = Property(&AClass::x, Not(Ref(x)));
3643 EXPECT_TRUE(m.Matches(a));
3644}
3645
3646// Tests that Property(&Foo::property, ...) works when the argument is
3647// passed by value.
3648TEST(PropertyTest, WorksForByValueArgument) {
3649 Matcher<AClass> m = Property(&AClass::s, StartsWith("hi"));
3650
3651 AClass a;
3652 a.set_s("hill");
3653 EXPECT_TRUE(m.Matches(a));
3654
3655 a.set_s("hole");
3656 EXPECT_FALSE(m.Matches(a));
3657}
3658
3659// Tests that Property(&Foo::property, ...) works when the argument's
3660// type is a sub-type of Foo.
3661TEST(PropertyTest, WorksForArgumentOfSubType) {
3662 // The matcher expects a DerivedClass, but inside the Property() we
3663 // say AClass.
3664 Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0));
3665
3666 DerivedClass d;
3667 d.set_n(1);
3668 EXPECT_TRUE(m.Matches(d));
3669
3670 d.set_n(-1);
3671 EXPECT_FALSE(m.Matches(d));
3672}
3673
3674// Tests that Property(&Foo::property, m) works when property()'s type
3675// and m's argument type are compatible but different.
3676TEST(PropertyTest, WorksForCompatibleMatcherType) {
3677 // n() returns an int but the inner matcher expects a signed char.
3678 Matcher<const AClass&> m = Property(&AClass::n,
3679 Matcher<signed char>(Ge(0)));
3680
3681 AClass a;
3682 EXPECT_TRUE(m.Matches(a));
3683 a.set_n(-1);
3684 EXPECT_FALSE(m.Matches(a));
3685}
3686
3687// Tests that Property() can describe itself.
3688TEST(PropertyTest, CanDescribeSelf) {
3689 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3690
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003691 EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3692 EXPECT_EQ("is an object whose given property isn't >= 0",
3693 DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003694}
3695
3696// Tests that Property() can explain the match result.
3697TEST(PropertyTest, CanExplainMatchResult) {
3698 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3699
3700 AClass a;
3701 a.set_n(1);
zhanyong.wan736baa82010-09-27 17:44:16 +00003702 EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003703
3704 m = Property(&AClass::n, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003705 EXPECT_EQ(
3706 "whose given property is 1" + OfType("int") + ", which is 1 more than 0",
3707 Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003708}
3709
3710// Tests that Property() works when the argument is a pointer to const.
3711TEST(PropertyForPointerTest, WorksForPointerToConst) {
3712 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3713
3714 AClass a;
3715 a.set_n(1);
3716 EXPECT_TRUE(m.Matches(&a));
3717
3718 a.set_n(-1);
3719 EXPECT_FALSE(m.Matches(&a));
3720}
3721
3722// Tests that Property() works when the argument is a pointer to non-const.
3723TEST(PropertyForPointerTest, WorksForPointerToNonConst) {
3724 Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi"));
3725
3726 AClass a;
3727 a.set_s("hill");
3728 EXPECT_TRUE(m.Matches(&a));
3729
3730 a.set_s("hole");
3731 EXPECT_FALSE(m.Matches(&a));
3732}
3733
zhanyong.wan6953a722010-01-13 05:15:07 +00003734// Tests that Property() works when the argument is a reference to a
3735// const pointer.
3736TEST(PropertyForPointerTest, WorksForReferenceToConstPointer) {
3737 Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi"));
3738
3739 AClass a;
3740 a.set_s("hill");
3741 EXPECT_TRUE(m.Matches(&a));
3742
3743 a.set_s("hole");
3744 EXPECT_FALSE(m.Matches(&a));
3745}
3746
shiqiane35fdd92008-12-10 05:08:54 +00003747// Tests that Property() does not match the NULL pointer.
3748TEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) {
3749 Matcher<const AClass*> m = Property(&AClass::x, _);
3750 EXPECT_FALSE(m.Matches(NULL));
3751}
3752
3753// Tests that Property(&Foo::property, ...) works when the argument's
3754// type is a sub-type of const Foo*.
3755TEST(PropertyForPointerTest, WorksForArgumentOfSubType) {
3756 // The matcher expects a DerivedClass, but inside the Property() we
3757 // say AClass.
3758 Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0));
3759
3760 DerivedClass d;
3761 d.set_n(1);
3762 EXPECT_TRUE(m.Matches(&d));
3763
3764 d.set_n(-1);
3765 EXPECT_FALSE(m.Matches(&d));
3766}
3767
3768// Tests that Property() can describe itself when used to match a pointer.
3769TEST(PropertyForPointerTest, CanDescribeSelf) {
3770 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3771
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003772 EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3773 EXPECT_EQ("is an object whose given property isn't >= 0",
3774 DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003775}
3776
3777// Tests that Property() can explain the result of matching a pointer.
3778TEST(PropertyForPointerTest, CanExplainMatchResult) {
3779 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3780
3781 AClass a;
3782 a.set_n(1);
3783 EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL)));
zhanyong.wan736baa82010-09-27 17:44:16 +00003784 EXPECT_EQ(
3785 "which points to an object whose given property is 1" + OfType("int"),
3786 Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003787
3788 m = Property(&AClass::n, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003789 EXPECT_EQ("which points to an object whose given property is 1" +
3790 OfType("int") + ", which is 1 more than 0",
3791 Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003792}
3793
3794// Tests ResultOf.
3795
3796// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3797// function pointer.
3798string IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; }
3799
3800TEST(ResultOfTest, WorksForFunctionPointers) {
3801 Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo")));
3802
3803 EXPECT_TRUE(matcher.Matches(1));
3804 EXPECT_FALSE(matcher.Matches(2));
3805}
3806
3807// Tests that ResultOf() can describe itself.
3808TEST(ResultOfTest, CanDescribeItself) {
3809 Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo"));
3810
zhanyong.wan676e8cc2010-03-16 20:01:51 +00003811 EXPECT_EQ("is mapped by the given callable to a value that "
3812 "is equal to \"foo\"", Describe(matcher));
3813 EXPECT_EQ("is mapped by the given callable to a value that "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003814 "isn't equal to \"foo\"", DescribeNegation(matcher));
shiqiane35fdd92008-12-10 05:08:54 +00003815}
3816
3817// Tests that ResultOf() can explain the match result.
3818int IntFunction(int input) { return input == 42 ? 80 : 90; }
3819
3820TEST(ResultOfTest, CanExplainMatchResult) {
3821 Matcher<int> matcher = ResultOf(&IntFunction, Ge(85));
zhanyong.wan736baa82010-09-27 17:44:16 +00003822 EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"),
zhanyong.wan676e8cc2010-03-16 20:01:51 +00003823 Explain(matcher, 36));
shiqiane35fdd92008-12-10 05:08:54 +00003824
3825 matcher = ResultOf(&IntFunction, GreaterThan(85));
zhanyong.wan736baa82010-09-27 17:44:16 +00003826 EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") +
3827 ", which is 5 more than 85", Explain(matcher, 36));
shiqiane35fdd92008-12-10 05:08:54 +00003828}
3829
3830// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3831// returns a non-reference.
3832TEST(ResultOfTest, WorksForNonReferenceResults) {
3833 Matcher<int> matcher = ResultOf(&IntFunction, Eq(80));
3834
3835 EXPECT_TRUE(matcher.Matches(42));
3836 EXPECT_FALSE(matcher.Matches(36));
3837}
3838
3839// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3840// returns a reference to non-const.
zhanyong.wan736baa82010-09-27 17:44:16 +00003841double& DoubleFunction(double& input) { return input; } // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00003842
zhanyong.wan736baa82010-09-27 17:44:16 +00003843Uncopyable& RefUncopyableFunction(Uncopyable& obj) { // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00003844 return obj;
3845}
3846
3847TEST(ResultOfTest, WorksForReferenceToNonConstResults) {
3848 double x = 3.14;
3849 double x2 = x;
3850 Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x));
3851
3852 EXPECT_TRUE(matcher.Matches(x));
3853 EXPECT_FALSE(matcher.Matches(x2));
3854
3855 // Test that ResultOf works with uncopyable objects
3856 Uncopyable obj(0);
3857 Uncopyable obj2(0);
3858 Matcher<Uncopyable&> matcher2 =
3859 ResultOf(&RefUncopyableFunction, Ref(obj));
3860
3861 EXPECT_TRUE(matcher2.Matches(obj));
3862 EXPECT_FALSE(matcher2.Matches(obj2));
3863}
3864
3865// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3866// returns a reference to const.
3867const string& StringFunction(const string& input) { return input; }
3868
3869TEST(ResultOfTest, WorksForReferenceToConstResults) {
3870 string s = "foo";
3871 string s2 = s;
3872 Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s));
3873
3874 EXPECT_TRUE(matcher.Matches(s));
3875 EXPECT_FALSE(matcher.Matches(s2));
3876}
3877
3878// Tests that ResultOf(f, m) works when f(x) and m's
3879// argument types are compatible but different.
3880TEST(ResultOfTest, WorksForCompatibleMatcherTypes) {
3881 // IntFunction() returns int but the inner matcher expects a signed char.
3882 Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85)));
3883
3884 EXPECT_TRUE(matcher.Matches(36));
3885 EXPECT_FALSE(matcher.Matches(42));
3886}
3887
shiqiane35fdd92008-12-10 05:08:54 +00003888// Tests that the program aborts when ResultOf is passed
3889// a NULL function pointer.
3890TEST(ResultOfDeathTest, DiesOnNullFunctionPointers) {
zhanyong.wan04d6ed82009-09-11 07:01:08 +00003891 EXPECT_DEATH_IF_SUPPORTED(
zhanyong.wan736baa82010-09-27 17:44:16 +00003892 ResultOf(static_cast<string(*)(int dummy)>(NULL), Eq(string("foo"))),
shiqiane35fdd92008-12-10 05:08:54 +00003893 "NULL function pointer is passed into ResultOf\\(\\)\\.");
3894}
shiqiane35fdd92008-12-10 05:08:54 +00003895
3896// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3897// function reference.
3898TEST(ResultOfTest, WorksForFunctionReferences) {
3899 Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo"));
3900 EXPECT_TRUE(matcher.Matches(1));
3901 EXPECT_FALSE(matcher.Matches(2));
3902}
3903
3904// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3905// function object.
3906struct Functor : public ::std::unary_function<int, string> {
3907 result_type operator()(argument_type input) const {
3908 return IntToStringFunction(input);
3909 }
3910};
3911
3912TEST(ResultOfTest, WorksForFunctors) {
3913 Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo")));
3914
3915 EXPECT_TRUE(matcher.Matches(1));
3916 EXPECT_FALSE(matcher.Matches(2));
3917}
3918
3919// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3920// functor with more then one operator() defined. ResultOf() must work
3921// for each defined operator().
3922struct PolymorphicFunctor {
3923 typedef int result_type;
3924 int operator()(int n) { return n; }
3925 int operator()(const char* s) { return static_cast<int>(strlen(s)); }
3926};
3927
3928TEST(ResultOfTest, WorksForPolymorphicFunctors) {
3929 Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5));
3930
3931 EXPECT_TRUE(matcher_int.Matches(10));
3932 EXPECT_FALSE(matcher_int.Matches(2));
3933
3934 Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5));
3935
3936 EXPECT_TRUE(matcher_string.Matches("long string"));
3937 EXPECT_FALSE(matcher_string.Matches("shrt"));
3938}
3939
3940const int* ReferencingFunction(const int& n) { return &n; }
3941
3942struct ReferencingFunctor {
3943 typedef const int* result_type;
3944 result_type operator()(const int& n) { return &n; }
3945};
3946
3947TEST(ResultOfTest, WorksForReferencingCallables) {
3948 const int n = 1;
3949 const int n2 = 1;
3950 Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n));
3951 EXPECT_TRUE(matcher2.Matches(n));
3952 EXPECT_FALSE(matcher2.Matches(n2));
3953
3954 Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n));
3955 EXPECT_TRUE(matcher3.Matches(n));
3956 EXPECT_FALSE(matcher3.Matches(n2));
3957}
3958
shiqiane35fdd92008-12-10 05:08:54 +00003959class DivisibleByImpl {
3960 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +00003961 explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {}
shiqiane35fdd92008-12-10 05:08:54 +00003962
zhanyong.wandb22c222010-01-28 21:52:29 +00003963 // For testing using ExplainMatchResultTo() with polymorphic matchers.
shiqiane35fdd92008-12-10 05:08:54 +00003964 template <typename T>
zhanyong.wandb22c222010-01-28 21:52:29 +00003965 bool MatchAndExplain(const T& n, MatchResultListener* listener) const {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003966 *listener << "which is " << (n % divider_) << " modulo "
zhanyong.wandb22c222010-01-28 21:52:29 +00003967 << divider_;
shiqiane35fdd92008-12-10 05:08:54 +00003968 return (n % divider_) == 0;
3969 }
3970
zhanyong.wanab5b77c2010-05-17 19:32:48 +00003971 void DescribeTo(ostream* os) const {
shiqiane35fdd92008-12-10 05:08:54 +00003972 *os << "is divisible by " << divider_;
3973 }
3974
zhanyong.wanab5b77c2010-05-17 19:32:48 +00003975 void DescribeNegationTo(ostream* os) const {
shiqiane35fdd92008-12-10 05:08:54 +00003976 *os << "is not divisible by " << divider_;
3977 }
3978
zhanyong.wan32de5f52009-12-23 00:13:23 +00003979 void set_divider(int a_divider) { divider_ = a_divider; }
shiqiane35fdd92008-12-10 05:08:54 +00003980 int divider() const { return divider_; }
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00003981
shiqiane35fdd92008-12-10 05:08:54 +00003982 private:
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00003983 int divider_;
shiqiane35fdd92008-12-10 05:08:54 +00003984};
3985
shiqiane35fdd92008-12-10 05:08:54 +00003986PolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {
3987 return MakePolymorphicMatcher(DivisibleByImpl(n));
3988}
3989
3990// Tests that when AllOf() fails, only the first failing matcher is
3991// asked to explain why.
3992TEST(ExplainMatchResultTest, AllOf_False_False) {
3993 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003994 EXPECT_EQ("which is 1 modulo 4", Explain(m, 5));
shiqiane35fdd92008-12-10 05:08:54 +00003995}
3996
3997// Tests that when AllOf() fails, only the first failing matcher is
3998// asked to explain why.
3999TEST(ExplainMatchResultTest, AllOf_False_True) {
4000 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004001 EXPECT_EQ("which is 2 modulo 4", Explain(m, 6));
shiqiane35fdd92008-12-10 05:08:54 +00004002}
4003
4004// Tests that when AllOf() fails, only the first failing matcher is
4005// asked to explain why.
4006TEST(ExplainMatchResultTest, AllOf_True_False) {
4007 const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004008 EXPECT_EQ("which is 2 modulo 3", Explain(m, 5));
shiqiane35fdd92008-12-10 05:08:54 +00004009}
4010
4011// Tests that when AllOf() succeeds, all matchers are asked to explain
4012// why.
4013TEST(ExplainMatchResultTest, AllOf_True_True) {
4014 const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004015 EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6));
shiqiane35fdd92008-12-10 05:08:54 +00004016}
4017
4018TEST(ExplainMatchResultTest, AllOf_True_True_2) {
4019 const Matcher<int> m = AllOf(Ge(2), Le(3));
4020 EXPECT_EQ("", Explain(m, 2));
4021}
4022
4023TEST(ExplainmatcherResultTest, MonomorphicMatcher) {
4024 const Matcher<int> m = GreaterThan(5);
zhanyong.wan676e8cc2010-03-16 20:01:51 +00004025 EXPECT_EQ("which is 1 more than 5", Explain(m, 6));
shiqiane35fdd92008-12-10 05:08:54 +00004026}
4027
4028// The following two tests verify that values without a public copy
4029// ctor can be used as arguments to matchers like Eq(), Ge(), and etc
4030// with the help of ByRef().
4031
4032class NotCopyable {
4033 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +00004034 explicit NotCopyable(int a_value) : value_(a_value) {}
shiqiane35fdd92008-12-10 05:08:54 +00004035
4036 int value() const { return value_; }
4037
4038 bool operator==(const NotCopyable& rhs) const {
4039 return value() == rhs.value();
4040 }
4041
4042 bool operator>=(const NotCopyable& rhs) const {
4043 return value() >= rhs.value();
4044 }
4045 private:
4046 int value_;
4047
4048 GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable);
4049};
4050
4051TEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) {
4052 const NotCopyable const_value1(1);
4053 const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1));
4054
4055 const NotCopyable n1(1), n2(2);
4056 EXPECT_TRUE(m.Matches(n1));
4057 EXPECT_FALSE(m.Matches(n2));
4058}
4059
4060TEST(ByRefTest, AllowsNotCopyableValueInMatchers) {
4061 NotCopyable value2(2);
4062 const Matcher<NotCopyable&> m = Ge(ByRef(value2));
4063
4064 NotCopyable n1(1), n2(2);
4065 EXPECT_FALSE(m.Matches(n1));
4066 EXPECT_TRUE(m.Matches(n2));
4067}
4068
zhanyong.wan320814a2013-03-01 00:20:30 +00004069TEST(IsEmptyTest, ImplementsIsEmpty) {
4070 vector<int> container;
4071 EXPECT_THAT(container, IsEmpty());
4072 container.push_back(0);
4073 EXPECT_THAT(container, Not(IsEmpty()));
4074 container.push_back(1);
4075 EXPECT_THAT(container, Not(IsEmpty()));
4076}
4077
4078TEST(IsEmptyTest, WorksWithString) {
4079 string text;
4080 EXPECT_THAT(text, IsEmpty());
4081 text = "foo";
4082 EXPECT_THAT(text, Not(IsEmpty()));
4083 text = string("\0", 1);
4084 EXPECT_THAT(text, Not(IsEmpty()));
4085}
4086
4087TEST(IsEmptyTest, CanDescribeSelf) {
4088 Matcher<vector<int> > m = IsEmpty();
4089 EXPECT_EQ("is empty", Describe(m));
4090 EXPECT_EQ("isn't empty", DescribeNegation(m));
4091}
4092
4093TEST(IsEmptyTest, ExplainsResult) {
4094 Matcher<vector<int> > m = IsEmpty();
4095 vector<int> container;
4096 EXPECT_EQ("", Explain(m, container));
4097 container.push_back(0);
4098 EXPECT_EQ("whose size is 1", Explain(m, container));
4099}
4100
zhanyong.wana31d9ce2013-03-01 01:50:17 +00004101TEST(SizeIsTest, ImplementsSizeIs) {
4102 vector<int> container;
4103 EXPECT_THAT(container, SizeIs(0));
4104 EXPECT_THAT(container, Not(SizeIs(1)));
4105 container.push_back(0);
4106 EXPECT_THAT(container, Not(SizeIs(0)));
4107 EXPECT_THAT(container, SizeIs(1));
4108 container.push_back(0);
4109 EXPECT_THAT(container, Not(SizeIs(0)));
4110 EXPECT_THAT(container, SizeIs(2));
4111}
4112
4113TEST(SizeIsTest, WorksWithMap) {
4114 map<string, int> container;
4115 EXPECT_THAT(container, SizeIs(0));
4116 EXPECT_THAT(container, Not(SizeIs(1)));
4117 container.insert(make_pair("foo", 1));
4118 EXPECT_THAT(container, Not(SizeIs(0)));
4119 EXPECT_THAT(container, SizeIs(1));
4120 container.insert(make_pair("bar", 2));
4121 EXPECT_THAT(container, Not(SizeIs(0)));
4122 EXPECT_THAT(container, SizeIs(2));
4123}
4124
4125TEST(SizeIsTest, WorksWithReferences) {
4126 vector<int> container;
4127 Matcher<const vector<int>&> m = SizeIs(1);
4128 EXPECT_THAT(container, Not(m));
4129 container.push_back(0);
4130 EXPECT_THAT(container, m);
4131}
4132
4133TEST(SizeIsTest, CanDescribeSelf) {
4134 Matcher<vector<int> > m = SizeIs(2);
4135 EXPECT_EQ("size is equal to 2", Describe(m));
4136 EXPECT_EQ("size isn't equal to 2", DescribeNegation(m));
4137}
4138
4139TEST(SizeIsTest, ExplainsResult) {
4140 Matcher<vector<int> > m1 = SizeIs(2);
4141 Matcher<vector<int> > m2 = SizeIs(Lt(2u));
4142 Matcher<vector<int> > m3 = SizeIs(AnyOf(0, 3));
4143 Matcher<vector<int> > m4 = SizeIs(GreaterThan(1));
4144 vector<int> container;
4145 EXPECT_EQ("whose size 0 doesn't match", Explain(m1, container));
4146 EXPECT_EQ("whose size 0 matches", Explain(m2, container));
4147 EXPECT_EQ("whose size 0 matches", Explain(m3, container));
4148 EXPECT_EQ("whose size 0 doesn't match, which is 1 less than 1",
4149 Explain(m4, container));
4150 container.push_back(0);
4151 container.push_back(0);
4152 EXPECT_EQ("whose size 2 matches", Explain(m1, container));
4153 EXPECT_EQ("whose size 2 doesn't match", Explain(m2, container));
4154 EXPECT_EQ("whose size 2 doesn't match", Explain(m3, container));
4155 EXPECT_EQ("whose size 2 matches, which is 1 more than 1",
4156 Explain(m4, container));
4157}
4158
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00004159#if GTEST_HAS_TYPED_TEST
zhanyong.wan6a896b52009-01-16 01:13:50 +00004160// Tests ContainerEq with different container types, and
4161// different element types.
4162
4163template <typename T>
zhanyong.wanb8243162009-06-04 05:48:20 +00004164class ContainerEqTest : public testing::Test {};
zhanyong.wan6a896b52009-01-16 01:13:50 +00004165
4166typedef testing::Types<
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004167 set<int>,
4168 vector<size_t>,
4169 multiset<size_t>,
4170 list<int> >
zhanyong.wan6a896b52009-01-16 01:13:50 +00004171 ContainerEqTestTypes;
4172
4173TYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes);
4174
4175// Tests that the filled container is equal to itself.
4176TYPED_TEST(ContainerEqTest, EqualsSelf) {
4177 static const int vals[] = {1, 1, 2, 3, 5, 8};
4178 TypeParam my_set(vals, vals + 6);
4179 const Matcher<TypeParam> m = ContainerEq(my_set);
4180 EXPECT_TRUE(m.Matches(my_set));
4181 EXPECT_EQ("", Explain(m, my_set));
4182}
4183
4184// Tests that missing values are reported.
4185TYPED_TEST(ContainerEqTest, ValueMissing) {
4186 static const int vals[] = {1, 1, 2, 3, 5, 8};
4187 static const int test_vals[] = {2, 1, 8, 5};
4188 TypeParam my_set(vals, vals + 6);
4189 TypeParam test_set(test_vals, test_vals + 4);
4190 const Matcher<TypeParam> m = ContainerEq(my_set);
4191 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004192 EXPECT_EQ("which doesn't have these expected elements: 3",
4193 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004194}
4195
4196// Tests that added values are reported.
4197TYPED_TEST(ContainerEqTest, ValueAdded) {
4198 static const int vals[] = {1, 1, 2, 3, 5, 8};
4199 static const int test_vals[] = {1, 2, 3, 5, 8, 46};
4200 TypeParam my_set(vals, vals + 6);
4201 TypeParam test_set(test_vals, test_vals + 6);
4202 const Matcher<const TypeParam&> m = ContainerEq(my_set);
4203 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004204 EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004205}
4206
4207// Tests that added and missing values are reported together.
4208TYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) {
4209 static const int vals[] = {1, 1, 2, 3, 5, 8};
4210 static const int test_vals[] = {1, 2, 3, 8, 46};
4211 TypeParam my_set(vals, vals + 6);
4212 TypeParam test_set(test_vals, test_vals + 5);
4213 const Matcher<TypeParam> m = ContainerEq(my_set);
4214 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004215 EXPECT_EQ("which has these unexpected elements: 46,\n"
4216 "and doesn't have these expected elements: 5",
4217 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004218}
4219
4220// Tests duplicated value -- expect no explanation.
4221TYPED_TEST(ContainerEqTest, DuplicateDifference) {
4222 static const int vals[] = {1, 1, 2, 3, 5, 8};
4223 static const int test_vals[] = {1, 2, 3, 5, 8};
4224 TypeParam my_set(vals, vals + 6);
4225 TypeParam test_set(test_vals, test_vals + 5);
4226 const Matcher<const TypeParam&> m = ContainerEq(my_set);
4227 // Depending on the container, match may be true or false
4228 // But in any case there should be no explanation.
4229 EXPECT_EQ("", Explain(m, test_set));
4230}
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00004231#endif // GTEST_HAS_TYPED_TEST
zhanyong.wan6a896b52009-01-16 01:13:50 +00004232
4233// Tests that mutliple missing values are reported.
4234// Using just vector here, so order is predicatble.
4235TEST(ContainerEqExtraTest, MultipleValuesMissing) {
4236 static const int vals[] = {1, 1, 2, 3, 5, 8};
4237 static const int test_vals[] = {2, 1, 5};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004238 vector<int> my_set(vals, vals + 6);
4239 vector<int> test_set(test_vals, test_vals + 3);
4240 const Matcher<vector<int> > m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004241 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004242 EXPECT_EQ("which doesn't have these expected elements: 3, 8",
4243 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004244}
4245
4246// Tests that added values are reported.
4247// Using just vector here, so order is predicatble.
4248TEST(ContainerEqExtraTest, MultipleValuesAdded) {
4249 static const int vals[] = {1, 1, 2, 3, 5, 8};
4250 static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004251 list<size_t> my_set(vals, vals + 6);
4252 list<size_t> test_set(test_vals, test_vals + 7);
4253 const Matcher<const list<size_t>&> m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004254 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004255 EXPECT_EQ("which has these unexpected elements: 92, 46",
4256 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004257}
4258
4259// Tests that added and missing values are reported together.
4260TEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) {
4261 static const int vals[] = {1, 1, 2, 3, 5, 8};
4262 static const int test_vals[] = {1, 2, 3, 92, 46};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004263 list<size_t> my_set(vals, vals + 6);
4264 list<size_t> test_set(test_vals, test_vals + 5);
4265 const Matcher<const list<size_t> > m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004266 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004267 EXPECT_EQ("which has these unexpected elements: 92, 46,\n"
4268 "and doesn't have these expected elements: 5, 8",
zhanyong.wan6a896b52009-01-16 01:13:50 +00004269 Explain(m, test_set));
4270}
4271
4272// Tests to see that duplicate elements are detected,
4273// but (as above) not reported in the explanation.
4274TEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) {
4275 static const int vals[] = {1, 1, 2, 3, 5, 8};
4276 static const int test_vals[] = {1, 2, 3, 5, 8};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004277 vector<int> my_set(vals, vals + 6);
4278 vector<int> test_set(test_vals, test_vals + 5);
4279 const Matcher<vector<int> > m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004280 EXPECT_TRUE(m.Matches(my_set));
4281 EXPECT_FALSE(m.Matches(test_set));
4282 // There is nothing to report when both sets contain all the same values.
4283 EXPECT_EQ("", Explain(m, test_set));
4284}
4285
4286// Tests that ContainerEq works for non-trivial associative containers,
4287// like maps.
4288TEST(ContainerEqExtraTest, WorksForMaps) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004289 map<int, std::string> my_map;
zhanyong.wan6a896b52009-01-16 01:13:50 +00004290 my_map[0] = "a";
4291 my_map[1] = "b";
4292
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004293 map<int, std::string> test_map;
zhanyong.wan6a896b52009-01-16 01:13:50 +00004294 test_map[0] = "aa";
4295 test_map[1] = "b";
4296
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004297 const Matcher<const map<int, std::string>&> m = ContainerEq(my_map);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004298 EXPECT_TRUE(m.Matches(my_map));
4299 EXPECT_FALSE(m.Matches(test_map));
4300
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004301 EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n"
4302 "and doesn't have these expected elements: (0, \"a\")",
zhanyong.wan6a896b52009-01-16 01:13:50 +00004303 Explain(m, test_map));
4304}
4305
zhanyong.wanb8243162009-06-04 05:48:20 +00004306TEST(ContainerEqExtraTest, WorksForNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00004307 int a1[] = {1, 2, 3};
4308 int a2[] = {1, 2, 3};
4309 int b[] = {1, 2, 4};
zhanyong.wanb8243162009-06-04 05:48:20 +00004310
4311 EXPECT_THAT(a1, ContainerEq(a2));
4312 EXPECT_THAT(a1, Not(ContainerEq(b)));
4313}
4314
4315TEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00004316 const char a1[][3] = {"hi", "lo"};
4317 const char a2[][3] = {"hi", "lo"};
4318 const char b[][3] = {"lo", "hi"};
zhanyong.wanb8243162009-06-04 05:48:20 +00004319
4320 // Tests using ContainerEq() in the first dimension.
4321 EXPECT_THAT(a1, ContainerEq(a2));
4322 EXPECT_THAT(a1, Not(ContainerEq(b)));
4323
4324 // Tests using ContainerEq() in the second dimension.
4325 EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1])));
4326 EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1])));
4327}
4328
4329TEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) {
kosak2336e9c2014-07-28 22:57:30 +00004330 const int a1[] = {1, 2, 3};
4331 const int a2[] = {1, 2, 3};
4332 const int b[] = {1, 2, 3, 4};
zhanyong.wanb8243162009-06-04 05:48:20 +00004333
zhanyong.wan2661c682009-06-09 05:42:12 +00004334 const int* const p1 = a1;
4335 EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2));
4336 EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b)));
zhanyong.wanb8243162009-06-04 05:48:20 +00004337
kosak2336e9c2014-07-28 22:57:30 +00004338 const int c[] = {1, 3, 2};
zhanyong.wan2661c682009-06-09 05:42:12 +00004339 EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c)));
zhanyong.wanb8243162009-06-04 05:48:20 +00004340}
4341
4342TEST(ContainerEqExtraTest, CopiesNativeArrayParameter) {
4343 std::string a1[][3] = {
kosak2336e9c2014-07-28 22:57:30 +00004344 {"hi", "hello", "ciao"},
4345 {"bye", "see you", "ciao"}
zhanyong.wanb8243162009-06-04 05:48:20 +00004346 };
4347
4348 std::string a2[][3] = {
kosak2336e9c2014-07-28 22:57:30 +00004349 {"hi", "hello", "ciao"},
4350 {"bye", "see you", "ciao"}
zhanyong.wanb8243162009-06-04 05:48:20 +00004351 };
4352
4353 const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2);
4354 EXPECT_THAT(a1, m);
4355
4356 a2[0][0] = "ha";
4357 EXPECT_THAT(a1, m);
4358}
4359
zhanyong.wan898725c2011-09-16 16:45:39 +00004360TEST(WhenSortedByTest, WorksForEmptyContainer) {
4361 const vector<int> numbers;
4362 EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre()));
4363 EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1))));
4364}
4365
4366TEST(WhenSortedByTest, WorksForNonEmptyContainer) {
4367 vector<unsigned> numbers;
4368 numbers.push_back(3);
4369 numbers.push_back(1);
4370 numbers.push_back(2);
4371 numbers.push_back(2);
4372 EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(),
4373 ElementsAre(3, 2, 2, 1)));
4374 EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(),
4375 ElementsAre(1, 2, 2, 3))));
4376}
4377
4378TEST(WhenSortedByTest, WorksForNonVectorContainer) {
4379 list<string> words;
4380 words.push_back("say");
4381 words.push_back("hello");
4382 words.push_back("world");
4383 EXPECT_THAT(words, WhenSortedBy(less<string>(),
4384 ElementsAre("hello", "say", "world")));
4385 EXPECT_THAT(words, Not(WhenSortedBy(less<string>(),
4386 ElementsAre("say", "hello", "world"))));
4387}
4388
4389TEST(WhenSortedByTest, WorksForNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00004390 const int numbers[] = {1, 3, 2, 4};
4391 const int sorted_numbers[] = {1, 2, 3, 4};
zhanyong.wan898725c2011-09-16 16:45:39 +00004392 EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4)));
4393 EXPECT_THAT(numbers, WhenSortedBy(less<int>(),
4394 ElementsAreArray(sorted_numbers)));
4395 EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4))));
4396}
4397
4398TEST(WhenSortedByTest, CanDescribeSelf) {
4399 const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2));
4400 EXPECT_EQ("(when sorted) has 2 elements where\n"
4401 "element #0 is equal to 1,\n"
4402 "element #1 is equal to 2",
4403 Describe(m));
4404 EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n"
4405 "element #0 isn't equal to 1, or\n"
4406 "element #1 isn't equal to 2",
4407 DescribeNegation(m));
4408}
4409
4410TEST(WhenSortedByTest, ExplainsMatchResult) {
kosak2336e9c2014-07-28 22:57:30 +00004411 const int a[] = {2, 1};
zhanyong.wan898725c2011-09-16 16:45:39 +00004412 EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match",
4413 Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a));
4414 EXPECT_EQ("which is { 1, 2 } when sorted",
4415 Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a));
4416}
4417
4418// WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't
4419// need to test it as exhaustively as we test the latter.
4420
4421TEST(WhenSortedTest, WorksForEmptyContainer) {
4422 const vector<int> numbers;
4423 EXPECT_THAT(numbers, WhenSorted(ElementsAre()));
4424 EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1))));
4425}
4426
4427TEST(WhenSortedTest, WorksForNonEmptyContainer) {
4428 list<string> words;
4429 words.push_back("3");
4430 words.push_back("1");
4431 words.push_back("2");
4432 words.push_back("2");
4433 EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3")));
4434 EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2"))));
4435}
4436
zhanyong.wana9a59e02013-03-27 16:14:55 +00004437TEST(WhenSortedTest, WorksForMapTypes) {
4438 map<string, int> word_counts;
4439 word_counts["and"] = 1;
4440 word_counts["the"] = 1;
4441 word_counts["buffalo"] = 2;
4442 EXPECT_THAT(word_counts, WhenSorted(ElementsAre(
4443 Pair("and", 1), Pair("buffalo", 2), Pair("the", 1))));
4444 EXPECT_THAT(word_counts, Not(WhenSorted(ElementsAre(
4445 Pair("and", 1), Pair("the", 1), Pair("buffalo", 2)))));
4446}
4447
4448TEST(WhenSortedTest, WorksForMultiMapTypes) {
4449 multimap<int, int> ifib;
4450 ifib.insert(make_pair(8, 6));
4451 ifib.insert(make_pair(2, 3));
4452 ifib.insert(make_pair(1, 1));
4453 ifib.insert(make_pair(3, 4));
4454 ifib.insert(make_pair(1, 2));
4455 ifib.insert(make_pair(5, 5));
4456 EXPECT_THAT(ifib, WhenSorted(ElementsAre(Pair(1, 1),
4457 Pair(1, 2),
4458 Pair(2, 3),
4459 Pair(3, 4),
4460 Pair(5, 5),
4461 Pair(8, 6))));
4462 EXPECT_THAT(ifib, Not(WhenSorted(ElementsAre(Pair(8, 6),
4463 Pair(2, 3),
4464 Pair(1, 1),
4465 Pair(3, 4),
4466 Pair(1, 2),
4467 Pair(5, 5)))));
4468}
4469
4470TEST(WhenSortedTest, WorksForPolymorphicMatcher) {
4471 std::deque<int> d;
4472 d.push_back(2);
4473 d.push_back(1);
4474 EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2)));
4475 EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1))));
4476}
4477
4478TEST(WhenSortedTest, WorksForVectorConstRefMatcher) {
4479 std::deque<int> d;
4480 d.push_back(2);
4481 d.push_back(1);
4482 Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2);
4483 EXPECT_THAT(d, WhenSorted(vector_match));
4484 Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1);
4485 EXPECT_THAT(d, Not(WhenSorted(not_vector_match)));
4486}
4487
4488// Deliberately bare pseudo-container.
4489// Offers only begin() and end() accessors, yielding InputIterator.
4490template <typename T>
4491class Streamlike {
4492 private:
4493 class ConstIter;
4494 public:
4495 typedef ConstIter const_iterator;
4496 typedef T value_type;
4497
4498 template <typename InIter>
4499 Streamlike(InIter first, InIter last) : remainder_(first, last) {}
4500
4501 const_iterator begin() const {
4502 return const_iterator(this, remainder_.begin());
4503 }
4504 const_iterator end() const {
4505 return const_iterator(this, remainder_.end());
4506 }
4507
4508 private:
4509 class ConstIter : public std::iterator<std::input_iterator_tag,
4510 value_type,
4511 ptrdiff_t,
kosakcd99eb02014-11-17 02:18:28 +00004512 const value_type*,
4513 const value_type&> {
zhanyong.wana9a59e02013-03-27 16:14:55 +00004514 public:
4515 ConstIter(const Streamlike* s,
4516 typename std::list<value_type>::iterator pos)
4517 : s_(s), pos_(pos) {}
4518
4519 const value_type& operator*() const { return *pos_; }
4520 const value_type* operator->() const { return &*pos_; }
4521 ConstIter& operator++() {
4522 s_->remainder_.erase(pos_++);
4523 return *this;
4524 }
4525
4526 // *iter++ is required to work (see std::istreambuf_iterator).
4527 // (void)iter++ is also required to work.
4528 class PostIncrProxy {
4529 public:
4530 explicit PostIncrProxy(const value_type& value) : value_(value) {}
4531 value_type operator*() const { return value_; }
4532 private:
4533 value_type value_;
4534 };
4535 PostIncrProxy operator++(int) {
4536 PostIncrProxy proxy(**this);
4537 ++(*this);
4538 return proxy;
4539 }
4540
4541 friend bool operator==(const ConstIter& a, const ConstIter& b) {
4542 return a.s_ == b.s_ && a.pos_ == b.pos_;
4543 }
4544 friend bool operator!=(const ConstIter& a, const ConstIter& b) {
4545 return !(a == b);
4546 }
4547
4548 private:
4549 const Streamlike* s_;
4550 typename std::list<value_type>::iterator pos_;
4551 };
4552
4553 friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) {
4554 os << "[";
4555 typedef typename std::list<value_type>::const_iterator Iter;
4556 const char* sep = "";
4557 for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) {
4558 os << sep << *it;
4559 sep = ",";
4560 }
4561 os << "]";
4562 return os;
4563 }
4564
4565 mutable std::list<value_type> remainder_; // modified by iteration
4566};
4567
4568TEST(StreamlikeTest, Iteration) {
kosak2336e9c2014-07-28 22:57:30 +00004569 const int a[5] = {2, 1, 4, 5, 3};
zhanyong.wana9a59e02013-03-27 16:14:55 +00004570 Streamlike<int> s(a, a + 5);
4571 Streamlike<int>::const_iterator it = s.begin();
4572 const int* ip = a;
4573 while (it != s.end()) {
4574 SCOPED_TRACE(ip - a);
4575 EXPECT_EQ(*ip++, *it++);
4576 }
4577}
4578
kosak5b9cbbb2014-11-17 00:28:55 +00004579#if GTEST_HAS_STD_FORWARD_LIST_
kosakb6a34882014-03-12 21:06:46 +00004580TEST(BeginEndDistanceIsTest, WorksWithForwardList) {
4581 std::forward_list<int> container;
4582 EXPECT_THAT(container, BeginEndDistanceIs(0));
4583 EXPECT_THAT(container, Not(BeginEndDistanceIs(1)));
4584 container.push_front(0);
4585 EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));
4586 EXPECT_THAT(container, BeginEndDistanceIs(1));
4587 container.push_front(0);
4588 EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));
4589 EXPECT_THAT(container, BeginEndDistanceIs(2));
4590}
kosak5b9cbbb2014-11-17 00:28:55 +00004591#endif // GTEST_HAS_STD_FORWARD_LIST_
kosakb6a34882014-03-12 21:06:46 +00004592
4593TEST(BeginEndDistanceIsTest, WorksWithNonStdList) {
kosak2336e9c2014-07-28 22:57:30 +00004594 const int a[5] = {1, 2, 3, 4, 5};
kosakb6a34882014-03-12 21:06:46 +00004595 Streamlike<int> s(a, a + 5);
4596 EXPECT_THAT(s, BeginEndDistanceIs(5));
4597}
4598
4599TEST(BeginEndDistanceIsTest, CanDescribeSelf) {
4600 Matcher<vector<int> > m = BeginEndDistanceIs(2);
4601 EXPECT_EQ("distance between begin() and end() is equal to 2", Describe(m));
4602 EXPECT_EQ("distance between begin() and end() isn't equal to 2",
4603 DescribeNegation(m));
4604}
4605
4606TEST(BeginEndDistanceIsTest, ExplainsResult) {
4607 Matcher<vector<int> > m1 = BeginEndDistanceIs(2);
4608 Matcher<vector<int> > m2 = BeginEndDistanceIs(Lt(2));
4609 Matcher<vector<int> > m3 = BeginEndDistanceIs(AnyOf(0, 3));
4610 Matcher<vector<int> > m4 = BeginEndDistanceIs(GreaterThan(1));
4611 vector<int> container;
4612 EXPECT_EQ("whose distance between begin() and end() 0 doesn't match",
4613 Explain(m1, container));
4614 EXPECT_EQ("whose distance between begin() and end() 0 matches",
4615 Explain(m2, container));
4616 EXPECT_EQ("whose distance between begin() and end() 0 matches",
4617 Explain(m3, container));
4618 EXPECT_EQ(
4619 "whose distance between begin() and end() 0 doesn't match, which is 1 "
4620 "less than 1",
4621 Explain(m4, container));
4622 container.push_back(0);
4623 container.push_back(0);
4624 EXPECT_EQ("whose distance between begin() and end() 2 matches",
4625 Explain(m1, container));
4626 EXPECT_EQ("whose distance between begin() and end() 2 doesn't match",
4627 Explain(m2, container));
4628 EXPECT_EQ("whose distance between begin() and end() 2 doesn't match",
4629 Explain(m3, container));
4630 EXPECT_EQ(
4631 "whose distance between begin() and end() 2 matches, which is 1 more "
4632 "than 1",
4633 Explain(m4, container));
4634}
4635
zhanyong.wana9a59e02013-03-27 16:14:55 +00004636TEST(WhenSortedTest, WorksForStreamlike) {
4637 // Streamlike 'container' provides only minimal iterator support.
4638 // Its iterators are tagged with input_iterator_tag.
kosak2336e9c2014-07-28 22:57:30 +00004639 const int a[5] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004640 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wana9a59e02013-03-27 16:14:55 +00004641 EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5)));
4642 EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4643}
4644
4645TEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) {
kosak2336e9c2014-07-28 22:57:30 +00004646 const int a[] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004647 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wana9a59e02013-03-27 16:14:55 +00004648 Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5);
4649 EXPECT_THAT(s, WhenSorted(vector_match));
4650 EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4651}
4652
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004653// Tests using ElementsAre() and ElementsAreArray() with stream-like
4654// "containers".
4655
4656TEST(ElemensAreStreamTest, WorksForStreamlike) {
kosak2336e9c2014-07-28 22:57:30 +00004657 const int a[5] = {1, 2, 3, 4, 5};
kosak6414d802013-12-03 23:19:36 +00004658 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004659 EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5));
4660 EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3)));
4661}
4662
4663TEST(ElemensAreArrayStreamTest, WorksForStreamlike) {
kosak2336e9c2014-07-28 22:57:30 +00004664 const int a[5] = {1, 2, 3, 4, 5};
kosak6414d802013-12-03 23:19:36 +00004665 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004666
4667 vector<int> expected;
4668 expected.push_back(1);
4669 expected.push_back(2);
4670 expected.push_back(3);
4671 expected.push_back(4);
4672 expected.push_back(5);
4673 EXPECT_THAT(s, ElementsAreArray(expected));
4674
4675 expected[3] = 0;
4676 EXPECT_THAT(s, Not(ElementsAreArray(expected)));
4677}
4678
billydonahue1f5fdea2014-05-19 17:54:51 +00004679TEST(ElementsAreTest, WorksWithUncopyable) {
4680 Uncopyable objs[2];
4681 objs[0].set_value(-3);
4682 objs[1].set_value(1);
4683 EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive)));
4684}
4685
kosak06678922014-07-28 20:01:28 +00004686TEST(ElementsAreTest, TakesStlContainer) {
4687 const int actual[] = {3, 1, 2};
4688
4689 ::std::list<int> expected;
4690 expected.push_back(3);
4691 expected.push_back(1);
4692 expected.push_back(2);
4693 EXPECT_THAT(actual, ElementsAreArray(expected));
4694
4695 expected.push_back(4);
4696 EXPECT_THAT(actual, Not(ElementsAreArray(expected)));
4697}
4698
zhanyong.wanfb25d532013-07-28 08:24:00 +00004699// Tests for UnorderedElementsAreArray()
4700
4701TEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) {
kosak2336e9c2014-07-28 22:57:30 +00004702 const int a[] = {0, 1, 2, 3, 4};
kosak6414d802013-12-03 23:19:36 +00004703 std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004704 do {
4705 StringMatchResultListener listener;
4706 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a),
4707 s, &listener)) << listener.str();
4708 } while (std::next_permutation(s.begin(), s.end()));
4709}
4710
4711TEST(UnorderedElementsAreArrayTest, VectorBool) {
kosak2336e9c2014-07-28 22:57:30 +00004712 const bool a[] = {0, 1, 0, 1, 1};
4713 const bool b[] = {1, 0, 1, 1, 0};
kosak6414d802013-12-03 23:19:36 +00004714 std::vector<bool> expected(a, a + GTEST_ARRAY_SIZE_(a));
4715 std::vector<bool> actual(b, b + GTEST_ARRAY_SIZE_(b));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004716 StringMatchResultListener listener;
4717 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected),
4718 actual, &listener)) << listener.str();
4719}
4720
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004721TEST(UnorderedElementsAreArrayTest, WorksForStreamlike) {
4722 // Streamlike 'container' provides only minimal iterator support.
4723 // Its iterators are tagged with input_iterator_tag, and it has no
4724 // size() or empty() methods.
kosak2336e9c2014-07-28 22:57:30 +00004725 const int a[5] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004726 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004727
4728 ::std::vector<int> expected;
4729 expected.push_back(1);
4730 expected.push_back(2);
4731 expected.push_back(3);
4732 expected.push_back(4);
4733 expected.push_back(5);
4734 EXPECT_THAT(s, UnorderedElementsAreArray(expected));
4735
4736 expected.push_back(6);
4737 EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected)));
4738}
4739
kosak06678922014-07-28 20:01:28 +00004740TEST(UnorderedElementsAreArrayTest, TakesStlContainer) {
4741 const int actual[] = {3, 1, 2};
4742
4743 ::std::list<int> expected;
4744 expected.push_back(1);
4745 expected.push_back(2);
4746 expected.push_back(3);
4747 EXPECT_THAT(actual, UnorderedElementsAreArray(expected));
4748
4749 expected.push_back(4);
4750 EXPECT_THAT(actual, Not(UnorderedElementsAreArray(expected)));
4751}
4752
kosak18489fa2013-12-04 23:49:07 +00004753#if GTEST_HAS_STD_INITIALIZER_LIST_
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004754
4755TEST(UnorderedElementsAreArrayTest, TakesInitializerList) {
kosak2336e9c2014-07-28 22:57:30 +00004756 const int a[5] = {2, 1, 4, 5, 3};
4757 EXPECT_THAT(a, UnorderedElementsAreArray({1, 2, 3, 4, 5}));
4758 EXPECT_THAT(a, Not(UnorderedElementsAreArray({1, 2, 3, 4, 6})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004759}
4760
4761TEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) {
kosak2336e9c2014-07-28 22:57:30 +00004762 const string a[5] = {"a", "b", "c", "d", "e"};
4763 EXPECT_THAT(a, UnorderedElementsAreArray({"a", "b", "c", "d", "e"}));
4764 EXPECT_THAT(a, Not(UnorderedElementsAreArray({"a", "b", "c", "d", "ef"})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004765}
4766
4767TEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) {
kosak2336e9c2014-07-28 22:57:30 +00004768 const int a[5] = {2, 1, 4, 5, 3};
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004769 EXPECT_THAT(a, UnorderedElementsAreArray(
kosak2336e9c2014-07-28 22:57:30 +00004770 {Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)}));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004771 EXPECT_THAT(a, Not(UnorderedElementsAreArray(
kosak2336e9c2014-07-28 22:57:30 +00004772 {Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004773}
4774
4775TEST(UnorderedElementsAreArrayTest,
4776 TakesInitializerListOfDifferentTypedMatchers) {
kosak2336e9c2014-07-28 22:57:30 +00004777 const int a[5] = {2, 1, 4, 5, 3};
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004778 // The compiler cannot infer the type of the initializer list if its
4779 // elements have different types. We must explicitly specify the
4780 // unified element type in this case.
4781 EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int> >(
kosak2336e9c2014-07-28 22:57:30 +00004782 {Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)}));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004783 EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int> >(
kosak2336e9c2014-07-28 22:57:30 +00004784 {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004785}
4786
kosak18489fa2013-12-04 23:49:07 +00004787#endif // GTEST_HAS_STD_INITIALIZER_LIST_
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004788
zhanyong.wanfb25d532013-07-28 08:24:00 +00004789class UnorderedElementsAreTest : public testing::Test {
4790 protected:
4791 typedef std::vector<int> IntVec;
4792};
4793
billydonahue1f5fdea2014-05-19 17:54:51 +00004794TEST_F(UnorderedElementsAreTest, WorksWithUncopyable) {
4795 Uncopyable objs[2];
4796 objs[0].set_value(-3);
4797 objs[1].set_value(1);
4798 EXPECT_THAT(objs,
4799 UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3)));
4800}
4801
zhanyong.wanfb25d532013-07-28 08:24:00 +00004802TEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) {
kosak2336e9c2014-07-28 22:57:30 +00004803 const int a[] = {1, 2, 3};
kosak6414d802013-12-03 23:19:36 +00004804 std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004805 do {
4806 StringMatchResultListener listener;
4807 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4808 s, &listener)) << listener.str();
4809 } while (std::next_permutation(s.begin(), s.end()));
4810}
4811
4812TEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) {
kosak2336e9c2014-07-28 22:57:30 +00004813 const int a[] = {1, 2, 3};
kosak6414d802013-12-03 23:19:36 +00004814 std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004815 std::vector<Matcher<int> > mv;
4816 mv.push_back(1);
4817 mv.push_back(2);
4818 mv.push_back(2);
4819 // The element with value '3' matches nothing: fail fast.
4820 StringMatchResultListener listener;
4821 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4822 s, &listener)) << listener.str();
4823}
4824
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004825TEST_F(UnorderedElementsAreTest, WorksForStreamlike) {
4826 // Streamlike 'container' provides only minimal iterator support.
4827 // Its iterators are tagged with input_iterator_tag, and it has no
4828 // size() or empty() methods.
kosak2336e9c2014-07-28 22:57:30 +00004829 const int a[5] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004830 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004831
4832 EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5));
4833 EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5)));
4834}
4835
zhanyong.wanfb25d532013-07-28 08:24:00 +00004836// One naive implementation of the matcher runs in O(N!) time, which is too
4837// slow for many real-world inputs. This test shows that our matcher can match
4838// 100 inputs very quickly (a few milliseconds). An O(100!) is 10^158
4839// iterations and obviously effectively incomputable.
4840// [ RUN ] UnorderedElementsAreTest.Performance
4841// [ OK ] UnorderedElementsAreTest.Performance (4 ms)
4842TEST_F(UnorderedElementsAreTest, Performance) {
4843 std::vector<int> s;
4844 std::vector<Matcher<int> > mv;
4845 for (int i = 0; i < 100; ++i) {
4846 s.push_back(i);
4847 mv.push_back(_);
4848 }
4849 mv[50] = Eq(0);
4850 StringMatchResultListener listener;
4851 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4852 s, &listener)) << listener.str();
4853}
4854
4855// Another variant of 'Performance' with similar expectations.
4856// [ RUN ] UnorderedElementsAreTest.PerformanceHalfStrict
4857// [ OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms)
4858TEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) {
4859 std::vector<int> s;
4860 std::vector<Matcher<int> > mv;
4861 for (int i = 0; i < 100; ++i) {
4862 s.push_back(i);
4863 if (i & 1) {
4864 mv.push_back(_);
4865 } else {
4866 mv.push_back(i);
4867 }
4868 }
4869 StringMatchResultListener listener;
4870 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4871 s, &listener)) << listener.str();
4872}
4873
4874TEST_F(UnorderedElementsAreTest, FailMessageCountWrong) {
4875 std::vector<int> v;
4876 v.push_back(4);
4877 StringMatchResultListener listener;
4878 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4879 v, &listener)) << listener.str();
4880 EXPECT_THAT(listener.str(), Eq("which has 1 element"));
4881}
4882
4883TEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) {
4884 std::vector<int> v;
4885 StringMatchResultListener listener;
4886 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4887 v, &listener)) << listener.str();
4888 EXPECT_THAT(listener.str(), Eq(""));
4889}
4890
4891TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) {
4892 std::vector<int> v;
4893 v.push_back(1);
4894 v.push_back(1);
4895 StringMatchResultListener listener;
4896 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4897 v, &listener)) << listener.str();
4898 EXPECT_THAT(
4899 listener.str(),
4900 Eq("where the following matchers don't match any elements:\n"
4901 "matcher #1: is equal to 2"));
4902}
4903
4904TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) {
4905 std::vector<int> v;
4906 v.push_back(1);
4907 v.push_back(2);
4908 StringMatchResultListener listener;
4909 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1),
4910 v, &listener)) << listener.str();
4911 EXPECT_THAT(
4912 listener.str(),
4913 Eq("where the following elements don't match any matchers:\n"
4914 "element #1: 2"));
4915}
4916
4917TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) {
4918 std::vector<int> v;
4919 v.push_back(2);
4920 v.push_back(3);
4921 StringMatchResultListener listener;
4922 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4923 v, &listener)) << listener.str();
4924 EXPECT_THAT(
4925 listener.str(),
4926 Eq("where"
4927 " the following matchers don't match any elements:\n"
4928 "matcher #0: is equal to 1\n"
4929 "and"
4930 " where"
4931 " the following elements don't match any matchers:\n"
4932 "element #1: 3"));
4933}
4934
4935// Test helper for formatting element, matcher index pairs in expectations.
4936static string EMString(int element, int matcher) {
4937 stringstream ss;
4938 ss << "(element #" << element << ", matcher #" << matcher << ")";
4939 return ss.str();
4940}
4941
4942TEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) {
4943 // A situation where all elements and matchers have a match
4944 // associated with them, but the max matching is not perfect.
4945 std::vector<string> v;
4946 v.push_back("a");
4947 v.push_back("b");
4948 v.push_back("c");
4949 StringMatchResultListener listener;
4950 EXPECT_FALSE(ExplainMatchResult(
4951 UnorderedElementsAre("a", "a", AnyOf("b", "c")), v, &listener))
4952 << listener.str();
4953
4954 string prefix =
4955 "where no permutation of the elements can satisfy all matchers, "
4956 "and the closest match is 2 of 3 matchers with the "
4957 "pairings:\n";
4958
4959 // We have to be a bit loose here, because there are 4 valid max matches.
4960 EXPECT_THAT(
4961 listener.str(),
4962 AnyOf(prefix + "{\n " + EMString(0, 0) +
4963 ",\n " + EMString(1, 2) + "\n}",
4964 prefix + "{\n " + EMString(0, 1) +
4965 ",\n " + EMString(1, 2) + "\n}",
4966 prefix + "{\n " + EMString(0, 0) +
4967 ",\n " + EMString(2, 2) + "\n}",
4968 prefix + "{\n " + EMString(0, 1) +
4969 ",\n " + EMString(2, 2) + "\n}"));
4970}
4971
4972TEST_F(UnorderedElementsAreTest, Describe) {
4973 EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()),
4974 Eq("is empty"));
4975 EXPECT_THAT(
4976 Describe<IntVec>(UnorderedElementsAre(345)),
4977 Eq("has 1 element and that element is equal to 345"));
4978 EXPECT_THAT(
4979 Describe<IntVec>(UnorderedElementsAre(111, 222, 333)),
4980 Eq("has 3 elements and there exists some permutation "
4981 "of elements such that:\n"
4982 " - element #0 is equal to 111, and\n"
4983 " - element #1 is equal to 222, and\n"
4984 " - element #2 is equal to 333"));
4985}
4986
4987TEST_F(UnorderedElementsAreTest, DescribeNegation) {
4988 EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()),
4989 Eq("isn't empty"));
4990 EXPECT_THAT(
4991 DescribeNegation<IntVec>(UnorderedElementsAre(345)),
4992 Eq("doesn't have 1 element, or has 1 element that isn't equal to 345"));
4993 EXPECT_THAT(
4994 DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)),
4995 Eq("doesn't have 3 elements, or there exists no permutation "
4996 "of elements such that:\n"
4997 " - element #0 is equal to 123, and\n"
4998 " - element #1 is equal to 234, and\n"
4999 " - element #2 is equal to 345"));
5000}
5001
5002namespace {
5003
5004// Used as a check on the more complex max flow method used in the
5005// real testing::internal::FindMaxBipartiteMatching. This method is
5006// compatible but runs in worst-case factorial time, so we only
5007// use it in testing for small problem sizes.
5008template <typename Graph>
5009class BacktrackingMaxBPMState {
5010 public:
5011 // Does not take ownership of 'g'.
5012 explicit BacktrackingMaxBPMState(const Graph* g) : graph_(g) { }
5013
5014 ElementMatcherPairs Compute() {
5015 if (graph_->LhsSize() == 0 || graph_->RhsSize() == 0) {
5016 return best_so_far_;
5017 }
5018 lhs_used_.assign(graph_->LhsSize(), kUnused);
5019 rhs_used_.assign(graph_->RhsSize(), kUnused);
5020 for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {
5021 matches_.clear();
5022 RecurseInto(irhs);
5023 if (best_so_far_.size() == graph_->RhsSize())
5024 break;
5025 }
5026 return best_so_far_;
5027 }
5028
5029 private:
5030 static const size_t kUnused = static_cast<size_t>(-1);
5031
5032 void PushMatch(size_t lhs, size_t rhs) {
5033 matches_.push_back(ElementMatcherPair(lhs, rhs));
5034 lhs_used_[lhs] = rhs;
5035 rhs_used_[rhs] = lhs;
5036 if (matches_.size() > best_so_far_.size()) {
5037 best_so_far_ = matches_;
5038 }
5039 }
5040
5041 void PopMatch() {
5042 const ElementMatcherPair& back = matches_.back();
5043 lhs_used_[back.first] = kUnused;
5044 rhs_used_[back.second] = kUnused;
5045 matches_.pop_back();
5046 }
5047
5048 bool RecurseInto(size_t irhs) {
5049 if (rhs_used_[irhs] != kUnused) {
5050 return true;
5051 }
5052 for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {
5053 if (lhs_used_[ilhs] != kUnused) {
5054 continue;
5055 }
5056 if (!graph_->HasEdge(ilhs, irhs)) {
5057 continue;
5058 }
5059 PushMatch(ilhs, irhs);
5060 if (best_so_far_.size() == graph_->RhsSize()) {
5061 return false;
5062 }
5063 for (size_t mi = irhs + 1; mi < graph_->RhsSize(); ++mi) {
5064 if (!RecurseInto(mi)) return false;
5065 }
5066 PopMatch();
5067 }
5068 return true;
5069 }
5070
5071 const Graph* graph_; // not owned
5072 std::vector<size_t> lhs_used_;
5073 std::vector<size_t> rhs_used_;
5074 ElementMatcherPairs matches_;
5075 ElementMatcherPairs best_so_far_;
5076};
5077
5078template <typename Graph>
5079const size_t BacktrackingMaxBPMState<Graph>::kUnused;
5080
5081} // namespace
5082
5083// Implement a simple backtracking algorithm to determine if it is possible
5084// to find one element per matcher, without reusing elements.
5085template <typename Graph>
5086ElementMatcherPairs
5087FindBacktrackingMaxBPM(const Graph& g) {
5088 return BacktrackingMaxBPMState<Graph>(&g).Compute();
5089}
5090
5091class BacktrackingBPMTest : public ::testing::Test { };
5092
5093// Tests the MaxBipartiteMatching algorithm with square matrices.
5094// The single int param is the # of nodes on each of the left and right sides.
5095class BipartiteTest : public ::testing::TestWithParam<int> { };
5096
5097// Verify all match graphs up to some moderate number of edges.
5098TEST_P(BipartiteTest, Exhaustive) {
5099 int nodes = GetParam();
5100 MatchMatrix graph(nodes, nodes);
5101 do {
5102 ElementMatcherPairs matches =
5103 internal::FindMaxBipartiteMatching(graph);
5104 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), matches.size())
5105 << "graph: " << graph.DebugString();
5106 // Check that all elements of matches are in the graph.
5107 // Check that elements of first and second are unique.
5108 std::vector<bool> seen_element(graph.LhsSize());
5109 std::vector<bool> seen_matcher(graph.RhsSize());
5110 SCOPED_TRACE(PrintToString(matches));
5111 for (size_t i = 0; i < matches.size(); ++i) {
5112 size_t ilhs = matches[i].first;
5113 size_t irhs = matches[i].second;
5114 EXPECT_TRUE(graph.HasEdge(ilhs, irhs));
5115 EXPECT_FALSE(seen_element[ilhs]);
5116 EXPECT_FALSE(seen_matcher[irhs]);
5117 seen_element[ilhs] = true;
5118 seen_matcher[irhs] = true;
5119 }
5120 } while (graph.NextGraph());
5121}
5122
5123INSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteTest,
5124 ::testing::Range(0, 5));
5125
5126// Parameterized by a pair interpreted as (LhsSize, RhsSize).
5127class BipartiteNonSquareTest
5128 : public ::testing::TestWithParam<std::pair<size_t, size_t> > {
5129};
5130
5131TEST_F(BipartiteNonSquareTest, SimpleBacktracking) {
5132 // .......
5133 // 0:-----\ :
5134 // 1:---\ | :
5135 // 2:---\ | :
5136 // 3:-\ | | :
5137 // :.......:
5138 // 0 1 2
5139 MatchMatrix g(4, 3);
kosak2336e9c2014-07-28 22:57:30 +00005140 static const int kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}};
kosak6414d802013-12-03 23:19:36 +00005141 for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) {
zhanyong.wanfb25d532013-07-28 08:24:00 +00005142 g.SetEdge(kEdges[i][0], kEdges[i][1], true);
5143 }
5144 EXPECT_THAT(FindBacktrackingMaxBPM(g),
5145 ElementsAre(Pair(3, 0),
5146 Pair(AnyOf(1, 2), 1),
5147 Pair(0, 2))) << g.DebugString();
5148}
5149
5150// Verify a few nonsquare matrices.
5151TEST_P(BipartiteNonSquareTest, Exhaustive) {
5152 size_t nlhs = GetParam().first;
5153 size_t nrhs = GetParam().second;
5154 MatchMatrix graph(nlhs, nrhs);
5155 do {
5156 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
5157 internal::FindMaxBipartiteMatching(graph).size())
5158 << "graph: " << graph.DebugString()
5159 << "\nbacktracking: "
5160 << PrintToString(FindBacktrackingMaxBPM(graph))
5161 << "\nmax flow: "
5162 << PrintToString(internal::FindMaxBipartiteMatching(graph));
5163 } while (graph.NextGraph());
5164}
5165
5166INSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteNonSquareTest,
5167 testing::Values(
5168 std::make_pair(1, 2),
5169 std::make_pair(2, 1),
5170 std::make_pair(3, 2),
5171 std::make_pair(2, 3),
5172 std::make_pair(4, 1),
5173 std::make_pair(1, 4),
5174 std::make_pair(4, 3),
5175 std::make_pair(3, 4)));
5176
5177class BipartiteRandomTest
5178 : public ::testing::TestWithParam<std::pair<int, int> > {
5179};
5180
5181// Verifies a large sample of larger graphs.
5182TEST_P(BipartiteRandomTest, LargerNets) {
5183 int nodes = GetParam().first;
5184 int iters = GetParam().second;
5185 MatchMatrix graph(nodes, nodes);
5186
5187 testing::internal::Int32 seed = GTEST_FLAG(random_seed);
5188 if (seed == 0) {
5189 seed = static_cast<testing::internal::Int32>(time(NULL));
5190 }
5191
5192 for (; iters > 0; --iters, ++seed) {
5193 srand(static_cast<int>(seed));
5194 graph.Randomize();
5195 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
5196 internal::FindMaxBipartiteMatching(graph).size())
5197 << " graph: " << graph.DebugString()
5198 << "\nTo reproduce the failure, rerun the test with the flag"
5199 " --" << GTEST_FLAG_PREFIX_ << "random_seed=" << seed;
5200 }
5201}
5202
5203// Test argument is a std::pair<int, int> representing (nodes, iters).
5204INSTANTIATE_TEST_CASE_P(Samples, BipartiteRandomTest,
5205 testing::Values(
5206 std::make_pair(5, 10000),
5207 std::make_pair(6, 5000),
5208 std::make_pair(7, 2000),
5209 std::make_pair(8, 500),
5210 std::make_pair(9, 100)));
5211
zhanyong.wan736baa82010-09-27 17:44:16 +00005212// Tests IsReadableTypeName().
5213
5214TEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) {
5215 EXPECT_TRUE(IsReadableTypeName("int"));
5216 EXPECT_TRUE(IsReadableTypeName("const unsigned char*"));
5217 EXPECT_TRUE(IsReadableTypeName("MyMap<int, void*>"));
5218 EXPECT_TRUE(IsReadableTypeName("void (*)(int, bool)"));
5219}
5220
5221TEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) {
5222 EXPECT_TRUE(IsReadableTypeName("my_long_namespace::MyClassName"));
5223 EXPECT_TRUE(IsReadableTypeName("int [5][6][7][8][9][10][11]"));
5224 EXPECT_TRUE(IsReadableTypeName("my_namespace::MyOuterClass::MyInnerClass"));
5225}
5226
5227TEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) {
5228 EXPECT_FALSE(
5229 IsReadableTypeName("basic_string<char, std::char_traits<char> >"));
5230 EXPECT_FALSE(IsReadableTypeName("std::vector<int, std::alloc_traits<int> >"));
5231}
5232
5233TEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) {
5234 EXPECT_FALSE(IsReadableTypeName("void (&)(int, bool, char, float)"));
5235}
5236
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005237// Tests JoinAsTuple().
5238
5239TEST(JoinAsTupleTest, JoinsEmptyTuple) {
5240 EXPECT_EQ("", JoinAsTuple(Strings()));
5241}
5242
5243TEST(JoinAsTupleTest, JoinsOneTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005244 const char* fields[] = {"1"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005245 EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1)));
5246}
5247
5248TEST(JoinAsTupleTest, JoinsTwoTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005249 const char* fields[] = {"1", "a"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005250 EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2)));
5251}
5252
5253TEST(JoinAsTupleTest, JoinsTenTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005254 const char* fields[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005255 EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)",
5256 JoinAsTuple(Strings(fields, fields + 10)));
5257}
5258
5259// Tests FormatMatcherDescription().
5260
5261TEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) {
5262 EXPECT_EQ("is even",
zhanyong.wanb4140802010-06-08 22:53:57 +00005263 FormatMatcherDescription(false, "IsEven", Strings()));
5264 EXPECT_EQ("not (is even)",
5265 FormatMatcherDescription(true, "IsEven", Strings()));
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005266
kosak2336e9c2014-07-28 22:57:30 +00005267 const char* params[] = {"5"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005268 EXPECT_EQ("equals 5",
zhanyong.wanb4140802010-06-08 22:53:57 +00005269 FormatMatcherDescription(false, "Equals",
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005270 Strings(params, params + 1)));
5271
kosak2336e9c2014-07-28 22:57:30 +00005272 const char* params2[] = {"5", "8"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005273 EXPECT_EQ("is in range (5, 8)",
zhanyong.wanb4140802010-06-08 22:53:57 +00005274 FormatMatcherDescription(false, "IsInRange",
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005275 Strings(params2, params2 + 2)));
5276}
5277
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00005278// Tests PolymorphicMatcher::mutable_impl().
5279TEST(PolymorphicMatcherTest, CanAccessMutableImpl) {
5280 PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
5281 DivisibleByImpl& impl = m.mutable_impl();
5282 EXPECT_EQ(42, impl.divider());
5283
5284 impl.set_divider(0);
5285 EXPECT_EQ(0, m.mutable_impl().divider());
5286}
5287
5288// Tests PolymorphicMatcher::impl().
5289TEST(PolymorphicMatcherTest, CanAccessImpl) {
5290 const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
5291 const DivisibleByImpl& impl = m.impl();
5292 EXPECT_EQ(42, impl.divider());
5293}
5294
zhanyong.wanb1c7f932010-03-24 17:35:11 +00005295TEST(MatcherTupleTest, ExplainsMatchFailure) {
5296 stringstream ss1;
5297 ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)),
5298 make_tuple('a', 10), &ss1);
5299 EXPECT_EQ("", ss1.str()); // Successful match.
5300
5301 stringstream ss2;
5302 ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5303 make_tuple(2, 'b'), &ss2);
5304 EXPECT_EQ(" Expected arg #0: is > 5\n"
5305 " Actual: 2, which is 3 less than 5\n"
zhanyong.wand60c5f42010-07-21 22:21:07 +00005306 " Expected arg #1: is equal to 'a' (97, 0x61)\n"
5307 " Actual: 'b' (98, 0x62)\n",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00005308 ss2.str()); // Failed match where both arguments need explanation.
5309
5310 stringstream ss3;
5311 ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5312 make_tuple(2, 'a'), &ss3);
5313 EXPECT_EQ(" Expected arg #0: is > 5\n"
5314 " Actual: 2, which is 3 less than 5\n",
5315 ss3.str()); // Failed match where only one argument needs
5316 // explanation.
5317}
5318
zhanyong.wan33605ba2010-04-22 23:37:47 +00005319// Tests Each().
5320
5321TEST(EachTest, ExplainsMatchResultCorrectly) {
5322 set<int> a; // empty
5323
5324 Matcher<set<int> > m = Each(2);
5325 EXPECT_EQ("", Explain(m, a));
5326
zhanyong.wan736baa82010-09-27 17:44:16 +00005327 Matcher<const int(&)[1]> n = Each(1); // NOLINT
zhanyong.wan33605ba2010-04-22 23:37:47 +00005328
kosak2336e9c2014-07-28 22:57:30 +00005329 const int b[1] = {1};
zhanyong.wan33605ba2010-04-22 23:37:47 +00005330 EXPECT_EQ("", Explain(n, b));
5331
5332 n = Each(3);
5333 EXPECT_EQ("whose element #0 doesn't match", Explain(n, b));
5334
5335 a.insert(1);
5336 a.insert(2);
5337 a.insert(3);
5338 m = Each(GreaterThan(0));
5339 EXPECT_EQ("", Explain(m, a));
5340
5341 m = Each(GreaterThan(10));
5342 EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10",
5343 Explain(m, a));
5344}
5345
5346TEST(EachTest, DescribesItselfCorrectly) {
5347 Matcher<vector<int> > m = Each(1);
5348 EXPECT_EQ("only contains elements that is equal to 1", Describe(m));
5349
5350 Matcher<vector<int> > m2 = Not(m);
5351 EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2));
5352}
5353
5354TEST(EachTest, MatchesVectorWhenAllElementsMatch) {
5355 vector<int> some_vector;
5356 EXPECT_THAT(some_vector, Each(1));
5357 some_vector.push_back(3);
5358 EXPECT_THAT(some_vector, Not(Each(1)));
5359 EXPECT_THAT(some_vector, Each(3));
5360 some_vector.push_back(1);
5361 some_vector.push_back(2);
5362 EXPECT_THAT(some_vector, Not(Each(3)));
5363 EXPECT_THAT(some_vector, Each(Lt(3.5)));
5364
5365 vector<string> another_vector;
5366 another_vector.push_back("fee");
5367 EXPECT_THAT(another_vector, Each(string("fee")));
5368 another_vector.push_back("fie");
5369 another_vector.push_back("foe");
5370 another_vector.push_back("fum");
5371 EXPECT_THAT(another_vector, Not(Each(string("fee"))));
5372}
5373
5374TEST(EachTest, MatchesMapWhenAllElementsMatch) {
5375 map<const char*, int> my_map;
5376 const char* bar = "a string";
5377 my_map[bar] = 2;
5378 EXPECT_THAT(my_map, Each(make_pair(bar, 2)));
5379
5380 map<string, int> another_map;
5381 EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
5382 another_map["fee"] = 1;
5383 EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
5384 another_map["fie"] = 2;
5385 another_map["foe"] = 3;
5386 another_map["fum"] = 4;
5387 EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1))));
5388 EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1))));
5389 EXPECT_THAT(another_map, Each(Pair(_, Gt(0))));
5390}
5391
5392TEST(EachTest, AcceptsMatcher) {
kosak2336e9c2014-07-28 22:57:30 +00005393 const int a[] = {1, 2, 3};
zhanyong.wan33605ba2010-04-22 23:37:47 +00005394 EXPECT_THAT(a, Each(Gt(0)));
5395 EXPECT_THAT(a, Not(Each(Gt(1))));
5396}
5397
5398TEST(EachTest, WorksForNativeArrayAsTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005399 const int a[] = {1, 2};
zhanyong.wan33605ba2010-04-22 23:37:47 +00005400 const int* const pointer = a;
5401 EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0)));
5402 EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1))));
5403}
5404
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005405// For testing Pointwise().
5406class IsHalfOfMatcher {
5407 public:
5408 template <typename T1, typename T2>
5409 bool MatchAndExplain(const tuple<T1, T2>& a_pair,
5410 MatchResultListener* listener) const {
5411 if (get<0>(a_pair) == get<1>(a_pair)/2) {
5412 *listener << "where the second is " << get<1>(a_pair);
5413 return true;
5414 } else {
5415 *listener << "where the second/2 is " << get<1>(a_pair)/2;
5416 return false;
5417 }
5418 }
5419
5420 void DescribeTo(ostream* os) const {
5421 *os << "are a pair where the first is half of the second";
5422 }
5423
5424 void DescribeNegationTo(ostream* os) const {
5425 *os << "are a pair where the first isn't half of the second";
5426 }
5427};
5428
5429PolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() {
5430 return MakePolymorphicMatcher(IsHalfOfMatcher());
5431}
5432
5433TEST(PointwiseTest, DescribesSelf) {
5434 vector<int> rhs;
5435 rhs.push_back(1);
5436 rhs.push_back(2);
5437 rhs.push_back(3);
5438 const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs);
5439 EXPECT_EQ("contains 3 values, where each value and its corresponding value "
5440 "in { 1, 2, 3 } are a pair where the first is half of the second",
5441 Describe(m));
5442 EXPECT_EQ("doesn't contain exactly 3 values, or contains a value x at some "
5443 "index i where x and the i-th value of { 1, 2, 3 } are a pair "
5444 "where the first isn't half of the second",
5445 DescribeNegation(m));
5446}
5447
5448TEST(PointwiseTest, MakesCopyOfRhs) {
5449 list<signed char> rhs;
5450 rhs.push_back(2);
5451 rhs.push_back(4);
5452
kosak2336e9c2014-07-28 22:57:30 +00005453 int lhs[] = {1, 2};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005454 const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs);
5455 EXPECT_THAT(lhs, m);
5456
5457 // Changing rhs now shouldn't affect m, which made a copy of rhs.
5458 rhs.push_back(6);
5459 EXPECT_THAT(lhs, m);
5460}
5461
5462TEST(PointwiseTest, WorksForLhsNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00005463 const int lhs[] = {1, 2, 3};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005464 vector<int> rhs;
5465 rhs.push_back(2);
5466 rhs.push_back(4);
5467 rhs.push_back(6);
5468 EXPECT_THAT(lhs, Pointwise(Lt(), rhs));
5469 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5470}
5471
5472TEST(PointwiseTest, WorksForRhsNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00005473 const int rhs[] = {1, 2, 3};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005474 vector<int> lhs;
5475 lhs.push_back(2);
5476 lhs.push_back(4);
5477 lhs.push_back(6);
5478 EXPECT_THAT(lhs, Pointwise(Gt(), rhs));
5479 EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs)));
5480}
5481
kosak2336e9c2014-07-28 22:57:30 +00005482#if GTEST_HAS_STD_INITIALIZER_LIST_
5483
5484TEST(PointwiseTest, WorksForRhsInitializerList) {
5485 const vector<int> lhs{2, 4, 6};
5486 EXPECT_THAT(lhs, Pointwise(Gt(), {1, 2, 3}));
5487 EXPECT_THAT(lhs, Not(Pointwise(Lt(), {3, 3, 7})));
5488}
5489
5490#endif // GTEST_HAS_STD_INITIALIZER_LIST_
5491
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005492TEST(PointwiseTest, RejectsWrongSize) {
kosak2336e9c2014-07-28 22:57:30 +00005493 const double lhs[2] = {1, 2};
5494 const int rhs[1] = {0};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005495 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5496 EXPECT_EQ("which contains 2 values",
5497 Explain(Pointwise(Gt(), rhs), lhs));
5498
kosak2336e9c2014-07-28 22:57:30 +00005499 const int rhs2[3] = {0, 1, 2};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005500 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2)));
5501}
5502
5503TEST(PointwiseTest, RejectsWrongContent) {
kosak2336e9c2014-07-28 22:57:30 +00005504 const double lhs[3] = {1, 2, 3};
5505 const int rhs[3] = {2, 6, 4};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005506 EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs)));
5507 EXPECT_EQ("where the value pair (2, 6) at index #1 don't match, "
5508 "where the second/2 is 3",
5509 Explain(Pointwise(IsHalfOf(), rhs), lhs));
5510}
5511
5512TEST(PointwiseTest, AcceptsCorrectContent) {
kosak2336e9c2014-07-28 22:57:30 +00005513 const double lhs[3] = {1, 2, 3};
5514 const int rhs[3] = {2, 4, 6};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005515 EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs));
5516 EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs));
5517}
5518
5519TEST(PointwiseTest, AllowsMonomorphicInnerMatcher) {
kosak2336e9c2014-07-28 22:57:30 +00005520 const double lhs[3] = {1, 2, 3};
5521 const int rhs[3] = {2, 4, 6};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005522 const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();
5523 EXPECT_THAT(lhs, Pointwise(m1, rhs));
5524 EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs));
5525
5526 // This type works as a tuple<const double&, const int&> can be
5527 // implicitly cast to tuple<double, int>.
5528 const Matcher<tuple<double, int> > m2 = IsHalfOf();
5529 EXPECT_THAT(lhs, Pointwise(m2, rhs));
5530 EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs));
5531}
5532
kosak2336e9c2014-07-28 22:57:30 +00005533TEST(UnorderedPointwiseTest, DescribesSelf) {
5534 vector<int> rhs;
5535 rhs.push_back(1);
5536 rhs.push_back(2);
5537 rhs.push_back(3);
5538 const Matcher<const vector<int>&> m = UnorderedPointwise(IsHalfOf(), rhs);
5539 EXPECT_EQ(
5540 "has 3 elements and there exists some permutation of elements such "
5541 "that:\n"
5542 " - element #0 and 1 are a pair where the first is half of the second, "
5543 "and\n"
5544 " - element #1 and 2 are a pair where the first is half of the second, "
5545 "and\n"
5546 " - element #2 and 3 are a pair where the first is half of the second",
5547 Describe(m));
5548 EXPECT_EQ(
5549 "doesn't have 3 elements, or there exists no permutation of elements "
5550 "such that:\n"
5551 " - element #0 and 1 are a pair where the first is half of the second, "
5552 "and\n"
5553 " - element #1 and 2 are a pair where the first is half of the second, "
5554 "and\n"
5555 " - element #2 and 3 are a pair where the first is half of the second",
5556 DescribeNegation(m));
5557}
5558
5559TEST(UnorderedPointwiseTest, MakesCopyOfRhs) {
5560 list<signed char> rhs;
5561 rhs.push_back(2);
5562 rhs.push_back(4);
5563
5564 int lhs[] = {2, 1};
5565 const Matcher<const int (&)[2]> m = UnorderedPointwise(IsHalfOf(), rhs);
5566 EXPECT_THAT(lhs, m);
5567
5568 // Changing rhs now shouldn't affect m, which made a copy of rhs.
5569 rhs.push_back(6);
5570 EXPECT_THAT(lhs, m);
5571}
5572
5573TEST(UnorderedPointwiseTest, WorksForLhsNativeArray) {
5574 const int lhs[] = {1, 2, 3};
5575 vector<int> rhs;
5576 rhs.push_back(4);
5577 rhs.push_back(6);
5578 rhs.push_back(2);
5579 EXPECT_THAT(lhs, UnorderedPointwise(Lt(), rhs));
5580 EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));
5581}
5582
5583TEST(UnorderedPointwiseTest, WorksForRhsNativeArray) {
5584 const int rhs[] = {1, 2, 3};
5585 vector<int> lhs;
5586 lhs.push_back(4);
5587 lhs.push_back(2);
5588 lhs.push_back(6);
5589 EXPECT_THAT(lhs, UnorderedPointwise(Gt(), rhs));
5590 EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), rhs)));
5591}
5592
5593#if GTEST_HAS_STD_INITIALIZER_LIST_
5594
5595TEST(UnorderedPointwiseTest, WorksForRhsInitializerList) {
5596 const vector<int> lhs{2, 4, 6};
5597 EXPECT_THAT(lhs, UnorderedPointwise(Gt(), {5, 1, 3}));
5598 EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), {1, 1, 7})));
5599}
5600
5601#endif // GTEST_HAS_STD_INITIALIZER_LIST_
5602
5603TEST(UnorderedPointwiseTest, RejectsWrongSize) {
5604 const double lhs[2] = {1, 2};
5605 const int rhs[1] = {0};
5606 EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));
5607 EXPECT_EQ("which has 2 elements",
5608 Explain(UnorderedPointwise(Gt(), rhs), lhs));
5609
5610 const int rhs2[3] = {0, 1, 2};
5611 EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs2)));
5612}
5613
5614TEST(UnorderedPointwiseTest, RejectsWrongContent) {
5615 const double lhs[3] = {1, 2, 3};
5616 const int rhs[3] = {2, 6, 6};
5617 EXPECT_THAT(lhs, Not(UnorderedPointwise(IsHalfOf(), rhs)));
5618 EXPECT_EQ("where the following elements don't match any matchers:\n"
5619 "element #1: 2",
5620 Explain(UnorderedPointwise(IsHalfOf(), rhs), lhs));
5621}
5622
5623TEST(UnorderedPointwiseTest, AcceptsCorrectContentInSameOrder) {
5624 const double lhs[3] = {1, 2, 3};
5625 const int rhs[3] = {2, 4, 6};
5626 EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));
5627}
5628
5629TEST(UnorderedPointwiseTest, AcceptsCorrectContentInDifferentOrder) {
5630 const double lhs[3] = {1, 2, 3};
5631 const int rhs[3] = {6, 4, 2};
5632 EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));
5633}
5634
5635TEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) {
5636 const double lhs[3] = {1, 2, 3};
5637 const int rhs[3] = {4, 6, 2};
5638 const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();
5639 EXPECT_THAT(lhs, UnorderedPointwise(m1, rhs));
5640
5641 // This type works as a tuple<const double&, const int&> can be
5642 // implicitly cast to tuple<double, int>.
5643 const Matcher<tuple<double, int> > m2 = IsHalfOf();
5644 EXPECT_THAT(lhs, UnorderedPointwise(m2, rhs));
5645}
5646
shiqiane35fdd92008-12-10 05:08:54 +00005647} // namespace gmock_matchers_test
5648} // namespace testing