blob: b44426e5ce7a722b07e4508dd45888f4581be568 [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
kosakb6a34882014-03-12 21:06:46 +000057#if GTEST_LANG_CXX11
58# 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
jgm79a367e2012-04-10 16:02:11 +0000610// Implicitly convertible form any type.
611struct ConvertibleFromAny {
612 ConvertibleFromAny(int a_value) : value(a_value) {}
613 template <typename T>
614 ConvertibleFromAny(const T& a_value) : value(-1) {
615 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
vladloseve56daa72009-11-18 01:08:08 +00001028TEST(IsNullTest, ReferenceToConstScopedPtr) {
1029 const Matcher<const scoped_ptr<double>&> m = IsNull();
1030 const scoped_ptr<double> null_p;
1031 const scoped_ptr<double> non_null_p(new double);
1032
1033 EXPECT_TRUE(m.Matches(null_p));
1034 EXPECT_FALSE(m.Matches(non_null_p));
1035}
1036
zhanyong.wan2d970ee2009-09-24 21:41:36 +00001037// Tests that IsNull() describes itself properly.
1038TEST(IsNullTest, CanDescribeSelf) {
1039 Matcher<int*> m = IsNull();
1040 EXPECT_EQ("is NULL", Describe(m));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001041 EXPECT_EQ("isn't NULL", DescribeNegation(m));
zhanyong.wan2d970ee2009-09-24 21:41:36 +00001042}
1043
shiqiane35fdd92008-12-10 05:08:54 +00001044// Tests that NotNull() matches any non-NULL pointer of any type.
1045TEST(NotNullTest, MatchesNonNullPointer) {
1046 Matcher<int*> m1 = NotNull();
1047 int* p1 = NULL;
1048 int n = 0;
1049 EXPECT_FALSE(m1.Matches(p1));
1050 EXPECT_TRUE(m1.Matches(&n));
1051
1052 Matcher<const char*> m2 = NotNull();
1053 const char* p2 = NULL;
1054 EXPECT_FALSE(m2.Matches(p2));
1055 EXPECT_TRUE(m2.Matches("hi"));
1056}
1057
vladlosev79b83502009-11-18 00:43:37 +00001058TEST(NotNullTest, LinkedPtr) {
1059 const Matcher<linked_ptr<int> > m = NotNull();
1060 const linked_ptr<int> null_p;
1061 const linked_ptr<int> non_null_p(new int);
1062
1063 EXPECT_FALSE(m.Matches(null_p));
1064 EXPECT_TRUE(m.Matches(non_null_p));
1065}
1066
1067TEST(NotNullTest, ReferenceToConstLinkedPtr) {
1068 const Matcher<const linked_ptr<double>&> m = NotNull();
1069 const linked_ptr<double> null_p;
1070 const linked_ptr<double> non_null_p(new double);
1071
1072 EXPECT_FALSE(m.Matches(null_p));
1073 EXPECT_TRUE(m.Matches(non_null_p));
1074}
1075
vladloseve56daa72009-11-18 01:08:08 +00001076TEST(NotNullTest, ReferenceToConstScopedPtr) {
1077 const Matcher<const scoped_ptr<double>&> m = NotNull();
1078 const scoped_ptr<double> null_p;
1079 const scoped_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
shiqiane35fdd92008-12-10 05:08:54 +00001085// Tests that NotNull() describes itself properly.
1086TEST(NotNullTest, CanDescribeSelf) {
1087 Matcher<int*> m = NotNull();
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001088 EXPECT_EQ("isn't NULL", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001089}
1090
1091// Tests that Ref(variable) matches an argument that references
1092// 'variable'.
1093TEST(RefTest, MatchesSameVariable) {
1094 int a = 0;
1095 int b = 0;
1096 Matcher<int&> m = Ref(a);
1097 EXPECT_TRUE(m.Matches(a));
1098 EXPECT_FALSE(m.Matches(b));
1099}
1100
1101// Tests that Ref(variable) describes itself properly.
1102TEST(RefTest, CanDescribeSelf) {
1103 int n = 5;
1104 Matcher<int&> m = Ref(n);
1105 stringstream ss;
1106 ss << "references the variable @" << &n << " 5";
1107 EXPECT_EQ(string(ss.str()), Describe(m));
1108}
1109
1110// Test that Ref(non_const_varialbe) can be used as a matcher for a
1111// const reference.
1112TEST(RefTest, CanBeUsedAsMatcherForConstReference) {
1113 int a = 0;
1114 int b = 0;
1115 Matcher<const int&> m = Ref(a);
1116 EXPECT_TRUE(m.Matches(a));
1117 EXPECT_FALSE(m.Matches(b));
1118}
1119
1120// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be
1121// used wherever Ref(base) can be used (Ref(derived) is a sub-type
1122// of Ref(base), but not vice versa.
1123
shiqiane35fdd92008-12-10 05:08:54 +00001124TEST(RefTest, IsCovariant) {
1125 Base base, base2;
1126 Derived derived;
1127 Matcher<const Base&> m1 = Ref(base);
1128 EXPECT_TRUE(m1.Matches(base));
1129 EXPECT_FALSE(m1.Matches(base2));
1130 EXPECT_FALSE(m1.Matches(derived));
1131
1132 m1 = Ref(derived);
1133 EXPECT_TRUE(m1.Matches(derived));
1134 EXPECT_FALSE(m1.Matches(base));
1135 EXPECT_FALSE(m1.Matches(base2));
1136}
1137
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001138TEST(RefTest, ExplainsResult) {
1139 int n = 0;
1140 EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n),
1141 StartsWith("which is located @"));
1142
1143 int m = 0;
1144 EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m),
1145 StartsWith("which is located @"));
1146}
1147
shiqiane35fdd92008-12-10 05:08:54 +00001148// Tests string comparison matchers.
1149
1150TEST(StrEqTest, MatchesEqualString) {
1151 Matcher<const char*> m = StrEq(string("Hello"));
1152 EXPECT_TRUE(m.Matches("Hello"));
1153 EXPECT_FALSE(m.Matches("hello"));
1154 EXPECT_FALSE(m.Matches(NULL));
1155
1156 Matcher<const string&> m2 = StrEq("Hello");
1157 EXPECT_TRUE(m2.Matches("Hello"));
1158 EXPECT_FALSE(m2.Matches("Hi"));
1159}
1160
1161TEST(StrEqTest, CanDescribeSelf) {
vladlosevaa432202011-04-01 21:58:42 +00001162 Matcher<string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3");
1163 EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"",
shiqiane35fdd92008-12-10 05:08:54 +00001164 Describe(m));
1165
1166 string str("01204500800");
1167 str[3] = '\0';
1168 Matcher<string> m2 = StrEq(str);
1169 EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2));
1170 str[0] = str[6] = str[7] = str[9] = str[10] = '\0';
1171 Matcher<string> m3 = StrEq(str);
1172 EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3));
1173}
1174
1175TEST(StrNeTest, MatchesUnequalString) {
1176 Matcher<const char*> m = StrNe("Hello");
1177 EXPECT_TRUE(m.Matches(""));
1178 EXPECT_TRUE(m.Matches(NULL));
1179 EXPECT_FALSE(m.Matches("Hello"));
1180
1181 Matcher<string> m2 = StrNe(string("Hello"));
1182 EXPECT_TRUE(m2.Matches("hello"));
1183 EXPECT_FALSE(m2.Matches("Hello"));
1184}
1185
1186TEST(StrNeTest, CanDescribeSelf) {
1187 Matcher<const char*> m = StrNe("Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001188 EXPECT_EQ("isn't equal to \"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001189}
1190
1191TEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) {
1192 Matcher<const char*> m = StrCaseEq(string("Hello"));
1193 EXPECT_TRUE(m.Matches("Hello"));
1194 EXPECT_TRUE(m.Matches("hello"));
1195 EXPECT_FALSE(m.Matches("Hi"));
1196 EXPECT_FALSE(m.Matches(NULL));
1197
1198 Matcher<const string&> m2 = StrCaseEq("Hello");
1199 EXPECT_TRUE(m2.Matches("hello"));
1200 EXPECT_FALSE(m2.Matches("Hi"));
1201}
1202
1203TEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1204 string str1("oabocdooeoo");
1205 string str2("OABOCDOOEOO");
1206 Matcher<const string&> m0 = StrCaseEq(str1);
1207 EXPECT_FALSE(m0.Matches(str2 + string(1, '\0')));
1208
1209 str1[3] = str2[3] = '\0';
1210 Matcher<const string&> m1 = StrCaseEq(str1);
1211 EXPECT_TRUE(m1.Matches(str2));
1212
1213 str1[0] = str1[6] = str1[7] = str1[10] = '\0';
1214 str2[0] = str2[6] = str2[7] = str2[10] = '\0';
1215 Matcher<const string&> m2 = StrCaseEq(str1);
1216 str1[9] = str2[9] = '\0';
1217 EXPECT_FALSE(m2.Matches(str2));
1218
1219 Matcher<const string&> m3 = StrCaseEq(str1);
1220 EXPECT_TRUE(m3.Matches(str2));
1221
1222 EXPECT_FALSE(m3.Matches(str2 + "x"));
1223 str2.append(1, '\0');
1224 EXPECT_FALSE(m3.Matches(str2));
1225 EXPECT_FALSE(m3.Matches(string(str2, 0, 9)));
1226}
1227
1228TEST(StrCaseEqTest, CanDescribeSelf) {
1229 Matcher<string> m = StrCaseEq("Hi");
1230 EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m));
1231}
1232
1233TEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1234 Matcher<const char*> m = StrCaseNe("Hello");
1235 EXPECT_TRUE(m.Matches("Hi"));
1236 EXPECT_TRUE(m.Matches(NULL));
1237 EXPECT_FALSE(m.Matches("Hello"));
1238 EXPECT_FALSE(m.Matches("hello"));
1239
1240 Matcher<string> m2 = StrCaseNe(string("Hello"));
1241 EXPECT_TRUE(m2.Matches(""));
1242 EXPECT_FALSE(m2.Matches("Hello"));
1243}
1244
1245TEST(StrCaseNeTest, CanDescribeSelf) {
1246 Matcher<const char*> m = StrCaseNe("Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001247 EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001248}
1249
1250// Tests that HasSubstr() works for matching string-typed values.
1251TEST(HasSubstrTest, WorksForStringClasses) {
1252 const Matcher<string> m1 = HasSubstr("foo");
1253 EXPECT_TRUE(m1.Matches(string("I love food.")));
1254 EXPECT_FALSE(m1.Matches(string("tofo")));
1255
1256 const Matcher<const std::string&> m2 = HasSubstr("foo");
1257 EXPECT_TRUE(m2.Matches(std::string("I love food.")));
1258 EXPECT_FALSE(m2.Matches(std::string("tofo")));
1259}
1260
1261// Tests that HasSubstr() works for matching C-string-typed values.
1262TEST(HasSubstrTest, WorksForCStrings) {
1263 const Matcher<char*> m1 = HasSubstr("foo");
1264 EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food.")));
1265 EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo")));
1266 EXPECT_FALSE(m1.Matches(NULL));
1267
1268 const Matcher<const char*> m2 = HasSubstr("foo");
1269 EXPECT_TRUE(m2.Matches("I love food."));
1270 EXPECT_FALSE(m2.Matches("tofo"));
1271 EXPECT_FALSE(m2.Matches(NULL));
1272}
1273
1274// Tests that HasSubstr(s) describes itself properly.
1275TEST(HasSubstrTest, CanDescribeSelf) {
1276 Matcher<string> m = HasSubstr("foo\n\"");
1277 EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m));
1278}
1279
zhanyong.wanb5937da2009-07-16 20:26:41 +00001280TEST(KeyTest, CanDescribeSelf) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001281 Matcher<const pair<std::string, int>&> m = Key("foo");
zhanyong.wanb5937da2009-07-16 20:26:41 +00001282 EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001283 EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m));
1284}
1285
1286TEST(KeyTest, ExplainsResult) {
1287 Matcher<pair<int, bool> > m = Key(GreaterThan(10));
1288 EXPECT_EQ("whose first field is a value which is 5 less than 10",
1289 Explain(m, make_pair(5, true)));
1290 EXPECT_EQ("whose first field is a value which is 5 more than 10",
1291 Explain(m, make_pair(15, true)));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001292}
1293
1294TEST(KeyTest, MatchesCorrectly) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001295 pair<int, std::string> p(25, "foo");
zhanyong.wanb5937da2009-07-16 20:26:41 +00001296 EXPECT_THAT(p, Key(25));
1297 EXPECT_THAT(p, Not(Key(42)));
1298 EXPECT_THAT(p, Key(Ge(20)));
1299 EXPECT_THAT(p, Not(Key(Lt(25))));
1300}
1301
1302TEST(KeyTest, SafelyCastsInnerMatcher) {
1303 Matcher<int> is_positive = Gt(0);
1304 Matcher<int> is_negative = Lt(0);
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001305 pair<char, bool> p('a', true);
zhanyong.wanb5937da2009-07-16 20:26:41 +00001306 EXPECT_THAT(p, Key(is_positive));
1307 EXPECT_THAT(p, Not(Key(is_negative)));
1308}
1309
1310TEST(KeyTest, InsideContainsUsingMap) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001311 map<int, char> container;
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001312 container.insert(make_pair(1, 'a'));
1313 container.insert(make_pair(2, 'b'));
1314 container.insert(make_pair(4, 'c'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001315 EXPECT_THAT(container, Contains(Key(1)));
1316 EXPECT_THAT(container, Not(Contains(Key(3))));
1317}
1318
1319TEST(KeyTest, InsideContainsUsingMultimap) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001320 multimap<int, char> container;
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001321 container.insert(make_pair(1, 'a'));
1322 container.insert(make_pair(2, 'b'));
1323 container.insert(make_pair(4, 'c'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001324
1325 EXPECT_THAT(container, Not(Contains(Key(25))));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001326 container.insert(make_pair(25, 'd'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001327 EXPECT_THAT(container, Contains(Key(25)));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001328 container.insert(make_pair(25, 'e'));
zhanyong.wanb5937da2009-07-16 20:26:41 +00001329 EXPECT_THAT(container, Contains(Key(25)));
1330
1331 EXPECT_THAT(container, Contains(Key(1)));
1332 EXPECT_THAT(container, Not(Contains(Key(3))));
1333}
1334
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001335TEST(PairTest, Typing) {
1336 // Test verifies the following type conversions can be compiled.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001337 Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42);
1338 Matcher<const pair<const char*, int> > m2 = Pair("foo", 42);
1339 Matcher<pair<const char*, int> > m3 = Pair("foo", 42);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001340
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001341 Matcher<pair<int, const std::string> > m4 = Pair(25, "42");
1342 Matcher<pair<const std::string, int> > m5 = Pair("25", 42);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001343}
1344
1345TEST(PairTest, CanDescribeSelf) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001346 Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001347 EXPECT_EQ("has a first field that is equal to \"foo\""
1348 ", and has a second field that is equal to 42",
1349 Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001350 EXPECT_EQ("has a first field that isn't equal to \"foo\""
1351 ", or has a second field that isn't equal to 42",
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001352 DescribeNegation(m1));
1353 // Double and triple negation (1 or 2 times not and description of negation).
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001354 Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42));
1355 EXPECT_EQ("has a first field that isn't equal to 13"
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001356 ", and has a second field that is equal to 42",
1357 DescribeNegation(m2));
1358}
1359
1360TEST(PairTest, CanExplainMatchResultTo) {
zhanyong.wan82113312010-01-08 21:55:40 +00001361 // If neither field matches, Pair() should explain about the first
1362 // field.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001363 const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001364 EXPECT_EQ("whose first field does not match, which is 1 less than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001365 Explain(m, make_pair(-1, -2)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001366
zhanyong.wan82113312010-01-08 21:55:40 +00001367 // If the first field matches but the second doesn't, Pair() should
1368 // explain about the second field.
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001369 EXPECT_EQ("whose second field does not match, which is 2 less than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001370 Explain(m, make_pair(1, -2)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001371
zhanyong.wan82113312010-01-08 21:55:40 +00001372 // If the first field doesn't match but the second does, Pair()
1373 // should explain about the first field.
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001374 EXPECT_EQ("whose first field does not match, which is 1 less than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001375 Explain(m, make_pair(-1, 2)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001376
zhanyong.wan82113312010-01-08 21:55:40 +00001377 // If both fields match, Pair() should explain about them both.
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001378 EXPECT_EQ("whose both fields match, where the first field is a value "
1379 "which is 1 more than 0, and the second field is a value "
1380 "which is 2 more than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001381 Explain(m, make_pair(1, 2)));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001382
1383 // If only the first match has an explanation, only this explanation should
1384 // be printed.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001385 const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0);
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001386 EXPECT_EQ("whose both fields match, where the first field is a value "
1387 "which is 1 more than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001388 Explain(explain_first, make_pair(1, 0)));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001389
1390 // If only the second match has an explanation, only this explanation should
1391 // be printed.
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001392 const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0));
zhanyong.wan676e8cc2010-03-16 20:01:51 +00001393 EXPECT_EQ("whose both fields match, where the second field is a value "
1394 "which is 1 more than 0",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001395 Explain(explain_second, make_pair(0, 1)));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001396}
1397
1398TEST(PairTest, MatchesCorrectly) {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001399 pair<int, std::string> p(25, "foo");
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001400
1401 // Both fields match.
1402 EXPECT_THAT(p, Pair(25, "foo"));
1403 EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o")));
1404
1405 // 'first' doesnt' match, but 'second' matches.
1406 EXPECT_THAT(p, Not(Pair(42, "foo")));
1407 EXPECT_THAT(p, Not(Pair(Lt(25), "foo")));
1408
1409 // 'first' matches, but 'second' doesn't match.
1410 EXPECT_THAT(p, Not(Pair(25, "bar")));
1411 EXPECT_THAT(p, Not(Pair(25, Not("foo"))));
1412
1413 // Neither field matches.
1414 EXPECT_THAT(p, Not(Pair(13, "bar")));
1415 EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a"))));
1416}
1417
1418TEST(PairTest, SafelyCastsInnerMatchers) {
1419 Matcher<int> is_positive = Gt(0);
1420 Matcher<int> is_negative = Lt(0);
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001421 pair<char, bool> p('a', true);
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001422 EXPECT_THAT(p, Pair(is_positive, _));
1423 EXPECT_THAT(p, Not(Pair(is_negative, _)));
1424 EXPECT_THAT(p, Pair(_, is_positive));
1425 EXPECT_THAT(p, Not(Pair(_, is_negative)));
1426}
1427
1428TEST(PairTest, InsideContainsUsingMap) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001429 map<int, char> container;
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001430 container.insert(make_pair(1, 'a'));
1431 container.insert(make_pair(2, 'b'));
1432 container.insert(make_pair(4, 'c'));
zhanyong.wan95b12332009-09-25 18:55:50 +00001433 EXPECT_THAT(container, Contains(Pair(1, 'a')));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001434 EXPECT_THAT(container, Contains(Pair(1, _)));
zhanyong.wan95b12332009-09-25 18:55:50 +00001435 EXPECT_THAT(container, Contains(Pair(_, 'a')));
zhanyong.wanf5e1ce52009-09-16 07:02:02 +00001436 EXPECT_THAT(container, Not(Contains(Pair(3, _))));
1437}
1438
shiqiane35fdd92008-12-10 05:08:54 +00001439// Tests StartsWith(s).
1440
1441TEST(StartsWithTest, MatchesStringWithGivenPrefix) {
1442 const Matcher<const char*> m1 = StartsWith(string(""));
1443 EXPECT_TRUE(m1.Matches("Hi"));
1444 EXPECT_TRUE(m1.Matches(""));
1445 EXPECT_FALSE(m1.Matches(NULL));
1446
1447 const Matcher<const string&> m2 = StartsWith("Hi");
1448 EXPECT_TRUE(m2.Matches("Hi"));
1449 EXPECT_TRUE(m2.Matches("Hi Hi!"));
1450 EXPECT_TRUE(m2.Matches("High"));
1451 EXPECT_FALSE(m2.Matches("H"));
1452 EXPECT_FALSE(m2.Matches(" Hi"));
1453}
1454
1455TEST(StartsWithTest, CanDescribeSelf) {
1456 Matcher<const std::string> m = StartsWith("Hi");
1457 EXPECT_EQ("starts with \"Hi\"", Describe(m));
1458}
1459
1460// Tests EndsWith(s).
1461
1462TEST(EndsWithTest, MatchesStringWithGivenSuffix) {
1463 const Matcher<const char*> m1 = EndsWith("");
1464 EXPECT_TRUE(m1.Matches("Hi"));
1465 EXPECT_TRUE(m1.Matches(""));
1466 EXPECT_FALSE(m1.Matches(NULL));
1467
1468 const Matcher<const string&> m2 = EndsWith(string("Hi"));
1469 EXPECT_TRUE(m2.Matches("Hi"));
1470 EXPECT_TRUE(m2.Matches("Wow Hi Hi"));
1471 EXPECT_TRUE(m2.Matches("Super Hi"));
1472 EXPECT_FALSE(m2.Matches("i"));
1473 EXPECT_FALSE(m2.Matches("Hi "));
1474}
1475
1476TEST(EndsWithTest, CanDescribeSelf) {
1477 Matcher<const std::string> m = EndsWith("Hi");
1478 EXPECT_EQ("ends with \"Hi\"", Describe(m));
1479}
1480
shiqiane35fdd92008-12-10 05:08:54 +00001481// Tests MatchesRegex().
1482
1483TEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) {
1484 const Matcher<const char*> m1 = MatchesRegex("a.*z");
1485 EXPECT_TRUE(m1.Matches("az"));
1486 EXPECT_TRUE(m1.Matches("abcz"));
1487 EXPECT_FALSE(m1.Matches(NULL));
1488
1489 const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z"));
1490 EXPECT_TRUE(m2.Matches("azbz"));
1491 EXPECT_FALSE(m2.Matches("az1"));
1492 EXPECT_FALSE(m2.Matches("1az"));
1493}
1494
1495TEST(MatchesRegexTest, CanDescribeSelf) {
1496 Matcher<const std::string> m1 = MatchesRegex(string("Hi.*"));
1497 EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1));
1498
zhanyong.wand14aaed2010-01-14 05:36:32 +00001499 Matcher<const char*> m2 = MatchesRegex(new RE("a.*"));
1500 EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2));
shiqiane35fdd92008-12-10 05:08:54 +00001501}
1502
1503// Tests ContainsRegex().
1504
1505TEST(ContainsRegexTest, MatchesStringContainingGivenRegex) {
1506 const Matcher<const char*> m1 = ContainsRegex(string("a.*z"));
1507 EXPECT_TRUE(m1.Matches("az"));
1508 EXPECT_TRUE(m1.Matches("0abcz1"));
1509 EXPECT_FALSE(m1.Matches(NULL));
1510
1511 const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z"));
1512 EXPECT_TRUE(m2.Matches("azbz"));
1513 EXPECT_TRUE(m2.Matches("az1"));
1514 EXPECT_FALSE(m2.Matches("1a"));
1515}
1516
1517TEST(ContainsRegexTest, CanDescribeSelf) {
1518 Matcher<const std::string> m1 = ContainsRegex("Hi.*");
1519 EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1));
1520
zhanyong.wand14aaed2010-01-14 05:36:32 +00001521 Matcher<const char*> m2 = ContainsRegex(new RE("a.*"));
1522 EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2));
shiqiane35fdd92008-12-10 05:08:54 +00001523}
shiqiane35fdd92008-12-10 05:08:54 +00001524
1525// Tests for wide strings.
1526#if GTEST_HAS_STD_WSTRING
1527TEST(StdWideStrEqTest, MatchesEqual) {
1528 Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello"));
1529 EXPECT_TRUE(m.Matches(L"Hello"));
1530 EXPECT_FALSE(m.Matches(L"hello"));
1531 EXPECT_FALSE(m.Matches(NULL));
1532
1533 Matcher<const ::std::wstring&> m2 = StrEq(L"Hello");
1534 EXPECT_TRUE(m2.Matches(L"Hello"));
1535 EXPECT_FALSE(m2.Matches(L"Hi"));
1536
1537 Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1538 EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1539 EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1540
1541 ::std::wstring str(L"01204500800");
1542 str[3] = L'\0';
1543 Matcher<const ::std::wstring&> m4 = StrEq(str);
1544 EXPECT_TRUE(m4.Matches(str));
1545 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1546 Matcher<const ::std::wstring&> m5 = StrEq(str);
1547 EXPECT_TRUE(m5.Matches(str));
1548}
1549
1550TEST(StdWideStrEqTest, CanDescribeSelf) {
vladlosevaa432202011-04-01 21:58:42 +00001551 Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1552 EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
shiqiane35fdd92008-12-10 05:08:54 +00001553 Describe(m));
1554
1555 Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1556 EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1557 Describe(m2));
1558
1559 ::std::wstring str(L"01204500800");
1560 str[3] = L'\0';
1561 Matcher<const ::std::wstring&> m4 = StrEq(str);
1562 EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1563 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1564 Matcher<const ::std::wstring&> m5 = StrEq(str);
1565 EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1566}
1567
1568TEST(StdWideStrNeTest, MatchesUnequalString) {
1569 Matcher<const wchar_t*> m = StrNe(L"Hello");
1570 EXPECT_TRUE(m.Matches(L""));
1571 EXPECT_TRUE(m.Matches(NULL));
1572 EXPECT_FALSE(m.Matches(L"Hello"));
1573
1574 Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello"));
1575 EXPECT_TRUE(m2.Matches(L"hello"));
1576 EXPECT_FALSE(m2.Matches(L"Hello"));
1577}
1578
1579TEST(StdWideStrNeTest, CanDescribeSelf) {
1580 Matcher<const wchar_t*> m = StrNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001581 EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001582}
1583
1584TEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1585 Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello"));
1586 EXPECT_TRUE(m.Matches(L"Hello"));
1587 EXPECT_TRUE(m.Matches(L"hello"));
1588 EXPECT_FALSE(m.Matches(L"Hi"));
1589 EXPECT_FALSE(m.Matches(NULL));
1590
1591 Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello");
1592 EXPECT_TRUE(m2.Matches(L"hello"));
1593 EXPECT_FALSE(m2.Matches(L"Hi"));
1594}
1595
1596TEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1597 ::std::wstring str1(L"oabocdooeoo");
1598 ::std::wstring str2(L"OABOCDOOEOO");
1599 Matcher<const ::std::wstring&> m0 = StrCaseEq(str1);
1600 EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0')));
1601
1602 str1[3] = str2[3] = L'\0';
1603 Matcher<const ::std::wstring&> m1 = StrCaseEq(str1);
1604 EXPECT_TRUE(m1.Matches(str2));
1605
1606 str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1607 str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1608 Matcher<const ::std::wstring&> m2 = StrCaseEq(str1);
1609 str1[9] = str2[9] = L'\0';
1610 EXPECT_FALSE(m2.Matches(str2));
1611
1612 Matcher<const ::std::wstring&> m3 = StrCaseEq(str1);
1613 EXPECT_TRUE(m3.Matches(str2));
1614
1615 EXPECT_FALSE(m3.Matches(str2 + L"x"));
1616 str2.append(1, L'\0');
1617 EXPECT_FALSE(m3.Matches(str2));
1618 EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9)));
1619}
1620
1621TEST(StdWideStrCaseEqTest, CanDescribeSelf) {
1622 Matcher< ::std::wstring> m = StrCaseEq(L"Hi");
1623 EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1624}
1625
1626TEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1627 Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1628 EXPECT_TRUE(m.Matches(L"Hi"));
1629 EXPECT_TRUE(m.Matches(NULL));
1630 EXPECT_FALSE(m.Matches(L"Hello"));
1631 EXPECT_FALSE(m.Matches(L"hello"));
1632
1633 Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello"));
1634 EXPECT_TRUE(m2.Matches(L""));
1635 EXPECT_FALSE(m2.Matches(L"Hello"));
1636}
1637
1638TEST(StdWideStrCaseNeTest, CanDescribeSelf) {
1639 Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001640 EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001641}
1642
1643// Tests that HasSubstr() works for matching wstring-typed values.
1644TEST(StdWideHasSubstrTest, WorksForStringClasses) {
1645 const Matcher< ::std::wstring> m1 = HasSubstr(L"foo");
1646 EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food.")));
1647 EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo")));
1648
1649 const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo");
1650 EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food.")));
1651 EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo")));
1652}
1653
1654// Tests that HasSubstr() works for matching C-wide-string-typed values.
1655TEST(StdWideHasSubstrTest, WorksForCStrings) {
1656 const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1657 EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1658 EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1659 EXPECT_FALSE(m1.Matches(NULL));
1660
1661 const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1662 EXPECT_TRUE(m2.Matches(L"I love food."));
1663 EXPECT_FALSE(m2.Matches(L"tofo"));
1664 EXPECT_FALSE(m2.Matches(NULL));
1665}
1666
1667// Tests that HasSubstr(s) describes itself properly.
1668TEST(StdWideHasSubstrTest, CanDescribeSelf) {
1669 Matcher< ::std::wstring> m = HasSubstr(L"foo\n\"");
1670 EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1671}
1672
1673// Tests StartsWith(s).
1674
1675TEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) {
1676 const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L""));
1677 EXPECT_TRUE(m1.Matches(L"Hi"));
1678 EXPECT_TRUE(m1.Matches(L""));
1679 EXPECT_FALSE(m1.Matches(NULL));
1680
1681 const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi");
1682 EXPECT_TRUE(m2.Matches(L"Hi"));
1683 EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1684 EXPECT_TRUE(m2.Matches(L"High"));
1685 EXPECT_FALSE(m2.Matches(L"H"));
1686 EXPECT_FALSE(m2.Matches(L" Hi"));
1687}
1688
1689TEST(StdWideStartsWithTest, CanDescribeSelf) {
1690 Matcher<const ::std::wstring> m = StartsWith(L"Hi");
1691 EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1692}
1693
1694// Tests EndsWith(s).
1695
1696TEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) {
1697 const Matcher<const wchar_t*> m1 = EndsWith(L"");
1698 EXPECT_TRUE(m1.Matches(L"Hi"));
1699 EXPECT_TRUE(m1.Matches(L""));
1700 EXPECT_FALSE(m1.Matches(NULL));
1701
1702 const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi"));
1703 EXPECT_TRUE(m2.Matches(L"Hi"));
1704 EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1705 EXPECT_TRUE(m2.Matches(L"Super Hi"));
1706 EXPECT_FALSE(m2.Matches(L"i"));
1707 EXPECT_FALSE(m2.Matches(L"Hi "));
1708}
1709
1710TEST(StdWideEndsWithTest, CanDescribeSelf) {
1711 Matcher<const ::std::wstring> m = EndsWith(L"Hi");
1712 EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1713}
1714
1715#endif // GTEST_HAS_STD_WSTRING
1716
1717#if GTEST_HAS_GLOBAL_WSTRING
1718TEST(GlobalWideStrEqTest, MatchesEqual) {
1719 Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello"));
1720 EXPECT_TRUE(m.Matches(L"Hello"));
1721 EXPECT_FALSE(m.Matches(L"hello"));
1722 EXPECT_FALSE(m.Matches(NULL));
1723
1724 Matcher<const ::wstring&> m2 = StrEq(L"Hello");
1725 EXPECT_TRUE(m2.Matches(L"Hello"));
1726 EXPECT_FALSE(m2.Matches(L"Hi"));
1727
1728 Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1729 EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1730 EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1731
1732 ::wstring str(L"01204500800");
1733 str[3] = L'\0';
1734 Matcher<const ::wstring&> m4 = StrEq(str);
1735 EXPECT_TRUE(m4.Matches(str));
1736 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1737 Matcher<const ::wstring&> m5 = StrEq(str);
1738 EXPECT_TRUE(m5.Matches(str));
1739}
1740
1741TEST(GlobalWideStrEqTest, CanDescribeSelf) {
vladlosevaa432202011-04-01 21:58:42 +00001742 Matcher< ::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1743 EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
shiqiane35fdd92008-12-10 05:08:54 +00001744 Describe(m));
1745
1746 Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1747 EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1748 Describe(m2));
1749
1750 ::wstring str(L"01204500800");
1751 str[3] = L'\0';
1752 Matcher<const ::wstring&> m4 = StrEq(str);
1753 EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1754 str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1755 Matcher<const ::wstring&> m5 = StrEq(str);
1756 EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1757}
1758
1759TEST(GlobalWideStrNeTest, MatchesUnequalString) {
1760 Matcher<const wchar_t*> m = StrNe(L"Hello");
1761 EXPECT_TRUE(m.Matches(L""));
1762 EXPECT_TRUE(m.Matches(NULL));
1763 EXPECT_FALSE(m.Matches(L"Hello"));
1764
1765 Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello"));
1766 EXPECT_TRUE(m2.Matches(L"hello"));
1767 EXPECT_FALSE(m2.Matches(L"Hello"));
1768}
1769
1770TEST(GlobalWideStrNeTest, CanDescribeSelf) {
1771 Matcher<const wchar_t*> m = StrNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001772 EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001773}
1774
1775TEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1776 Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello"));
1777 EXPECT_TRUE(m.Matches(L"Hello"));
1778 EXPECT_TRUE(m.Matches(L"hello"));
1779 EXPECT_FALSE(m.Matches(L"Hi"));
1780 EXPECT_FALSE(m.Matches(NULL));
1781
1782 Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello");
1783 EXPECT_TRUE(m2.Matches(L"hello"));
1784 EXPECT_FALSE(m2.Matches(L"Hi"));
1785}
1786
1787TEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1788 ::wstring str1(L"oabocdooeoo");
1789 ::wstring str2(L"OABOCDOOEOO");
1790 Matcher<const ::wstring&> m0 = StrCaseEq(str1);
1791 EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0')));
1792
1793 str1[3] = str2[3] = L'\0';
1794 Matcher<const ::wstring&> m1 = StrCaseEq(str1);
1795 EXPECT_TRUE(m1.Matches(str2));
1796
1797 str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1798 str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1799 Matcher<const ::wstring&> m2 = StrCaseEq(str1);
1800 str1[9] = str2[9] = L'\0';
1801 EXPECT_FALSE(m2.Matches(str2));
1802
1803 Matcher<const ::wstring&> m3 = StrCaseEq(str1);
1804 EXPECT_TRUE(m3.Matches(str2));
1805
1806 EXPECT_FALSE(m3.Matches(str2 + L"x"));
1807 str2.append(1, L'\0');
1808 EXPECT_FALSE(m3.Matches(str2));
1809 EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9)));
1810}
1811
1812TEST(GlobalWideStrCaseEqTest, CanDescribeSelf) {
1813 Matcher< ::wstring> m = StrCaseEq(L"Hi");
1814 EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1815}
1816
1817TEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1818 Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1819 EXPECT_TRUE(m.Matches(L"Hi"));
1820 EXPECT_TRUE(m.Matches(NULL));
1821 EXPECT_FALSE(m.Matches(L"Hello"));
1822 EXPECT_FALSE(m.Matches(L"hello"));
1823
1824 Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello"));
1825 EXPECT_TRUE(m2.Matches(L""));
1826 EXPECT_FALSE(m2.Matches(L"Hello"));
1827}
1828
1829TEST(GlobalWideStrCaseNeTest, CanDescribeSelf) {
1830 Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
zhanyong.wanb1c7f932010-03-24 17:35:11 +00001831 EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001832}
1833
1834// Tests that HasSubstr() works for matching wstring-typed values.
1835TEST(GlobalWideHasSubstrTest, WorksForStringClasses) {
1836 const Matcher< ::wstring> m1 = HasSubstr(L"foo");
1837 EXPECT_TRUE(m1.Matches(::wstring(L"I love food.")));
1838 EXPECT_FALSE(m1.Matches(::wstring(L"tofo")));
1839
1840 const Matcher<const ::wstring&> m2 = HasSubstr(L"foo");
1841 EXPECT_TRUE(m2.Matches(::wstring(L"I love food.")));
1842 EXPECT_FALSE(m2.Matches(::wstring(L"tofo")));
1843}
1844
1845// Tests that HasSubstr() works for matching C-wide-string-typed values.
1846TEST(GlobalWideHasSubstrTest, WorksForCStrings) {
1847 const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1848 EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1849 EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1850 EXPECT_FALSE(m1.Matches(NULL));
1851
1852 const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1853 EXPECT_TRUE(m2.Matches(L"I love food."));
1854 EXPECT_FALSE(m2.Matches(L"tofo"));
1855 EXPECT_FALSE(m2.Matches(NULL));
1856}
1857
1858// Tests that HasSubstr(s) describes itself properly.
1859TEST(GlobalWideHasSubstrTest, CanDescribeSelf) {
1860 Matcher< ::wstring> m = HasSubstr(L"foo\n\"");
1861 EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1862}
1863
1864// Tests StartsWith(s).
1865
1866TEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) {
1867 const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L""));
1868 EXPECT_TRUE(m1.Matches(L"Hi"));
1869 EXPECT_TRUE(m1.Matches(L""));
1870 EXPECT_FALSE(m1.Matches(NULL));
1871
1872 const Matcher<const ::wstring&> m2 = StartsWith(L"Hi");
1873 EXPECT_TRUE(m2.Matches(L"Hi"));
1874 EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1875 EXPECT_TRUE(m2.Matches(L"High"));
1876 EXPECT_FALSE(m2.Matches(L"H"));
1877 EXPECT_FALSE(m2.Matches(L" Hi"));
1878}
1879
1880TEST(GlobalWideStartsWithTest, CanDescribeSelf) {
1881 Matcher<const ::wstring> m = StartsWith(L"Hi");
1882 EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1883}
1884
1885// Tests EndsWith(s).
1886
1887TEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) {
1888 const Matcher<const wchar_t*> m1 = EndsWith(L"");
1889 EXPECT_TRUE(m1.Matches(L"Hi"));
1890 EXPECT_TRUE(m1.Matches(L""));
1891 EXPECT_FALSE(m1.Matches(NULL));
1892
1893 const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi"));
1894 EXPECT_TRUE(m2.Matches(L"Hi"));
1895 EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1896 EXPECT_TRUE(m2.Matches(L"Super Hi"));
1897 EXPECT_FALSE(m2.Matches(L"i"));
1898 EXPECT_FALSE(m2.Matches(L"Hi "));
1899}
1900
1901TEST(GlobalWideEndsWithTest, CanDescribeSelf) {
1902 Matcher<const ::wstring> m = EndsWith(L"Hi");
1903 EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1904}
1905
1906#endif // GTEST_HAS_GLOBAL_WSTRING
1907
1908
kosakbd018832014-04-02 20:30:00 +00001909typedef ::testing::tuple<long, int> Tuple2; // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00001910
1911// Tests that Eq() matches a 2-tuple where the first field == the
1912// second field.
1913TEST(Eq2Test, MatchesEqualArguments) {
1914 Matcher<const Tuple2&> m = Eq();
1915 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1916 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1917}
1918
1919// Tests that Eq() describes itself properly.
1920TEST(Eq2Test, CanDescribeSelf) {
1921 Matcher<const Tuple2&> m = Eq();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001922 EXPECT_EQ("are an equal pair", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001923}
1924
1925// Tests that Ge() matches a 2-tuple where the first field >= the
1926// second field.
1927TEST(Ge2Test, MatchesGreaterThanOrEqualArguments) {
1928 Matcher<const Tuple2&> m = Ge();
1929 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1930 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1931 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1932}
1933
1934// Tests that Ge() describes itself properly.
1935TEST(Ge2Test, CanDescribeSelf) {
1936 Matcher<const Tuple2&> m = Ge();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001937 EXPECT_EQ("are a pair where the first >= the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001938}
1939
1940// Tests that Gt() matches a 2-tuple where the first field > the
1941// second field.
1942TEST(Gt2Test, MatchesGreaterThanArguments) {
1943 Matcher<const Tuple2&> m = Gt();
1944 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1945 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1946 EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1947}
1948
1949// Tests that Gt() describes itself properly.
1950TEST(Gt2Test, CanDescribeSelf) {
1951 Matcher<const Tuple2&> m = Gt();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001952 EXPECT_EQ("are a pair where the first > the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001953}
1954
1955// Tests that Le() matches a 2-tuple where the first field <= the
1956// second field.
1957TEST(Le2Test, MatchesLessThanOrEqualArguments) {
1958 Matcher<const Tuple2&> m = Le();
1959 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1960 EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1961 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1962}
1963
1964// Tests that Le() describes itself properly.
1965TEST(Le2Test, CanDescribeSelf) {
1966 Matcher<const Tuple2&> m = Le();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001967 EXPECT_EQ("are a pair where the first <= the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001968}
1969
1970// Tests that Lt() matches a 2-tuple where the first field < the
1971// second field.
1972TEST(Lt2Test, MatchesLessThanArguments) {
1973 Matcher<const Tuple2&> m = Lt();
1974 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1975 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1976 EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1977}
1978
1979// Tests that Lt() describes itself properly.
1980TEST(Lt2Test, CanDescribeSelf) {
1981 Matcher<const Tuple2&> m = Lt();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001982 EXPECT_EQ("are a pair where the first < the second", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001983}
1984
1985// Tests that Ne() matches a 2-tuple where the first field != the
1986// second field.
1987TEST(Ne2Test, MatchesUnequalArguments) {
1988 Matcher<const Tuple2&> m = Ne();
1989 EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1990 EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1991 EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1992}
1993
1994// Tests that Ne() describes itself properly.
1995TEST(Ne2Test, CanDescribeSelf) {
1996 Matcher<const Tuple2&> m = Ne();
zhanyong.wanab5b77c2010-05-17 19:32:48 +00001997 EXPECT_EQ("are an unequal pair", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00001998}
1999
2000// Tests that Not(m) matches any value that doesn't match m.
2001TEST(NotTest, NegatesMatcher) {
2002 Matcher<int> m;
2003 m = Not(Eq(2));
2004 EXPECT_TRUE(m.Matches(3));
2005 EXPECT_FALSE(m.Matches(2));
2006}
2007
2008// Tests that Not(m) describes itself properly.
2009TEST(NotTest, CanDescribeSelf) {
2010 Matcher<int> m = Not(Eq(5));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002011 EXPECT_EQ("isn't equal to 5", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00002012}
2013
zhanyong.wan18490652009-05-11 18:54:08 +00002014// Tests that monomorphic matchers are safely cast by the Not matcher.
2015TEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {
2016 // greater_than_5 is a monomorphic matcher.
2017 Matcher<int> greater_than_5 = Gt(5);
2018
2019 Matcher<const int&> m = Not(greater_than_5);
2020 Matcher<int&> m2 = Not(greater_than_5);
2021 Matcher<int&> m3 = Not(m);
2022}
2023
zhanyong.wan02c15052010-06-09 19:21:30 +00002024// Helper to allow easy testing of AllOf matchers with num parameters.
2025void AllOfMatches(int num, const Matcher<int>& m) {
2026 SCOPED_TRACE(Describe(m));
2027 EXPECT_TRUE(m.Matches(0));
2028 for (int i = 1; i <= num; ++i) {
2029 EXPECT_FALSE(m.Matches(i));
2030 }
2031 EXPECT_TRUE(m.Matches(num + 1));
2032}
2033
shiqiane35fdd92008-12-10 05:08:54 +00002034// Tests that AllOf(m1, ..., mn) matches any value that matches all of
2035// the given matchers.
2036TEST(AllOfTest, MatchesWhenAllMatch) {
2037 Matcher<int> m;
2038 m = AllOf(Le(2), Ge(1));
2039 EXPECT_TRUE(m.Matches(1));
2040 EXPECT_TRUE(m.Matches(2));
2041 EXPECT_FALSE(m.Matches(0));
2042 EXPECT_FALSE(m.Matches(3));
2043
2044 m = AllOf(Gt(0), Ne(1), Ne(2));
2045 EXPECT_TRUE(m.Matches(3));
2046 EXPECT_FALSE(m.Matches(2));
2047 EXPECT_FALSE(m.Matches(1));
2048 EXPECT_FALSE(m.Matches(0));
2049
2050 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
2051 EXPECT_TRUE(m.Matches(4));
2052 EXPECT_FALSE(m.Matches(3));
2053 EXPECT_FALSE(m.Matches(2));
2054 EXPECT_FALSE(m.Matches(1));
2055 EXPECT_FALSE(m.Matches(0));
2056
2057 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
2058 EXPECT_TRUE(m.Matches(0));
2059 EXPECT_TRUE(m.Matches(1));
2060 EXPECT_FALSE(m.Matches(3));
zhanyong.wan02c15052010-06-09 19:21:30 +00002061
2062 // The following tests for varying number of sub-matchers. Due to the way
2063 // the sub-matchers are handled it is enough to test every sub-matcher once
2064 // with sub-matchers using the same matcher type. Varying matcher types are
2065 // checked for above.
2066 AllOfMatches(2, AllOf(Ne(1), Ne(2)));
2067 AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3)));
2068 AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4)));
2069 AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5)));
2070 AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6)));
2071 AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7)));
2072 AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
2073 Ne(8)));
2074 AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
2075 Ne(8), Ne(9)));
2076 AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2077 Ne(9), Ne(10)));
shiqiane35fdd92008-12-10 05:08:54 +00002078}
2079
zhanyong.wan616180e2013-06-18 18:49:51 +00002080#if GTEST_LANG_CXX11
2081// Tests the variadic version of the AllOfMatcher.
2082TEST(AllOfTest, VariadicMatchesWhenAllMatch) {
2083 // Make sure AllOf is defined in the right namespace and does not depend on
2084 // ADL.
2085 ::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2086 Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2087 Ne(9), Ne(10), Ne(11));
2088 EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11))))))))))"));
2089 AllOfMatches(11, m);
2090 AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2091 Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15),
2092 Ne(16), Ne(17), Ne(18), Ne(19), Ne(20), Ne(21), Ne(22),
2093 Ne(23), Ne(24), Ne(25), Ne(26), Ne(27), Ne(28), Ne(29),
2094 Ne(30), Ne(31), Ne(32), Ne(33), Ne(34), Ne(35), Ne(36),
2095 Ne(37), Ne(38), Ne(39), Ne(40), Ne(41), Ne(42), Ne(43),
2096 Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49),
2097 Ne(50)));
2098}
2099
2100#endif // GTEST_LANG_CXX11
2101
shiqiane35fdd92008-12-10 05:08:54 +00002102// Tests that AllOf(m1, ..., mn) describes itself properly.
2103TEST(AllOfTest, CanDescribeSelf) {
2104 Matcher<int> m;
2105 m = AllOf(Le(2), Ge(1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002106 EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m));
shiqiane35fdd92008-12-10 05:08:54 +00002107
2108 m = AllOf(Gt(0), Ne(1), Ne(2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002109 EXPECT_EQ("(is > 0) and "
2110 "((isn't equal to 1) and "
2111 "(isn't equal to 2))",
shiqiane35fdd92008-12-10 05:08:54 +00002112 Describe(m));
2113
2114
2115 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
jgm79a367e2012-04-10 16:02:11 +00002116 EXPECT_EQ("((is > 0) and "
2117 "(isn't equal to 1)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002118 "((isn't equal to 2) and "
jgm79a367e2012-04-10 16:02:11 +00002119 "(isn't equal to 3))",
shiqiane35fdd92008-12-10 05:08:54 +00002120 Describe(m));
2121
2122
2123 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
jgm79a367e2012-04-10 16:02:11 +00002124 EXPECT_EQ("((is >= 0) and "
2125 "(is < 10)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002126 "((isn't equal to 3) and "
2127 "((isn't equal to 5) and "
jgm79a367e2012-04-10 16:02:11 +00002128 "(isn't equal to 7)))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002129 Describe(m));
2130}
2131
2132// Tests that AllOf(m1, ..., mn) describes its negation properly.
2133TEST(AllOfTest, CanDescribeNegation) {
2134 Matcher<int> m;
2135 m = AllOf(Le(2), Ge(1));
2136 EXPECT_EQ("(isn't <= 2) or "
2137 "(isn't >= 1)",
2138 DescribeNegation(m));
2139
2140 m = AllOf(Gt(0), Ne(1), Ne(2));
2141 EXPECT_EQ("(isn't > 0) or "
2142 "((is equal to 1) or "
2143 "(is equal to 2))",
2144 DescribeNegation(m));
2145
2146
2147 m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
jgm79a367e2012-04-10 16:02:11 +00002148 EXPECT_EQ("((isn't > 0) or "
2149 "(is equal to 1)) or "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002150 "((is equal to 2) or "
jgm79a367e2012-04-10 16:02:11 +00002151 "(is equal to 3))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002152 DescribeNegation(m));
2153
2154
2155 m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
jgm79a367e2012-04-10 16:02:11 +00002156 EXPECT_EQ("((isn't >= 0) or "
2157 "(isn't < 10)) or "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002158 "((is equal to 3) or "
2159 "((is equal to 5) or "
jgm79a367e2012-04-10 16:02:11 +00002160 "(is equal to 7)))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002161 DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00002162}
2163
zhanyong.wan18490652009-05-11 18:54:08 +00002164// Tests that monomorphic matchers are safely cast by the AllOf matcher.
2165TEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
2166 // greater_than_5 and less_than_10 are monomorphic matchers.
2167 Matcher<int> greater_than_5 = Gt(5);
2168 Matcher<int> less_than_10 = Lt(10);
2169
2170 Matcher<const int&> m = AllOf(greater_than_5, less_than_10);
2171 Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);
2172 Matcher<int&> m3 = AllOf(greater_than_5, m2);
2173
2174 // Tests that BothOf works when composing itself.
2175 Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);
2176 Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);
2177}
2178
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002179TEST(AllOfTest, ExplainsResult) {
2180 Matcher<int> m;
2181
2182 // Successful match. Both matchers need to explain. The second
2183 // matcher doesn't give an explanation, so only the first matcher's
2184 // explanation is printed.
2185 m = AllOf(GreaterThan(10), Lt(30));
2186 EXPECT_EQ("which is 15 more than 10", Explain(m, 25));
2187
2188 // Successful match. Both matchers need to explain.
2189 m = AllOf(GreaterThan(10), GreaterThan(20));
2190 EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20",
2191 Explain(m, 30));
2192
2193 // Successful match. All matchers need to explain. The second
2194 // matcher doesn't given an explanation.
2195 m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20));
2196 EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20",
2197 Explain(m, 25));
2198
2199 // Successful match. All matchers need to explain.
2200 m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2201 EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, "
2202 "and which is 10 more than 30",
2203 Explain(m, 40));
2204
2205 // Failed match. The first matcher, which failed, needs to
2206 // explain.
2207 m = AllOf(GreaterThan(10), GreaterThan(20));
2208 EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2209
2210 // Failed match. The second matcher, which failed, needs to
2211 // explain. Since it doesn't given an explanation, nothing is
2212 // printed.
2213 m = AllOf(GreaterThan(10), Lt(30));
2214 EXPECT_EQ("", Explain(m, 40));
2215
2216 // Failed match. The second matcher, which failed, needs to
2217 // explain.
2218 m = AllOf(GreaterThan(10), GreaterThan(20));
2219 EXPECT_EQ("which is 5 less than 20", Explain(m, 15));
2220}
2221
zhanyong.wan02c15052010-06-09 19:21:30 +00002222// Helper to allow easy testing of AnyOf matchers with num parameters.
2223void AnyOfMatches(int num, const Matcher<int>& m) {
2224 SCOPED_TRACE(Describe(m));
2225 EXPECT_FALSE(m.Matches(0));
2226 for (int i = 1; i <= num; ++i) {
2227 EXPECT_TRUE(m.Matches(i));
2228 }
2229 EXPECT_FALSE(m.Matches(num + 1));
2230}
2231
shiqiane35fdd92008-12-10 05:08:54 +00002232// Tests that AnyOf(m1, ..., mn) matches any value that matches at
2233// least one of the given matchers.
2234TEST(AnyOfTest, MatchesWhenAnyMatches) {
2235 Matcher<int> m;
2236 m = AnyOf(Le(1), Ge(3));
2237 EXPECT_TRUE(m.Matches(1));
2238 EXPECT_TRUE(m.Matches(4));
2239 EXPECT_FALSE(m.Matches(2));
2240
2241 m = AnyOf(Lt(0), Eq(1), Eq(2));
2242 EXPECT_TRUE(m.Matches(-1));
2243 EXPECT_TRUE(m.Matches(1));
2244 EXPECT_TRUE(m.Matches(2));
2245 EXPECT_FALSE(m.Matches(0));
2246
2247 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2248 EXPECT_TRUE(m.Matches(-1));
2249 EXPECT_TRUE(m.Matches(1));
2250 EXPECT_TRUE(m.Matches(2));
2251 EXPECT_TRUE(m.Matches(3));
2252 EXPECT_FALSE(m.Matches(0));
2253
2254 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2255 EXPECT_TRUE(m.Matches(0));
2256 EXPECT_TRUE(m.Matches(11));
2257 EXPECT_TRUE(m.Matches(3));
2258 EXPECT_FALSE(m.Matches(2));
zhanyong.wan02c15052010-06-09 19:21:30 +00002259
2260 // The following tests for varying number of sub-matchers. Due to the way
2261 // the sub-matchers are handled it is enough to test every sub-matcher once
2262 // with sub-matchers using the same matcher type. Varying matcher types are
2263 // checked for above.
2264 AnyOfMatches(2, AnyOf(1, 2));
2265 AnyOfMatches(3, AnyOf(1, 2, 3));
2266 AnyOfMatches(4, AnyOf(1, 2, 3, 4));
2267 AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5));
2268 AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6));
2269 AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7));
2270 AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8));
2271 AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9));
2272 AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
shiqiane35fdd92008-12-10 05:08:54 +00002273}
2274
zhanyong.wan616180e2013-06-18 18:49:51 +00002275#if GTEST_LANG_CXX11
2276// Tests the variadic version of the AnyOfMatcher.
2277TEST(AnyOfTest, VariadicMatchesWhenAnyMatches) {
2278 // Also make sure AnyOf is defined in the right namespace and does not depend
2279 // on ADL.
2280 Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2281
2282 EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11))))))))))"));
2283 AnyOfMatches(11, m);
2284 AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
2285 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
2286 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
2287 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
2288 41, 42, 43, 44, 45, 46, 47, 48, 49, 50));
2289}
2290
2291#endif // GTEST_LANG_CXX11
2292
shiqiane35fdd92008-12-10 05:08:54 +00002293// Tests that AnyOf(m1, ..., mn) describes itself properly.
2294TEST(AnyOfTest, CanDescribeSelf) {
2295 Matcher<int> m;
2296 m = AnyOf(Le(1), Ge(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002297 EXPECT_EQ("(is <= 1) or (is >= 3)",
shiqiane35fdd92008-12-10 05:08:54 +00002298 Describe(m));
2299
2300 m = AnyOf(Lt(0), Eq(1), Eq(2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002301 EXPECT_EQ("(is < 0) or "
shiqiane35fdd92008-12-10 05:08:54 +00002302 "((is equal to 1) or (is equal to 2))",
2303 Describe(m));
2304
2305 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
jgm79a367e2012-04-10 16:02:11 +00002306 EXPECT_EQ("((is < 0) or "
2307 "(is equal to 1)) or "
shiqiane35fdd92008-12-10 05:08:54 +00002308 "((is equal to 2) or "
jgm79a367e2012-04-10 16:02:11 +00002309 "(is equal to 3))",
shiqiane35fdd92008-12-10 05:08:54 +00002310 Describe(m));
2311
2312 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
jgm79a367e2012-04-10 16:02:11 +00002313 EXPECT_EQ("((is <= 0) or "
2314 "(is > 10)) or "
shiqiane35fdd92008-12-10 05:08:54 +00002315 "((is equal to 3) or "
2316 "((is equal to 5) or "
jgm79a367e2012-04-10 16:02:11 +00002317 "(is equal to 7)))",
shiqiane35fdd92008-12-10 05:08:54 +00002318 Describe(m));
2319}
2320
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002321// Tests that AnyOf(m1, ..., mn) describes its negation properly.
2322TEST(AnyOfTest, CanDescribeNegation) {
2323 Matcher<int> m;
2324 m = AnyOf(Le(1), Ge(3));
2325 EXPECT_EQ("(isn't <= 1) and (isn't >= 3)",
2326 DescribeNegation(m));
2327
2328 m = AnyOf(Lt(0), Eq(1), Eq(2));
2329 EXPECT_EQ("(isn't < 0) and "
2330 "((isn't equal to 1) and (isn't equal to 2))",
2331 DescribeNegation(m));
2332
2333 m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
jgm79a367e2012-04-10 16:02:11 +00002334 EXPECT_EQ("((isn't < 0) and "
2335 "(isn't equal to 1)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002336 "((isn't equal to 2) and "
jgm79a367e2012-04-10 16:02:11 +00002337 "(isn't equal to 3))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002338 DescribeNegation(m));
2339
2340 m = AnyOf(Le(0), Gt(10), 3, 5, 7);
jgm79a367e2012-04-10 16:02:11 +00002341 EXPECT_EQ("((isn't <= 0) and "
2342 "(isn't > 10)) and "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002343 "((isn't equal to 3) and "
2344 "((isn't equal to 5) and "
jgm79a367e2012-04-10 16:02:11 +00002345 "(isn't equal to 7)))",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002346 DescribeNegation(m));
2347}
2348
zhanyong.wan18490652009-05-11 18:54:08 +00002349// Tests that monomorphic matchers are safely cast by the AnyOf matcher.
2350TEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
2351 // greater_than_5 and less_than_10 are monomorphic matchers.
2352 Matcher<int> greater_than_5 = Gt(5);
2353 Matcher<int> less_than_10 = Lt(10);
2354
2355 Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);
2356 Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);
2357 Matcher<int&> m3 = AnyOf(greater_than_5, m2);
2358
2359 // Tests that EitherOf works when composing itself.
2360 Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);
2361 Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);
2362}
2363
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002364TEST(AnyOfTest, ExplainsResult) {
2365 Matcher<int> m;
2366
2367 // Failed match. Both matchers need to explain. The second
2368 // matcher doesn't give an explanation, so only the first matcher's
2369 // explanation is printed.
2370 m = AnyOf(GreaterThan(10), Lt(0));
2371 EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2372
2373 // Failed match. Both matchers need to explain.
2374 m = AnyOf(GreaterThan(10), GreaterThan(20));
2375 EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20",
2376 Explain(m, 5));
2377
2378 // Failed match. All matchers need to explain. The second
2379 // matcher doesn't given an explanation.
2380 m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30));
2381 EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30",
2382 Explain(m, 5));
2383
2384 // Failed match. All matchers need to explain.
2385 m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2386 EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, "
2387 "and which is 25 less than 30",
2388 Explain(m, 5));
2389
2390 // Successful match. The first matcher, which succeeded, needs to
2391 // explain.
2392 m = AnyOf(GreaterThan(10), GreaterThan(20));
2393 EXPECT_EQ("which is 5 more than 10", Explain(m, 15));
2394
2395 // Successful match. The second matcher, which succeeded, needs to
2396 // explain. Since it doesn't given an explanation, nothing is
2397 // printed.
2398 m = AnyOf(GreaterThan(10), Lt(30));
2399 EXPECT_EQ("", Explain(m, 0));
2400
2401 // Successful match. The second matcher, which succeeded, needs to
2402 // explain.
2403 m = AnyOf(GreaterThan(30), GreaterThan(20));
2404 EXPECT_EQ("which is 5 more than 20", Explain(m, 25));
2405}
2406
shiqiane35fdd92008-12-10 05:08:54 +00002407// The following predicate function and predicate functor are for
2408// testing the Truly(predicate) matcher.
2409
2410// Returns non-zero if the input is positive. Note that the return
2411// type of this function is not bool. It's OK as Truly() accepts any
2412// unary function or functor whose return type can be implicitly
2413// converted to bool.
2414int IsPositive(double x) {
2415 return x > 0 ? 1 : 0;
2416}
2417
2418// This functor returns true if the input is greater than the given
2419// number.
2420class IsGreaterThan {
2421 public:
2422 explicit IsGreaterThan(int threshold) : threshold_(threshold) {}
2423
2424 bool operator()(int n) const { return n > threshold_; }
zhanyong.wan32de5f52009-12-23 00:13:23 +00002425
shiqiane35fdd92008-12-10 05:08:54 +00002426 private:
zhanyong.wan32de5f52009-12-23 00:13:23 +00002427 int threshold_;
shiqiane35fdd92008-12-10 05:08:54 +00002428};
2429
2430// For testing Truly().
2431const int foo = 0;
2432
2433// This predicate returns true iff the argument references foo and has
2434// a zero value.
2435bool ReferencesFooAndIsZero(const int& n) {
2436 return (&n == &foo) && (n == 0);
2437}
2438
2439// Tests that Truly(predicate) matches what satisfies the given
2440// predicate.
2441TEST(TrulyTest, MatchesWhatSatisfiesThePredicate) {
2442 Matcher<double> m = Truly(IsPositive);
2443 EXPECT_TRUE(m.Matches(2.0));
2444 EXPECT_FALSE(m.Matches(-1.5));
2445}
2446
2447// Tests that Truly(predicate_functor) works too.
2448TEST(TrulyTest, CanBeUsedWithFunctor) {
2449 Matcher<int> m = Truly(IsGreaterThan(5));
2450 EXPECT_TRUE(m.Matches(6));
2451 EXPECT_FALSE(m.Matches(4));
2452}
2453
zhanyong.wan8d3dc0c2011-04-14 19:37:06 +00002454// A class that can be implicitly converted to bool.
2455class ConvertibleToBool {
2456 public:
2457 explicit ConvertibleToBool(int number) : number_(number) {}
2458 operator bool() const { return number_ != 0; }
2459
2460 private:
2461 int number_;
2462};
2463
2464ConvertibleToBool IsNotZero(int number) {
2465 return ConvertibleToBool(number);
2466}
2467
2468// Tests that the predicate used in Truly() may return a class that's
2469// implicitly convertible to bool, even when the class has no
2470// operator!().
2471TEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) {
2472 Matcher<int> m = Truly(IsNotZero);
2473 EXPECT_TRUE(m.Matches(1));
2474 EXPECT_FALSE(m.Matches(0));
2475}
2476
shiqiane35fdd92008-12-10 05:08:54 +00002477// Tests that Truly(predicate) can describe itself properly.
2478TEST(TrulyTest, CanDescribeSelf) {
2479 Matcher<double> m = Truly(IsPositive);
2480 EXPECT_EQ("satisfies the given predicate",
2481 Describe(m));
2482}
2483
2484// Tests that Truly(predicate) works when the matcher takes its
2485// argument by reference.
2486TEST(TrulyTest, WorksForByRefArguments) {
2487 Matcher<const int&> m = Truly(ReferencesFooAndIsZero);
2488 EXPECT_TRUE(m.Matches(foo));
2489 int n = 0;
2490 EXPECT_FALSE(m.Matches(n));
2491}
2492
2493// Tests that Matches(m) is a predicate satisfied by whatever that
2494// matches matcher m.
2495TEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) {
2496 EXPECT_TRUE(Matches(Ge(0))(1));
2497 EXPECT_FALSE(Matches(Eq('a'))('b'));
2498}
2499
2500// Tests that Matches(m) works when the matcher takes its argument by
2501// reference.
2502TEST(MatchesTest, WorksOnByRefArguments) {
2503 int m = 0, n = 0;
2504 EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n));
2505 EXPECT_FALSE(Matches(Ref(m))(n));
2506}
2507
2508// Tests that a Matcher on non-reference type can be used in
2509// Matches().
2510TEST(MatchesTest, WorksWithMatcherOnNonRefType) {
2511 Matcher<int> eq5 = Eq(5);
2512 EXPECT_TRUE(Matches(eq5)(5));
2513 EXPECT_FALSE(Matches(eq5)(2));
2514}
2515
zhanyong.wanb8243162009-06-04 05:48:20 +00002516// Tests Value(value, matcher). Since Value() is a simple wrapper for
2517// Matches(), which has been tested already, we don't spend a lot of
2518// effort on testing Value().
2519TEST(ValueTest, WorksWithPolymorphicMatcher) {
2520 EXPECT_TRUE(Value("hi", StartsWith("h")));
2521 EXPECT_FALSE(Value(5, Gt(10)));
2522}
2523
2524TEST(ValueTest, WorksWithMonomorphicMatcher) {
2525 const Matcher<int> is_zero = Eq(0);
2526 EXPECT_TRUE(Value(0, is_zero));
2527 EXPECT_FALSE(Value('a', is_zero));
2528
2529 int n = 0;
2530 const Matcher<const int&> ref_n = Ref(n);
2531 EXPECT_TRUE(Value(n, ref_n));
2532 EXPECT_FALSE(Value(1, ref_n));
2533}
2534
zhanyong.wana862f1d2010-03-15 21:23:04 +00002535TEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) {
zhanyong.wan34b034c2010-03-05 21:23:23 +00002536 StringMatchResultListener listener1;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002537 EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002538 EXPECT_EQ("% 2 == 0", listener1.str());
2539
2540 StringMatchResultListener listener2;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002541 EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002542 EXPECT_EQ("", listener2.str());
2543}
2544
zhanyong.wana862f1d2010-03-15 21:23:04 +00002545TEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {
zhanyong.wan34b034c2010-03-05 21:23:23 +00002546 const Matcher<int> is_even = PolymorphicIsEven();
2547 StringMatchResultListener listener1;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002548 EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002549 EXPECT_EQ("% 2 == 0", listener1.str());
2550
2551 const Matcher<const double&> is_zero = Eq(0);
2552 StringMatchResultListener listener2;
zhanyong.wana862f1d2010-03-15 21:23:04 +00002553 EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2));
zhanyong.wan34b034c2010-03-05 21:23:23 +00002554 EXPECT_EQ("", listener2.str());
2555}
2556
zhanyong.wana862f1d2010-03-15 21:23:04 +00002557MATCHER_P(Really, inner_matcher, "") {
2558 return ExplainMatchResult(inner_matcher, arg, result_listener);
2559}
2560
2561TEST(ExplainMatchResultTest, WorksInsideMATCHER) {
2562 EXPECT_THAT(0, Really(Eq(0)));
2563}
2564
zhanyong.wanbf550852009-06-09 06:09:53 +00002565TEST(AllArgsTest, WorksForTuple) {
2566 EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt()));
2567 EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt())));
2568}
2569
2570TEST(AllArgsTest, WorksForNonTuple) {
2571 EXPECT_THAT(42, AllArgs(Gt(0)));
2572 EXPECT_THAT('a', Not(AllArgs(Eq('b'))));
2573}
2574
2575class AllArgsHelper {
2576 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +00002577 AllArgsHelper() {}
2578
zhanyong.wanbf550852009-06-09 06:09:53 +00002579 MOCK_METHOD2(Helper, int(char x, int y));
zhanyong.wan32de5f52009-12-23 00:13:23 +00002580
2581 private:
2582 GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper);
zhanyong.wanbf550852009-06-09 06:09:53 +00002583};
2584
2585TEST(AllArgsTest, WorksInWithClause) {
2586 AllArgsHelper helper;
2587 ON_CALL(helper, Helper(_, _))
2588 .With(AllArgs(Lt()))
2589 .WillByDefault(Return(1));
2590 EXPECT_CALL(helper, Helper(_, _));
2591 EXPECT_CALL(helper, Helper(_, _))
2592 .With(AllArgs(Gt()))
2593 .WillOnce(Return(2));
2594
2595 EXPECT_EQ(1, helper.Helper('\1', 2));
2596 EXPECT_EQ(2, helper.Helper('a', 1));
2597}
2598
shiqiane35fdd92008-12-10 05:08:54 +00002599// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2600// matches the matcher.
2601TEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {
2602 ASSERT_THAT(5, Ge(2)) << "This should succeed.";
2603 ASSERT_THAT("Foo", EndsWith("oo"));
2604 EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too.";
2605 EXPECT_THAT("Hello", StartsWith("Hell"));
2606}
2607
2608// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2609// doesn't match the matcher.
2610TEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {
2611 // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(),
2612 // which cannot reference auto variables.
zhanyong.wan736baa82010-09-27 17:44:16 +00002613 static unsigned short n; // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00002614 n = 5;
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002615
2616 // VC++ prior to version 8.0 SP1 has a bug where it will not see any
2617 // functions declared in the namespace scope from within nested classes.
2618 // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all
2619 // namespace-level functions invoked inside them need to be explicitly
2620 // resolved.
2621 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)),
shiqiane35fdd92008-12-10 05:08:54 +00002622 "Value of: n\n"
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002623 "Expected: is > 10\n"
zhanyong.wan736baa82010-09-27 17:44:16 +00002624 " Actual: 5" + OfType("unsigned short"));
shiqiane35fdd92008-12-10 05:08:54 +00002625 n = 0;
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002626 EXPECT_NONFATAL_FAILURE(
2627 EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))),
2628 "Value of: n\n"
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002629 "Expected: (is <= 7) and (is >= 5)\n"
zhanyong.wan736baa82010-09-27 17:44:16 +00002630 " Actual: 0" + OfType("unsigned short"));
shiqiane35fdd92008-12-10 05:08:54 +00002631}
2632
2633// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument
2634// has a reference type.
2635TEST(MatcherAssertionTest, WorksForByRefArguments) {
2636 // We use a static variable here as EXPECT_FATAL_FAILURE() cannot
2637 // reference auto variables.
2638 static int n;
2639 n = 0;
2640 EXPECT_THAT(n, AllOf(Le(7), Ref(n)));
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002641 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
shiqiane35fdd92008-12-10 05:08:54 +00002642 "Value of: n\n"
2643 "Expected: does not reference the variable @");
2644 // Tests the "Actual" part.
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00002645 EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
zhanyong.wan736baa82010-09-27 17:44:16 +00002646 "Actual: 0" + OfType("int") + ", which is located @");
shiqiane35fdd92008-12-10 05:08:54 +00002647}
2648
zhanyong.wan95b12332009-09-25 18:55:50 +00002649#if !GTEST_OS_SYMBIAN
shiqiane35fdd92008-12-10 05:08:54 +00002650// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is
2651// monomorphic.
zhanyong.wan95b12332009-09-25 18:55:50 +00002652
2653// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's
2654// Symbian compiler: it tries to compile
2655// template<T, U> class MatcherCastImpl { ...
zhanyong.wandb22c222010-01-28 21:52:29 +00002656// virtual bool MatchAndExplain(T x, ...) const {
2657// return source_matcher_.MatchAndExplain(static_cast<U>(x), ...);
zhanyong.wan95b12332009-09-25 18:55:50 +00002658// with U == string and T == const char*
2659// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... )
2660// the compiler silently crashes with no output.
2661// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x)
2662// the code compiles but the converted string is bogus.
shiqiane35fdd92008-12-10 05:08:54 +00002663TEST(MatcherAssertionTest, WorksForMonomorphicMatcher) {
2664 Matcher<const char*> starts_with_he = StartsWith("he");
2665 ASSERT_THAT("hello", starts_with_he);
2666
2667 Matcher<const string&> ends_with_ok = EndsWith("ok");
2668 ASSERT_THAT("book", ends_with_ok);
zhanyong.wan736baa82010-09-27 17:44:16 +00002669 const string bad = "bad";
2670 EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok),
2671 "Value of: bad\n"
2672 "Expected: ends with \"ok\"\n"
2673 " Actual: \"bad\"");
shiqiane35fdd92008-12-10 05:08:54 +00002674 Matcher<int> is_greater_than_5 = Gt(5);
2675 EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5),
2676 "Value of: 5\n"
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002677 "Expected: is > 5\n"
zhanyong.wan736baa82010-09-27 17:44:16 +00002678 " Actual: 5" + OfType("int"));
shiqiane35fdd92008-12-10 05:08:54 +00002679}
zhanyong.wan95b12332009-09-25 18:55:50 +00002680#endif // !GTEST_OS_SYMBIAN
shiqiane35fdd92008-12-10 05:08:54 +00002681
2682// Tests floating-point matchers.
2683template <typename RawType>
2684class FloatingPointTest : public testing::Test {
2685 protected:
zhanyong.wan35877b72013-09-18 17:51:08 +00002686 typedef testing::internal::FloatingPoint<RawType> Floating;
shiqiane35fdd92008-12-10 05:08:54 +00002687 typedef typename Floating::Bits Bits;
2688
zhanyong.wan35877b72013-09-18 17:51:08 +00002689 FloatingPointTest()
2690 : max_ulps_(Floating::kMaxUlps),
2691 zero_bits_(Floating(0).bits()),
2692 one_bits_(Floating(1).bits()),
2693 infinity_bits_(Floating(Floating::Infinity()).bits()),
2694 close_to_positive_zero_(
2695 Floating::ReinterpretBits(zero_bits_ + max_ulps_/2)),
2696 close_to_negative_zero_(
2697 -Floating::ReinterpretBits(zero_bits_ + max_ulps_ - max_ulps_/2)),
2698 further_from_negative_zero_(-Floating::ReinterpretBits(
2699 zero_bits_ + max_ulps_ + 1 - max_ulps_/2)),
2700 close_to_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_)),
2701 further_from_one_(Floating::ReinterpretBits(one_bits_ + max_ulps_ + 1)),
2702 infinity_(Floating::Infinity()),
2703 close_to_infinity_(
2704 Floating::ReinterpretBits(infinity_bits_ - max_ulps_)),
2705 further_from_infinity_(
2706 Floating::ReinterpretBits(infinity_bits_ - max_ulps_ - 1)),
2707 max_(Floating::Max()),
2708 nan1_(Floating::ReinterpretBits(Floating::kExponentBitMask | 1)),
2709 nan2_(Floating::ReinterpretBits(Floating::kExponentBitMask | 200)) {
shiqiane35fdd92008-12-10 05:08:54 +00002710 }
2711
2712 void TestSize() {
2713 EXPECT_EQ(sizeof(RawType), sizeof(Bits));
2714 }
2715
2716 // A battery of tests for FloatingEqMatcher::Matches.
2717 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
2718 void TestMatches(
2719 testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) {
2720 Matcher<RawType> m1 = matcher_maker(0.0);
2721 EXPECT_TRUE(m1.Matches(-0.0));
2722 EXPECT_TRUE(m1.Matches(close_to_positive_zero_));
2723 EXPECT_TRUE(m1.Matches(close_to_negative_zero_));
2724 EXPECT_FALSE(m1.Matches(1.0));
2725
2726 Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_);
2727 EXPECT_FALSE(m2.Matches(further_from_negative_zero_));
2728
2729 Matcher<RawType> m3 = matcher_maker(1.0);
2730 EXPECT_TRUE(m3.Matches(close_to_one_));
2731 EXPECT_FALSE(m3.Matches(further_from_one_));
2732
2733 // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above.
2734 EXPECT_FALSE(m3.Matches(0.0));
2735
2736 Matcher<RawType> m4 = matcher_maker(-infinity_);
2737 EXPECT_TRUE(m4.Matches(-close_to_infinity_));
2738
2739 Matcher<RawType> m5 = matcher_maker(infinity_);
2740 EXPECT_TRUE(m5.Matches(close_to_infinity_));
2741
2742 // This is interesting as the representations of infinity_ and nan1_
2743 // are only 1 DLP apart.
2744 EXPECT_FALSE(m5.Matches(nan1_));
2745
2746 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2747 // some cases.
2748 Matcher<const RawType&> m6 = matcher_maker(0.0);
2749 EXPECT_TRUE(m6.Matches(-0.0));
2750 EXPECT_TRUE(m6.Matches(close_to_positive_zero_));
2751 EXPECT_FALSE(m6.Matches(1.0));
2752
2753 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2754 // cases.
2755 Matcher<RawType&> m7 = matcher_maker(0.0);
2756 RawType x = 0.0;
2757 EXPECT_TRUE(m7.Matches(x));
2758 x = 0.01f;
2759 EXPECT_FALSE(m7.Matches(x));
2760 }
2761
2762 // Pre-calculated numbers to be used by the tests.
2763
zhanyong.wan35877b72013-09-18 17:51:08 +00002764 const size_t max_ulps_;
shiqiane35fdd92008-12-10 05:08:54 +00002765
zhanyong.wan35877b72013-09-18 17:51:08 +00002766 const Bits zero_bits_; // The bits that represent 0.0.
2767 const Bits one_bits_; // The bits that represent 1.0.
2768 const Bits infinity_bits_; // The bits that represent +infinity.
shiqiane35fdd92008-12-10 05:08:54 +00002769
zhanyong.wan35877b72013-09-18 17:51:08 +00002770 // Some numbers close to 0.0.
2771 const RawType close_to_positive_zero_;
2772 const RawType close_to_negative_zero_;
2773 const RawType further_from_negative_zero_;
shiqiane35fdd92008-12-10 05:08:54 +00002774
zhanyong.wan35877b72013-09-18 17:51:08 +00002775 // Some numbers close to 1.0.
2776 const RawType close_to_one_;
2777 const RawType further_from_one_;
2778
2779 // Some numbers close to +infinity.
2780 const RawType infinity_;
2781 const RawType close_to_infinity_;
2782 const RawType further_from_infinity_;
2783
2784 // Maximum representable value that's not infinity.
2785 const RawType max_;
2786
2787 // Some NaNs.
2788 const RawType nan1_;
2789 const RawType nan2_;
shiqiane35fdd92008-12-10 05:08:54 +00002790};
2791
zhanyong.wan616180e2013-06-18 18:49:51 +00002792// Tests floating-point matchers with fixed epsilons.
2793template <typename RawType>
2794class FloatingPointNearTest : public FloatingPointTest<RawType> {
2795 protected:
2796 typedef FloatingPointTest<RawType> ParentType;
2797
2798 // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon.
2799 // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
2800 void TestNearMatches(
2801 testing::internal::FloatingEqMatcher<RawType>
2802 (*matcher_maker)(RawType, RawType)) {
2803 Matcher<RawType> m1 = matcher_maker(0.0, 0.0);
2804 EXPECT_TRUE(m1.Matches(0.0));
2805 EXPECT_TRUE(m1.Matches(-0.0));
2806 EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_));
2807 EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_));
2808 EXPECT_FALSE(m1.Matches(1.0));
2809
2810 Matcher<RawType> m2 = matcher_maker(0.0, 1.0);
2811 EXPECT_TRUE(m2.Matches(0.0));
2812 EXPECT_TRUE(m2.Matches(-0.0));
2813 EXPECT_TRUE(m2.Matches(1.0));
2814 EXPECT_TRUE(m2.Matches(-1.0));
2815 EXPECT_FALSE(m2.Matches(ParentType::close_to_one_));
2816 EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_));
2817
2818 // Check that inf matches inf, regardless of the of the specified max
2819 // absolute error.
2820 Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0);
2821 EXPECT_TRUE(m3.Matches(ParentType::infinity_));
2822 EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_));
2823 EXPECT_FALSE(m3.Matches(-ParentType::infinity_));
2824
2825 Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0);
2826 EXPECT_TRUE(m4.Matches(-ParentType::infinity_));
2827 EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_));
2828 EXPECT_FALSE(m4.Matches(ParentType::infinity_));
2829
2830 // Test various overflow scenarios.
zhanyong.wan35877b72013-09-18 17:51:08 +00002831 Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_);
2832 EXPECT_TRUE(m5.Matches(ParentType::max_));
2833 EXPECT_FALSE(m5.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002834
zhanyong.wan35877b72013-09-18 17:51:08 +00002835 Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_);
2836 EXPECT_FALSE(m6.Matches(ParentType::max_));
2837 EXPECT_TRUE(m6.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002838
zhanyong.wan35877b72013-09-18 17:51:08 +00002839 Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0);
2840 EXPECT_TRUE(m7.Matches(ParentType::max_));
2841 EXPECT_FALSE(m7.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002842
zhanyong.wan35877b72013-09-18 17:51:08 +00002843 Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0);
2844 EXPECT_FALSE(m8.Matches(ParentType::max_));
2845 EXPECT_TRUE(m8.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002846
2847 // The difference between max() and -max() normally overflows to infinity,
2848 // but it should still match if the max_abs_error is also infinity.
2849 Matcher<RawType> m9 = matcher_maker(
zhanyong.wan35877b72013-09-18 17:51:08 +00002850 ParentType::max_, ParentType::infinity_);
2851 EXPECT_TRUE(m8.Matches(-ParentType::max_));
zhanyong.wan616180e2013-06-18 18:49:51 +00002852
2853 // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2854 // some cases.
2855 Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0);
2856 EXPECT_TRUE(m10.Matches(-0.0));
2857 EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_));
2858 EXPECT_FALSE(m10.Matches(ParentType::close_to_one_));
2859
2860 // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2861 // cases.
2862 Matcher<RawType&> m11 = matcher_maker(0.0, 1.0);
2863 RawType x = 0.0;
2864 EXPECT_TRUE(m11.Matches(x));
2865 x = 1.0f;
2866 EXPECT_TRUE(m11.Matches(x));
2867 x = -1.0f;
2868 EXPECT_TRUE(m11.Matches(x));
2869 x = 1.1f;
2870 EXPECT_FALSE(m11.Matches(x));
2871 x = -1.1f;
2872 EXPECT_FALSE(m11.Matches(x));
2873 }
2874};
2875
shiqiane35fdd92008-12-10 05:08:54 +00002876// Instantiate FloatingPointTest for testing floats.
2877typedef FloatingPointTest<float> FloatTest;
2878
2879TEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) {
2880 TestMatches(&FloatEq);
2881}
2882
2883TEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) {
2884 TestMatches(&NanSensitiveFloatEq);
2885}
2886
2887TEST_F(FloatTest, FloatEqCannotMatchNaN) {
2888 // FloatEq never matches NaN.
2889 Matcher<float> m = FloatEq(nan1_);
2890 EXPECT_FALSE(m.Matches(nan1_));
2891 EXPECT_FALSE(m.Matches(nan2_));
2892 EXPECT_FALSE(m.Matches(1.0));
2893}
2894
2895TEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {
2896 // NanSensitiveFloatEq will match NaN.
2897 Matcher<float> m = NanSensitiveFloatEq(nan1_);
2898 EXPECT_TRUE(m.Matches(nan1_));
2899 EXPECT_TRUE(m.Matches(nan2_));
2900 EXPECT_FALSE(m.Matches(1.0));
2901}
2902
2903TEST_F(FloatTest, FloatEqCanDescribeSelf) {
2904 Matcher<float> m1 = FloatEq(2.0f);
2905 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002906 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00002907
2908 Matcher<float> m2 = FloatEq(0.5f);
2909 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002910 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00002911
2912 Matcher<float> m3 = FloatEq(nan1_);
2913 EXPECT_EQ("never matches", Describe(m3));
2914 EXPECT_EQ("is anything", DescribeNegation(m3));
2915}
2916
2917TEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) {
2918 Matcher<float> m1 = NanSensitiveFloatEq(2.0f);
2919 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002920 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00002921
2922 Matcher<float> m2 = NanSensitiveFloatEq(0.5f);
2923 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002924 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00002925
2926 Matcher<float> m3 = NanSensitiveFloatEq(nan1_);
2927 EXPECT_EQ("is NaN", Describe(m3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00002928 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
shiqiane35fdd92008-12-10 05:08:54 +00002929}
2930
zhanyong.wan616180e2013-06-18 18:49:51 +00002931// Instantiate FloatingPointTest for testing floats with a user-specified
2932// max absolute error.
2933typedef FloatingPointNearTest<float> FloatNearTest;
2934
2935TEST_F(FloatNearTest, FloatNearMatches) {
2936 TestNearMatches(&FloatNear);
2937}
2938
2939TEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) {
2940 TestNearMatches(&NanSensitiveFloatNear);
2941}
2942
2943TEST_F(FloatNearTest, FloatNearCanDescribeSelf) {
2944 Matcher<float> m1 = FloatNear(2.0f, 0.5f);
2945 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2946 EXPECT_EQ(
2947 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2948
2949 Matcher<float> m2 = FloatNear(0.5f, 0.5f);
2950 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2951 EXPECT_EQ(
2952 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2953
2954 Matcher<float> m3 = FloatNear(nan1_, 0.0);
2955 EXPECT_EQ("never matches", Describe(m3));
2956 EXPECT_EQ("is anything", DescribeNegation(m3));
2957}
2958
2959TEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) {
2960 Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f);
2961 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2962 EXPECT_EQ(
2963 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2964
2965 Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f);
2966 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2967 EXPECT_EQ(
2968 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2969
2970 Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f);
2971 EXPECT_EQ("is NaN", Describe(m3));
2972 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2973}
2974
2975TEST_F(FloatNearTest, FloatNearCannotMatchNaN) {
2976 // FloatNear never matches NaN.
2977 Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f);
2978 EXPECT_FALSE(m.Matches(nan1_));
2979 EXPECT_FALSE(m.Matches(nan2_));
2980 EXPECT_FALSE(m.Matches(1.0));
2981}
2982
2983TEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) {
2984 // NanSensitiveFloatNear will match NaN.
2985 Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f);
2986 EXPECT_TRUE(m.Matches(nan1_));
2987 EXPECT_TRUE(m.Matches(nan2_));
2988 EXPECT_FALSE(m.Matches(1.0));
2989}
2990
shiqiane35fdd92008-12-10 05:08:54 +00002991// Instantiate FloatingPointTest for testing doubles.
2992typedef FloatingPointTest<double> DoubleTest;
2993
2994TEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) {
2995 TestMatches(&DoubleEq);
2996}
2997
2998TEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) {
2999 TestMatches(&NanSensitiveDoubleEq);
3000}
3001
3002TEST_F(DoubleTest, DoubleEqCannotMatchNaN) {
3003 // DoubleEq never matches NaN.
3004 Matcher<double> m = DoubleEq(nan1_);
3005 EXPECT_FALSE(m.Matches(nan1_));
3006 EXPECT_FALSE(m.Matches(nan2_));
3007 EXPECT_FALSE(m.Matches(1.0));
3008}
3009
3010TEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {
3011 // NanSensitiveDoubleEq will match NaN.
3012 Matcher<double> m = NanSensitiveDoubleEq(nan1_);
3013 EXPECT_TRUE(m.Matches(nan1_));
3014 EXPECT_TRUE(m.Matches(nan2_));
3015 EXPECT_FALSE(m.Matches(1.0));
3016}
3017
3018TEST_F(DoubleTest, DoubleEqCanDescribeSelf) {
3019 Matcher<double> m1 = DoubleEq(2.0);
3020 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003021 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00003022
3023 Matcher<double> m2 = DoubleEq(0.5);
3024 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003025 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00003026
3027 Matcher<double> m3 = DoubleEq(nan1_);
3028 EXPECT_EQ("never matches", Describe(m3));
3029 EXPECT_EQ("is anything", DescribeNegation(m3));
3030}
3031
3032TEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) {
3033 Matcher<double> m1 = NanSensitiveDoubleEq(2.0);
3034 EXPECT_EQ("is approximately 2", Describe(m1));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003035 EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
shiqiane35fdd92008-12-10 05:08:54 +00003036
3037 Matcher<double> m2 = NanSensitiveDoubleEq(0.5);
3038 EXPECT_EQ("is approximately 0.5", Describe(m2));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003039 EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
shiqiane35fdd92008-12-10 05:08:54 +00003040
3041 Matcher<double> m3 = NanSensitiveDoubleEq(nan1_);
3042 EXPECT_EQ("is NaN", Describe(m3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003043 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
shiqiane35fdd92008-12-10 05:08:54 +00003044}
3045
zhanyong.wan616180e2013-06-18 18:49:51 +00003046// Instantiate FloatingPointTest for testing floats with a user-specified
3047// max absolute error.
3048typedef FloatingPointNearTest<double> DoubleNearTest;
3049
3050TEST_F(DoubleNearTest, DoubleNearMatches) {
3051 TestNearMatches(&DoubleNear);
3052}
3053
3054TEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) {
3055 TestNearMatches(&NanSensitiveDoubleNear);
3056}
3057
3058TEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) {
3059 Matcher<double> m1 = DoubleNear(2.0, 0.5);
3060 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3061 EXPECT_EQ(
3062 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3063
3064 Matcher<double> m2 = DoubleNear(0.5, 0.5);
3065 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3066 EXPECT_EQ(
3067 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3068
3069 Matcher<double> m3 = DoubleNear(nan1_, 0.0);
3070 EXPECT_EQ("never matches", Describe(m3));
3071 EXPECT_EQ("is anything", DescribeNegation(m3));
3072}
3073
3074TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) {
3075 Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5);
3076 EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3077 EXPECT_EQ(
3078 "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3079
3080 Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5);
3081 EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3082 EXPECT_EQ(
3083 "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3084
3085 Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1);
3086 EXPECT_EQ("is NaN", Describe(m3));
3087 EXPECT_EQ("isn't NaN", DescribeNegation(m3));
3088}
3089
3090TEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) {
3091 // DoubleNear never matches NaN.
3092 Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1);
3093 EXPECT_FALSE(m.Matches(nan1_));
3094 EXPECT_FALSE(m.Matches(nan2_));
3095 EXPECT_FALSE(m.Matches(1.0));
3096}
3097
3098TEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) {
3099 // NanSensitiveDoubleNear will match NaN.
3100 Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1);
3101 EXPECT_TRUE(m.Matches(nan1_));
3102 EXPECT_TRUE(m.Matches(nan2_));
3103 EXPECT_FALSE(m.Matches(1.0));
3104}
3105
shiqiane35fdd92008-12-10 05:08:54 +00003106TEST(PointeeTest, RawPointer) {
3107 const Matcher<int*> m = Pointee(Ge(0));
3108
3109 int n = 1;
3110 EXPECT_TRUE(m.Matches(&n));
3111 n = -1;
3112 EXPECT_FALSE(m.Matches(&n));
3113 EXPECT_FALSE(m.Matches(NULL));
3114}
3115
3116TEST(PointeeTest, RawPointerToConst) {
3117 const Matcher<const double*> m = Pointee(Ge(0));
3118
3119 double x = 1;
3120 EXPECT_TRUE(m.Matches(&x));
3121 x = -1;
3122 EXPECT_FALSE(m.Matches(&x));
3123 EXPECT_FALSE(m.Matches(NULL));
3124}
3125
3126TEST(PointeeTest, ReferenceToConstRawPointer) {
3127 const Matcher<int* const &> m = Pointee(Ge(0));
3128
3129 int n = 1;
3130 EXPECT_TRUE(m.Matches(&n));
3131 n = -1;
3132 EXPECT_FALSE(m.Matches(&n));
3133 EXPECT_FALSE(m.Matches(NULL));
3134}
3135
3136TEST(PointeeTest, ReferenceToNonConstRawPointer) {
3137 const Matcher<double* &> m = Pointee(Ge(0));
3138
3139 double x = 1.0;
3140 double* p = &x;
3141 EXPECT_TRUE(m.Matches(p));
3142 x = -1;
3143 EXPECT_FALSE(m.Matches(p));
3144 p = NULL;
3145 EXPECT_FALSE(m.Matches(p));
3146}
3147
billydonahue1f5fdea2014-05-19 17:54:51 +00003148
3149MATCHER_P(FieldIIs, inner_matcher, "") {
3150 return ExplainMatchResult(inner_matcher, arg.i, result_listener);
3151}
3152
3153TEST(WhenDynamicCastToTest, SameType) {
3154 Derived derived;
3155 derived.i = 4;
3156
3157 // Right type. A pointer is passed down.
3158 Base* as_base_ptr = &derived;
3159 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull())));
3160 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4))));
3161 EXPECT_THAT(as_base_ptr,
3162 Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5)))));
3163}
3164
3165TEST(WhenDynamicCastToTest, WrongTypes) {
3166 Base base;
3167 Derived derived;
3168 OtherDerived other_derived;
3169
3170 // Wrong types. NULL is passed.
3171 EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
3172 EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull()));
3173 Base* as_base_ptr = &derived;
3174 EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_))));
3175 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull()));
3176 as_base_ptr = &other_derived;
3177 EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
3178 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
3179}
3180
3181TEST(WhenDynamicCastToTest, AlreadyNull) {
3182 // Already NULL.
3183 Base* as_base_ptr = NULL;
3184 EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
3185}
3186
3187struct AmbiguousCastTypes {
3188 class VirtualDerived : public virtual Base {};
3189 class DerivedSub1 : public VirtualDerived {};
3190 class DerivedSub2 : public VirtualDerived {};
3191 class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {};
3192};
3193
3194TEST(WhenDynamicCastToTest, AmbiguousCast) {
3195 AmbiguousCastTypes::DerivedSub1 sub1;
3196 AmbiguousCastTypes::ManyDerivedInHierarchy many_derived;
3197 // Multiply derived from Base. dynamic_cast<> returns NULL.
3198 Base* as_base_ptr =
3199 static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived);
3200 EXPECT_THAT(as_base_ptr,
3201 WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull()));
3202 as_base_ptr = &sub1;
3203 EXPECT_THAT(
3204 as_base_ptr,
3205 WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull())));
3206}
3207
3208TEST(WhenDynamicCastToTest, Describe) {
3209 Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
3210#if GTEST_HAS_RTTI
3211 const string prefix =
3212 "when dynamic_cast to " + internal::GetTypeName<Derived*>() + ", ";
3213#else // GTEST_HAS_RTTI
3214 const string prefix = "when dynamic_cast, ";
3215#endif // GTEST_HAS_RTTI
3216 EXPECT_EQ(prefix + "points to a value that is anything", Describe(matcher));
3217 EXPECT_EQ(prefix + "does not point to a value that is anything",
3218 DescribeNegation(matcher));
3219}
3220
3221TEST(WhenDynamicCastToTest, Explain) {
3222 Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
3223 Base* null = NULL;
3224 EXPECT_THAT(Explain(matcher, null), HasSubstr("NULL"));
3225 Derived derived;
3226 EXPECT_TRUE(matcher.Matches(&derived));
3227 EXPECT_THAT(Explain(matcher, &derived), HasSubstr("which points to "));
3228
3229 // With references, the matcher itself can fail. Test for that one.
3230 Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_);
3231 EXPECT_THAT(Explain(ref_matcher, derived),
3232 HasSubstr("which cannot be dynamic_cast"));
3233}
3234
3235TEST(WhenDynamicCastToTest, GoodReference) {
3236 Derived derived;
3237 derived.i = 4;
3238 Base& as_base_ref = derived;
3239 EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4)));
3240 EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5))));
3241}
3242
3243TEST(WhenDynamicCastToTest, BadReference) {
3244 Derived derived;
3245 Base& as_base_ref = derived;
3246 EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_)));
3247}
3248
vladlosevada23472012-08-14 15:38:49 +00003249// Minimal const-propagating pointer.
3250template <typename T>
3251class ConstPropagatingPtr {
3252 public:
3253 typedef T element_type;
3254
3255 ConstPropagatingPtr() : val_() {}
3256 explicit ConstPropagatingPtr(T* t) : val_(t) {}
3257 ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {}
3258
3259 T* get() { return val_; }
3260 T& operator*() { return *val_; }
3261 // Most smart pointers return non-const T* and T& from the next methods.
3262 const T* get() const { return val_; }
3263 const T& operator*() const { return *val_; }
3264
3265 private:
3266 T* val_;
3267};
3268
3269TEST(PointeeTest, WorksWithConstPropagatingPointers) {
3270 const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5));
3271 int three = 3;
3272 const ConstPropagatingPtr<int> co(&three);
3273 ConstPropagatingPtr<int> o(&three);
3274 EXPECT_TRUE(m.Matches(o));
3275 EXPECT_TRUE(m.Matches(co));
3276 *o = 6;
3277 EXPECT_FALSE(m.Matches(o));
3278 EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>()));
3279}
3280
shiqiane35fdd92008-12-10 05:08:54 +00003281TEST(PointeeTest, NeverMatchesNull) {
3282 const Matcher<const char*> m = Pointee(_);
3283 EXPECT_FALSE(m.Matches(NULL));
3284}
3285
3286// Tests that we can write Pointee(value) instead of Pointee(Eq(value)).
3287TEST(PointeeTest, MatchesAgainstAValue) {
3288 const Matcher<int*> m = Pointee(5);
3289
3290 int n = 5;
3291 EXPECT_TRUE(m.Matches(&n));
3292 n = -1;
3293 EXPECT_FALSE(m.Matches(&n));
3294 EXPECT_FALSE(m.Matches(NULL));
3295}
3296
3297TEST(PointeeTest, CanDescribeSelf) {
3298 const Matcher<int*> m = Pointee(Gt(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003299 EXPECT_EQ("points to a value that is > 3", Describe(m));
3300 EXPECT_EQ("does not point to a value that is > 3",
shiqiane35fdd92008-12-10 05:08:54 +00003301 DescribeNegation(m));
3302}
3303
shiqiane35fdd92008-12-10 05:08:54 +00003304TEST(PointeeTest, CanExplainMatchResult) {
3305 const Matcher<const string*> m = Pointee(StartsWith("Hi"));
3306
3307 EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL)));
3308
zhanyong.wan736baa82010-09-27 17:44:16 +00003309 const Matcher<long*> m2 = Pointee(GreaterThan(1)); // NOLINT
3310 long n = 3; // NOLINT
3311 EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1",
zhanyong.wan676e8cc2010-03-16 20:01:51 +00003312 Explain(m2, &n));
3313}
3314
3315TEST(PointeeTest, AlwaysExplainsPointee) {
3316 const Matcher<int*> m = Pointee(0);
3317 int n = 42;
zhanyong.wan736baa82010-09-27 17:44:16 +00003318 EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n));
shiqiane35fdd92008-12-10 05:08:54 +00003319}
3320
3321// An uncopyable class.
3322class Uncopyable {
3323 public:
billydonahue1f5fdea2014-05-19 17:54:51 +00003324 Uncopyable() : value_(-1) {}
zhanyong.wan32de5f52009-12-23 00:13:23 +00003325 explicit Uncopyable(int a_value) : value_(a_value) {}
shiqiane35fdd92008-12-10 05:08:54 +00003326
3327 int value() const { return value_; }
billydonahue1f5fdea2014-05-19 17:54:51 +00003328 void set_value(int i) { value_ = i; }
3329
shiqiane35fdd92008-12-10 05:08:54 +00003330 private:
billydonahue1f5fdea2014-05-19 17:54:51 +00003331 int value_;
shiqiane35fdd92008-12-10 05:08:54 +00003332 GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable);
3333};
3334
3335// Returns true iff x.value() is positive.
3336bool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; }
3337
billydonahue1f5fdea2014-05-19 17:54:51 +00003338MATCHER_P(UncopyableIs, inner_matcher, "") {
3339 return ExplainMatchResult(inner_matcher, arg.value(), result_listener);
3340}
3341
shiqiane35fdd92008-12-10 05:08:54 +00003342// A user-defined struct for testing Field().
3343struct AStruct {
3344 AStruct() : x(0), y(1.0), z(5), p(NULL) {}
3345 AStruct(const AStruct& rhs)
3346 : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {}
3347
3348 int x; // A non-const field.
3349 const double y; // A const field.
3350 Uncopyable z; // An uncopyable field.
3351 const char* p; // A pointer field.
zhanyong.wan32de5f52009-12-23 00:13:23 +00003352
3353 private:
3354 GTEST_DISALLOW_ASSIGN_(AStruct);
shiqiane35fdd92008-12-10 05:08:54 +00003355};
3356
3357// A derived struct for testing Field().
3358struct DerivedStruct : public AStruct {
3359 char ch;
zhanyong.wan32de5f52009-12-23 00:13:23 +00003360
3361 private:
3362 GTEST_DISALLOW_ASSIGN_(DerivedStruct);
shiqiane35fdd92008-12-10 05:08:54 +00003363};
3364
3365// Tests that Field(&Foo::field, ...) works when field is non-const.
3366TEST(FieldTest, WorksForNonConstField) {
3367 Matcher<AStruct> m = Field(&AStruct::x, Ge(0));
3368
3369 AStruct a;
3370 EXPECT_TRUE(m.Matches(a));
3371 a.x = -1;
3372 EXPECT_FALSE(m.Matches(a));
3373}
3374
3375// Tests that Field(&Foo::field, ...) works when field is const.
3376TEST(FieldTest, WorksForConstField) {
3377 AStruct a;
3378
3379 Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0));
3380 EXPECT_TRUE(m.Matches(a));
3381 m = Field(&AStruct::y, Le(0.0));
3382 EXPECT_FALSE(m.Matches(a));
3383}
3384
3385// Tests that Field(&Foo::field, ...) works when field is not copyable.
3386TEST(FieldTest, WorksForUncopyableField) {
3387 AStruct a;
3388
3389 Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive));
3390 EXPECT_TRUE(m.Matches(a));
3391 m = Field(&AStruct::z, Not(Truly(ValueIsPositive)));
3392 EXPECT_FALSE(m.Matches(a));
3393}
3394
3395// Tests that Field(&Foo::field, ...) works when field is a pointer.
3396TEST(FieldTest, WorksForPointerField) {
3397 // Matching against NULL.
3398 Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL));
3399 AStruct a;
3400 EXPECT_TRUE(m.Matches(a));
3401 a.p = "hi";
3402 EXPECT_FALSE(m.Matches(a));
3403
3404 // Matching a pointer that is not NULL.
3405 m = Field(&AStruct::p, StartsWith("hi"));
3406 a.p = "hill";
3407 EXPECT_TRUE(m.Matches(a));
3408 a.p = "hole";
3409 EXPECT_FALSE(m.Matches(a));
3410}
3411
3412// Tests that Field() works when the object is passed by reference.
3413TEST(FieldTest, WorksForByRefArgument) {
3414 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3415
3416 AStruct a;
3417 EXPECT_TRUE(m.Matches(a));
3418 a.x = -1;
3419 EXPECT_FALSE(m.Matches(a));
3420}
3421
3422// Tests that Field(&Foo::field, ...) works when the argument's type
3423// is a sub-type of Foo.
3424TEST(FieldTest, WorksForArgumentOfSubType) {
3425 // Note that the matcher expects DerivedStruct but we say AStruct
3426 // inside Field().
3427 Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0));
3428
3429 DerivedStruct d;
3430 EXPECT_TRUE(m.Matches(d));
3431 d.x = -1;
3432 EXPECT_FALSE(m.Matches(d));
3433}
3434
3435// Tests that Field(&Foo::field, m) works when field's type and m's
3436// argument type are compatible but not the same.
3437TEST(FieldTest, WorksForCompatibleMatcherType) {
3438 // The field is an int, but the inner matcher expects a signed char.
3439 Matcher<const AStruct&> m = Field(&AStruct::x,
3440 Matcher<signed char>(Ge(0)));
3441
3442 AStruct a;
3443 EXPECT_TRUE(m.Matches(a));
3444 a.x = -1;
3445 EXPECT_FALSE(m.Matches(a));
3446}
3447
3448// Tests that Field() can describe itself.
3449TEST(FieldTest, CanDescribeSelf) {
3450 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3451
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003452 EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3453 EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003454}
3455
3456// Tests that Field() can explain the match result.
3457TEST(FieldTest, CanExplainMatchResult) {
3458 Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3459
3460 AStruct a;
3461 a.x = 1;
zhanyong.wan736baa82010-09-27 17:44:16 +00003462 EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003463
3464 m = Field(&AStruct::x, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003465 EXPECT_EQ(
3466 "whose given field is 1" + OfType("int") + ", which is 1 more than 0",
3467 Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003468}
3469
3470// Tests that Field() works when the argument is a pointer to const.
3471TEST(FieldForPointerTest, WorksForPointerToConst) {
3472 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3473
3474 AStruct a;
3475 EXPECT_TRUE(m.Matches(&a));
3476 a.x = -1;
3477 EXPECT_FALSE(m.Matches(&a));
3478}
3479
3480// Tests that Field() works when the argument is a pointer to non-const.
3481TEST(FieldForPointerTest, WorksForPointerToNonConst) {
3482 Matcher<AStruct*> m = Field(&AStruct::x, Ge(0));
3483
3484 AStruct a;
3485 EXPECT_TRUE(m.Matches(&a));
3486 a.x = -1;
3487 EXPECT_FALSE(m.Matches(&a));
3488}
3489
zhanyong.wan6953a722010-01-13 05:15:07 +00003490// Tests that Field() works when the argument is a reference to a const pointer.
3491TEST(FieldForPointerTest, WorksForReferenceToConstPointer) {
3492 Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0));
3493
3494 AStruct a;
3495 EXPECT_TRUE(m.Matches(&a));
3496 a.x = -1;
3497 EXPECT_FALSE(m.Matches(&a));
3498}
3499
shiqiane35fdd92008-12-10 05:08:54 +00003500// Tests that Field() does not match the NULL pointer.
3501TEST(FieldForPointerTest, DoesNotMatchNull) {
3502 Matcher<const AStruct*> m = Field(&AStruct::x, _);
3503 EXPECT_FALSE(m.Matches(NULL));
3504}
3505
3506// Tests that Field(&Foo::field, ...) works when the argument's type
3507// is a sub-type of const Foo*.
3508TEST(FieldForPointerTest, WorksForArgumentOfSubType) {
3509 // Note that the matcher expects DerivedStruct but we say AStruct
3510 // inside Field().
3511 Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0));
3512
3513 DerivedStruct d;
3514 EXPECT_TRUE(m.Matches(&d));
3515 d.x = -1;
3516 EXPECT_FALSE(m.Matches(&d));
3517}
3518
3519// Tests that Field() can describe itself when used to match a pointer.
3520TEST(FieldForPointerTest, CanDescribeSelf) {
3521 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3522
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003523 EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3524 EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003525}
3526
3527// Tests that Field() can explain the result of matching a pointer.
3528TEST(FieldForPointerTest, CanExplainMatchResult) {
3529 Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3530
3531 AStruct a;
3532 a.x = 1;
3533 EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL)));
zhanyong.wan736baa82010-09-27 17:44:16 +00003534 EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"),
3535 Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003536
3537 m = Field(&AStruct::x, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003538 EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") +
3539 ", which is 1 more than 0", Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003540}
3541
3542// A user-defined class for testing Property().
3543class AClass {
3544 public:
3545 AClass() : n_(0) {}
3546
3547 // A getter that returns a non-reference.
3548 int n() const { return n_; }
3549
3550 void set_n(int new_n) { n_ = new_n; }
3551
3552 // A getter that returns a reference to const.
3553 const string& s() const { return s_; }
3554
3555 void set_s(const string& new_s) { s_ = new_s; }
3556
3557 // A getter that returns a reference to non-const.
3558 double& x() const { return x_; }
3559 private:
3560 int n_;
3561 string s_;
3562
3563 static double x_;
3564};
3565
3566double AClass::x_ = 0.0;
3567
3568// A derived class for testing Property().
3569class DerivedClass : public AClass {
kosak6414d802013-12-03 23:19:36 +00003570 public:
3571 int k() const { return k_; }
shiqiane35fdd92008-12-10 05:08:54 +00003572 private:
3573 int k_;
3574};
3575
3576// Tests that Property(&Foo::property, ...) works when property()
3577// returns a non-reference.
3578TEST(PropertyTest, WorksForNonReferenceProperty) {
3579 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3580
3581 AClass a;
3582 a.set_n(1);
3583 EXPECT_TRUE(m.Matches(a));
3584
3585 a.set_n(-1);
3586 EXPECT_FALSE(m.Matches(a));
3587}
3588
3589// Tests that Property(&Foo::property, ...) works when property()
3590// returns a reference to const.
3591TEST(PropertyTest, WorksForReferenceToConstProperty) {
3592 Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi"));
3593
3594 AClass a;
3595 a.set_s("hill");
3596 EXPECT_TRUE(m.Matches(a));
3597
3598 a.set_s("hole");
3599 EXPECT_FALSE(m.Matches(a));
3600}
3601
3602// Tests that Property(&Foo::property, ...) works when property()
3603// returns a reference to non-const.
3604TEST(PropertyTest, WorksForReferenceToNonConstProperty) {
3605 double x = 0.0;
3606 AClass a;
3607
3608 Matcher<const AClass&> m = Property(&AClass::x, Ref(x));
3609 EXPECT_FALSE(m.Matches(a));
3610
3611 m = Property(&AClass::x, Not(Ref(x)));
3612 EXPECT_TRUE(m.Matches(a));
3613}
3614
3615// Tests that Property(&Foo::property, ...) works when the argument is
3616// passed by value.
3617TEST(PropertyTest, WorksForByValueArgument) {
3618 Matcher<AClass> m = Property(&AClass::s, StartsWith("hi"));
3619
3620 AClass a;
3621 a.set_s("hill");
3622 EXPECT_TRUE(m.Matches(a));
3623
3624 a.set_s("hole");
3625 EXPECT_FALSE(m.Matches(a));
3626}
3627
3628// Tests that Property(&Foo::property, ...) works when the argument's
3629// type is a sub-type of Foo.
3630TEST(PropertyTest, WorksForArgumentOfSubType) {
3631 // The matcher expects a DerivedClass, but inside the Property() we
3632 // say AClass.
3633 Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0));
3634
3635 DerivedClass d;
3636 d.set_n(1);
3637 EXPECT_TRUE(m.Matches(d));
3638
3639 d.set_n(-1);
3640 EXPECT_FALSE(m.Matches(d));
3641}
3642
3643// Tests that Property(&Foo::property, m) works when property()'s type
3644// and m's argument type are compatible but different.
3645TEST(PropertyTest, WorksForCompatibleMatcherType) {
3646 // n() returns an int but the inner matcher expects a signed char.
3647 Matcher<const AClass&> m = Property(&AClass::n,
3648 Matcher<signed char>(Ge(0)));
3649
3650 AClass a;
3651 EXPECT_TRUE(m.Matches(a));
3652 a.set_n(-1);
3653 EXPECT_FALSE(m.Matches(a));
3654}
3655
3656// Tests that Property() can describe itself.
3657TEST(PropertyTest, CanDescribeSelf) {
3658 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3659
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003660 EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3661 EXPECT_EQ("is an object whose given property isn't >= 0",
3662 DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003663}
3664
3665// Tests that Property() can explain the match result.
3666TEST(PropertyTest, CanExplainMatchResult) {
3667 Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3668
3669 AClass a;
3670 a.set_n(1);
zhanyong.wan736baa82010-09-27 17:44:16 +00003671 EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003672
3673 m = Property(&AClass::n, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003674 EXPECT_EQ(
3675 "whose given property is 1" + OfType("int") + ", which is 1 more than 0",
3676 Explain(m, a));
shiqiane35fdd92008-12-10 05:08:54 +00003677}
3678
3679// Tests that Property() works when the argument is a pointer to const.
3680TEST(PropertyForPointerTest, WorksForPointerToConst) {
3681 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3682
3683 AClass a;
3684 a.set_n(1);
3685 EXPECT_TRUE(m.Matches(&a));
3686
3687 a.set_n(-1);
3688 EXPECT_FALSE(m.Matches(&a));
3689}
3690
3691// Tests that Property() works when the argument is a pointer to non-const.
3692TEST(PropertyForPointerTest, WorksForPointerToNonConst) {
3693 Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi"));
3694
3695 AClass a;
3696 a.set_s("hill");
3697 EXPECT_TRUE(m.Matches(&a));
3698
3699 a.set_s("hole");
3700 EXPECT_FALSE(m.Matches(&a));
3701}
3702
zhanyong.wan6953a722010-01-13 05:15:07 +00003703// Tests that Property() works when the argument is a reference to a
3704// const pointer.
3705TEST(PropertyForPointerTest, WorksForReferenceToConstPointer) {
3706 Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi"));
3707
3708 AClass a;
3709 a.set_s("hill");
3710 EXPECT_TRUE(m.Matches(&a));
3711
3712 a.set_s("hole");
3713 EXPECT_FALSE(m.Matches(&a));
3714}
3715
shiqiane35fdd92008-12-10 05:08:54 +00003716// Tests that Property() does not match the NULL pointer.
3717TEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) {
3718 Matcher<const AClass*> m = Property(&AClass::x, _);
3719 EXPECT_FALSE(m.Matches(NULL));
3720}
3721
3722// Tests that Property(&Foo::property, ...) works when the argument's
3723// type is a sub-type of const Foo*.
3724TEST(PropertyForPointerTest, WorksForArgumentOfSubType) {
3725 // The matcher expects a DerivedClass, but inside the Property() we
3726 // say AClass.
3727 Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0));
3728
3729 DerivedClass d;
3730 d.set_n(1);
3731 EXPECT_TRUE(m.Matches(&d));
3732
3733 d.set_n(-1);
3734 EXPECT_FALSE(m.Matches(&d));
3735}
3736
3737// Tests that Property() can describe itself when used to match a pointer.
3738TEST(PropertyForPointerTest, CanDescribeSelf) {
3739 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3740
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003741 EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3742 EXPECT_EQ("is an object whose given property isn't >= 0",
3743 DescribeNegation(m));
shiqiane35fdd92008-12-10 05:08:54 +00003744}
3745
3746// Tests that Property() can explain the result of matching a pointer.
3747TEST(PropertyForPointerTest, CanExplainMatchResult) {
3748 Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3749
3750 AClass a;
3751 a.set_n(1);
3752 EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL)));
zhanyong.wan736baa82010-09-27 17:44:16 +00003753 EXPECT_EQ(
3754 "which points to an object whose given property is 1" + OfType("int"),
3755 Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003756
3757 m = Property(&AClass::n, GreaterThan(0));
zhanyong.wan736baa82010-09-27 17:44:16 +00003758 EXPECT_EQ("which points to an object whose given property is 1" +
3759 OfType("int") + ", which is 1 more than 0",
3760 Explain(m, &a));
shiqiane35fdd92008-12-10 05:08:54 +00003761}
3762
3763// Tests ResultOf.
3764
3765// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3766// function pointer.
3767string IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; }
3768
3769TEST(ResultOfTest, WorksForFunctionPointers) {
3770 Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo")));
3771
3772 EXPECT_TRUE(matcher.Matches(1));
3773 EXPECT_FALSE(matcher.Matches(2));
3774}
3775
3776// Tests that ResultOf() can describe itself.
3777TEST(ResultOfTest, CanDescribeItself) {
3778 Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo"));
3779
zhanyong.wan676e8cc2010-03-16 20:01:51 +00003780 EXPECT_EQ("is mapped by the given callable to a value that "
3781 "is equal to \"foo\"", Describe(matcher));
3782 EXPECT_EQ("is mapped by the given callable to a value that "
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003783 "isn't equal to \"foo\"", DescribeNegation(matcher));
shiqiane35fdd92008-12-10 05:08:54 +00003784}
3785
3786// Tests that ResultOf() can explain the match result.
3787int IntFunction(int input) { return input == 42 ? 80 : 90; }
3788
3789TEST(ResultOfTest, CanExplainMatchResult) {
3790 Matcher<int> matcher = ResultOf(&IntFunction, Ge(85));
zhanyong.wan736baa82010-09-27 17:44:16 +00003791 EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"),
zhanyong.wan676e8cc2010-03-16 20:01:51 +00003792 Explain(matcher, 36));
shiqiane35fdd92008-12-10 05:08:54 +00003793
3794 matcher = ResultOf(&IntFunction, GreaterThan(85));
zhanyong.wan736baa82010-09-27 17:44:16 +00003795 EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") +
3796 ", which is 5 more than 85", Explain(matcher, 36));
shiqiane35fdd92008-12-10 05:08:54 +00003797}
3798
3799// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3800// returns a non-reference.
3801TEST(ResultOfTest, WorksForNonReferenceResults) {
3802 Matcher<int> matcher = ResultOf(&IntFunction, Eq(80));
3803
3804 EXPECT_TRUE(matcher.Matches(42));
3805 EXPECT_FALSE(matcher.Matches(36));
3806}
3807
3808// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3809// returns a reference to non-const.
zhanyong.wan736baa82010-09-27 17:44:16 +00003810double& DoubleFunction(double& input) { return input; } // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00003811
zhanyong.wan736baa82010-09-27 17:44:16 +00003812Uncopyable& RefUncopyableFunction(Uncopyable& obj) { // NOLINT
shiqiane35fdd92008-12-10 05:08:54 +00003813 return obj;
3814}
3815
3816TEST(ResultOfTest, WorksForReferenceToNonConstResults) {
3817 double x = 3.14;
3818 double x2 = x;
3819 Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x));
3820
3821 EXPECT_TRUE(matcher.Matches(x));
3822 EXPECT_FALSE(matcher.Matches(x2));
3823
3824 // Test that ResultOf works with uncopyable objects
3825 Uncopyable obj(0);
3826 Uncopyable obj2(0);
3827 Matcher<Uncopyable&> matcher2 =
3828 ResultOf(&RefUncopyableFunction, Ref(obj));
3829
3830 EXPECT_TRUE(matcher2.Matches(obj));
3831 EXPECT_FALSE(matcher2.Matches(obj2));
3832}
3833
3834// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3835// returns a reference to const.
3836const string& StringFunction(const string& input) { return input; }
3837
3838TEST(ResultOfTest, WorksForReferenceToConstResults) {
3839 string s = "foo";
3840 string s2 = s;
3841 Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s));
3842
3843 EXPECT_TRUE(matcher.Matches(s));
3844 EXPECT_FALSE(matcher.Matches(s2));
3845}
3846
3847// Tests that ResultOf(f, m) works when f(x) and m's
3848// argument types are compatible but different.
3849TEST(ResultOfTest, WorksForCompatibleMatcherTypes) {
3850 // IntFunction() returns int but the inner matcher expects a signed char.
3851 Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85)));
3852
3853 EXPECT_TRUE(matcher.Matches(36));
3854 EXPECT_FALSE(matcher.Matches(42));
3855}
3856
shiqiane35fdd92008-12-10 05:08:54 +00003857// Tests that the program aborts when ResultOf is passed
3858// a NULL function pointer.
3859TEST(ResultOfDeathTest, DiesOnNullFunctionPointers) {
zhanyong.wan04d6ed82009-09-11 07:01:08 +00003860 EXPECT_DEATH_IF_SUPPORTED(
zhanyong.wan736baa82010-09-27 17:44:16 +00003861 ResultOf(static_cast<string(*)(int dummy)>(NULL), Eq(string("foo"))),
shiqiane35fdd92008-12-10 05:08:54 +00003862 "NULL function pointer is passed into ResultOf\\(\\)\\.");
3863}
shiqiane35fdd92008-12-10 05:08:54 +00003864
3865// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3866// function reference.
3867TEST(ResultOfTest, WorksForFunctionReferences) {
3868 Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo"));
3869 EXPECT_TRUE(matcher.Matches(1));
3870 EXPECT_FALSE(matcher.Matches(2));
3871}
3872
3873// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3874// function object.
3875struct Functor : public ::std::unary_function<int, string> {
3876 result_type operator()(argument_type input) const {
3877 return IntToStringFunction(input);
3878 }
3879};
3880
3881TEST(ResultOfTest, WorksForFunctors) {
3882 Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo")));
3883
3884 EXPECT_TRUE(matcher.Matches(1));
3885 EXPECT_FALSE(matcher.Matches(2));
3886}
3887
3888// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3889// functor with more then one operator() defined. ResultOf() must work
3890// for each defined operator().
3891struct PolymorphicFunctor {
3892 typedef int result_type;
3893 int operator()(int n) { return n; }
3894 int operator()(const char* s) { return static_cast<int>(strlen(s)); }
3895};
3896
3897TEST(ResultOfTest, WorksForPolymorphicFunctors) {
3898 Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5));
3899
3900 EXPECT_TRUE(matcher_int.Matches(10));
3901 EXPECT_FALSE(matcher_int.Matches(2));
3902
3903 Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5));
3904
3905 EXPECT_TRUE(matcher_string.Matches("long string"));
3906 EXPECT_FALSE(matcher_string.Matches("shrt"));
3907}
3908
3909const int* ReferencingFunction(const int& n) { return &n; }
3910
3911struct ReferencingFunctor {
3912 typedef const int* result_type;
3913 result_type operator()(const int& n) { return &n; }
3914};
3915
3916TEST(ResultOfTest, WorksForReferencingCallables) {
3917 const int n = 1;
3918 const int n2 = 1;
3919 Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n));
3920 EXPECT_TRUE(matcher2.Matches(n));
3921 EXPECT_FALSE(matcher2.Matches(n2));
3922
3923 Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n));
3924 EXPECT_TRUE(matcher3.Matches(n));
3925 EXPECT_FALSE(matcher3.Matches(n2));
3926}
3927
shiqiane35fdd92008-12-10 05:08:54 +00003928class DivisibleByImpl {
3929 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +00003930 explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {}
shiqiane35fdd92008-12-10 05:08:54 +00003931
zhanyong.wandb22c222010-01-28 21:52:29 +00003932 // For testing using ExplainMatchResultTo() with polymorphic matchers.
shiqiane35fdd92008-12-10 05:08:54 +00003933 template <typename T>
zhanyong.wandb22c222010-01-28 21:52:29 +00003934 bool MatchAndExplain(const T& n, MatchResultListener* listener) const {
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003935 *listener << "which is " << (n % divider_) << " modulo "
zhanyong.wandb22c222010-01-28 21:52:29 +00003936 << divider_;
shiqiane35fdd92008-12-10 05:08:54 +00003937 return (n % divider_) == 0;
3938 }
3939
zhanyong.wanab5b77c2010-05-17 19:32:48 +00003940 void DescribeTo(ostream* os) const {
shiqiane35fdd92008-12-10 05:08:54 +00003941 *os << "is divisible by " << divider_;
3942 }
3943
zhanyong.wanab5b77c2010-05-17 19:32:48 +00003944 void DescribeNegationTo(ostream* os) const {
shiqiane35fdd92008-12-10 05:08:54 +00003945 *os << "is not divisible by " << divider_;
3946 }
3947
zhanyong.wan32de5f52009-12-23 00:13:23 +00003948 void set_divider(int a_divider) { divider_ = a_divider; }
shiqiane35fdd92008-12-10 05:08:54 +00003949 int divider() const { return divider_; }
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00003950
shiqiane35fdd92008-12-10 05:08:54 +00003951 private:
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00003952 int divider_;
shiqiane35fdd92008-12-10 05:08:54 +00003953};
3954
shiqiane35fdd92008-12-10 05:08:54 +00003955PolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {
3956 return MakePolymorphicMatcher(DivisibleByImpl(n));
3957}
3958
3959// Tests that when AllOf() fails, only the first failing matcher is
3960// asked to explain why.
3961TEST(ExplainMatchResultTest, AllOf_False_False) {
3962 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003963 EXPECT_EQ("which is 1 modulo 4", Explain(m, 5));
shiqiane35fdd92008-12-10 05:08:54 +00003964}
3965
3966// Tests that when AllOf() fails, only the first failing matcher is
3967// asked to explain why.
3968TEST(ExplainMatchResultTest, AllOf_False_True) {
3969 const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003970 EXPECT_EQ("which is 2 modulo 4", Explain(m, 6));
shiqiane35fdd92008-12-10 05:08:54 +00003971}
3972
3973// Tests that when AllOf() fails, only the first failing matcher is
3974// asked to explain why.
3975TEST(ExplainMatchResultTest, AllOf_True_False) {
3976 const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003977 EXPECT_EQ("which is 2 modulo 3", Explain(m, 5));
shiqiane35fdd92008-12-10 05:08:54 +00003978}
3979
3980// Tests that when AllOf() succeeds, all matchers are asked to explain
3981// why.
3982TEST(ExplainMatchResultTest, AllOf_True_True) {
3983 const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00003984 EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6));
shiqiane35fdd92008-12-10 05:08:54 +00003985}
3986
3987TEST(ExplainMatchResultTest, AllOf_True_True_2) {
3988 const Matcher<int> m = AllOf(Ge(2), Le(3));
3989 EXPECT_EQ("", Explain(m, 2));
3990}
3991
3992TEST(ExplainmatcherResultTest, MonomorphicMatcher) {
3993 const Matcher<int> m = GreaterThan(5);
zhanyong.wan676e8cc2010-03-16 20:01:51 +00003994 EXPECT_EQ("which is 1 more than 5", Explain(m, 6));
shiqiane35fdd92008-12-10 05:08:54 +00003995}
3996
3997// The following two tests verify that values without a public copy
3998// ctor can be used as arguments to matchers like Eq(), Ge(), and etc
3999// with the help of ByRef().
4000
4001class NotCopyable {
4002 public:
zhanyong.wan32de5f52009-12-23 00:13:23 +00004003 explicit NotCopyable(int a_value) : value_(a_value) {}
shiqiane35fdd92008-12-10 05:08:54 +00004004
4005 int value() const { return value_; }
4006
4007 bool operator==(const NotCopyable& rhs) const {
4008 return value() == rhs.value();
4009 }
4010
4011 bool operator>=(const NotCopyable& rhs) const {
4012 return value() >= rhs.value();
4013 }
4014 private:
4015 int value_;
4016
4017 GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable);
4018};
4019
4020TEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) {
4021 const NotCopyable const_value1(1);
4022 const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1));
4023
4024 const NotCopyable n1(1), n2(2);
4025 EXPECT_TRUE(m.Matches(n1));
4026 EXPECT_FALSE(m.Matches(n2));
4027}
4028
4029TEST(ByRefTest, AllowsNotCopyableValueInMatchers) {
4030 NotCopyable value2(2);
4031 const Matcher<NotCopyable&> m = Ge(ByRef(value2));
4032
4033 NotCopyable n1(1), n2(2);
4034 EXPECT_FALSE(m.Matches(n1));
4035 EXPECT_TRUE(m.Matches(n2));
4036}
4037
zhanyong.wan320814a2013-03-01 00:20:30 +00004038TEST(IsEmptyTest, ImplementsIsEmpty) {
4039 vector<int> container;
4040 EXPECT_THAT(container, IsEmpty());
4041 container.push_back(0);
4042 EXPECT_THAT(container, Not(IsEmpty()));
4043 container.push_back(1);
4044 EXPECT_THAT(container, Not(IsEmpty()));
4045}
4046
4047TEST(IsEmptyTest, WorksWithString) {
4048 string text;
4049 EXPECT_THAT(text, IsEmpty());
4050 text = "foo";
4051 EXPECT_THAT(text, Not(IsEmpty()));
4052 text = string("\0", 1);
4053 EXPECT_THAT(text, Not(IsEmpty()));
4054}
4055
4056TEST(IsEmptyTest, CanDescribeSelf) {
4057 Matcher<vector<int> > m = IsEmpty();
4058 EXPECT_EQ("is empty", Describe(m));
4059 EXPECT_EQ("isn't empty", DescribeNegation(m));
4060}
4061
4062TEST(IsEmptyTest, ExplainsResult) {
4063 Matcher<vector<int> > m = IsEmpty();
4064 vector<int> container;
4065 EXPECT_EQ("", Explain(m, container));
4066 container.push_back(0);
4067 EXPECT_EQ("whose size is 1", Explain(m, container));
4068}
4069
zhanyong.wana31d9ce2013-03-01 01:50:17 +00004070TEST(SizeIsTest, ImplementsSizeIs) {
4071 vector<int> container;
4072 EXPECT_THAT(container, SizeIs(0));
4073 EXPECT_THAT(container, Not(SizeIs(1)));
4074 container.push_back(0);
4075 EXPECT_THAT(container, Not(SizeIs(0)));
4076 EXPECT_THAT(container, SizeIs(1));
4077 container.push_back(0);
4078 EXPECT_THAT(container, Not(SizeIs(0)));
4079 EXPECT_THAT(container, SizeIs(2));
4080}
4081
4082TEST(SizeIsTest, WorksWithMap) {
4083 map<string, int> container;
4084 EXPECT_THAT(container, SizeIs(0));
4085 EXPECT_THAT(container, Not(SizeIs(1)));
4086 container.insert(make_pair("foo", 1));
4087 EXPECT_THAT(container, Not(SizeIs(0)));
4088 EXPECT_THAT(container, SizeIs(1));
4089 container.insert(make_pair("bar", 2));
4090 EXPECT_THAT(container, Not(SizeIs(0)));
4091 EXPECT_THAT(container, SizeIs(2));
4092}
4093
4094TEST(SizeIsTest, WorksWithReferences) {
4095 vector<int> container;
4096 Matcher<const vector<int>&> m = SizeIs(1);
4097 EXPECT_THAT(container, Not(m));
4098 container.push_back(0);
4099 EXPECT_THAT(container, m);
4100}
4101
4102TEST(SizeIsTest, CanDescribeSelf) {
4103 Matcher<vector<int> > m = SizeIs(2);
4104 EXPECT_EQ("size is equal to 2", Describe(m));
4105 EXPECT_EQ("size isn't equal to 2", DescribeNegation(m));
4106}
4107
4108TEST(SizeIsTest, ExplainsResult) {
4109 Matcher<vector<int> > m1 = SizeIs(2);
4110 Matcher<vector<int> > m2 = SizeIs(Lt(2u));
4111 Matcher<vector<int> > m3 = SizeIs(AnyOf(0, 3));
4112 Matcher<vector<int> > m4 = SizeIs(GreaterThan(1));
4113 vector<int> container;
4114 EXPECT_EQ("whose size 0 doesn't match", Explain(m1, container));
4115 EXPECT_EQ("whose size 0 matches", Explain(m2, container));
4116 EXPECT_EQ("whose size 0 matches", Explain(m3, container));
4117 EXPECT_EQ("whose size 0 doesn't match, which is 1 less than 1",
4118 Explain(m4, container));
4119 container.push_back(0);
4120 container.push_back(0);
4121 EXPECT_EQ("whose size 2 matches", Explain(m1, container));
4122 EXPECT_EQ("whose size 2 doesn't match", Explain(m2, container));
4123 EXPECT_EQ("whose size 2 doesn't match", Explain(m3, container));
4124 EXPECT_EQ("whose size 2 matches, which is 1 more than 1",
4125 Explain(m4, container));
4126}
4127
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00004128#if GTEST_HAS_TYPED_TEST
zhanyong.wan6a896b52009-01-16 01:13:50 +00004129// Tests ContainerEq with different container types, and
4130// different element types.
4131
4132template <typename T>
zhanyong.wanb8243162009-06-04 05:48:20 +00004133class ContainerEqTest : public testing::Test {};
zhanyong.wan6a896b52009-01-16 01:13:50 +00004134
4135typedef testing::Types<
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004136 set<int>,
4137 vector<size_t>,
4138 multiset<size_t>,
4139 list<int> >
zhanyong.wan6a896b52009-01-16 01:13:50 +00004140 ContainerEqTestTypes;
4141
4142TYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes);
4143
4144// Tests that the filled container is equal to itself.
4145TYPED_TEST(ContainerEqTest, EqualsSelf) {
4146 static const int vals[] = {1, 1, 2, 3, 5, 8};
4147 TypeParam my_set(vals, vals + 6);
4148 const Matcher<TypeParam> m = ContainerEq(my_set);
4149 EXPECT_TRUE(m.Matches(my_set));
4150 EXPECT_EQ("", Explain(m, my_set));
4151}
4152
4153// Tests that missing values are reported.
4154TYPED_TEST(ContainerEqTest, ValueMissing) {
4155 static const int vals[] = {1, 1, 2, 3, 5, 8};
4156 static const int test_vals[] = {2, 1, 8, 5};
4157 TypeParam my_set(vals, vals + 6);
4158 TypeParam test_set(test_vals, test_vals + 4);
4159 const Matcher<TypeParam> m = ContainerEq(my_set);
4160 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004161 EXPECT_EQ("which doesn't have these expected elements: 3",
4162 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004163}
4164
4165// Tests that added values are reported.
4166TYPED_TEST(ContainerEqTest, ValueAdded) {
4167 static const int vals[] = {1, 1, 2, 3, 5, 8};
4168 static const int test_vals[] = {1, 2, 3, 5, 8, 46};
4169 TypeParam my_set(vals, vals + 6);
4170 TypeParam test_set(test_vals, test_vals + 6);
4171 const Matcher<const TypeParam&> m = ContainerEq(my_set);
4172 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004173 EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004174}
4175
4176// Tests that added and missing values are reported together.
4177TYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) {
4178 static const int vals[] = {1, 1, 2, 3, 5, 8};
4179 static const int test_vals[] = {1, 2, 3, 8, 46};
4180 TypeParam my_set(vals, vals + 6);
4181 TypeParam test_set(test_vals, test_vals + 5);
4182 const Matcher<TypeParam> m = ContainerEq(my_set);
4183 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004184 EXPECT_EQ("which has these unexpected elements: 46,\n"
4185 "and doesn't have these expected elements: 5",
4186 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004187}
4188
4189// Tests duplicated value -- expect no explanation.
4190TYPED_TEST(ContainerEqTest, DuplicateDifference) {
4191 static const int vals[] = {1, 1, 2, 3, 5, 8};
4192 static const int test_vals[] = {1, 2, 3, 5, 8};
4193 TypeParam my_set(vals, vals + 6);
4194 TypeParam test_set(test_vals, test_vals + 5);
4195 const Matcher<const TypeParam&> m = ContainerEq(my_set);
4196 // Depending on the container, match may be true or false
4197 // But in any case there should be no explanation.
4198 EXPECT_EQ("", Explain(m, test_set));
4199}
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00004200#endif // GTEST_HAS_TYPED_TEST
zhanyong.wan6a896b52009-01-16 01:13:50 +00004201
4202// Tests that mutliple missing values are reported.
4203// Using just vector here, so order is predicatble.
4204TEST(ContainerEqExtraTest, MultipleValuesMissing) {
4205 static const int vals[] = {1, 1, 2, 3, 5, 8};
4206 static const int test_vals[] = {2, 1, 5};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004207 vector<int> my_set(vals, vals + 6);
4208 vector<int> test_set(test_vals, test_vals + 3);
4209 const Matcher<vector<int> > m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004210 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004211 EXPECT_EQ("which doesn't have these expected elements: 3, 8",
4212 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004213}
4214
4215// Tests that added values are reported.
4216// Using just vector here, so order is predicatble.
4217TEST(ContainerEqExtraTest, MultipleValuesAdded) {
4218 static const int vals[] = {1, 1, 2, 3, 5, 8};
4219 static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004220 list<size_t> my_set(vals, vals + 6);
4221 list<size_t> test_set(test_vals, test_vals + 7);
4222 const Matcher<const list<size_t>&> m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004223 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004224 EXPECT_EQ("which has these unexpected elements: 92, 46",
4225 Explain(m, test_set));
zhanyong.wan6a896b52009-01-16 01:13:50 +00004226}
4227
4228// Tests that added and missing values are reported together.
4229TEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) {
4230 static const int vals[] = {1, 1, 2, 3, 5, 8};
4231 static const int test_vals[] = {1, 2, 3, 92, 46};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004232 list<size_t> my_set(vals, vals + 6);
4233 list<size_t> test_set(test_vals, test_vals + 5);
4234 const Matcher<const list<size_t> > m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004235 EXPECT_FALSE(m.Matches(test_set));
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004236 EXPECT_EQ("which has these unexpected elements: 92, 46,\n"
4237 "and doesn't have these expected elements: 5, 8",
zhanyong.wan6a896b52009-01-16 01:13:50 +00004238 Explain(m, test_set));
4239}
4240
4241// Tests to see that duplicate elements are detected,
4242// but (as above) not reported in the explanation.
4243TEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) {
4244 static const int vals[] = {1, 1, 2, 3, 5, 8};
4245 static const int test_vals[] = {1, 2, 3, 5, 8};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004246 vector<int> my_set(vals, vals + 6);
4247 vector<int> test_set(test_vals, test_vals + 5);
4248 const Matcher<vector<int> > m = ContainerEq(my_set);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004249 EXPECT_TRUE(m.Matches(my_set));
4250 EXPECT_FALSE(m.Matches(test_set));
4251 // There is nothing to report when both sets contain all the same values.
4252 EXPECT_EQ("", Explain(m, test_set));
4253}
4254
4255// Tests that ContainerEq works for non-trivial associative containers,
4256// like maps.
4257TEST(ContainerEqExtraTest, WorksForMaps) {
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004258 map<int, std::string> my_map;
zhanyong.wan6a896b52009-01-16 01:13:50 +00004259 my_map[0] = "a";
4260 my_map[1] = "b";
4261
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004262 map<int, std::string> test_map;
zhanyong.wan6a896b52009-01-16 01:13:50 +00004263 test_map[0] = "aa";
4264 test_map[1] = "b";
4265
zhanyong.wanab5b77c2010-05-17 19:32:48 +00004266 const Matcher<const map<int, std::string>&> m = ContainerEq(my_map);
zhanyong.wan6a896b52009-01-16 01:13:50 +00004267 EXPECT_TRUE(m.Matches(my_map));
4268 EXPECT_FALSE(m.Matches(test_map));
4269
zhanyong.wanb1c7f932010-03-24 17:35:11 +00004270 EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n"
4271 "and doesn't have these expected elements: (0, \"a\")",
zhanyong.wan6a896b52009-01-16 01:13:50 +00004272 Explain(m, test_map));
4273}
4274
zhanyong.wanb8243162009-06-04 05:48:20 +00004275TEST(ContainerEqExtraTest, WorksForNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00004276 int a1[] = {1, 2, 3};
4277 int a2[] = {1, 2, 3};
4278 int b[] = {1, 2, 4};
zhanyong.wanb8243162009-06-04 05:48:20 +00004279
4280 EXPECT_THAT(a1, ContainerEq(a2));
4281 EXPECT_THAT(a1, Not(ContainerEq(b)));
4282}
4283
4284TEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00004285 const char a1[][3] = {"hi", "lo"};
4286 const char a2[][3] = {"hi", "lo"};
4287 const char b[][3] = {"lo", "hi"};
zhanyong.wanb8243162009-06-04 05:48:20 +00004288
4289 // Tests using ContainerEq() in the first dimension.
4290 EXPECT_THAT(a1, ContainerEq(a2));
4291 EXPECT_THAT(a1, Not(ContainerEq(b)));
4292
4293 // Tests using ContainerEq() in the second dimension.
4294 EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1])));
4295 EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1])));
4296}
4297
4298TEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) {
kosak2336e9c2014-07-28 22:57:30 +00004299 const int a1[] = {1, 2, 3};
4300 const int a2[] = {1, 2, 3};
4301 const int b[] = {1, 2, 3, 4};
zhanyong.wanb8243162009-06-04 05:48:20 +00004302
zhanyong.wan2661c682009-06-09 05:42:12 +00004303 const int* const p1 = a1;
4304 EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2));
4305 EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b)));
zhanyong.wanb8243162009-06-04 05:48:20 +00004306
kosak2336e9c2014-07-28 22:57:30 +00004307 const int c[] = {1, 3, 2};
zhanyong.wan2661c682009-06-09 05:42:12 +00004308 EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c)));
zhanyong.wanb8243162009-06-04 05:48:20 +00004309}
4310
4311TEST(ContainerEqExtraTest, CopiesNativeArrayParameter) {
4312 std::string a1[][3] = {
kosak2336e9c2014-07-28 22:57:30 +00004313 {"hi", "hello", "ciao"},
4314 {"bye", "see you", "ciao"}
zhanyong.wanb8243162009-06-04 05:48:20 +00004315 };
4316
4317 std::string a2[][3] = {
kosak2336e9c2014-07-28 22:57:30 +00004318 {"hi", "hello", "ciao"},
4319 {"bye", "see you", "ciao"}
zhanyong.wanb8243162009-06-04 05:48:20 +00004320 };
4321
4322 const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2);
4323 EXPECT_THAT(a1, m);
4324
4325 a2[0][0] = "ha";
4326 EXPECT_THAT(a1, m);
4327}
4328
zhanyong.wan898725c2011-09-16 16:45:39 +00004329TEST(WhenSortedByTest, WorksForEmptyContainer) {
4330 const vector<int> numbers;
4331 EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre()));
4332 EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1))));
4333}
4334
4335TEST(WhenSortedByTest, WorksForNonEmptyContainer) {
4336 vector<unsigned> numbers;
4337 numbers.push_back(3);
4338 numbers.push_back(1);
4339 numbers.push_back(2);
4340 numbers.push_back(2);
4341 EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(),
4342 ElementsAre(3, 2, 2, 1)));
4343 EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(),
4344 ElementsAre(1, 2, 2, 3))));
4345}
4346
4347TEST(WhenSortedByTest, WorksForNonVectorContainer) {
4348 list<string> words;
4349 words.push_back("say");
4350 words.push_back("hello");
4351 words.push_back("world");
4352 EXPECT_THAT(words, WhenSortedBy(less<string>(),
4353 ElementsAre("hello", "say", "world")));
4354 EXPECT_THAT(words, Not(WhenSortedBy(less<string>(),
4355 ElementsAre("say", "hello", "world"))));
4356}
4357
4358TEST(WhenSortedByTest, WorksForNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00004359 const int numbers[] = {1, 3, 2, 4};
4360 const int sorted_numbers[] = {1, 2, 3, 4};
zhanyong.wan898725c2011-09-16 16:45:39 +00004361 EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4)));
4362 EXPECT_THAT(numbers, WhenSortedBy(less<int>(),
4363 ElementsAreArray(sorted_numbers)));
4364 EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4))));
4365}
4366
4367TEST(WhenSortedByTest, CanDescribeSelf) {
4368 const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2));
4369 EXPECT_EQ("(when sorted) has 2 elements where\n"
4370 "element #0 is equal to 1,\n"
4371 "element #1 is equal to 2",
4372 Describe(m));
4373 EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n"
4374 "element #0 isn't equal to 1, or\n"
4375 "element #1 isn't equal to 2",
4376 DescribeNegation(m));
4377}
4378
4379TEST(WhenSortedByTest, ExplainsMatchResult) {
kosak2336e9c2014-07-28 22:57:30 +00004380 const int a[] = {2, 1};
zhanyong.wan898725c2011-09-16 16:45:39 +00004381 EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match",
4382 Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a));
4383 EXPECT_EQ("which is { 1, 2 } when sorted",
4384 Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a));
4385}
4386
4387// WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't
4388// need to test it as exhaustively as we test the latter.
4389
4390TEST(WhenSortedTest, WorksForEmptyContainer) {
4391 const vector<int> numbers;
4392 EXPECT_THAT(numbers, WhenSorted(ElementsAre()));
4393 EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1))));
4394}
4395
4396TEST(WhenSortedTest, WorksForNonEmptyContainer) {
4397 list<string> words;
4398 words.push_back("3");
4399 words.push_back("1");
4400 words.push_back("2");
4401 words.push_back("2");
4402 EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3")));
4403 EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2"))));
4404}
4405
zhanyong.wana9a59e02013-03-27 16:14:55 +00004406TEST(WhenSortedTest, WorksForMapTypes) {
4407 map<string, int> word_counts;
4408 word_counts["and"] = 1;
4409 word_counts["the"] = 1;
4410 word_counts["buffalo"] = 2;
4411 EXPECT_THAT(word_counts, WhenSorted(ElementsAre(
4412 Pair("and", 1), Pair("buffalo", 2), Pair("the", 1))));
4413 EXPECT_THAT(word_counts, Not(WhenSorted(ElementsAre(
4414 Pair("and", 1), Pair("the", 1), Pair("buffalo", 2)))));
4415}
4416
4417TEST(WhenSortedTest, WorksForMultiMapTypes) {
4418 multimap<int, int> ifib;
4419 ifib.insert(make_pair(8, 6));
4420 ifib.insert(make_pair(2, 3));
4421 ifib.insert(make_pair(1, 1));
4422 ifib.insert(make_pair(3, 4));
4423 ifib.insert(make_pair(1, 2));
4424 ifib.insert(make_pair(5, 5));
4425 EXPECT_THAT(ifib, WhenSorted(ElementsAre(Pair(1, 1),
4426 Pair(1, 2),
4427 Pair(2, 3),
4428 Pair(3, 4),
4429 Pair(5, 5),
4430 Pair(8, 6))));
4431 EXPECT_THAT(ifib, Not(WhenSorted(ElementsAre(Pair(8, 6),
4432 Pair(2, 3),
4433 Pair(1, 1),
4434 Pair(3, 4),
4435 Pair(1, 2),
4436 Pair(5, 5)))));
4437}
4438
4439TEST(WhenSortedTest, WorksForPolymorphicMatcher) {
4440 std::deque<int> d;
4441 d.push_back(2);
4442 d.push_back(1);
4443 EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2)));
4444 EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1))));
4445}
4446
4447TEST(WhenSortedTest, WorksForVectorConstRefMatcher) {
4448 std::deque<int> d;
4449 d.push_back(2);
4450 d.push_back(1);
4451 Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2);
4452 EXPECT_THAT(d, WhenSorted(vector_match));
4453 Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1);
4454 EXPECT_THAT(d, Not(WhenSorted(not_vector_match)));
4455}
4456
4457// Deliberately bare pseudo-container.
4458// Offers only begin() and end() accessors, yielding InputIterator.
4459template <typename T>
4460class Streamlike {
4461 private:
4462 class ConstIter;
4463 public:
4464 typedef ConstIter const_iterator;
4465 typedef T value_type;
4466
4467 template <typename InIter>
4468 Streamlike(InIter first, InIter last) : remainder_(first, last) {}
4469
4470 const_iterator begin() const {
4471 return const_iterator(this, remainder_.begin());
4472 }
4473 const_iterator end() const {
4474 return const_iterator(this, remainder_.end());
4475 }
4476
4477 private:
4478 class ConstIter : public std::iterator<std::input_iterator_tag,
4479 value_type,
4480 ptrdiff_t,
4481 const value_type&,
4482 const value_type*> {
4483 public:
4484 ConstIter(const Streamlike* s,
4485 typename std::list<value_type>::iterator pos)
4486 : s_(s), pos_(pos) {}
4487
4488 const value_type& operator*() const { return *pos_; }
4489 const value_type* operator->() const { return &*pos_; }
4490 ConstIter& operator++() {
4491 s_->remainder_.erase(pos_++);
4492 return *this;
4493 }
4494
4495 // *iter++ is required to work (see std::istreambuf_iterator).
4496 // (void)iter++ is also required to work.
4497 class PostIncrProxy {
4498 public:
4499 explicit PostIncrProxy(const value_type& value) : value_(value) {}
4500 value_type operator*() const { return value_; }
4501 private:
4502 value_type value_;
4503 };
4504 PostIncrProxy operator++(int) {
4505 PostIncrProxy proxy(**this);
4506 ++(*this);
4507 return proxy;
4508 }
4509
4510 friend bool operator==(const ConstIter& a, const ConstIter& b) {
4511 return a.s_ == b.s_ && a.pos_ == b.pos_;
4512 }
4513 friend bool operator!=(const ConstIter& a, const ConstIter& b) {
4514 return !(a == b);
4515 }
4516
4517 private:
4518 const Streamlike* s_;
4519 typename std::list<value_type>::iterator pos_;
4520 };
4521
4522 friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) {
4523 os << "[";
4524 typedef typename std::list<value_type>::const_iterator Iter;
4525 const char* sep = "";
4526 for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) {
4527 os << sep << *it;
4528 sep = ",";
4529 }
4530 os << "]";
4531 return os;
4532 }
4533
4534 mutable std::list<value_type> remainder_; // modified by iteration
4535};
4536
4537TEST(StreamlikeTest, Iteration) {
kosak2336e9c2014-07-28 22:57:30 +00004538 const int a[5] = {2, 1, 4, 5, 3};
zhanyong.wana9a59e02013-03-27 16:14:55 +00004539 Streamlike<int> s(a, a + 5);
4540 Streamlike<int>::const_iterator it = s.begin();
4541 const int* ip = a;
4542 while (it != s.end()) {
4543 SCOPED_TRACE(ip - a);
4544 EXPECT_EQ(*ip++, *it++);
4545 }
4546}
4547
kosakb6a34882014-03-12 21:06:46 +00004548#if GTEST_LANG_CXX11
4549TEST(BeginEndDistanceIsTest, WorksWithForwardList) {
4550 std::forward_list<int> container;
4551 EXPECT_THAT(container, BeginEndDistanceIs(0));
4552 EXPECT_THAT(container, Not(BeginEndDistanceIs(1)));
4553 container.push_front(0);
4554 EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));
4555 EXPECT_THAT(container, BeginEndDistanceIs(1));
4556 container.push_front(0);
4557 EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));
4558 EXPECT_THAT(container, BeginEndDistanceIs(2));
4559}
4560#endif // GTEST_LANG_CXX11
4561
4562TEST(BeginEndDistanceIsTest, WorksWithNonStdList) {
kosak2336e9c2014-07-28 22:57:30 +00004563 const int a[5] = {1, 2, 3, 4, 5};
kosakb6a34882014-03-12 21:06:46 +00004564 Streamlike<int> s(a, a + 5);
4565 EXPECT_THAT(s, BeginEndDistanceIs(5));
4566}
4567
4568TEST(BeginEndDistanceIsTest, CanDescribeSelf) {
4569 Matcher<vector<int> > m = BeginEndDistanceIs(2);
4570 EXPECT_EQ("distance between begin() and end() is equal to 2", Describe(m));
4571 EXPECT_EQ("distance between begin() and end() isn't equal to 2",
4572 DescribeNegation(m));
4573}
4574
4575TEST(BeginEndDistanceIsTest, ExplainsResult) {
4576 Matcher<vector<int> > m1 = BeginEndDistanceIs(2);
4577 Matcher<vector<int> > m2 = BeginEndDistanceIs(Lt(2));
4578 Matcher<vector<int> > m3 = BeginEndDistanceIs(AnyOf(0, 3));
4579 Matcher<vector<int> > m4 = BeginEndDistanceIs(GreaterThan(1));
4580 vector<int> container;
4581 EXPECT_EQ("whose distance between begin() and end() 0 doesn't match",
4582 Explain(m1, container));
4583 EXPECT_EQ("whose distance between begin() and end() 0 matches",
4584 Explain(m2, container));
4585 EXPECT_EQ("whose distance between begin() and end() 0 matches",
4586 Explain(m3, container));
4587 EXPECT_EQ(
4588 "whose distance between begin() and end() 0 doesn't match, which is 1 "
4589 "less than 1",
4590 Explain(m4, container));
4591 container.push_back(0);
4592 container.push_back(0);
4593 EXPECT_EQ("whose distance between begin() and end() 2 matches",
4594 Explain(m1, container));
4595 EXPECT_EQ("whose distance between begin() and end() 2 doesn't match",
4596 Explain(m2, container));
4597 EXPECT_EQ("whose distance between begin() and end() 2 doesn't match",
4598 Explain(m3, container));
4599 EXPECT_EQ(
4600 "whose distance between begin() and end() 2 matches, which is 1 more "
4601 "than 1",
4602 Explain(m4, container));
4603}
4604
zhanyong.wana9a59e02013-03-27 16:14:55 +00004605TEST(WhenSortedTest, WorksForStreamlike) {
4606 // Streamlike 'container' provides only minimal iterator support.
4607 // Its iterators are tagged with input_iterator_tag.
kosak2336e9c2014-07-28 22:57:30 +00004608 const int a[5] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004609 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wana9a59e02013-03-27 16:14:55 +00004610 EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5)));
4611 EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4612}
4613
4614TEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) {
kosak2336e9c2014-07-28 22:57:30 +00004615 const int a[] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004616 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wana9a59e02013-03-27 16:14:55 +00004617 Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5);
4618 EXPECT_THAT(s, WhenSorted(vector_match));
4619 EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4620}
4621
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004622// Tests using ElementsAre() and ElementsAreArray() with stream-like
4623// "containers".
4624
4625TEST(ElemensAreStreamTest, WorksForStreamlike) {
kosak2336e9c2014-07-28 22:57:30 +00004626 const int a[5] = {1, 2, 3, 4, 5};
kosak6414d802013-12-03 23:19:36 +00004627 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004628 EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5));
4629 EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3)));
4630}
4631
4632TEST(ElemensAreArrayStreamTest, WorksForStreamlike) {
kosak2336e9c2014-07-28 22:57:30 +00004633 const int a[5] = {1, 2, 3, 4, 5};
kosak6414d802013-12-03 23:19:36 +00004634 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004635
4636 vector<int> expected;
4637 expected.push_back(1);
4638 expected.push_back(2);
4639 expected.push_back(3);
4640 expected.push_back(4);
4641 expected.push_back(5);
4642 EXPECT_THAT(s, ElementsAreArray(expected));
4643
4644 expected[3] = 0;
4645 EXPECT_THAT(s, Not(ElementsAreArray(expected)));
4646}
4647
billydonahue1f5fdea2014-05-19 17:54:51 +00004648TEST(ElementsAreTest, WorksWithUncopyable) {
4649 Uncopyable objs[2];
4650 objs[0].set_value(-3);
4651 objs[1].set_value(1);
4652 EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive)));
4653}
4654
kosak06678922014-07-28 20:01:28 +00004655TEST(ElementsAreTest, TakesStlContainer) {
4656 const int actual[] = {3, 1, 2};
4657
4658 ::std::list<int> expected;
4659 expected.push_back(3);
4660 expected.push_back(1);
4661 expected.push_back(2);
4662 EXPECT_THAT(actual, ElementsAreArray(expected));
4663
4664 expected.push_back(4);
4665 EXPECT_THAT(actual, Not(ElementsAreArray(expected)));
4666}
4667
zhanyong.wanfb25d532013-07-28 08:24:00 +00004668// Tests for UnorderedElementsAreArray()
4669
4670TEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) {
kosak2336e9c2014-07-28 22:57:30 +00004671 const int a[] = {0, 1, 2, 3, 4};
kosak6414d802013-12-03 23:19:36 +00004672 std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004673 do {
4674 StringMatchResultListener listener;
4675 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a),
4676 s, &listener)) << listener.str();
4677 } while (std::next_permutation(s.begin(), s.end()));
4678}
4679
4680TEST(UnorderedElementsAreArrayTest, VectorBool) {
kosak2336e9c2014-07-28 22:57:30 +00004681 const bool a[] = {0, 1, 0, 1, 1};
4682 const bool b[] = {1, 0, 1, 1, 0};
kosak6414d802013-12-03 23:19:36 +00004683 std::vector<bool> expected(a, a + GTEST_ARRAY_SIZE_(a));
4684 std::vector<bool> actual(b, b + GTEST_ARRAY_SIZE_(b));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004685 StringMatchResultListener listener;
4686 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected),
4687 actual, &listener)) << listener.str();
4688}
4689
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004690TEST(UnorderedElementsAreArrayTest, WorksForStreamlike) {
4691 // Streamlike 'container' provides only minimal iterator support.
4692 // Its iterators are tagged with input_iterator_tag, and it has no
4693 // size() or empty() methods.
kosak2336e9c2014-07-28 22:57:30 +00004694 const int a[5] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004695 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004696
4697 ::std::vector<int> expected;
4698 expected.push_back(1);
4699 expected.push_back(2);
4700 expected.push_back(3);
4701 expected.push_back(4);
4702 expected.push_back(5);
4703 EXPECT_THAT(s, UnorderedElementsAreArray(expected));
4704
4705 expected.push_back(6);
4706 EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected)));
4707}
4708
kosak06678922014-07-28 20:01:28 +00004709TEST(UnorderedElementsAreArrayTest, TakesStlContainer) {
4710 const int actual[] = {3, 1, 2};
4711
4712 ::std::list<int> expected;
4713 expected.push_back(1);
4714 expected.push_back(2);
4715 expected.push_back(3);
4716 EXPECT_THAT(actual, UnorderedElementsAreArray(expected));
4717
4718 expected.push_back(4);
4719 EXPECT_THAT(actual, Not(UnorderedElementsAreArray(expected)));
4720}
4721
kosak18489fa2013-12-04 23:49:07 +00004722#if GTEST_HAS_STD_INITIALIZER_LIST_
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004723
4724TEST(UnorderedElementsAreArrayTest, TakesInitializerList) {
kosak2336e9c2014-07-28 22:57:30 +00004725 const int a[5] = {2, 1, 4, 5, 3};
4726 EXPECT_THAT(a, UnorderedElementsAreArray({1, 2, 3, 4, 5}));
4727 EXPECT_THAT(a, Not(UnorderedElementsAreArray({1, 2, 3, 4, 6})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004728}
4729
4730TEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) {
kosak2336e9c2014-07-28 22:57:30 +00004731 const string a[5] = {"a", "b", "c", "d", "e"};
4732 EXPECT_THAT(a, UnorderedElementsAreArray({"a", "b", "c", "d", "e"}));
4733 EXPECT_THAT(a, Not(UnorderedElementsAreArray({"a", "b", "c", "d", "ef"})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004734}
4735
4736TEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) {
kosak2336e9c2014-07-28 22:57:30 +00004737 const int a[5] = {2, 1, 4, 5, 3};
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004738 EXPECT_THAT(a, UnorderedElementsAreArray(
kosak2336e9c2014-07-28 22:57:30 +00004739 {Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)}));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004740 EXPECT_THAT(a, Not(UnorderedElementsAreArray(
kosak2336e9c2014-07-28 22:57:30 +00004741 {Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004742}
4743
4744TEST(UnorderedElementsAreArrayTest,
4745 TakesInitializerListOfDifferentTypedMatchers) {
kosak2336e9c2014-07-28 22:57:30 +00004746 const int a[5] = {2, 1, 4, 5, 3};
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004747 // The compiler cannot infer the type of the initializer list if its
4748 // elements have different types. We must explicitly specify the
4749 // unified element type in this case.
4750 EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int> >(
kosak2336e9c2014-07-28 22:57:30 +00004751 {Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)}));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004752 EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int> >(
kosak2336e9c2014-07-28 22:57:30 +00004753 {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)})));
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004754}
4755
kosak18489fa2013-12-04 23:49:07 +00004756#endif // GTEST_HAS_STD_INITIALIZER_LIST_
zhanyong.wan1cc1d4b2013-08-08 18:41:51 +00004757
zhanyong.wanfb25d532013-07-28 08:24:00 +00004758class UnorderedElementsAreTest : public testing::Test {
4759 protected:
4760 typedef std::vector<int> IntVec;
4761};
4762
billydonahue1f5fdea2014-05-19 17:54:51 +00004763TEST_F(UnorderedElementsAreTest, WorksWithUncopyable) {
4764 Uncopyable objs[2];
4765 objs[0].set_value(-3);
4766 objs[1].set_value(1);
4767 EXPECT_THAT(objs,
4768 UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3)));
4769}
4770
zhanyong.wanfb25d532013-07-28 08:24:00 +00004771TEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) {
kosak2336e9c2014-07-28 22:57:30 +00004772 const int a[] = {1, 2, 3};
kosak6414d802013-12-03 23:19:36 +00004773 std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004774 do {
4775 StringMatchResultListener listener;
4776 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4777 s, &listener)) << listener.str();
4778 } while (std::next_permutation(s.begin(), s.end()));
4779}
4780
4781TEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) {
kosak2336e9c2014-07-28 22:57:30 +00004782 const int a[] = {1, 2, 3};
kosak6414d802013-12-03 23:19:36 +00004783 std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wanfb25d532013-07-28 08:24:00 +00004784 std::vector<Matcher<int> > mv;
4785 mv.push_back(1);
4786 mv.push_back(2);
4787 mv.push_back(2);
4788 // The element with value '3' matches nothing: fail fast.
4789 StringMatchResultListener listener;
4790 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4791 s, &listener)) << listener.str();
4792}
4793
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004794TEST_F(UnorderedElementsAreTest, WorksForStreamlike) {
4795 // Streamlike 'container' provides only minimal iterator support.
4796 // Its iterators are tagged with input_iterator_tag, and it has no
4797 // size() or empty() methods.
kosak2336e9c2014-07-28 22:57:30 +00004798 const int a[5] = {2, 1, 4, 5, 3};
kosak6414d802013-12-03 23:19:36 +00004799 Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
zhanyong.wan5579c1a2013-07-30 06:16:21 +00004800
4801 EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5));
4802 EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5)));
4803}
4804
zhanyong.wanfb25d532013-07-28 08:24:00 +00004805// One naive implementation of the matcher runs in O(N!) time, which is too
4806// slow for many real-world inputs. This test shows that our matcher can match
4807// 100 inputs very quickly (a few milliseconds). An O(100!) is 10^158
4808// iterations and obviously effectively incomputable.
4809// [ RUN ] UnorderedElementsAreTest.Performance
4810// [ OK ] UnorderedElementsAreTest.Performance (4 ms)
4811TEST_F(UnorderedElementsAreTest, Performance) {
4812 std::vector<int> s;
4813 std::vector<Matcher<int> > mv;
4814 for (int i = 0; i < 100; ++i) {
4815 s.push_back(i);
4816 mv.push_back(_);
4817 }
4818 mv[50] = Eq(0);
4819 StringMatchResultListener listener;
4820 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4821 s, &listener)) << listener.str();
4822}
4823
4824// Another variant of 'Performance' with similar expectations.
4825// [ RUN ] UnorderedElementsAreTest.PerformanceHalfStrict
4826// [ OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms)
4827TEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) {
4828 std::vector<int> s;
4829 std::vector<Matcher<int> > mv;
4830 for (int i = 0; i < 100; ++i) {
4831 s.push_back(i);
4832 if (i & 1) {
4833 mv.push_back(_);
4834 } else {
4835 mv.push_back(i);
4836 }
4837 }
4838 StringMatchResultListener listener;
4839 EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4840 s, &listener)) << listener.str();
4841}
4842
4843TEST_F(UnorderedElementsAreTest, FailMessageCountWrong) {
4844 std::vector<int> v;
4845 v.push_back(4);
4846 StringMatchResultListener listener;
4847 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4848 v, &listener)) << listener.str();
4849 EXPECT_THAT(listener.str(), Eq("which has 1 element"));
4850}
4851
4852TEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) {
4853 std::vector<int> v;
4854 StringMatchResultListener listener;
4855 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4856 v, &listener)) << listener.str();
4857 EXPECT_THAT(listener.str(), Eq(""));
4858}
4859
4860TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) {
4861 std::vector<int> v;
4862 v.push_back(1);
4863 v.push_back(1);
4864 StringMatchResultListener listener;
4865 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4866 v, &listener)) << listener.str();
4867 EXPECT_THAT(
4868 listener.str(),
4869 Eq("where the following matchers don't match any elements:\n"
4870 "matcher #1: is equal to 2"));
4871}
4872
4873TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) {
4874 std::vector<int> v;
4875 v.push_back(1);
4876 v.push_back(2);
4877 StringMatchResultListener listener;
4878 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1),
4879 v, &listener)) << listener.str();
4880 EXPECT_THAT(
4881 listener.str(),
4882 Eq("where the following elements don't match any matchers:\n"
4883 "element #1: 2"));
4884}
4885
4886TEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) {
4887 std::vector<int> v;
4888 v.push_back(2);
4889 v.push_back(3);
4890 StringMatchResultListener listener;
4891 EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4892 v, &listener)) << listener.str();
4893 EXPECT_THAT(
4894 listener.str(),
4895 Eq("where"
4896 " the following matchers don't match any elements:\n"
4897 "matcher #0: is equal to 1\n"
4898 "and"
4899 " where"
4900 " the following elements don't match any matchers:\n"
4901 "element #1: 3"));
4902}
4903
4904// Test helper for formatting element, matcher index pairs in expectations.
4905static string EMString(int element, int matcher) {
4906 stringstream ss;
4907 ss << "(element #" << element << ", matcher #" << matcher << ")";
4908 return ss.str();
4909}
4910
4911TEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) {
4912 // A situation where all elements and matchers have a match
4913 // associated with them, but the max matching is not perfect.
4914 std::vector<string> v;
4915 v.push_back("a");
4916 v.push_back("b");
4917 v.push_back("c");
4918 StringMatchResultListener listener;
4919 EXPECT_FALSE(ExplainMatchResult(
4920 UnorderedElementsAre("a", "a", AnyOf("b", "c")), v, &listener))
4921 << listener.str();
4922
4923 string prefix =
4924 "where no permutation of the elements can satisfy all matchers, "
4925 "and the closest match is 2 of 3 matchers with the "
4926 "pairings:\n";
4927
4928 // We have to be a bit loose here, because there are 4 valid max matches.
4929 EXPECT_THAT(
4930 listener.str(),
4931 AnyOf(prefix + "{\n " + EMString(0, 0) +
4932 ",\n " + EMString(1, 2) + "\n}",
4933 prefix + "{\n " + EMString(0, 1) +
4934 ",\n " + EMString(1, 2) + "\n}",
4935 prefix + "{\n " + EMString(0, 0) +
4936 ",\n " + EMString(2, 2) + "\n}",
4937 prefix + "{\n " + EMString(0, 1) +
4938 ",\n " + EMString(2, 2) + "\n}"));
4939}
4940
4941TEST_F(UnorderedElementsAreTest, Describe) {
4942 EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()),
4943 Eq("is empty"));
4944 EXPECT_THAT(
4945 Describe<IntVec>(UnorderedElementsAre(345)),
4946 Eq("has 1 element and that element is equal to 345"));
4947 EXPECT_THAT(
4948 Describe<IntVec>(UnorderedElementsAre(111, 222, 333)),
4949 Eq("has 3 elements and there exists some permutation "
4950 "of elements such that:\n"
4951 " - element #0 is equal to 111, and\n"
4952 " - element #1 is equal to 222, and\n"
4953 " - element #2 is equal to 333"));
4954}
4955
4956TEST_F(UnorderedElementsAreTest, DescribeNegation) {
4957 EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()),
4958 Eq("isn't empty"));
4959 EXPECT_THAT(
4960 DescribeNegation<IntVec>(UnorderedElementsAre(345)),
4961 Eq("doesn't have 1 element, or has 1 element that isn't equal to 345"));
4962 EXPECT_THAT(
4963 DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)),
4964 Eq("doesn't have 3 elements, or there exists no permutation "
4965 "of elements such that:\n"
4966 " - element #0 is equal to 123, and\n"
4967 " - element #1 is equal to 234, and\n"
4968 " - element #2 is equal to 345"));
4969}
4970
4971namespace {
4972
4973// Used as a check on the more complex max flow method used in the
4974// real testing::internal::FindMaxBipartiteMatching. This method is
4975// compatible but runs in worst-case factorial time, so we only
4976// use it in testing for small problem sizes.
4977template <typename Graph>
4978class BacktrackingMaxBPMState {
4979 public:
4980 // Does not take ownership of 'g'.
4981 explicit BacktrackingMaxBPMState(const Graph* g) : graph_(g) { }
4982
4983 ElementMatcherPairs Compute() {
4984 if (graph_->LhsSize() == 0 || graph_->RhsSize() == 0) {
4985 return best_so_far_;
4986 }
4987 lhs_used_.assign(graph_->LhsSize(), kUnused);
4988 rhs_used_.assign(graph_->RhsSize(), kUnused);
4989 for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {
4990 matches_.clear();
4991 RecurseInto(irhs);
4992 if (best_so_far_.size() == graph_->RhsSize())
4993 break;
4994 }
4995 return best_so_far_;
4996 }
4997
4998 private:
4999 static const size_t kUnused = static_cast<size_t>(-1);
5000
5001 void PushMatch(size_t lhs, size_t rhs) {
5002 matches_.push_back(ElementMatcherPair(lhs, rhs));
5003 lhs_used_[lhs] = rhs;
5004 rhs_used_[rhs] = lhs;
5005 if (matches_.size() > best_so_far_.size()) {
5006 best_so_far_ = matches_;
5007 }
5008 }
5009
5010 void PopMatch() {
5011 const ElementMatcherPair& back = matches_.back();
5012 lhs_used_[back.first] = kUnused;
5013 rhs_used_[back.second] = kUnused;
5014 matches_.pop_back();
5015 }
5016
5017 bool RecurseInto(size_t irhs) {
5018 if (rhs_used_[irhs] != kUnused) {
5019 return true;
5020 }
5021 for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {
5022 if (lhs_used_[ilhs] != kUnused) {
5023 continue;
5024 }
5025 if (!graph_->HasEdge(ilhs, irhs)) {
5026 continue;
5027 }
5028 PushMatch(ilhs, irhs);
5029 if (best_so_far_.size() == graph_->RhsSize()) {
5030 return false;
5031 }
5032 for (size_t mi = irhs + 1; mi < graph_->RhsSize(); ++mi) {
5033 if (!RecurseInto(mi)) return false;
5034 }
5035 PopMatch();
5036 }
5037 return true;
5038 }
5039
5040 const Graph* graph_; // not owned
5041 std::vector<size_t> lhs_used_;
5042 std::vector<size_t> rhs_used_;
5043 ElementMatcherPairs matches_;
5044 ElementMatcherPairs best_so_far_;
5045};
5046
5047template <typename Graph>
5048const size_t BacktrackingMaxBPMState<Graph>::kUnused;
5049
5050} // namespace
5051
5052// Implement a simple backtracking algorithm to determine if it is possible
5053// to find one element per matcher, without reusing elements.
5054template <typename Graph>
5055ElementMatcherPairs
5056FindBacktrackingMaxBPM(const Graph& g) {
5057 return BacktrackingMaxBPMState<Graph>(&g).Compute();
5058}
5059
5060class BacktrackingBPMTest : public ::testing::Test { };
5061
5062// Tests the MaxBipartiteMatching algorithm with square matrices.
5063// The single int param is the # of nodes on each of the left and right sides.
5064class BipartiteTest : public ::testing::TestWithParam<int> { };
5065
5066// Verify all match graphs up to some moderate number of edges.
5067TEST_P(BipartiteTest, Exhaustive) {
5068 int nodes = GetParam();
5069 MatchMatrix graph(nodes, nodes);
5070 do {
5071 ElementMatcherPairs matches =
5072 internal::FindMaxBipartiteMatching(graph);
5073 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), matches.size())
5074 << "graph: " << graph.DebugString();
5075 // Check that all elements of matches are in the graph.
5076 // Check that elements of first and second are unique.
5077 std::vector<bool> seen_element(graph.LhsSize());
5078 std::vector<bool> seen_matcher(graph.RhsSize());
5079 SCOPED_TRACE(PrintToString(matches));
5080 for (size_t i = 0; i < matches.size(); ++i) {
5081 size_t ilhs = matches[i].first;
5082 size_t irhs = matches[i].second;
5083 EXPECT_TRUE(graph.HasEdge(ilhs, irhs));
5084 EXPECT_FALSE(seen_element[ilhs]);
5085 EXPECT_FALSE(seen_matcher[irhs]);
5086 seen_element[ilhs] = true;
5087 seen_matcher[irhs] = true;
5088 }
5089 } while (graph.NextGraph());
5090}
5091
5092INSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteTest,
5093 ::testing::Range(0, 5));
5094
5095// Parameterized by a pair interpreted as (LhsSize, RhsSize).
5096class BipartiteNonSquareTest
5097 : public ::testing::TestWithParam<std::pair<size_t, size_t> > {
5098};
5099
5100TEST_F(BipartiteNonSquareTest, SimpleBacktracking) {
5101 // .......
5102 // 0:-----\ :
5103 // 1:---\ | :
5104 // 2:---\ | :
5105 // 3:-\ | | :
5106 // :.......:
5107 // 0 1 2
5108 MatchMatrix g(4, 3);
kosak2336e9c2014-07-28 22:57:30 +00005109 static const int kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}};
kosak6414d802013-12-03 23:19:36 +00005110 for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) {
zhanyong.wanfb25d532013-07-28 08:24:00 +00005111 g.SetEdge(kEdges[i][0], kEdges[i][1], true);
5112 }
5113 EXPECT_THAT(FindBacktrackingMaxBPM(g),
5114 ElementsAre(Pair(3, 0),
5115 Pair(AnyOf(1, 2), 1),
5116 Pair(0, 2))) << g.DebugString();
5117}
5118
5119// Verify a few nonsquare matrices.
5120TEST_P(BipartiteNonSquareTest, Exhaustive) {
5121 size_t nlhs = GetParam().first;
5122 size_t nrhs = GetParam().second;
5123 MatchMatrix graph(nlhs, nrhs);
5124 do {
5125 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
5126 internal::FindMaxBipartiteMatching(graph).size())
5127 << "graph: " << graph.DebugString()
5128 << "\nbacktracking: "
5129 << PrintToString(FindBacktrackingMaxBPM(graph))
5130 << "\nmax flow: "
5131 << PrintToString(internal::FindMaxBipartiteMatching(graph));
5132 } while (graph.NextGraph());
5133}
5134
5135INSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteNonSquareTest,
5136 testing::Values(
5137 std::make_pair(1, 2),
5138 std::make_pair(2, 1),
5139 std::make_pair(3, 2),
5140 std::make_pair(2, 3),
5141 std::make_pair(4, 1),
5142 std::make_pair(1, 4),
5143 std::make_pair(4, 3),
5144 std::make_pair(3, 4)));
5145
5146class BipartiteRandomTest
5147 : public ::testing::TestWithParam<std::pair<int, int> > {
5148};
5149
5150// Verifies a large sample of larger graphs.
5151TEST_P(BipartiteRandomTest, LargerNets) {
5152 int nodes = GetParam().first;
5153 int iters = GetParam().second;
5154 MatchMatrix graph(nodes, nodes);
5155
5156 testing::internal::Int32 seed = GTEST_FLAG(random_seed);
5157 if (seed == 0) {
5158 seed = static_cast<testing::internal::Int32>(time(NULL));
5159 }
5160
5161 for (; iters > 0; --iters, ++seed) {
5162 srand(static_cast<int>(seed));
5163 graph.Randomize();
5164 EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
5165 internal::FindMaxBipartiteMatching(graph).size())
5166 << " graph: " << graph.DebugString()
5167 << "\nTo reproduce the failure, rerun the test with the flag"
5168 " --" << GTEST_FLAG_PREFIX_ << "random_seed=" << seed;
5169 }
5170}
5171
5172// Test argument is a std::pair<int, int> representing (nodes, iters).
5173INSTANTIATE_TEST_CASE_P(Samples, BipartiteRandomTest,
5174 testing::Values(
5175 std::make_pair(5, 10000),
5176 std::make_pair(6, 5000),
5177 std::make_pair(7, 2000),
5178 std::make_pair(8, 500),
5179 std::make_pair(9, 100)));
5180
zhanyong.wan736baa82010-09-27 17:44:16 +00005181// Tests IsReadableTypeName().
5182
5183TEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) {
5184 EXPECT_TRUE(IsReadableTypeName("int"));
5185 EXPECT_TRUE(IsReadableTypeName("const unsigned char*"));
5186 EXPECT_TRUE(IsReadableTypeName("MyMap<int, void*>"));
5187 EXPECT_TRUE(IsReadableTypeName("void (*)(int, bool)"));
5188}
5189
5190TEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) {
5191 EXPECT_TRUE(IsReadableTypeName("my_long_namespace::MyClassName"));
5192 EXPECT_TRUE(IsReadableTypeName("int [5][6][7][8][9][10][11]"));
5193 EXPECT_TRUE(IsReadableTypeName("my_namespace::MyOuterClass::MyInnerClass"));
5194}
5195
5196TEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) {
5197 EXPECT_FALSE(
5198 IsReadableTypeName("basic_string<char, std::char_traits<char> >"));
5199 EXPECT_FALSE(IsReadableTypeName("std::vector<int, std::alloc_traits<int> >"));
5200}
5201
5202TEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) {
5203 EXPECT_FALSE(IsReadableTypeName("void (&)(int, bool, char, float)"));
5204}
5205
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005206// Tests JoinAsTuple().
5207
5208TEST(JoinAsTupleTest, JoinsEmptyTuple) {
5209 EXPECT_EQ("", JoinAsTuple(Strings()));
5210}
5211
5212TEST(JoinAsTupleTest, JoinsOneTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005213 const char* fields[] = {"1"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005214 EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1)));
5215}
5216
5217TEST(JoinAsTupleTest, JoinsTwoTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005218 const char* fields[] = {"1", "a"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005219 EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2)));
5220}
5221
5222TEST(JoinAsTupleTest, JoinsTenTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005223 const char* fields[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005224 EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)",
5225 JoinAsTuple(Strings(fields, fields + 10)));
5226}
5227
5228// Tests FormatMatcherDescription().
5229
5230TEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) {
5231 EXPECT_EQ("is even",
zhanyong.wanb4140802010-06-08 22:53:57 +00005232 FormatMatcherDescription(false, "IsEven", Strings()));
5233 EXPECT_EQ("not (is even)",
5234 FormatMatcherDescription(true, "IsEven", Strings()));
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005235
kosak2336e9c2014-07-28 22:57:30 +00005236 const char* params[] = {"5"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005237 EXPECT_EQ("equals 5",
zhanyong.wanb4140802010-06-08 22:53:57 +00005238 FormatMatcherDescription(false, "Equals",
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005239 Strings(params, params + 1)));
5240
kosak2336e9c2014-07-28 22:57:30 +00005241 const char* params2[] = {"5", "8"};
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005242 EXPECT_EQ("is in range (5, 8)",
zhanyong.wanb4140802010-06-08 22:53:57 +00005243 FormatMatcherDescription(false, "IsInRange",
zhanyong.wan4a5330d2009-02-19 00:36:44 +00005244 Strings(params2, params2 + 2)));
5245}
5246
zhanyong.wan2b43a9e2009-08-31 23:51:23 +00005247// Tests PolymorphicMatcher::mutable_impl().
5248TEST(PolymorphicMatcherTest, CanAccessMutableImpl) {
5249 PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
5250 DivisibleByImpl& impl = m.mutable_impl();
5251 EXPECT_EQ(42, impl.divider());
5252
5253 impl.set_divider(0);
5254 EXPECT_EQ(0, m.mutable_impl().divider());
5255}
5256
5257// Tests PolymorphicMatcher::impl().
5258TEST(PolymorphicMatcherTest, CanAccessImpl) {
5259 const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
5260 const DivisibleByImpl& impl = m.impl();
5261 EXPECT_EQ(42, impl.divider());
5262}
5263
zhanyong.wanb1c7f932010-03-24 17:35:11 +00005264TEST(MatcherTupleTest, ExplainsMatchFailure) {
5265 stringstream ss1;
5266 ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)),
5267 make_tuple('a', 10), &ss1);
5268 EXPECT_EQ("", ss1.str()); // Successful match.
5269
5270 stringstream ss2;
5271 ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5272 make_tuple(2, 'b'), &ss2);
5273 EXPECT_EQ(" Expected arg #0: is > 5\n"
5274 " Actual: 2, which is 3 less than 5\n"
zhanyong.wand60c5f42010-07-21 22:21:07 +00005275 " Expected arg #1: is equal to 'a' (97, 0x61)\n"
5276 " Actual: 'b' (98, 0x62)\n",
zhanyong.wanb1c7f932010-03-24 17:35:11 +00005277 ss2.str()); // Failed match where both arguments need explanation.
5278
5279 stringstream ss3;
5280 ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5281 make_tuple(2, 'a'), &ss3);
5282 EXPECT_EQ(" Expected arg #0: is > 5\n"
5283 " Actual: 2, which is 3 less than 5\n",
5284 ss3.str()); // Failed match where only one argument needs
5285 // explanation.
5286}
5287
zhanyong.wan33605ba2010-04-22 23:37:47 +00005288// Tests Each().
5289
5290TEST(EachTest, ExplainsMatchResultCorrectly) {
5291 set<int> a; // empty
5292
5293 Matcher<set<int> > m = Each(2);
5294 EXPECT_EQ("", Explain(m, a));
5295
zhanyong.wan736baa82010-09-27 17:44:16 +00005296 Matcher<const int(&)[1]> n = Each(1); // NOLINT
zhanyong.wan33605ba2010-04-22 23:37:47 +00005297
kosak2336e9c2014-07-28 22:57:30 +00005298 const int b[1] = {1};
zhanyong.wan33605ba2010-04-22 23:37:47 +00005299 EXPECT_EQ("", Explain(n, b));
5300
5301 n = Each(3);
5302 EXPECT_EQ("whose element #0 doesn't match", Explain(n, b));
5303
5304 a.insert(1);
5305 a.insert(2);
5306 a.insert(3);
5307 m = Each(GreaterThan(0));
5308 EXPECT_EQ("", Explain(m, a));
5309
5310 m = Each(GreaterThan(10));
5311 EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10",
5312 Explain(m, a));
5313}
5314
5315TEST(EachTest, DescribesItselfCorrectly) {
5316 Matcher<vector<int> > m = Each(1);
5317 EXPECT_EQ("only contains elements that is equal to 1", Describe(m));
5318
5319 Matcher<vector<int> > m2 = Not(m);
5320 EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2));
5321}
5322
5323TEST(EachTest, MatchesVectorWhenAllElementsMatch) {
5324 vector<int> some_vector;
5325 EXPECT_THAT(some_vector, Each(1));
5326 some_vector.push_back(3);
5327 EXPECT_THAT(some_vector, Not(Each(1)));
5328 EXPECT_THAT(some_vector, Each(3));
5329 some_vector.push_back(1);
5330 some_vector.push_back(2);
5331 EXPECT_THAT(some_vector, Not(Each(3)));
5332 EXPECT_THAT(some_vector, Each(Lt(3.5)));
5333
5334 vector<string> another_vector;
5335 another_vector.push_back("fee");
5336 EXPECT_THAT(another_vector, Each(string("fee")));
5337 another_vector.push_back("fie");
5338 another_vector.push_back("foe");
5339 another_vector.push_back("fum");
5340 EXPECT_THAT(another_vector, Not(Each(string("fee"))));
5341}
5342
5343TEST(EachTest, MatchesMapWhenAllElementsMatch) {
5344 map<const char*, int> my_map;
5345 const char* bar = "a string";
5346 my_map[bar] = 2;
5347 EXPECT_THAT(my_map, Each(make_pair(bar, 2)));
5348
5349 map<string, int> another_map;
5350 EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
5351 another_map["fee"] = 1;
5352 EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
5353 another_map["fie"] = 2;
5354 another_map["foe"] = 3;
5355 another_map["fum"] = 4;
5356 EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1))));
5357 EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1))));
5358 EXPECT_THAT(another_map, Each(Pair(_, Gt(0))));
5359}
5360
5361TEST(EachTest, AcceptsMatcher) {
kosak2336e9c2014-07-28 22:57:30 +00005362 const int a[] = {1, 2, 3};
zhanyong.wan33605ba2010-04-22 23:37:47 +00005363 EXPECT_THAT(a, Each(Gt(0)));
5364 EXPECT_THAT(a, Not(Each(Gt(1))));
5365}
5366
5367TEST(EachTest, WorksForNativeArrayAsTuple) {
kosak2336e9c2014-07-28 22:57:30 +00005368 const int a[] = {1, 2};
zhanyong.wan33605ba2010-04-22 23:37:47 +00005369 const int* const pointer = a;
5370 EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0)));
5371 EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1))));
5372}
5373
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005374// For testing Pointwise().
5375class IsHalfOfMatcher {
5376 public:
5377 template <typename T1, typename T2>
5378 bool MatchAndExplain(const tuple<T1, T2>& a_pair,
5379 MatchResultListener* listener) const {
5380 if (get<0>(a_pair) == get<1>(a_pair)/2) {
5381 *listener << "where the second is " << get<1>(a_pair);
5382 return true;
5383 } else {
5384 *listener << "where the second/2 is " << get<1>(a_pair)/2;
5385 return false;
5386 }
5387 }
5388
5389 void DescribeTo(ostream* os) const {
5390 *os << "are a pair where the first is half of the second";
5391 }
5392
5393 void DescribeNegationTo(ostream* os) const {
5394 *os << "are a pair where the first isn't half of the second";
5395 }
5396};
5397
5398PolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() {
5399 return MakePolymorphicMatcher(IsHalfOfMatcher());
5400}
5401
5402TEST(PointwiseTest, DescribesSelf) {
5403 vector<int> rhs;
5404 rhs.push_back(1);
5405 rhs.push_back(2);
5406 rhs.push_back(3);
5407 const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs);
5408 EXPECT_EQ("contains 3 values, where each value and its corresponding value "
5409 "in { 1, 2, 3 } are a pair where the first is half of the second",
5410 Describe(m));
5411 EXPECT_EQ("doesn't contain exactly 3 values, or contains a value x at some "
5412 "index i where x and the i-th value of { 1, 2, 3 } are a pair "
5413 "where the first isn't half of the second",
5414 DescribeNegation(m));
5415}
5416
5417TEST(PointwiseTest, MakesCopyOfRhs) {
5418 list<signed char> rhs;
5419 rhs.push_back(2);
5420 rhs.push_back(4);
5421
kosak2336e9c2014-07-28 22:57:30 +00005422 int lhs[] = {1, 2};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005423 const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs);
5424 EXPECT_THAT(lhs, m);
5425
5426 // Changing rhs now shouldn't affect m, which made a copy of rhs.
5427 rhs.push_back(6);
5428 EXPECT_THAT(lhs, m);
5429}
5430
5431TEST(PointwiseTest, WorksForLhsNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00005432 const int lhs[] = {1, 2, 3};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005433 vector<int> rhs;
5434 rhs.push_back(2);
5435 rhs.push_back(4);
5436 rhs.push_back(6);
5437 EXPECT_THAT(lhs, Pointwise(Lt(), rhs));
5438 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5439}
5440
5441TEST(PointwiseTest, WorksForRhsNativeArray) {
kosak2336e9c2014-07-28 22:57:30 +00005442 const int rhs[] = {1, 2, 3};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005443 vector<int> lhs;
5444 lhs.push_back(2);
5445 lhs.push_back(4);
5446 lhs.push_back(6);
5447 EXPECT_THAT(lhs, Pointwise(Gt(), rhs));
5448 EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs)));
5449}
5450
kosak2336e9c2014-07-28 22:57:30 +00005451#if GTEST_HAS_STD_INITIALIZER_LIST_
5452
5453TEST(PointwiseTest, WorksForRhsInitializerList) {
5454 const vector<int> lhs{2, 4, 6};
5455 EXPECT_THAT(lhs, Pointwise(Gt(), {1, 2, 3}));
5456 EXPECT_THAT(lhs, Not(Pointwise(Lt(), {3, 3, 7})));
5457}
5458
5459#endif // GTEST_HAS_STD_INITIALIZER_LIST_
5460
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005461TEST(PointwiseTest, RejectsWrongSize) {
kosak2336e9c2014-07-28 22:57:30 +00005462 const double lhs[2] = {1, 2};
5463 const int rhs[1] = {0};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005464 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5465 EXPECT_EQ("which contains 2 values",
5466 Explain(Pointwise(Gt(), rhs), lhs));
5467
kosak2336e9c2014-07-28 22:57:30 +00005468 const int rhs2[3] = {0, 1, 2};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005469 EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2)));
5470}
5471
5472TEST(PointwiseTest, RejectsWrongContent) {
kosak2336e9c2014-07-28 22:57:30 +00005473 const double lhs[3] = {1, 2, 3};
5474 const int rhs[3] = {2, 6, 4};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005475 EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs)));
5476 EXPECT_EQ("where the value pair (2, 6) at index #1 don't match, "
5477 "where the second/2 is 3",
5478 Explain(Pointwise(IsHalfOf(), rhs), lhs));
5479}
5480
5481TEST(PointwiseTest, AcceptsCorrectContent) {
kosak2336e9c2014-07-28 22:57:30 +00005482 const double lhs[3] = {1, 2, 3};
5483 const int rhs[3] = {2, 4, 6};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005484 EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs));
5485 EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs));
5486}
5487
5488TEST(PointwiseTest, AllowsMonomorphicInnerMatcher) {
kosak2336e9c2014-07-28 22:57:30 +00005489 const double lhs[3] = {1, 2, 3};
5490 const int rhs[3] = {2, 4, 6};
zhanyong.wanab5b77c2010-05-17 19:32:48 +00005491 const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();
5492 EXPECT_THAT(lhs, Pointwise(m1, rhs));
5493 EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs));
5494
5495 // This type works as a tuple<const double&, const int&> can be
5496 // implicitly cast to tuple<double, int>.
5497 const Matcher<tuple<double, int> > m2 = IsHalfOf();
5498 EXPECT_THAT(lhs, Pointwise(m2, rhs));
5499 EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs));
5500}
5501
kosak2336e9c2014-07-28 22:57:30 +00005502TEST(UnorderedPointwiseTest, DescribesSelf) {
5503 vector<int> rhs;
5504 rhs.push_back(1);
5505 rhs.push_back(2);
5506 rhs.push_back(3);
5507 const Matcher<const vector<int>&> m = UnorderedPointwise(IsHalfOf(), rhs);
5508 EXPECT_EQ(
5509 "has 3 elements and there exists some permutation of elements such "
5510 "that:\n"
5511 " - element #0 and 1 are a pair where the first is half of the second, "
5512 "and\n"
5513 " - element #1 and 2 are a pair where the first is half of the second, "
5514 "and\n"
5515 " - element #2 and 3 are a pair where the first is half of the second",
5516 Describe(m));
5517 EXPECT_EQ(
5518 "doesn't have 3 elements, or there exists no permutation of elements "
5519 "such that:\n"
5520 " - element #0 and 1 are a pair where the first is half of the second, "
5521 "and\n"
5522 " - element #1 and 2 are a pair where the first is half of the second, "
5523 "and\n"
5524 " - element #2 and 3 are a pair where the first is half of the second",
5525 DescribeNegation(m));
5526}
5527
5528TEST(UnorderedPointwiseTest, MakesCopyOfRhs) {
5529 list<signed char> rhs;
5530 rhs.push_back(2);
5531 rhs.push_back(4);
5532
5533 int lhs[] = {2, 1};
5534 const Matcher<const int (&)[2]> m = UnorderedPointwise(IsHalfOf(), rhs);
5535 EXPECT_THAT(lhs, m);
5536
5537 // Changing rhs now shouldn't affect m, which made a copy of rhs.
5538 rhs.push_back(6);
5539 EXPECT_THAT(lhs, m);
5540}
5541
5542TEST(UnorderedPointwiseTest, WorksForLhsNativeArray) {
5543 const int lhs[] = {1, 2, 3};
5544 vector<int> rhs;
5545 rhs.push_back(4);
5546 rhs.push_back(6);
5547 rhs.push_back(2);
5548 EXPECT_THAT(lhs, UnorderedPointwise(Lt(), rhs));
5549 EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));
5550}
5551
5552TEST(UnorderedPointwiseTest, WorksForRhsNativeArray) {
5553 const int rhs[] = {1, 2, 3};
5554 vector<int> lhs;
5555 lhs.push_back(4);
5556 lhs.push_back(2);
5557 lhs.push_back(6);
5558 EXPECT_THAT(lhs, UnorderedPointwise(Gt(), rhs));
5559 EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), rhs)));
5560}
5561
5562#if GTEST_HAS_STD_INITIALIZER_LIST_
5563
5564TEST(UnorderedPointwiseTest, WorksForRhsInitializerList) {
5565 const vector<int> lhs{2, 4, 6};
5566 EXPECT_THAT(lhs, UnorderedPointwise(Gt(), {5, 1, 3}));
5567 EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), {1, 1, 7})));
5568}
5569
5570#endif // GTEST_HAS_STD_INITIALIZER_LIST_
5571
5572TEST(UnorderedPointwiseTest, RejectsWrongSize) {
5573 const double lhs[2] = {1, 2};
5574 const int rhs[1] = {0};
5575 EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));
5576 EXPECT_EQ("which has 2 elements",
5577 Explain(UnorderedPointwise(Gt(), rhs), lhs));
5578
5579 const int rhs2[3] = {0, 1, 2};
5580 EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs2)));
5581}
5582
5583TEST(UnorderedPointwiseTest, RejectsWrongContent) {
5584 const double lhs[3] = {1, 2, 3};
5585 const int rhs[3] = {2, 6, 6};
5586 EXPECT_THAT(lhs, Not(UnorderedPointwise(IsHalfOf(), rhs)));
5587 EXPECT_EQ("where the following elements don't match any matchers:\n"
5588 "element #1: 2",
5589 Explain(UnorderedPointwise(IsHalfOf(), rhs), lhs));
5590}
5591
5592TEST(UnorderedPointwiseTest, AcceptsCorrectContentInSameOrder) {
5593 const double lhs[3] = {1, 2, 3};
5594 const int rhs[3] = {2, 4, 6};
5595 EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));
5596}
5597
5598TEST(UnorderedPointwiseTest, AcceptsCorrectContentInDifferentOrder) {
5599 const double lhs[3] = {1, 2, 3};
5600 const int rhs[3] = {6, 4, 2};
5601 EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));
5602}
5603
5604TEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) {
5605 const double lhs[3] = {1, 2, 3};
5606 const int rhs[3] = {4, 6, 2};
5607 const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();
5608 EXPECT_THAT(lhs, UnorderedPointwise(m1, rhs));
5609
5610 // This type works as a tuple<const double&, const int&> can be
5611 // implicitly cast to tuple<double, int>.
5612 const Matcher<tuple<double, int> > m2 = IsHalfOf();
5613 EXPECT_THAT(lhs, UnorderedPointwise(m2, rhs));
5614}
5615
shiqiane35fdd92008-12-10 05:08:54 +00005616} // namespace gmock_matchers_test
5617} // namespace testing