1e35fdd936d133bf8a48de140a3c666897588a05shiqian// Copyright 2007, Google Inc.
2e35fdd936d133bf8a48de140a3c666897588a05shiqian// All rights reserved.
3e35fdd936d133bf8a48de140a3c666897588a05shiqian//
4e35fdd936d133bf8a48de140a3c666897588a05shiqian// Redistribution and use in source and binary forms, with or without
5e35fdd936d133bf8a48de140a3c666897588a05shiqian// modification, are permitted provided that the following conditions are
6e35fdd936d133bf8a48de140a3c666897588a05shiqian// met:
7e35fdd936d133bf8a48de140a3c666897588a05shiqian//
8e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Redistributions of source code must retain the above copyright
9e35fdd936d133bf8a48de140a3c666897588a05shiqian// notice, this list of conditions and the following disclaimer.
10e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Redistributions in binary form must reproduce the above
11e35fdd936d133bf8a48de140a3c666897588a05shiqian// copyright notice, this list of conditions and the following disclaimer
12e35fdd936d133bf8a48de140a3c666897588a05shiqian// in the documentation and/or other materials provided with the
13e35fdd936d133bf8a48de140a3c666897588a05shiqian// distribution.
14e35fdd936d133bf8a48de140a3c666897588a05shiqian//     * Neither the name of Google Inc. nor the names of its
15e35fdd936d133bf8a48de140a3c666897588a05shiqian// contributors may be used to endorse or promote products derived from
16e35fdd936d133bf8a48de140a3c666897588a05shiqian// this software without specific prior written permission.
17e35fdd936d133bf8a48de140a3c666897588a05shiqian//
18e35fdd936d133bf8a48de140a3c666897588a05shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e35fdd936d133bf8a48de140a3c666897588a05shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e35fdd936d133bf8a48de140a3c666897588a05shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e35fdd936d133bf8a48de140a3c666897588a05shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e35fdd936d133bf8a48de140a3c666897588a05shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e35fdd936d133bf8a48de140a3c666897588a05shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e35fdd936d133bf8a48de140a3c666897588a05shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e35fdd936d133bf8a48de140a3c666897588a05shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e35fdd936d133bf8a48de140a3c666897588a05shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e35fdd936d133bf8a48de140a3c666897588a05shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e35fdd936d133bf8a48de140a3c666897588a05shiqian//
30e35fdd936d133bf8a48de140a3c666897588a05shiqian// Author: wan@google.com (Zhanyong Wan)
31e35fdd936d133bf8a48de140a3c666897588a05shiqian
32e35fdd936d133bf8a48de140a3c666897588a05shiqian// Google Mock - a framework for writing C++ mock classes.
33e35fdd936d133bf8a48de140a3c666897588a05shiqian//
34e35fdd936d133bf8a48de140a3c666897588a05shiqian// This file tests some commonly used argument matchers.
35e35fdd936d133bf8a48de140a3c666897588a05shiqian
3653e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock-matchers.h"
37320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan#include "gmock/gmock-more-matchers.h"
38e35fdd936d133bf8a48de140a3c666897588a05shiqian
39e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string.h>
40fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan#include <time.h>
41a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan#include <deque>
42e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <functional>
43a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan#include <iostream>
44a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan#include <iterator>
45616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#include <limits>
466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <list>
476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <map>
486a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <set>
49e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <sstream>
506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <string>
51f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan#include <utility>
526a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <vector>
5353e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/gmock.h"
5453e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h"
5553e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest-spi.h"
56e35fdd936d133bf8a48de140a3c666897588a05shiqian
575b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#if GTEST_HAS_STD_FORWARD_LIST_
58b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak# include <forward_list>  // NOLINT
59b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak#endif
60b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak
61e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing {
624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wannamespace internal {
64587c1b37c2f0b6d430fb13ce09326db0135b557cvladlosevGTEST_API_ string JoinAsTuple(const Strings& fields);
654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}  // namespace internal
664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
67e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace gmock_matchers_test {
68e35fdd936d133bf8a48de140a3c666897588a05shiqian
69898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing std::greater;
70898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing std::less;
71ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing std::list;
72b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing std::make_pair;
73b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::map;
74b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::multimap;
75ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing std::multiset;
76ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing std::ostream;
77b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing std::pair;
7833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanusing std::set;
79e35fdd936d133bf8a48de140a3c666897588a05shiqianusing std::stringstream;
8033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanusing std::vector;
81e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::A;
82bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanusing testing::AllArgs;
83e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AllOf;
84e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::An;
85e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AnyOf;
86e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ByRef;
87b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::ContainsRegex;
88e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DoubleEq;
89616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::DoubleNear;
90e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::EndsWith;
91e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Eq;
92b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::ExplainMatchResult;
93e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Field;
94e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::FloatEq;
95616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::FloatNear;
96e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ge;
97e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Gt;
98e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::HasSubstr;
99320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanusing testing::IsEmpty;
1002d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanusing testing::IsNull;
101b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing testing::Key;
102e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Le;
103e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Lt;
104e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakeMatcher;
105e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakePolymorphicMatcher;
106b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::MatchResultListener;
107e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matcher;
108e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherCast;
109e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherInterface;
110e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matches;
111b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::MatchesRegex;
112e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveDoubleEq;
113616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::NanSensitiveDoubleNear;
114e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveFloatEq;
115616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanusing testing::NanSensitiveFloatNear;
116e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ne;
117e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Not;
118e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NotNull;
119f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanusing testing::Pair;
120e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Pointee;
121ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanusing testing::Pointwise;
122e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::PolymorphicMatcher;
123e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Property;
124e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ref;
125e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ResultOf;
126a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanusing testing::SizeIs;
127e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StartsWith;
128e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseEq;
129e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseNe;
130e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrEq;
131e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrNe;
1322336e9c171b5894bac98f828289f537e29691896kosakusing testing::StringMatchResultListener;
133e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Truly;
134e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::TypedEq;
1352336e9c171b5894bac98f828289f537e29691896kosakusing testing::UnorderedPointwise;
136b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanusing testing::Value;
137898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing testing::WhenSorted;
138898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanusing testing::WhenSortedBy;
139e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::_;
1402336e9c171b5894bac98f828289f537e29691896kosakusing testing::get;
141a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanusing testing::internal::DummyMatchResultListener;
142fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanusing testing::internal::ElementMatcherPair;
143fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanusing testing::internal::ElementMatcherPairs;
144b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::ExplainMatchFailureTupleTo;
145e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::FloatingEqMatcher;
146b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wanusing testing::internal::FormatMatcherDescription;
147736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanusing testing::internal::IsReadableTypeName;
1484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::JoinAsTuple;
149f6df4c6baf244bc35a385b49ffb32be405f44e0ekosakusing testing::internal::linked_ptr;
150fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanusing testing::internal::MatchMatrix;
151b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::RE;
152f6df4c6baf244bc35a385b49ffb32be405f44e0ekosakusing testing::internal::scoped_ptr;
153a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanusing testing::internal::StreamMatchResultListener;
154b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::Strings;
15579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevusing testing::internal::linked_ptr;
156e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosevusing testing::internal::scoped_ptr;
157e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::string;
1582336e9c171b5894bac98f828289f537e29691896kosakusing testing::make_tuple;
1592336e9c171b5894bac98f828289f537e29691896kosakusing testing::tuple;
160e35fdd936d133bf8a48de140a3c666897588a05shiqian
161f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// For testing ExplainMatchResultTo().
162f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass GreaterThanMatcher : public MatcherInterface<int> {
163f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public:
164f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}
165f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
166ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  virtual void DescribeTo(ostream* os) const {
167b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan    *os << "is > " << rhs_;
168f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  }
169f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
170db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  virtual bool MatchAndExplain(int lhs,
171db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan                               MatchResultListener* listener) const {
172f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    const int diff = lhs - rhs_;
173f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    if (diff > 0) {
174676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan      *listener << "which is " << diff << " more than " << rhs_;
175f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    } else if (diff == 0) {
176676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan      *listener << "which is the same as " << rhs_;
177f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    } else {
178676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan      *listener << "which is " << -diff << " less than " << rhs_;
179f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    }
180db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan
181db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    return lhs > rhs_;
182f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  }
18332de5f53763125925e078498250f7e73a88de9edzhanyong.wan
184f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private:
18532de5f53763125925e078498250f7e73a88de9edzhanyong.wan  int rhs_;
186f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan};
187f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
188f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanMatcher<int> GreaterThan(int n) {
189f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  return MakeMatcher(new GreaterThanMatcher(n));
190f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
191f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
192736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanstring OfType(const string& type_name) {
193736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#if GTEST_HAS_RTTI
194736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  return " (of type " + type_name + ")";
195736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#else
196736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  return "";
197736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#endif
198736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan}
199736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan
200e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the given matcher.
201e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T>
202e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Describe(const Matcher<T>& m) {
203e35fdd936d133bf8a48de140a3c666897588a05shiqian  stringstream ss;
204e35fdd936d133bf8a48de140a3c666897588a05shiqian  m.DescribeTo(&ss);
205e35fdd936d133bf8a48de140a3c666897588a05shiqian  return ss.str();
206e35fdd936d133bf8a48de140a3c666897588a05shiqian}
207e35fdd936d133bf8a48de140a3c666897588a05shiqian
208e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the negation of the given matcher.
209e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T>
210e35fdd936d133bf8a48de140a3c666897588a05shiqianstring DescribeNegation(const Matcher<T>& m) {
211e35fdd936d133bf8a48de140a3c666897588a05shiqian  stringstream ss;
212e35fdd936d133bf8a48de140a3c666897588a05shiqian  m.DescribeNegationTo(&ss);
213e35fdd936d133bf8a48de140a3c666897588a05shiqian  return ss.str();
214e35fdd936d133bf8a48de140a3c666897588a05shiqian}
215e35fdd936d133bf8a48de140a3c666897588a05shiqian
216e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the reason why x matches, or doesn't match, m.
217e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherType, typename Value>
218e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Explain(const MatcherType& m, const Value& x) {
219ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  StringMatchResultListener listener;
220ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  ExplainMatchResult(m, x, &listener);
221ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  return listener.str();
222e35fdd936d133bf8a48de140a3c666897588a05shiqian}
223e35fdd936d133bf8a48de140a3c666897588a05shiqian
224a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, StreamingWorks) {
225a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  StringMatchResultListener listener;
226a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  listener << "hi" << 5;
227a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_EQ("hi5", listener.str());
228a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
2291cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  listener.Clear();
2301cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_EQ("", listener.str());
2311cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
2321cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  listener << 42;
2331cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_EQ("42", listener.str());
2341cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
235a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  // Streaming shouldn't crash when the underlying ostream is NULL.
236a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  DummyMatchResultListener dummy;
237a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  dummy << "hi" << 5;
238a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
239a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
240a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, CanAccessUnderlyingStream) {
241a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(DummyMatchResultListener().stream() == NULL);
242a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL);
243a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
244a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream());
245a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
246a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
247a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, IsInterestedWorks) {
248a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(StringMatchResultListener().IsInterested());
249a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested());
250a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
251a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(DummyMatchResultListener().IsInterested());
252a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested());
253a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
254a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
255e35fdd936d133bf8a48de140a3c666897588a05shiqian// Makes sure that the MatcherInterface<T> interface doesn't
256e35fdd936d133bf8a48de140a3c666897588a05shiqian// change.
257e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EvenMatcherImpl : public MatcherInterface<int> {
258e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
259db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  virtual bool MatchAndExplain(int x,
260db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan                               MatchResultListener* /* listener */) const {
261db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    return x % 2 == 0;
262db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  }
263e35fdd936d133bf8a48de140a3c666897588a05shiqian
264ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  virtual void DescribeTo(ostream* os) const {
265e35fdd936d133bf8a48de140a3c666897588a05shiqian    *os << "is an even number";
266e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
267e35fdd936d133bf8a48de140a3c666897588a05shiqian
268e35fdd936d133bf8a48de140a3c666897588a05shiqian  // We deliberately don't define DescribeNegationTo() and
269e35fdd936d133bf8a48de140a3c666897588a05shiqian  // ExplainMatchResultTo() here, to make sure the definition of these
270e35fdd936d133bf8a48de140a3c666897588a05shiqian  // two methods is optional.
271e35fdd936d133bf8a48de140a3c666897588a05shiqian};
272e35fdd936d133bf8a48de140a3c666897588a05shiqian
273a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan// Makes sure that the MatcherInterface API doesn't change.
274a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) {
275e35fdd936d133bf8a48de140a3c666897588a05shiqian  EvenMatcherImpl m;
276e35fdd936d133bf8a48de140a3c666897588a05shiqian}
277e35fdd936d133bf8a48de140a3c666897588a05shiqian
278821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests implementing a monomorphic matcher using MatchAndExplain().
279821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
280821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass NewEvenMatcherImpl : public MatcherInterface<int> {
281821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public:
282821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  virtual bool MatchAndExplain(int x, MatchResultListener* listener) const {
283821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    const bool match = x % 2 == 0;
284821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    // Verifies that we can stream to a listener directly.
285821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    *listener << "value % " << 2;
286821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    if (listener->stream() != NULL) {
287821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan      // Verifies that we can stream to a listener's underlying stream
288821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan      // too.
289821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan      *listener->stream() << " == " << (x % 2);
290821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    }
291821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    return match;
292821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
293821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
294ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  virtual void DescribeTo(ostream* os) const {
295821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    *os << "is an even number";
296821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
297821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan};
298821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
299821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) {
300821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl);
301821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m.Matches(2));
302821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m.Matches(3));
303821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("value % 2 == 0", Explain(m, 2));
304821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("value % 2 == 1", Explain(m, 3));
305821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
306821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
307e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests default-constructing a matcher.
308e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeDefaultConstructed) {
309e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m;
310e35fdd936d133bf8a48de140a3c666897588a05shiqian}
311e35fdd936d133bf8a48de140a3c666897588a05shiqian
312e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*.
313e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeConstructedFromMatcherInterface) {
314e35fdd936d133bf8a48de140a3c666897588a05shiqian  const MatcherInterface<int>* impl = new EvenMatcherImpl;
315e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m(impl);
316e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(4));
317e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(5));
318e35fdd936d133bf8a48de140a3c666897588a05shiqian}
319e35fdd936d133bf8a48de140a3c666897588a05shiqian
320e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that value can be used in place of Eq(value).
321e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) {
322e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = 5;
323e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(5));
324e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(6));
325e35fdd936d133bf8a48de140a3c666897588a05shiqian}
326e35fdd936d133bf8a48de140a3c666897588a05shiqian
327e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NULL can be used in place of Eq(NULL).
328e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) {
329e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int*> m1 = NULL;
330e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(NULL));
331e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
332e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(&n));
333e35fdd936d133bf8a48de140a3c666897588a05shiqian}
334e35fdd936d133bf8a48de140a3c666897588a05shiqian
335e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that matchers are copyable.
336e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, IsCopyable) {
337e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests the copy constructor.
338e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<bool> m1 = Eq(false);
339e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(false));
340e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(true));
341e35fdd936d133bf8a48de140a3c666897588a05shiqian
342e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests the assignment operator.
343e35fdd936d133bf8a48de140a3c666897588a05shiqian  m1 = Eq(true);
344e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(true));
345e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(false));
346e35fdd936d133bf8a48de140a3c666897588a05shiqian}
347e35fdd936d133bf8a48de140a3c666897588a05shiqian
348e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T>::DescribeTo() calls
349e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T>::DescribeTo().
350e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanDescribeItself) {
351e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is an even number",
352e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(Matcher<int>(new EvenMatcherImpl)));
353e35fdd936d133bf8a48de140a3c666897588a05shiqian}
354e35fdd936d133bf8a48de140a3c666897588a05shiqian
355821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests Matcher<T>::MatchAndExplain().
356821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MatcherTest, MatchAndExplain) {
357821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  Matcher<int> m = GreaterThan(0);
35834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener1;
359821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m.MatchAndExplain(42, &listener1));
360676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is 42 more than 0", listener1.str());
361821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
36234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener2;
363821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m.MatchAndExplain(-9, &listener2));
364676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is 9 less than 0", listener2.str());
365821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
366821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
367e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a C-string literal can be implicitly converted to a
368e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>.
369e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {
370e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m1 = "hi";
371e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("hi"));
372e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("hello"));
373e35fdd936d133bf8a48de140a3c666897588a05shiqian
374e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = "hi";
375e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hi"));
376e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("hello"));
377e35fdd936d133bf8a48de140a3c666897588a05shiqian}
378e35fdd936d133bf8a48de140a3c666897588a05shiqian
379e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a string object can be implicitly converted to a
380e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>.
381e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) {
382e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m1 = string("hi");
383e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("hi"));
384e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("hello"));
385e35fdd936d133bf8a48de140a3c666897588a05shiqian
386e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = string("hi");
387e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hi"));
388e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("hello"));
389e35fdd936d133bf8a48de140a3c666897588a05shiqian}
390e35fdd936d133bf8a48de140a3c666897588a05shiqian
3911f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan#if GTEST_HAS_STRING_PIECE_
3921f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Tests that a C-string literal can be implicitly converted to a
3931f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Matcher<StringPiece> or Matcher<const StringPiece&>.
3941f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wanTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {
3951f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  Matcher<StringPiece> m1 = "cats";
3961f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_TRUE(m1.Matches("cats"));
3971f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_FALSE(m1.Matches("dogs"));
3981f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan
3991f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  Matcher<const StringPiece&> m2 = "cats";
4001f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_TRUE(m2.Matches("cats"));
4011f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_FALSE(m2.Matches("dogs"));
4021f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan}
4031f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan
4041f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Tests that a string object can be implicitly converted to a
4051f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Matcher<StringPiece> or Matcher<const StringPiece&>.
4061f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wanTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromString) {
4071f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  Matcher<StringPiece> m1 = string("cats");
4081f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_TRUE(m1.Matches("cats"));
4091f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_FALSE(m1.Matches("dogs"));
4101f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan
4111f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  Matcher<const StringPiece&> m2 = string("cats");
4121f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_TRUE(m2.Matches("cats"));
4131f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_FALSE(m2.Matches("dogs"));
4141f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan}
4151f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan
4161f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Tests that a StringPiece object can be implicitly converted to a
4171f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan// Matcher<StringPiece> or Matcher<const StringPiece&>.
4181f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wanTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromStringPiece) {
4191f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  Matcher<StringPiece> m1 = StringPiece("cats");
4201f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_TRUE(m1.Matches("cats"));
4211f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_FALSE(m1.Matches("dogs"));
4221f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan
4231f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  Matcher<const StringPiece&> m2 = StringPiece("cats");
4241f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_TRUE(m2.Matches("cats"));
4251f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan  EXPECT_FALSE(m2.Matches("dogs"));
4261f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan}
4271f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan#endif  // GTEST_HAS_STRING_PIECE_
4281f122a06e6aad4d234123d2d8c1e352029ce0742zhanyong.wan
429e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MakeMatcher() constructs a Matcher<T> from a
430e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface* without requiring the user to explicitly
431e35fdd936d133bf8a48de140a3c666897588a05shiqian// write the type.
432e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) {
433e35fdd936d133bf8a48de140a3c666897588a05shiqian  const MatcherInterface<int>* dummy_impl = NULL;
434e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = MakeMatcher(dummy_impl);
435e35fdd936d133bf8a48de140a3c666897588a05shiqian}
436e35fdd936d133bf8a48de140a3c666897588a05shiqian
437821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests that MakePolymorphicMatcher() can construct a polymorphic
438821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// matcher from its implementation using the old API.
43933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanconst int g_bar = 1;
440e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ReferencesBarOrIsZeroImpl {
441e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
442e35fdd936d133bf8a48de140a3c666897588a05shiqian  template <typename T>
443db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  bool MatchAndExplain(const T& x,
444db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan                       MatchResultListener* /* listener */) const {
445e35fdd936d133bf8a48de140a3c666897588a05shiqian    const void* p = &x;
44633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan    return p == &g_bar || x == 0;
447e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
448e35fdd936d133bf8a48de140a3c666897588a05shiqian
449ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeTo(ostream* os) const { *os << "g_bar or zero"; }
450e35fdd936d133bf8a48de140a3c666897588a05shiqian
451ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeNegationTo(ostream* os) const {
45233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan    *os << "doesn't reference g_bar and is not zero";
453e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
454e35fdd936d133bf8a48de140a3c666897588a05shiqian};
455e35fdd936d133bf8a48de140a3c666897588a05shiqian
456e35fdd936d133bf8a48de140a3c666897588a05shiqian// This function verifies that MakePolymorphicMatcher() returns a
457e35fdd936d133bf8a48de140a3c666897588a05shiqian// PolymorphicMatcher<T> where T is the argument's type.
458e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() {
459e35fdd936d133bf8a48de140a3c666897588a05shiqian  return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl());
460e35fdd936d133bf8a48de140a3c666897588a05shiqian}
461e35fdd936d133bf8a48de140a3c666897588a05shiqian
462821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) {
463e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Using a polymorphic matcher to match a reference type.
464e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m1 = ReferencesBarOrIsZero();
465e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(0));
466e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Verifies that the identity of a by-reference argument is preserved.
46733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_TRUE(m1.Matches(g_bar));
468e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(1));
46933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("g_bar or zero", Describe(m1));
470e35fdd936d133bf8a48de140a3c666897588a05shiqian
471e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Using a polymorphic matcher to match a value type.
472e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m2 = ReferencesBarOrIsZero();
473e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0.0));
474e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(0.1));
47533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("g_bar or zero", Describe(m2));
476e35fdd936d133bf8a48de140a3c666897588a05shiqian}
477e35fdd936d133bf8a48de140a3c666897588a05shiqian
478821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests implementing a polymorphic matcher using MatchAndExplain().
479821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
480821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass PolymorphicIsEvenImpl {
481821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public:
482ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeTo(ostream* os) const { *os << "is even"; }
483821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
484ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeNegationTo(ostream* os) const {
485821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    *os << "is odd";
486821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
487821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
488db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  template <typename T>
489db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  bool MatchAndExplain(const T& x, MatchResultListener* listener) const {
490db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    // Verifies that we can stream to the listener directly.
491db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    *listener << "% " << 2;
492db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    if (listener->stream() != NULL) {
493db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan      // Verifies that we can stream to the listener's underlying stream
494db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan      // too.
495db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan      *listener->stream() << " == " << (x % 2);
496db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    }
497db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    return (x % 2) == 0;
498821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
499db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan};
500821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
501821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanPolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() {
502821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  return MakePolymorphicMatcher(PolymorphicIsEvenImpl());
503821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
504821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
505821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) {
506821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // Using PolymorphicIsEven() as a Matcher<int>.
507821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<int> m1 = PolymorphicIsEven();
508821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m1.Matches(42));
509821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m1.Matches(43));
510821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is even", Describe(m1));
511821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
512821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<int> not_m1 = Not(m1);
513821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is odd", Describe(not_m1));
514821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
515821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("% 2 == 0", Explain(m1, 42));
516821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
517821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // Using PolymorphicIsEven() as a Matcher<char>.
518821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<char> m2 = PolymorphicIsEven();
519821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m2.Matches('\x42'));
520821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m2.Matches('\x43'));
521821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is even", Describe(m2));
522821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
523821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<char> not_m2 = Not(m2);
524821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is odd", Describe(not_m2));
525821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
526821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("% 2 == 0", Explain(m2, '\x42'));
527821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
528821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
529e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher.
530e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromPolymorphicMatcher) {
531e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = MatcherCast<int>(Eq(5));
532e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(5));
533e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(6));
534e35fdd936d133bf8a48de140a3c666897588a05shiqian}
535e35fdd936d133bf8a48de140a3c666897588a05shiqian
536e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types.
537e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IntValue {
538e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
539e35fdd936d133bf8a48de140a3c666897588a05shiqian  // An int can be statically (although not implicitly) cast to a
540e35fdd936d133bf8a48de140a3c666897588a05shiqian  // IntValue.
54132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit IntValue(int a_value) : value_(a_value) {}
542e35fdd936d133bf8a48de140a3c666897588a05shiqian
543e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value() const { return value_; }
544e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
545e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value_;
546e35fdd936d133bf8a48de140a3c666897588a05shiqian};
547e35fdd936d133bf8a48de140a3c666897588a05shiqian
548e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types.
549e35fdd936d133bf8a48de140a3c666897588a05shiqianbool IsPositiveIntValue(const IntValue& foo) {
550e35fdd936d133bf8a48de140a3c666897588a05shiqian  return foo.value() > 0;
551e35fdd936d133bf8a48de140a3c666897588a05shiqian}
552e35fdd936d133bf8a48de140a3c666897588a05shiqian
553e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T
554e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be statically converted to U.
555e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromCompatibleType) {
556e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = Eq(2.0);
557e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
558e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(2));
559e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(3));
560e35fdd936d133bf8a48de140a3c666897588a05shiqian
561e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<IntValue> m3 = Truly(IsPositiveIntValue);
562e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m4 = MatcherCast<int>(m3);
563e35fdd936d133bf8a48de140a3c666897588a05shiqian  // In the following, the arguments 1 and 0 are statically converted
564e35fdd936d133bf8a48de140a3c666897588a05shiqian  // to IntValue objects, and then tested by the IsPositiveIntValue()
565e35fdd936d133bf8a48de140a3c666897588a05shiqian  // predicate.
566e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m4.Matches(1));
567e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m4.Matches(0));
568e35fdd936d133bf8a48de140a3c666897588a05shiqian}
569e35fdd936d133bf8a48de140a3c666897588a05shiqian
570e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>.
571e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromConstReferenceToNonReference) {
572e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m1 = Eq(0);
573e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
574e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
575e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
576e35fdd936d133bf8a48de140a3c666897588a05shiqian}
577e35fdd936d133bf8a48de140a3c666897588a05shiqian
578e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>.
579e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromReferenceToNonReference) {
580e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m1 = Eq(0);
581e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
582e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
583e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
584e35fdd936d133bf8a48de140a3c666897588a05shiqian}
585e35fdd936d133bf8a48de140a3c666897588a05shiqian
586e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
587e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToConstReference) {
588e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(0);
589e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m2 = MatcherCast<const int&>(m1);
590e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
591e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
592e35fdd936d133bf8a48de140a3c666897588a05shiqian}
593e35fdd936d133bf8a48de140a3c666897588a05shiqian
594e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>.
595e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToReference) {
596e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(0);
597e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m2 = MatcherCast<int&>(m1);
598e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
599e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(n));
600e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 1;
601e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(n));
602e35fdd936d133bf8a48de140a3c666897588a05shiqian}
603e35fdd936d133bf8a48de140a3c666897588a05shiqian
604e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T>.
605e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromSameType) {
606e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(0);
607e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
608e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
609e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
610e35fdd936d133bf8a48de140a3c666897588a05shiqian}
611e35fdd936d133bf8a48de140a3c666897588a05shiqian
612506340a66b7814b741b4b4a032ca4b059086f1bbkosak// Implicitly convertible from any type.
61379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmstruct ConvertibleFromAny {
61479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  ConvertibleFromAny(int a_value) : value(a_value) {}
61579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  template <typename T>
616506340a66b7814b741b4b4a032ca4b059086f1bbkosak  ConvertibleFromAny(const T& /*a_value*/) : value(-1) {
61779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm    ADD_FAILURE() << "Conversion constructor called";
61879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  }
61979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  int value;
62079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm};
62179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
62279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmbool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) {
62379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  return a.value == b.value;
62479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}
62579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
62679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmostream& operator<<(ostream& os, const ConvertibleFromAny& a) {
62779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  return os << a.value;
62879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}
62979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
63079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(MatcherCastTest, ConversionConstructorIsUsed) {
63179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1);
63279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
63379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
63479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}
63579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
63679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(MatcherCastTest, FromConvertibleFromAny) {
63779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  Matcher<ConvertibleFromAny> m =
63879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm      MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
63979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
64079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
64179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}
64279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
6435f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakstruct IntReferenceWrapper {
6445f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  IntReferenceWrapper(const int& a_value) : value(&a_value) {}
6455f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  const int* value;
6465f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak};
6475f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak
6485f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakbool operator==(const IntReferenceWrapper& a, const IntReferenceWrapper& b) {
6495f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  return a.value == b.value;
6505f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak}
6515f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak
6525f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakTEST(MatcherCastTest, ValueIsNotCopied) {
6535f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  int n = 42;
6545f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  Matcher<IntReferenceWrapper> m = MatcherCast<IntReferenceWrapper>(n);
6555f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  // Verify that the matcher holds a reference to n, not to its temporary copy.
6565f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  EXPECT_TRUE(m.Matches(n));
6575f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak}
6585f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak
6591f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueclass Base {
6601f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue public:
6611f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  virtual ~Base() {}
6621f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base() {}
6631f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue private:
6641f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  GTEST_DISALLOW_COPY_AND_ASSIGN_(Base);
6651f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue};
6661f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
6671f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueclass Derived : public Base {
6681f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue public:
6691f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Derived() : Base() {}
6701f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  int i;
6711f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue};
6721f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
6731f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueclass OtherDerived : public Base {};
67418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
67518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher.
67618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromPolymorphicMatcher) {
67718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<char> m2 = SafeMatcherCast<char>(Eq(32));
67818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(' '));
67918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches('\n'));
68018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
68118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
68216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where
68316cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// T and U are arithmetic types and T can be losslessly converted to
68416cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// U.
68516cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wanTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) {
68618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<double> m1 = DoubleEq(1.0);
68716cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  Matcher<float> m2 = SafeMatcherCast<float>(m1);
68816cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_TRUE(m2.Matches(1.0f));
68916cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_FALSE(m2.Matches(2.0f));
69016cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan
69116cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a'));
69216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_TRUE(m3.Matches('a'));
69316cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_FALSE(m3.Matches('b'));
69418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
69518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
69618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U
69718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// are pointers or references to a derived and a base class, correspondingly.
69818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromBaseClass) {
69918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Derived d, d2;
70018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Base*> m1 = Eq(&d);
70118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1);
70218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(&d));
70318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(&d2));
70418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
70518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Base&> m3 = Ref(d);
70618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3);
70718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m4.Matches(d));
70818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m4.Matches(d2));
70918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
71018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
71118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>.
71218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromConstReferenceToReference) {
71318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int n = 0;
71418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m1 = Ref(n);
71518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
71618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int n1 = 0;
71718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(n));
71818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(n1));
71918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
72018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
72118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
72218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) {
72318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m1 = Eq(0);
72418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1);
72518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(0));
72618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(1));
72718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
72818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
72918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>.
73018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToReference) {
73118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m1 = Eq(0);
73218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
73318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int n = 0;
73418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(n));
73518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  n = 1;
73618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(n));
73718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
73818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
73918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>.
74018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromSameType) {
74118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m1 = Eq(0);
74218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m2 = SafeMatcherCast<int>(m1);
74318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(0));
74418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(1));
74518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
74618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
74779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(SafeMatcherCastTest, ConversionConstructorIsUsed) {
74879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1);
74979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
75079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
75179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}
75279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
75379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmTEST(SafeMatcherCastTest, FromConvertibleFromAny) {
75479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  Matcher<ConvertibleFromAny> m =
75579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm      SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1)));
75679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_TRUE(m.Matches(ConvertibleFromAny(1)));
75779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_FALSE(m.Matches(ConvertibleFromAny(2)));
75879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}
75979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm
7605f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosakTEST(SafeMatcherCastTest, ValueIsNotCopied) {
7615f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  int n = 42;
7625f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n);
7635f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  // Verify that the matcher holds a reference to n, not to its temporary copy.
7645f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak  EXPECT_TRUE(m.Matches(n));
7655f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak}
7665f2a6ca4fd5e1ab6330be758ea88bfe778af2b77kosak
7679b1a944ec48b7f84ad2f4466ed3babd232a20db5kosakTEST(ExpectThat, TakesLiterals) {
7689b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  EXPECT_THAT(1, 1);
7699b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  EXPECT_THAT(1.0, 1.0);
7709b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  EXPECT_THAT(string(), "");
7719b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak}
7729b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak
7739b1a944ec48b7f84ad2f4466ed3babd232a20db5kosakTEST(ExpectThat, TakesFunctions) {
7749b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  struct Helper {
7759b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak    static void Func() {}
7769b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  };
7779b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  void (*func)() = Helper::Func;
7789b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  EXPECT_THAT(func, Helper::Func);
7799b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak  EXPECT_THAT(func, &Helper::Func);
7809b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak}
7819b1a944ec48b7f84ad2f4466ed3babd232a20db5kosak
782e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() matches any value of type T.
783e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, MatchesAnyValue) {
784e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a value type.
785e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = A<double>();
786e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(91.43));
787e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-15.32));
788e35fdd936d133bf8a48de140a3c666897588a05shiqian
789e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a reference type.
790e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 2;
791e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = -6;
792e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m2 = A<int&>();
793e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(a));
794e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(b));
795e35fdd936d133bf8a48de140a3c666897588a05shiqian}
796e35fdd936d133bf8a48de140a3c666897588a05shiqian
797f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wanTEST(ATest, WorksForDerivedClass) {
798f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan  Base base;
799f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan  Derived derived;
800f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan  EXPECT_THAT(&base, A<Base*>());
801f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan  // This shouldn't compile: EXPECT_THAT(&base, A<Derived*>());
802f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan  EXPECT_THAT(&derived, A<Base*>());
803f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan  EXPECT_THAT(&derived, A<Derived*>());
804f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan}
805f4274520da256a3e8dd4fe2aa2e714f44ad89d18zhanyong.wan
806e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() describes itself properly.
807e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, CanDescribeSelf) {
808e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", Describe(A<bool>()));
809e35fdd936d133bf8a48de140a3c666897588a05shiqian}
810e35fdd936d133bf8a48de140a3c666897588a05shiqian
811e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() matches any value of type T.
812e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, MatchesAnyValue) {
813e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a value type.
814e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = An<int>();
815e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(9143));
816e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-1532));
817e35fdd936d133bf8a48de140a3c666897588a05shiqian
818e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a reference type.
819e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 2;
820e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = -6;
821e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m2 = An<int&>();
822e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(a));
823e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(b));
824e35fdd936d133bf8a48de140a3c666897588a05shiqian}
825e35fdd936d133bf8a48de140a3c666897588a05shiqian
826e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() describes itself properly.
827e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, CanDescribeSelf) {
828e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", Describe(An<int>()));
829e35fdd936d133bf8a48de140a3c666897588a05shiqian}
830e35fdd936d133bf8a48de140a3c666897588a05shiqian
831e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ can be used as a matcher for any type and matches any
832e35fdd936d133bf8a48de140a3c666897588a05shiqian// value of that type.
833e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, MatchesAnyValue) {
834e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Uses _ as a matcher for a value type.
835e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = _;
836e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(123));
837e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-242));
838e35fdd936d133bf8a48de140a3c666897588a05shiqian
839e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Uses _ as a matcher for a reference type.
840e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool a = false;
841e35fdd936d133bf8a48de140a3c666897588a05shiqian  const bool b = true;
842e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const bool&> m2 = _;
843e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(a));
844e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(b));
845e35fdd936d133bf8a48de140a3c666897588a05shiqian}
846e35fdd936d133bf8a48de140a3c666897588a05shiqian
847e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ describes itself properly.
848e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, CanDescribeSelf) {
849e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = _;
850e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", Describe(m));
851e35fdd936d133bf8a48de140a3c666897588a05shiqian}
852e35fdd936d133bf8a48de140a3c666897588a05shiqian
853e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(x) matches any value equal to x.
854e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, MatchesEqualValue) {
855e35fdd936d133bf8a48de140a3c666897588a05shiqian  // 2 C-strings with same content but different addresses.
856e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char a1[] = "hi";
857e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char a2[] = "hi";
858e35fdd936d133bf8a48de140a3c666897588a05shiqian
859e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m1 = Eq(a1);
860e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(a1));
861e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(a2));
862e35fdd936d133bf8a48de140a3c666897588a05shiqian}
863e35fdd936d133bf8a48de140a3c666897588a05shiqian
864e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) describes itself properly.
865e35fdd936d133bf8a48de140a3c666897588a05shiqian
866e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Unprintable {
867e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
868e35fdd936d133bf8a48de140a3c666897588a05shiqian  Unprintable() : c_('a') {}
869e35fdd936d133bf8a48de140a3c666897588a05shiqian
87032de5f53763125925e078498250f7e73a88de9edzhanyong.wan  bool operator==(const Unprintable& /* rhs */) { return true; }
871e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
872e35fdd936d133bf8a48de140a3c666897588a05shiqian  char c_;
873e35fdd936d133bf8a48de140a3c666897588a05shiqian};
874e35fdd936d133bf8a48de140a3c666897588a05shiqian
875e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, CanDescribeSelf) {
876e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<Unprintable> m = Eq(Unprintable());
877e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to 1-byte object <61>", Describe(m));
878e35fdd936d133bf8a48de140a3c666897588a05shiqian}
879e35fdd936d133bf8a48de140a3c666897588a05shiqian
880e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) can be used to match any type that supports
881e35fdd936d133bf8a48de140a3c666897588a05shiqian// comparing with type T, where T is v's type.
882e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, IsPolymorphic) {
883e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(1);
884e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1));
885e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(2));
886e35fdd936d133bf8a48de140a3c666897588a05shiqian
887e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<char> m2 = Eq(1);
888e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches('\1'));
889e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches('a'));
890e35fdd936d133bf8a48de140a3c666897588a05shiqian}
891e35fdd936d133bf8a48de140a3c666897588a05shiqian
892e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) matches values of type T that's equal to v.
893e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, ChecksEqualityForGivenType) {
894e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<char> m1 = TypedEq<char>('a');
895e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches('a'));
896e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches('b'));
897e35fdd936d133bf8a48de140a3c666897588a05shiqian
898e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = TypedEq<int>(6);
899e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(6));
900e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(7));
901e35fdd936d133bf8a48de140a3c666897588a05shiqian}
902e35fdd936d133bf8a48de140a3c666897588a05shiqian
903e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq(v) describes itself properly.
904e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, CanDescribeSelf) {
905e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2)));
906e35fdd936d133bf8a48de140a3c666897588a05shiqian}
907e35fdd936d133bf8a48de140a3c666897588a05shiqian
908e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) has type Matcher<T>.
909e35fdd936d133bf8a48de140a3c666897588a05shiqian
910e35fdd936d133bf8a48de140a3c666897588a05shiqian// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T
911e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a "bare" type (i.e. not in the form of const U or U&).  If v's
912e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is not T, the compiler will generate a message about
913e35fdd936d133bf8a48de140a3c666897588a05shiqian// "undefined referece".
914e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T>
915e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Type {
91632de5f53763125925e078498250f7e73a88de9edzhanyong.wan  static bool IsTypeOf(const T& /* v */) { return true; }
917e35fdd936d133bf8a48de140a3c666897588a05shiqian
918e35fdd936d133bf8a48de140a3c666897588a05shiqian  template <typename T2>
919e35fdd936d133bf8a48de140a3c666897588a05shiqian  static void IsTypeOf(T2 v);
920e35fdd936d133bf8a48de140a3c666897588a05shiqian};
921e35fdd936d133bf8a48de140a3c666897588a05shiqian
922e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, HasSpecifiedType) {
923e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Verfies that the type of TypedEq<T>(v) is Matcher<T>.
924e35fdd936d133bf8a48de140a3c666897588a05shiqian  Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5));
925e35fdd936d133bf8a48de140a3c666897588a05shiqian  Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5));
926e35fdd936d133bf8a48de140a3c666897588a05shiqian}
927e35fdd936d133bf8a48de140a3c666897588a05shiqian
928e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) matches anything >= v.
929e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, ImplementsGreaterThanOrEqual) {
930e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Ge(0);
931e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1));
932e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(0));
933e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(-1));
934e35fdd936d133bf8a48de140a3c666897588a05shiqian}
935e35fdd936d133bf8a48de140a3c666897588a05shiqian
936e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) describes itself properly.
937e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, CanDescribeSelf) {
938e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Ge(5);
939b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is >= 5", Describe(m));
940e35fdd936d133bf8a48de140a3c666897588a05shiqian}
941e35fdd936d133bf8a48de140a3c666897588a05shiqian
942e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) matches anything > v.
943e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, ImplementsGreaterThan) {
944e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = Gt(0);
945e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1.0));
946e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(0.0));
947e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(-1.0));
948e35fdd936d133bf8a48de140a3c666897588a05shiqian}
949e35fdd936d133bf8a48de140a3c666897588a05shiqian
950e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) describes itself properly.
951e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, CanDescribeSelf) {
952e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Gt(5);
953b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is > 5", Describe(m));
954e35fdd936d133bf8a48de140a3c666897588a05shiqian}
955e35fdd936d133bf8a48de140a3c666897588a05shiqian
956e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) matches anything <= v.
957e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, ImplementsLessThanOrEqual) {
958e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<char> m1 = Le('b');
959e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches('a'));
960e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches('b'));
961e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches('c'));
962e35fdd936d133bf8a48de140a3c666897588a05shiqian}
963e35fdd936d133bf8a48de140a3c666897588a05shiqian
964e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) describes itself properly.
965e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, CanDescribeSelf) {
966e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Le(5);
967b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is <= 5", Describe(m));
968e35fdd936d133bf8a48de140a3c666897588a05shiqian}
969e35fdd936d133bf8a48de140a3c666897588a05shiqian
970e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) matches anything < v.
971e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, ImplementsLessThan) {
972e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m1 = Lt("Hello");
973e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("Abc"));
974e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("Hello"));
975e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("Hello, world!"));
976e35fdd936d133bf8a48de140a3c666897588a05shiqian}
977e35fdd936d133bf8a48de140a3c666897588a05shiqian
978e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) describes itself properly.
979e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, CanDescribeSelf) {
980e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Lt(5);
981b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is < 5", Describe(m));
982e35fdd936d133bf8a48de140a3c666897588a05shiqian}
983e35fdd936d133bf8a48de140a3c666897588a05shiqian
984e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) matches anything != v.
985e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, ImplementsNotEqual) {
986e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Ne(0);
987e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1));
988e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-1));
989e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(0));
990e35fdd936d133bf8a48de140a3c666897588a05shiqian}
991e35fdd936d133bf8a48de140a3c666897588a05shiqian
992e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) describes itself properly.
993e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, CanDescribeSelf) {
994e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Ne(5);
995b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to 5", Describe(m));
996e35fdd936d133bf8a48de140a3c666897588a05shiqian}
997e35fdd936d133bf8a48de140a3c666897588a05shiqian
9982d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() matches any NULL pointer of any type.
9992d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, MatchesNullPointer) {
10002d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<int*> m1 = IsNull();
10012d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  int* p1 = NULL;
10022d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  int n = 0;
10032d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_TRUE(m1.Matches(p1));
10042d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_FALSE(m1.Matches(&n));
10052d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
10062d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<const char*> m2 = IsNull();
10072d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  const char* p2 = NULL;
10082d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_TRUE(m2.Matches(p2));
10092d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_FALSE(m2.Matches("hi"));
10102d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
101195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if !GTEST_OS_SYMBIAN
101295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // Nokia's Symbian compiler generates:
101395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h: ambiguous access to overloaded function
101495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)'
101595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing::
101695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  //     MatcherInterface<void *> *)'
101795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h:  (point of instantiation: 'testing::
101895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  //     gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()')
101995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h:   (instantiating: 'testing::PolymorphicMatc
10202d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<void*> m3 = IsNull();
10212d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  void* p3 = NULL;
10222d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_TRUE(m3.Matches(p3));
10232d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef)));
102495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif
10252d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan}
10262d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
102779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(IsNullTest, LinkedPtr) {
102879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<linked_ptr<int> > m = IsNull();
102979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> null_p;
103079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> non_null_p(new int);
103179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
103279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(null_p));
103379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(non_null_p));
103479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
103579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
103679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(IsNullTest, ReferenceToConstLinkedPtr) {
103779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<const linked_ptr<double>&> m = IsNull();
103879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> null_p;
103979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> non_null_p(new double);
104079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
104179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(null_p));
104279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(non_null_p));
104379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
104479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
1045a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#if GTEST_HAS_STD_FUNCTION_
10466305ff5a922ddf3b428f08ad3b53d07d2c08d89akosakTEST(IsNullTest, StdFunction) {
10476305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak  const Matcher<std::function<void()>> m = IsNull();
10486305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak
10496305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak  EXPECT_TRUE(m.Matches(std::function<void()>()));
10506305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak  EXPECT_FALSE(m.Matches([]{}));
10516305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak}
1052a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#endif  // GTEST_HAS_STD_FUNCTION_
10536305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak
10542d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() describes itself properly.
10552d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, CanDescribeSelf) {
10562d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<int*> m = IsNull();
10572d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_EQ("is NULL", Describe(m));
1058b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NULL", DescribeNegation(m));
10592d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan}
10602d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
1061e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() matches any non-NULL pointer of any type.
1062e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, MatchesNonNullPointer) {
1063e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int*> m1 = NotNull();
1064e35fdd936d133bf8a48de140a3c666897588a05shiqian  int* p1 = NULL;
1065e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
1066e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(p1));
1067e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(&n));
1068e35fdd936d133bf8a48de140a3c666897588a05shiqian
1069e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m2 = NotNull();
1070e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char* p2 = NULL;
1071e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(p2));
1072e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hi"));
1073e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1074e35fdd936d133bf8a48de140a3c666897588a05shiqian
107579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(NotNullTest, LinkedPtr) {
107679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<linked_ptr<int> > m = NotNull();
107779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> null_p;
107879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> non_null_p(new int);
107979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
108079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(null_p));
108179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(non_null_p));
108279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
108379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
108479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(NotNullTest, ReferenceToConstLinkedPtr) {
108579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<const linked_ptr<double>&> m = NotNull();
108679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> null_p;
108779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> non_null_p(new double);
108879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
108979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(null_p));
109079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(non_null_p));
109179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
109279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
1093a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#if GTEST_HAS_STD_FUNCTION_
10946305ff5a922ddf3b428f08ad3b53d07d2c08d89akosakTEST(NotNullTest, StdFunction) {
10956305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak  const Matcher<std::function<void()>> m = NotNull();
10966305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak
10976305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak  EXPECT_TRUE(m.Matches([]{}));
10986305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak  EXPECT_FALSE(m.Matches(std::function<void()>()));
10996305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak}
1100a0435dc6879c336ab29afd64c380995055d2cd53Mark Mentovai#endif  // GTEST_HAS_STD_FUNCTION_
11016305ff5a922ddf3b428f08ad3b53d07d2c08d89akosak
1102e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() describes itself properly.
1103e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, CanDescribeSelf) {
1104e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int*> m = NotNull();
1105b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NULL", Describe(m));
1106e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1107e35fdd936d133bf8a48de140a3c666897588a05shiqian
1108e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) matches an argument that references
1109e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'variable'.
1110e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, MatchesSameVariable) {
1111e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 0;
1112e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = 0;
1113e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m = Ref(a);
1114e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
1115e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(b));
1116e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1117e35fdd936d133bf8a48de140a3c666897588a05shiqian
1118e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) describes itself properly.
1119e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanDescribeSelf) {
1120e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 5;
1121e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m = Ref(n);
1122e35fdd936d133bf8a48de140a3c666897588a05shiqian  stringstream ss;
1123e35fdd936d133bf8a48de140a3c666897588a05shiqian  ss << "references the variable @" << &n << " 5";
1124e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(string(ss.str()), Describe(m));
1125e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1126e35fdd936d133bf8a48de140a3c666897588a05shiqian
1127e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test that Ref(non_const_varialbe) can be used as a matcher for a
1128e35fdd936d133bf8a48de140a3c666897588a05shiqian// const reference.
1129e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanBeUsedAsMatcherForConstReference) {
1130e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 0;
1131e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = 0;
1132e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m = Ref(a);
1133e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
1134e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(b));
1135e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1136e35fdd936d133bf8a48de140a3c666897588a05shiqian
1137e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be
1138e35fdd936d133bf8a48de140a3c666897588a05shiqian// used wherever Ref(base) can be used (Ref(derived) is a sub-type
1139e35fdd936d133bf8a48de140a3c666897588a05shiqian// of Ref(base), but not vice versa.
1140e35fdd936d133bf8a48de140a3c666897588a05shiqian
1141e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, IsCovariant) {
1142e35fdd936d133bf8a48de140a3c666897588a05shiqian  Base base, base2;
1143e35fdd936d133bf8a48de140a3c666897588a05shiqian  Derived derived;
1144e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Base&> m1 = Ref(base);
1145e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(base));
1146e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(base2));
1147e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(derived));
1148e35fdd936d133bf8a48de140a3c666897588a05shiqian
1149e35fdd936d133bf8a48de140a3c666897588a05shiqian  m1 = Ref(derived);
1150e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(derived));
1151e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(base));
1152e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(base2));
1153e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1154e35fdd936d133bf8a48de140a3c666897588a05shiqian
1155b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(RefTest, ExplainsResult) {
1156b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  int n = 0;
1157b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n),
1158b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan              StartsWith("which is located @"));
1159b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1160b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  int m = 0;
1161b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m),
1162b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan              StartsWith("which is located @"));
1163b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
1164b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1165e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests string comparison matchers.
1166e35fdd936d133bf8a48de140a3c666897588a05shiqian
1167e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, MatchesEqualString) {
1168e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrEq(string("Hello"));
1169e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("Hello"));
1170e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("hello"));
1171e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1172e35fdd936d133bf8a48de140a3c666897588a05shiqian
1173e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = StrEq("Hello");
1174e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hello"));
1175e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hi"));
1176e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1177e35fdd936d133bf8a48de140a3c666897588a05shiqian
1178e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, CanDescribeSelf) {
1179aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev  Matcher<string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3");
1180aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev  EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"",
1181e35fdd936d133bf8a48de140a3c666897588a05shiqian      Describe(m));
1182e35fdd936d133bf8a48de140a3c666897588a05shiqian
1183e35fdd936d133bf8a48de140a3c666897588a05shiqian  string str("01204500800");
1184e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = '\0';
1185e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m2 = StrEq(str);
1186e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2));
1187e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = '\0';
1188e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m3 = StrEq(str);
1189e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3));
1190e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1191e35fdd936d133bf8a48de140a3c666897588a05shiqian
1192e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, MatchesUnequalString) {
1193e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrNe("Hello");
1194e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(""));
1195e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1196e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("Hello"));
1197e35fdd936d133bf8a48de140a3c666897588a05shiqian
1198e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m2 = StrNe(string("Hello"));
1199e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hello"));
1200e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hello"));
1201e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1202e35fdd936d133bf8a48de140a3c666897588a05shiqian
1203e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, CanDescribeSelf) {
1204e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrNe("Hi");
1205b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to \"Hi\"", Describe(m));
1206e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1207e35fdd936d133bf8a48de140a3c666897588a05shiqian
1208e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) {
1209e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrCaseEq(string("Hello"));
1210e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("Hello"));
1211e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("hello"));
1212e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("Hi"));
1213e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1214e35fdd936d133bf8a48de140a3c666897588a05shiqian
1215e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = StrCaseEq("Hello");
1216e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hello"));
1217e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hi"));
1218e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1219e35fdd936d133bf8a48de140a3c666897588a05shiqian
1220e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1221e35fdd936d133bf8a48de140a3c666897588a05shiqian  string str1("oabocdooeoo");
1222e35fdd936d133bf8a48de140a3c666897588a05shiqian  string str2("OABOCDOOEOO");
1223e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m0 = StrCaseEq(str1);
1224e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m0.Matches(str2 + string(1, '\0')));
1225e35fdd936d133bf8a48de140a3c666897588a05shiqian
1226e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[3] = str2[3] = '\0';
1227e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m1 = StrCaseEq(str1);
1228e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(str2));
1229e35fdd936d133bf8a48de140a3c666897588a05shiqian
1230e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[0] = str1[6] = str1[7] = str1[10] = '\0';
1231e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2[0] = str2[6] = str2[7] = str2[10] = '\0';
1232e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = StrCaseEq(str1);
1233e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[9] = str2[9] = '\0';
1234e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(str2));
1235e35fdd936d133bf8a48de140a3c666897588a05shiqian
1236e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m3 = StrCaseEq(str1);
1237e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(str2));
1238e35fdd936d133bf8a48de140a3c666897588a05shiqian
1239e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2 + "x"));
1240e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2.append(1, '\0');
1241e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2));
1242e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(string(str2, 0, 9)));
1243e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1244e35fdd936d133bf8a48de140a3c666897588a05shiqian
1245e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, CanDescribeSelf) {
1246e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m = StrCaseEq("Hi");
1247e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m));
1248e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1249e35fdd936d133bf8a48de140a3c666897588a05shiqian
1250e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1251e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrCaseNe("Hello");
1252e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("Hi"));
1253e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1254e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("Hello"));
1255e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("hello"));
1256e35fdd936d133bf8a48de140a3c666897588a05shiqian
1257e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m2 = StrCaseNe(string("Hello"));
1258e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(""));
1259e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hello"));
1260e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1261e35fdd936d133bf8a48de140a3c666897588a05shiqian
1262e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, CanDescribeSelf) {
1263e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrCaseNe("Hi");
1264b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m));
1265e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1266e35fdd936d133bf8a48de140a3c666897588a05shiqian
1267e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching string-typed values.
1268e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForStringClasses) {
1269e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<string> m1 = HasSubstr("foo");
1270e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(string("I love food.")));
1271e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(string("tofo")));
1272e35fdd936d133bf8a48de140a3c666897588a05shiqian
1273e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const std::string&> m2 = HasSubstr("foo");
1274e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(std::string("I love food.")));
1275e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(std::string("tofo")));
1276e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1277e35fdd936d133bf8a48de140a3c666897588a05shiqian
1278e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-string-typed values.
1279e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForCStrings) {
1280e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<char*> m1 = HasSubstr("foo");
1281e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food.")));
1282e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo")));
1283e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1284e35fdd936d133bf8a48de140a3c666897588a05shiqian
1285e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m2 = HasSubstr("foo");
1286e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("I love food."));
1287e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("tofo"));
1288e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(NULL));
1289e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1290e35fdd936d133bf8a48de140a3c666897588a05shiqian
1291e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly.
1292e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, CanDescribeSelf) {
1293e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m = HasSubstr("foo\n\"");
1294e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m));
1295e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1296e35fdd936d133bf8a48de140a3c666897588a05shiqian
1297b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, CanDescribeSelf) {
1298b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<std::string, int>&> m = Key("foo");
1299b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m));
1300b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m));
1301b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
1302b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1303b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(KeyTest, ExplainsResult) {
1304b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<int, bool> > m = Key(GreaterThan(10));
1305b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("whose first field is a value which is 5 less than 10",
1306b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(5, true)));
1307b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("whose first field is a value which is 5 more than 10",
1308b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(15, true)));
1309b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1310b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1311b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, MatchesCorrectly) {
1312b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<int, std::string> p(25, "foo");
1313b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Key(25));
1314b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Not(Key(42)));
1315b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Key(Ge(20)));
1316b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Not(Key(Lt(25))));
1317b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1318b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1319b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, SafelyCastsInnerMatcher) {
1320b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  Matcher<int> is_positive = Gt(0);
1321b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  Matcher<int> is_negative = Lt(0);
1322b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<char, bool> p('a', true);
1323b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Key(is_positive));
1324b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Not(Key(is_negative)));
1325b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1326b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1327b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMap) {
1328ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  map<int, char> container;
1329b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(1, 'a'));
1330b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(2, 'b'));
1331b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(4, 'c'));
1332b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(1)));
1333b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Not(Contains(Key(3))));
1334b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1335b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1336b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMultimap) {
1337ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  multimap<int, char> container;
1338b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(1, 'a'));
1339b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(2, 'b'));
1340b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(4, 'c'));
1341b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1342b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Not(Contains(Key(25))));
1343b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(25, 'd'));
1344b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(25)));
1345b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(25, 'e'));
1346b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(25)));
1347b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1348b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(1)));
1349b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Not(Contains(Key(3))));
1350b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1351b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1352f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, Typing) {
1353f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Test verifies the following type conversions can be compiled.
1354b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42);
1355b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<const char*, int> > m2 = Pair("foo", 42);
1356b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<const char*, int> > m3 = Pair("foo", 42);
1357f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1358b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<int, const std::string> > m4 = Pair(25, "42");
1359b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<const std::string, int> > m5 = Pair("25", 42);
1360f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1361f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1362f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanDescribeSelf) {
1363b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42);
1364f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_EQ("has a first field that is equal to \"foo\""
1365f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            ", and has a second field that is equal to 42",
1366f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            Describe(m1));
1367b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("has a first field that isn't equal to \"foo\""
1368b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            ", or has a second field that isn't equal to 42",
1369f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            DescribeNegation(m1));
1370f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Double and triple negation (1 or 2 times not and description of negation).
1371b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42));
1372b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("has a first field that isn't equal to 13"
1373f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            ", and has a second field that is equal to 42",
1374f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            DescribeNegation(m2));
1375f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1376f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1377f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanExplainMatchResultTo) {
1378821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If neither field matches, Pair() should explain about the first
1379821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // field.
1380b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0));
1381676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose first field does not match, which is 1 less than 0",
1382b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(-1, -2)));
1383f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1384821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If the first field matches but the second doesn't, Pair() should
1385821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // explain about the second field.
1386676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose second field does not match, which is 2 less than 0",
1387b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(1, -2)));
1388f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1389821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If the first field doesn't match but the second does, Pair()
1390821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // should explain about the first field.
1391676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose first field does not match, which is 1 less than 0",
1392b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(-1, 2)));
1393f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1394821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If both fields match, Pair() should explain about them both.
1395676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose both fields match, where the first field is a value "
1396676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0, and the second field is a value "
1397676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 2 more than 0",
1398b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(1, 2)));
1399676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan
1400676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // If only the first match has an explanation, only this explanation should
1401676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // be printed.
1402b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0);
1403676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose both fields match, where the first field is a value "
1404676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0",
1405b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(explain_first, make_pair(1, 0)));
1406676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan
1407676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // If only the second match has an explanation, only this explanation should
1408676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // be printed.
1409b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0));
1410676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose both fields match, where the second field is a value "
1411676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0",
1412b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(explain_second, make_pair(0, 1)));
1413f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1414f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1415f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, MatchesCorrectly) {
1416b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<int, std::string> p(25, "foo");
1417f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1418f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Both fields match.
1419f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(25, "foo"));
1420f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o")));
1421f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1422f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // 'first' doesnt' match, but 'second' matches.
1423f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(42, "foo")));
1424f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(Lt(25), "foo")));
1425f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1426f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // 'first' matches, but 'second' doesn't match.
1427f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(25, "bar")));
1428f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(25, Not("foo"))));
1429f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1430f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Neither field matches.
1431f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(13, "bar")));
1432f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a"))));
1433f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1434f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1435f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, SafelyCastsInnerMatchers) {
1436f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  Matcher<int> is_positive = Gt(0);
1437f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  Matcher<int> is_negative = Lt(0);
1438b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<char, bool> p('a', true);
1439f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(is_positive, _));
1440f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(is_negative, _)));
1441f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(_, is_positive));
1442f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(_, is_negative)));
1443f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1444f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1445f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, InsideContainsUsingMap) {
1446ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  map<int, char> container;
1447b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(1, 'a'));
1448b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(2, 'b'));
1449b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(4, 'c'));
145095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  EXPECT_THAT(container, Contains(Pair(1, 'a')));
1451f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(container, Contains(Pair(1, _)));
145295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  EXPECT_THAT(container, Contains(Pair(_, 'a')));
1453f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(container, Not(Contains(Pair(3, _))));
1454f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1455f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1456e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s).
1457e35fdd936d133bf8a48de140a3c666897588a05shiqian
1458e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, MatchesStringWithGivenPrefix) {
1459e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = StartsWith(string(""));
1460e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("Hi"));
1461e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(""));
1462e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1463e35fdd936d133bf8a48de140a3c666897588a05shiqian
1464e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = StartsWith("Hi");
1465e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hi"));
1466e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hi Hi!"));
1467e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("High"));
1468e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("H"));
1469e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(" Hi"));
1470e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1471e35fdd936d133bf8a48de140a3c666897588a05shiqian
1472e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, CanDescribeSelf) {
1473e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m = StartsWith("Hi");
1474e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("starts with \"Hi\"", Describe(m));
1475e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1476e35fdd936d133bf8a48de140a3c666897588a05shiqian
1477e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s).
1478e35fdd936d133bf8a48de140a3c666897588a05shiqian
1479e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, MatchesStringWithGivenSuffix) {
1480e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = EndsWith("");
1481e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("Hi"));
1482e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(""));
1483e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1484e35fdd936d133bf8a48de140a3c666897588a05shiqian
1485e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = EndsWith(string("Hi"));
1486e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hi"));
1487e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Wow Hi Hi"));
1488e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Super Hi"));
1489e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("i"));
1490e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hi "));
1491e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1492e35fdd936d133bf8a48de140a3c666897588a05shiqian
1493e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, CanDescribeSelf) {
1494e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m = EndsWith("Hi");
1495e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("ends with \"Hi\"", Describe(m));
1496e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1497e35fdd936d133bf8a48de140a3c666897588a05shiqian
1498e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests MatchesRegex().
1499e35fdd936d133bf8a48de140a3c666897588a05shiqian
1500e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) {
1501e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = MatchesRegex("a.*z");
1502e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("az"));
1503e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("abcz"));
1504e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1505e35fdd936d133bf8a48de140a3c666897588a05shiqian
1506e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z"));
1507e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("azbz"));
1508e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("az1"));
1509e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("1az"));
1510e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1511e35fdd936d133bf8a48de140a3c666897588a05shiqian
1512e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, CanDescribeSelf) {
1513e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m1 = MatchesRegex(string("Hi.*"));
1514e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1));
1515e35fdd936d133bf8a48de140a3c666897588a05shiqian
1516d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  Matcher<const char*> m2 = MatchesRegex(new RE("a.*"));
1517d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2));
1518e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1519e35fdd936d133bf8a48de140a3c666897588a05shiqian
1520e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ContainsRegex().
1521e35fdd936d133bf8a48de140a3c666897588a05shiqian
1522e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) {
1523e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = ContainsRegex(string("a.*z"));
1524e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("az"));
1525e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("0abcz1"));
1526e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1527e35fdd936d133bf8a48de140a3c666897588a05shiqian
1528e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z"));
1529e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("azbz"));
1530e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("az1"));
1531e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("1a"));
1532e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1533e35fdd936d133bf8a48de140a3c666897588a05shiqian
1534e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, CanDescribeSelf) {
1535e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m1 = ContainsRegex("Hi.*");
1536e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1));
1537e35fdd936d133bf8a48de140a3c666897588a05shiqian
1538d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  Matcher<const char*> m2 = ContainsRegex(new RE("a.*"));
1539d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2));
1540e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1541e35fdd936d133bf8a48de140a3c666897588a05shiqian
1542e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests for wide strings.
1543e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_STD_WSTRING
1544e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, MatchesEqual) {
1545e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello"));
1546e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1547e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1548e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1549e35fdd936d133bf8a48de140a3c666897588a05shiqian
1550e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m2 = StrEq(L"Hello");
1551e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hello"));
1552e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1553e35fdd936d133bf8a48de140a3c666897588a05shiqian
1554e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1555e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1556e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1557e35fdd936d133bf8a48de140a3c666897588a05shiqian
1558e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str(L"01204500800");
1559e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1560e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m4 = StrEq(str);
1561e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m4.Matches(str));
1562e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1563e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m5 = StrEq(str);
1564e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m5.Matches(str));
1565e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1566e35fdd936d133bf8a48de140a3c666897588a05shiqian
1567e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, CanDescribeSelf) {
1568aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev  Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1569aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev  EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
1570e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m));
1571e35fdd936d133bf8a48de140a3c666897588a05shiqian
1572e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1573e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1574e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m2));
1575e35fdd936d133bf8a48de140a3c666897588a05shiqian
1576e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str(L"01204500800");
1577e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1578e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m4 = StrEq(str);
1579e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1580e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1581e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m5 = StrEq(str);
1582e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1583e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1584e35fdd936d133bf8a48de140a3c666897588a05shiqian
1585e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, MatchesUnequalString) {
1586e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hello");
1587e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L""));
1588e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1589e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1590e35fdd936d133bf8a48de140a3c666897588a05shiqian
1591e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello"));
1592e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1593e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1594e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1595e35fdd936d133bf8a48de140a3c666897588a05shiqian
1596e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, CanDescribeSelf) {
1597e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hi");
1598b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
1599e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1600e35fdd936d133bf8a48de140a3c666897588a05shiqian
1601e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1602e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello"));
1603e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1604e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"hello"));
1605e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hi"));
1606e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1607e35fdd936d133bf8a48de140a3c666897588a05shiqian
1608e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello");
1609e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1610e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1611e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1612e35fdd936d133bf8a48de140a3c666897588a05shiqian
1613e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1614e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str1(L"oabocdooeoo");
1615e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str2(L"OABOCDOOEOO");
1616e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m0 = StrCaseEq(str1);
1617e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0')));
1618e35fdd936d133bf8a48de140a3c666897588a05shiqian
1619e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[3] = str2[3] = L'\0';
1620e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m1 = StrCaseEq(str1);
1621e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(str2));
1622e35fdd936d133bf8a48de140a3c666897588a05shiqian
1623e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1624e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1625e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m2 = StrCaseEq(str1);
1626e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[9] = str2[9] = L'\0';
1627e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(str2));
1628e35fdd936d133bf8a48de140a3c666897588a05shiqian
1629e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m3 = StrCaseEq(str1);
1630e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(str2));
1631e35fdd936d133bf8a48de140a3c666897588a05shiqian
1632e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2 + L"x"));
1633e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2.append(1, L'\0');
1634e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2));
1635e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9)));
1636e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1637e35fdd936d133bf8a48de140a3c666897588a05shiqian
1638e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, CanDescribeSelf) {
1639e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m = StrCaseEq(L"Hi");
1640e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1641e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1642e35fdd936d133bf8a48de140a3c666897588a05shiqian
1643e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1644e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1645e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hi"));
1646e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1647e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1648e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1649e35fdd936d133bf8a48de140a3c666897588a05shiqian
1650e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello"));
1651e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L""));
1652e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1653e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1654e35fdd936d133bf8a48de140a3c666897588a05shiqian
1655e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, CanDescribeSelf) {
1656e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
1657b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
1658e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1659e35fdd936d133bf8a48de140a3c666897588a05shiqian
1660e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values.
1661e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForStringClasses) {
1662e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher< ::std::wstring> m1 = HasSubstr(L"foo");
1663e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food.")));
1664e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo")));
1665e35fdd936d133bf8a48de140a3c666897588a05shiqian
1666e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo");
1667e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food.")));
1668e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo")));
1669e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1670e35fdd936d133bf8a48de140a3c666897588a05shiqian
1671e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values.
1672e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForCStrings) {
1673e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1674e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1675e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1676e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1677e35fdd936d133bf8a48de140a3c666897588a05shiqian
1678e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1679e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"I love food."));
1680e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"tofo"));
1681e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(NULL));
1682e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1683e35fdd936d133bf8a48de140a3c666897588a05shiqian
1684e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly.
1685e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, CanDescribeSelf) {
1686e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m = HasSubstr(L"foo\n\"");
1687e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1688e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1689e35fdd936d133bf8a48de140a3c666897588a05shiqian
1690e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s).
1691e35fdd936d133bf8a48de140a3c666897588a05shiqian
1692e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) {
1693e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L""));
1694e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1695e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1696e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1697e35fdd936d133bf8a48de140a3c666897588a05shiqian
1698e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi");
1699e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1700e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1701e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"High"));
1702e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"H"));
1703e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L" Hi"));
1704e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1705e35fdd936d133bf8a48de140a3c666897588a05shiqian
1706e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, CanDescribeSelf) {
1707e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring> m = StartsWith(L"Hi");
1708e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1709e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1710e35fdd936d133bf8a48de140a3c666897588a05shiqian
1711e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s).
1712e35fdd936d133bf8a48de140a3c666897588a05shiqian
1713e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) {
1714e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = EndsWith(L"");
1715e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1716e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1717e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1718e35fdd936d133bf8a48de140a3c666897588a05shiqian
1719e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi"));
1720e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1721e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1722e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Super Hi"));
1723e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"i"));
1724e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi "));
1725e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1726e35fdd936d133bf8a48de140a3c666897588a05shiqian
1727e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, CanDescribeSelf) {
1728e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring> m = EndsWith(L"Hi");
1729e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1730e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1731e35fdd936d133bf8a48de140a3c666897588a05shiqian
1732e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif  // GTEST_HAS_STD_WSTRING
1733e35fdd936d133bf8a48de140a3c666897588a05shiqian
1734e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_GLOBAL_WSTRING
1735e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, MatchesEqual) {
1736e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello"));
1737e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1738e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1739e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1740e35fdd936d133bf8a48de140a3c666897588a05shiqian
1741e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m2 = StrEq(L"Hello");
1742e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hello"));
1743e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1744e35fdd936d133bf8a48de140a3c666897588a05shiqian
1745e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1746e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1747e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1748e35fdd936d133bf8a48de140a3c666897588a05shiqian
1749e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str(L"01204500800");
1750e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1751e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m4 = StrEq(str);
1752e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m4.Matches(str));
1753e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1754e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m5 = StrEq(str);
1755e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m5.Matches(str));
1756e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1757e35fdd936d133bf8a48de140a3c666897588a05shiqian
1758e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, CanDescribeSelf) {
1759aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev  Matcher< ::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v");
1760aa43220fe5d34f7283f3a55e11dda5e3f25e5632vladlosev  EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
1761e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m));
1762e35fdd936d133bf8a48de140a3c666897588a05shiqian
1763e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1764e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1765e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m2));
1766e35fdd936d133bf8a48de140a3c666897588a05shiqian
1767e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str(L"01204500800");
1768e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1769e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m4 = StrEq(str);
1770e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1771e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1772e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m5 = StrEq(str);
1773e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1774e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1775e35fdd936d133bf8a48de140a3c666897588a05shiqian
1776e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, MatchesUnequalString) {
1777e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hello");
1778e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L""));
1779e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1780e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1781e35fdd936d133bf8a48de140a3c666897588a05shiqian
1782e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello"));
1783e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1784e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1785e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1786e35fdd936d133bf8a48de140a3c666897588a05shiqian
1787e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, CanDescribeSelf) {
1788e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hi");
1789b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
1790e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1791e35fdd936d133bf8a48de140a3c666897588a05shiqian
1792e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1793e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello"));
1794e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1795e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"hello"));
1796e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hi"));
1797e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1798e35fdd936d133bf8a48de140a3c666897588a05shiqian
1799e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello");
1800e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1801e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1802e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1803e35fdd936d133bf8a48de140a3c666897588a05shiqian
1804e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1805e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str1(L"oabocdooeoo");
1806e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str2(L"OABOCDOOEOO");
1807e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m0 = StrCaseEq(str1);
1808e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0')));
1809e35fdd936d133bf8a48de140a3c666897588a05shiqian
1810e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[3] = str2[3] = L'\0';
1811e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m1 = StrCaseEq(str1);
1812e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(str2));
1813e35fdd936d133bf8a48de140a3c666897588a05shiqian
1814e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1815e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1816e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m2 = StrCaseEq(str1);
1817e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[9] = str2[9] = L'\0';
1818e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(str2));
1819e35fdd936d133bf8a48de140a3c666897588a05shiqian
1820e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m3 = StrCaseEq(str1);
1821e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(str2));
1822e35fdd936d133bf8a48de140a3c666897588a05shiqian
1823e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2 + L"x"));
1824e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2.append(1, L'\0');
1825e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2));
1826e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9)));
1827e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1828e35fdd936d133bf8a48de140a3c666897588a05shiqian
1829e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, CanDescribeSelf) {
1830e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m = StrCaseEq(L"Hi");
1831e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1832e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1833e35fdd936d133bf8a48de140a3c666897588a05shiqian
1834e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1835e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1836e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hi"));
1837e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1838e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1839e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1840e35fdd936d133bf8a48de140a3c666897588a05shiqian
1841e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello"));
1842e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L""));
1843e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1844e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1845e35fdd936d133bf8a48de140a3c666897588a05shiqian
1846e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, CanDescribeSelf) {
1847e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
1848b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
1849e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1850e35fdd936d133bf8a48de140a3c666897588a05shiqian
1851e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values.
1852e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForStringClasses) {
1853e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher< ::wstring> m1 = HasSubstr(L"foo");
1854e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(::wstring(L"I love food.")));
1855e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(::wstring(L"tofo")));
1856e35fdd936d133bf8a48de140a3c666897588a05shiqian
1857e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::wstring&> m2 = HasSubstr(L"foo");
1858e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(::wstring(L"I love food.")));
1859e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(::wstring(L"tofo")));
1860e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1861e35fdd936d133bf8a48de140a3c666897588a05shiqian
1862e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values.
1863e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForCStrings) {
1864e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1865e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1866e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1867e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1868e35fdd936d133bf8a48de140a3c666897588a05shiqian
1869e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1870e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"I love food."));
1871e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"tofo"));
1872e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(NULL));
1873e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1874e35fdd936d133bf8a48de140a3c666897588a05shiqian
1875e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly.
1876e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, CanDescribeSelf) {
1877e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m = HasSubstr(L"foo\n\"");
1878e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1879e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1880e35fdd936d133bf8a48de140a3c666897588a05shiqian
1881e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s).
1882e35fdd936d133bf8a48de140a3c666897588a05shiqian
1883e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) {
1884e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L""));
1885e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1886e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1887e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1888e35fdd936d133bf8a48de140a3c666897588a05shiqian
1889e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::wstring&> m2 = StartsWith(L"Hi");
1890e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1891e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1892e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"High"));
1893e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"H"));
1894e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L" Hi"));
1895e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1896e35fdd936d133bf8a48de140a3c666897588a05shiqian
1897e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, CanDescribeSelf) {
1898e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring> m = StartsWith(L"Hi");
1899e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1900e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1901e35fdd936d133bf8a48de140a3c666897588a05shiqian
1902e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s).
1903e35fdd936d133bf8a48de140a3c666897588a05shiqian
1904e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) {
1905e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = EndsWith(L"");
1906e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1907e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1908e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1909e35fdd936d133bf8a48de140a3c666897588a05shiqian
1910e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi"));
1911e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1912e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1913e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Super Hi"));
1914e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"i"));
1915e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi "));
1916e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1917e35fdd936d133bf8a48de140a3c666897588a05shiqian
1918e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, CanDescribeSelf) {
1919e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring> m = EndsWith(L"Hi");
1920e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1921e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1922e35fdd936d133bf8a48de140a3c666897588a05shiqian
1923e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif  // GTEST_HAS_GLOBAL_WSTRING
1924e35fdd936d133bf8a48de140a3c666897588a05shiqian
1925e35fdd936d133bf8a48de140a3c666897588a05shiqian
1926bd0188320de5aab1b09718e2c466387099d43cfbkosaktypedef ::testing::tuple<long, int> Tuple2;  // NOLINT
1927e35fdd936d133bf8a48de140a3c666897588a05shiqian
1928e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() matches a 2-tuple where the first field == the
1929e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1930e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, MatchesEqualArguments) {
1931e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Eq();
1932e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1933e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1934e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1935e35fdd936d133bf8a48de140a3c666897588a05shiqian
1936e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() describes itself properly.
1937e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, CanDescribeSelf) {
1938e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Eq();
1939ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("are an equal pair", Describe(m));
1940e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1941e35fdd936d133bf8a48de140a3c666897588a05shiqian
1942e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() matches a 2-tuple where the first field >= the
1943e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1944e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, MatchesGreaterThanOrEqualArguments) {
1945e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ge();
1946e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1947e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1948e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1949e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1950e35fdd936d133bf8a48de140a3c666897588a05shiqian
1951e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() describes itself properly.
1952e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, CanDescribeSelf) {
1953e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ge();
1954ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("are a pair where the first >= the second", Describe(m));
1955e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1956e35fdd936d133bf8a48de140a3c666897588a05shiqian
1957e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() matches a 2-tuple where the first field > the
1958e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1959e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, MatchesGreaterThanArguments) {
1960e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Gt();
1961e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1962e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1963e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1964e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1965e35fdd936d133bf8a48de140a3c666897588a05shiqian
1966e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() describes itself properly.
1967e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, CanDescribeSelf) {
1968e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Gt();
1969ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("are a pair where the first > the second", Describe(m));
1970e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1971e35fdd936d133bf8a48de140a3c666897588a05shiqian
1972e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() matches a 2-tuple where the first field <= the
1973e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1974e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, MatchesLessThanOrEqualArguments) {
1975e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Le();
1976e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1977e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1978e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1979e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1980e35fdd936d133bf8a48de140a3c666897588a05shiqian
1981e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() describes itself properly.
1982e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, CanDescribeSelf) {
1983e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Le();
1984ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("are a pair where the first <= the second", Describe(m));
1985e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1986e35fdd936d133bf8a48de140a3c666897588a05shiqian
1987e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() matches a 2-tuple where the first field < the
1988e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1989e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, MatchesLessThanArguments) {
1990e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Lt();
1991e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1992e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1993e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1994e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1995e35fdd936d133bf8a48de140a3c666897588a05shiqian
1996e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() describes itself properly.
1997e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, CanDescribeSelf) {
1998e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Lt();
1999ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("are a pair where the first < the second", Describe(m));
2000e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2001e35fdd936d133bf8a48de140a3c666897588a05shiqian
2002e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() matches a 2-tuple where the first field != the
2003e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
2004e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, MatchesUnequalArguments) {
2005e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ne();
2006e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
2007e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
2008e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
2009e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2010e35fdd936d133bf8a48de140a3c666897588a05shiqian
2011e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() describes itself properly.
2012e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, CanDescribeSelf) {
2013e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ne();
2014ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("are an unequal pair", Describe(m));
2015e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2016e35fdd936d133bf8a48de140a3c666897588a05shiqian
2017e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) matches any value that doesn't match m.
2018e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, NegatesMatcher) {
2019e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
2020e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Not(Eq(2));
2021e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
2022e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
2023e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2024e35fdd936d133bf8a48de140a3c666897588a05shiqian
2025e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) describes itself properly.
2026e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, CanDescribeSelf) {
2027e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Not(Eq(5));
2028b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to 5", Describe(m));
2029e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2030e35fdd936d133bf8a48de140a3c666897588a05shiqian
203118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the Not matcher.
203218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {
203318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // greater_than_5 is a monomorphic matcher.
203418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> greater_than_5 = Gt(5);
203518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
203618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m = Not(greater_than_5);
203718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = Not(greater_than_5);
203818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m3 = Not(m);
203918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
204018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
204102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan// Helper to allow easy testing of AllOf matchers with num parameters.
204202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wanvoid AllOfMatches(int num, const Matcher<int>& m) {
204302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  SCOPED_TRACE(Describe(m));
204402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  EXPECT_TRUE(m.Matches(0));
204502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  for (int i = 1; i <= num; ++i) {
204602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan    EXPECT_FALSE(m.Matches(i));
204702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  }
204802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  EXPECT_TRUE(m.Matches(num + 1));
204902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan}
205002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan
2051e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) matches any value that matches all of
2052e35fdd936d133bf8a48de140a3c666897588a05shiqian// the given matchers.
2053e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, MatchesWhenAllMatch) {
2054e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
2055e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Le(2), Ge(1));
2056e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2057e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2));
2058e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
2059e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(3));
2060e35fdd936d133bf8a48de140a3c666897588a05shiqian
2061e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2));
2062e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
2063e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
2064e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1));
2065e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
2066e35fdd936d133bf8a48de140a3c666897588a05shiqian
2067e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
2068e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(4));
2069e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(3));
2070e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
2071e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1));
2072e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
2073e35fdd936d133bf8a48de140a3c666897588a05shiqian
2074e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
2075e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(0));
2076e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2077e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(3));
207802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan
207902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // The following tests for varying number of sub-matchers. Due to the way
208002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // the sub-matchers are handled it is enough to test every sub-matcher once
208102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // with sub-matchers using the same matcher type. Varying matcher types are
208202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // checked for above.
208302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(2, AllOf(Ne(1), Ne(2)));
208402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3)));
208502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4)));
208602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5)));
208702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6)));
208802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7)));
208902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
209002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan                        Ne(8)));
209102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7),
209202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan                        Ne(8), Ne(9)));
209302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
209402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan                         Ne(9), Ne(10)));
2095e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2096e35fdd936d133bf8a48de140a3c666897588a05shiqian
2097616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#if GTEST_LANG_CXX11
2098616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Tests the variadic version of the AllOfMatcher.
2099616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST(AllOfTest, VariadicMatchesWhenAllMatch) {
2100616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // Make sure AllOf is defined in the right namespace and does not depend on
2101616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // ADL.
2102616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  ::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2103616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2104616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(9), Ne(10), Ne(11));
2105616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11))))))))))"));
2106616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  AllOfMatches(11, m);
2107616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8),
2108616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15),
2109616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(16), Ne(17), Ne(18), Ne(19), Ne(20), Ne(21), Ne(22),
2110616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(23), Ne(24), Ne(25), Ne(26), Ne(27), Ne(28), Ne(29),
2111616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(30), Ne(31), Ne(32), Ne(33), Ne(34), Ne(35), Ne(36),
2112616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(37), Ne(38), Ne(39), Ne(40), Ne(41), Ne(42), Ne(43),
2113616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49),
2114616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         Ne(50)));
2115616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
2116616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2117616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#endif  // GTEST_LANG_CXX11
2118616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2119e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) describes itself properly.
2120e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, CanDescribeSelf) {
2121e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
2122e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Le(2), Ge(1));
2123b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m));
2124e35fdd936d133bf8a48de140a3c666897588a05shiqian
2125e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2));
2126b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is > 0) and "
2127b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 1) and "
2128b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't equal to 2))",
2129e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2130e35fdd936d133bf8a48de140a3c666897588a05shiqian
2131e35fdd936d133bf8a48de140a3c666897588a05shiqian
2132e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
213379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((is > 0) and "
213479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't equal to 1)) and "
2135b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 2) and "
213679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't equal to 3))",
2137e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2138e35fdd936d133bf8a48de140a3c666897588a05shiqian
2139e35fdd936d133bf8a48de140a3c666897588a05shiqian
2140e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
214179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((is >= 0) and "
214279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is < 10)) and "
2143b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 3) and "
2144b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 5) and "
214579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't equal to 7)))",
2146b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Describe(m));
2147b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
2148b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2149b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// Tests that AllOf(m1, ..., mn) describes its negation properly.
2150b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AllOfTest, CanDescribeNegation) {
2151b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
2152b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Le(2), Ge(1));
2153b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't <= 2) or "
2154b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't >= 1)",
2155b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2156b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2157b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Gt(0), Ne(1), Ne(2));
2158b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't > 0) or "
2159b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 1) or "
2160b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(is equal to 2))",
2161b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2162b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2163b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2164b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
216579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((isn't > 0) or "
216679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is equal to 1)) or "
2167b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 2) or "
216879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is equal to 3))",
2169b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2170b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2171b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2172b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
217379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((isn't >= 0) or "
217479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't < 10)) or "
2175b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 3) or "
2176b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 5) or "
217779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is equal to 7)))",
2178b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2179e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2180e35fdd936d133bf8a48de140a3c666897588a05shiqian
218118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AllOf matcher.
218218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
218318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // greater_than_5 and less_than_10 are monomorphic matchers.
218418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> greater_than_5 = Gt(5);
218518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> less_than_10 = Lt(10);
218618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
218718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m = AllOf(greater_than_5, less_than_10);
218818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);
218918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m3 = AllOf(greater_than_5, m2);
219018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
219118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // Tests that BothOf works when composing itself.
219218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);
219318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);
219418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
219518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
2196b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AllOfTest, ExplainsResult) {
2197b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
2198b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2199b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  Both matchers need to explain.  The second
2200b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't give an explanation, so only the first matcher's
2201b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explanation is printed.
2202b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), Lt(30));
2203b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 15 more than 10", Explain(m, 25));
2204b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2205b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  Both matchers need to explain.
2206b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20));
2207b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20",
2208b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 30));
2209b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2210b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  All matchers need to explain.  The second
2211b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't given an explanation.
2212b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20));
2213b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20",
2214b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 25));
2215b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2216b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  All matchers need to explain.
2217b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2218b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, "
2219b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and which is 10 more than 30",
2220b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 40));
2221b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2222b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  The first matcher, which failed, needs to
2223b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2224b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20));
2225b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2226b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2227b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  The second matcher, which failed, needs to
2228b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.  Since it doesn't given an explanation, nothing is
2229b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // printed.
2230b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), Lt(30));
2231b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("", Explain(m, 40));
2232b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2233b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  The second matcher, which failed, needs to
2234b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2235b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20));
2236b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 20", Explain(m, 15));
2237b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
2238b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
223902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan// Helper to allow easy testing of AnyOf matchers with num parameters.
224002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wanvoid AnyOfMatches(int num, const Matcher<int>& m) {
224102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  SCOPED_TRACE(Describe(m));
224202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  EXPECT_FALSE(m.Matches(0));
224302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  for (int i = 1; i <= num; ++i) {
224402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan    EXPECT_TRUE(m.Matches(i));
224502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  }
224602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  EXPECT_FALSE(m.Matches(num + 1));
224702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan}
224802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan
2249e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) matches any value that matches at
2250e35fdd936d133bf8a48de140a3c666897588a05shiqian// least one of the given matchers.
2251e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, MatchesWhenAnyMatches) {
2252e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
2253e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(1), Ge(3));
2254e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2255e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(4));
2256e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
2257e35fdd936d133bf8a48de140a3c666897588a05shiqian
2258e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2));
2259e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(-1));
2260e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2261e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2));
2262e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
2263e35fdd936d133bf8a48de140a3c666897588a05shiqian
2264e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2265e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(-1));
2266e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2267e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2));
2268e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
2269e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
2270e35fdd936d133bf8a48de140a3c666897588a05shiqian
2271e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2272e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(0));
2273e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(11));
2274e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
2275e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
227602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan
227702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // The following tests for varying number of sub-matchers. Due to the way
227802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // the sub-matchers are handled it is enough to test every sub-matcher once
227902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // with sub-matchers using the same matcher type. Varying matcher types are
228002c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  // checked for above.
228102c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(2, AnyOf(1, 2));
228202c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(3, AnyOf(1, 2, 3));
228302c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(4, AnyOf(1, 2, 3, 4));
228402c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5));
228502c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6));
228602c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7));
228702c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8));
228802c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9));
228902c1505ebfaadbc34b4cb85546796521d6f0e634zhanyong.wan  AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
2290e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2291e35fdd936d133bf8a48de140a3c666897588a05shiqian
2292616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#if GTEST_LANG_CXX11
2293616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Tests the variadic version of the AnyOfMatcher.
2294616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST(AnyOfTest, VariadicMatchesWhenAnyMatches) {
2295616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // Also make sure AnyOf is defined in the right namespace and does not depend
2296616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // on ADL.
2297616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
2298616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2299616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11))))))))))"));
2300616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  AnyOfMatches(11, m);
2301616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
2302616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
2303616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
2304616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
2305616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan                         41, 42, 43, 44, 45, 46, 47, 48, 49, 50));
2306616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
2307616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2308616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan#endif  // GTEST_LANG_CXX11
2309616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2310e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) describes itself properly.
2311e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, CanDescribeSelf) {
2312e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
2313e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(1), Ge(3));
2314b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is <= 1) or (is >= 3)",
2315e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2316e35fdd936d133bf8a48de140a3c666897588a05shiqian
2317e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2));
2318b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is < 0) or "
2319e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 1) or (is equal to 2))",
2320e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2321e35fdd936d133bf8a48de140a3c666897588a05shiqian
2322e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
232379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((is < 0) or "
232479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is equal to 1)) or "
2325e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 2) or "
232679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is equal to 3))",
2327e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2328e35fdd936d133bf8a48de140a3c666897588a05shiqian
2329e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(0), Gt(10), 3, 5, 7);
233079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((is <= 0) or "
233179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is > 10)) or "
2332e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 3) or "
2333e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 5) or "
233479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(is equal to 7)))",
2335e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2336e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2337e35fdd936d133bf8a48de140a3c666897588a05shiqian
2338b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// Tests that AnyOf(m1, ..., mn) describes its negation properly.
2339b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AnyOfTest, CanDescribeNegation) {
2340b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
2341b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Le(1), Ge(3));
2342b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't <= 1) and (isn't >= 3)",
2343b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2344b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2345b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Lt(0), Eq(1), Eq(2));
2346b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't < 0) and "
2347b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 1) and (isn't equal to 2))",
2348b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2349b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2350b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
235179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((isn't < 0) and "
235279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't equal to 1)) and "
2353b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 2) and "
235479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't equal to 3))",
2355b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2356b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2357b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Le(0), Gt(10), 3, 5, 7);
235879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm  EXPECT_EQ("((isn't <= 0) and "
235979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't > 10)) and "
2360b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 3) and "
2361b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 5) and "
236279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm            "(isn't equal to 7)))",
2363b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2364b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
2365b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
236618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AnyOf matcher.
236718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
236818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // greater_than_5 and less_than_10 are monomorphic matchers.
236918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> greater_than_5 = Gt(5);
237018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> less_than_10 = Lt(10);
237118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
237218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);
237318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);
237418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m3 = AnyOf(greater_than_5, m2);
237518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
237618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // Tests that EitherOf works when composing itself.
237718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);
237818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);
237918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
238018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
2381b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AnyOfTest, ExplainsResult) {
2382b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
2383b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2384b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  Both matchers need to explain.  The second
2385b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't give an explanation, so only the first matcher's
2386b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explanation is printed.
2387b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), Lt(0));
2388b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2389b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2390b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  Both matchers need to explain.
2391b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), GreaterThan(20));
2392b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20",
2393b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 5));
2394b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2395b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  All matchers need to explain.  The second
2396b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't given an explanation.
2397b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30));
2398b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30",
2399b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 5));
2400b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2401b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  All matchers need to explain.
2402b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2403b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, "
2404b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and which is 25 less than 30",
2405b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 5));
2406b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2407b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  The first matcher, which succeeded, needs to
2408b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2409b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), GreaterThan(20));
2410b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 more than 10", Explain(m, 15));
2411b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2412b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  The second matcher, which succeeded, needs to
2413b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.  Since it doesn't given an explanation, nothing is
2414b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // printed.
2415b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), Lt(30));
2416b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("", Explain(m, 0));
2417b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2418b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  The second matcher, which succeeded, needs to
2419b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2420b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(30), GreaterThan(20));
2421b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 more than 20", Explain(m, 25));
2422b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
2423b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2424e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following predicate function and predicate functor are for
2425e35fdd936d133bf8a48de140a3c666897588a05shiqian// testing the Truly(predicate) matcher.
2426e35fdd936d133bf8a48de140a3c666897588a05shiqian
2427e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns non-zero if the input is positive.  Note that the return
2428e35fdd936d133bf8a48de140a3c666897588a05shiqian// type of this function is not bool.  It's OK as Truly() accepts any
2429e35fdd936d133bf8a48de140a3c666897588a05shiqian// unary function or functor whose return type can be implicitly
2430e35fdd936d133bf8a48de140a3c666897588a05shiqian// converted to bool.
2431e35fdd936d133bf8a48de140a3c666897588a05shiqianint IsPositive(double x) {
2432e35fdd936d133bf8a48de140a3c666897588a05shiqian  return x > 0 ? 1 : 0;
2433e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2434e35fdd936d133bf8a48de140a3c666897588a05shiqian
2435e35fdd936d133bf8a48de140a3c666897588a05shiqian// This functor returns true if the input is greater than the given
2436e35fdd936d133bf8a48de140a3c666897588a05shiqian// number.
2437e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IsGreaterThan {
2438e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
2439e35fdd936d133bf8a48de140a3c666897588a05shiqian  explicit IsGreaterThan(int threshold) : threshold_(threshold) {}
2440e35fdd936d133bf8a48de140a3c666897588a05shiqian
2441e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool operator()(int n) const { return n > threshold_; }
244232de5f53763125925e078498250f7e73a88de9edzhanyong.wan
2443e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
244432de5f53763125925e078498250f7e73a88de9edzhanyong.wan  int threshold_;
2445e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2446e35fdd936d133bf8a48de140a3c666897588a05shiqian
2447e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing Truly().
2448e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int foo = 0;
2449e35fdd936d133bf8a48de140a3c666897588a05shiqian
2450e35fdd936d133bf8a48de140a3c666897588a05shiqian// This predicate returns true iff the argument references foo and has
2451e35fdd936d133bf8a48de140a3c666897588a05shiqian// a zero value.
2452e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ReferencesFooAndIsZero(const int& n) {
2453e35fdd936d133bf8a48de140a3c666897588a05shiqian  return (&n == &foo) && (n == 0);
2454e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2455e35fdd936d133bf8a48de140a3c666897588a05shiqian
2456e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) matches what satisfies the given
2457e35fdd936d133bf8a48de140a3c666897588a05shiqian// predicate.
2458e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, MatchesWhatSatisfiesThePredicate) {
2459e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = Truly(IsPositive);
2460e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2.0));
2461e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(-1.5));
2462e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2463e35fdd936d133bf8a48de140a3c666897588a05shiqian
2464e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate_functor) works too.
2465e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanBeUsedWithFunctor) {
2466e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Truly(IsGreaterThan(5));
2467e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(6));
2468e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(4));
2469e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2470e35fdd936d133bf8a48de140a3c666897588a05shiqian
24718d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// A class that can be implicitly converted to bool.
24728d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wanclass ConvertibleToBool {
24738d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan public:
24748d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan  explicit ConvertibleToBool(int number) : number_(number) {}
24758d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan  operator bool() const { return number_ != 0; }
24768d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan
24778d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan private:
24788d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan  int number_;
24798d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan};
24808d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan
24818d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wanConvertibleToBool IsNotZero(int number) {
24828d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan  return ConvertibleToBool(number);
24838d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan}
24848d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan
24858d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// Tests that the predicate used in Truly() may return a class that's
24868d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// implicitly convertible to bool, even when the class has no
24878d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan// operator!().
24888d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wanTEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) {
24898d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan  Matcher<int> m = Truly(IsNotZero);
24908d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan  EXPECT_TRUE(m.Matches(1));
24918d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan  EXPECT_FALSE(m.Matches(0));
24928d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan}
24938d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan
2494e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) can describe itself properly.
2495e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanDescribeSelf) {
2496e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = Truly(IsPositive);
2497e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("satisfies the given predicate",
2498e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2499e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2500e35fdd936d133bf8a48de140a3c666897588a05shiqian
2501e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) works when the matcher takes its
2502e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument by reference.
2503e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, WorksForByRefArguments) {
2504e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m = Truly(ReferencesFooAndIsZero);
2505e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(foo));
2506e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
2507e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(n));
2508e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2509e35fdd936d133bf8a48de140a3c666897588a05shiqian
2510e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) is a predicate satisfied by whatever that
2511e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches matcher m.
2512e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) {
2513e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(Matches(Ge(0))(1));
2514e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(Matches(Eq('a'))('b'));
2515e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2516e35fdd936d133bf8a48de140a3c666897588a05shiqian
2517e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) works when the matcher takes its argument by
2518e35fdd936d133bf8a48de140a3c666897588a05shiqian// reference.
2519e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksOnByRefArguments) {
2520e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
2521e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n));
2522e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(Matches(Ref(m))(n));
2523e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2524e35fdd936d133bf8a48de140a3c666897588a05shiqian
2525e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a Matcher on non-reference type can be used in
2526e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches().
2527e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksWithMatcherOnNonRefType) {
2528e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> eq5 = Eq(5);
2529e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(Matches(eq5)(5));
2530e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(Matches(eq5)(2));
2531e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2532e35fdd936d133bf8a48de140a3c666897588a05shiqian
2533b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Tests Value(value, matcher).  Since Value() is a simple wrapper for
2534b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Matches(), which has been tested already, we don't spend a lot of
2535b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// effort on testing Value().
2536b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithPolymorphicMatcher) {
2537b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_TRUE(Value("hi", StartsWith("h")));
2538b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_FALSE(Value(5, Gt(10)));
2539b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
2540b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
2541b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithMonomorphicMatcher) {
2542b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const Matcher<int> is_zero = Eq(0);
2543b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_TRUE(Value(0, is_zero));
2544b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_FALSE(Value('a', is_zero));
2545b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
2546b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  int n = 0;
2547b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const Matcher<const int&> ref_n = Ref(n);
2548b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_TRUE(Value(n, ref_n));
2549b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_FALSE(Value(1, ref_n));
2550b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
2551b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
2552a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) {
255334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener1;
2554a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1));
255534b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("% 2 == 0", listener1.str());
255634b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
255734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener2;
2558a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2));
255934b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("", listener2.str());
256034b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan}
256134b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
2562a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {
256334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  const Matcher<int> is_even = PolymorphicIsEven();
256434b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener1;
2565a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1));
256634b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("% 2 == 0", listener1.str());
256734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
256834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  const Matcher<const double&> is_zero = Eq(0);
256934b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener2;
2570a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2));
257134b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("", listener2.str());
257234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan}
257334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
2574a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanMATCHER_P(Really, inner_matcher, "") {
2575a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  return ExplainMatchResult(inner_matcher, arg, result_listener);
2576a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
2577a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
2578a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksInsideMATCHER) {
2579a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_THAT(0, Really(Eq(0)));
2580a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
2581a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
2582bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForTuple) {
2583bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt()));
2584bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt())));
2585bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}
2586bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2587bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForNonTuple) {
2588bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT(42, AllArgs(Gt(0)));
2589bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT('a', Not(AllArgs(Eq('b'))));
2590bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}
2591bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2592bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanclass AllArgsHelper {
2593bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan public:
259432de5f53763125925e078498250f7e73a88de9edzhanyong.wan  AllArgsHelper() {}
259532de5f53763125925e078498250f7e73a88de9edzhanyong.wan
2596bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  MOCK_METHOD2(Helper, int(char x, int y));
259732de5f53763125925e078498250f7e73a88de9edzhanyong.wan
259832de5f53763125925e078498250f7e73a88de9edzhanyong.wan private:
259932de5f53763125925e078498250f7e73a88de9edzhanyong.wan  GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper);
2600bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan};
2601bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2602bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksInWithClause) {
2603bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  AllArgsHelper helper;
2604bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  ON_CALL(helper, Helper(_, _))
2605bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .With(AllArgs(Lt()))
2606bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .WillByDefault(Return(1));
2607bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_CALL(helper, Helper(_, _));
2608bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_CALL(helper, Helper(_, _))
2609bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .With(AllArgs(Gt()))
2610bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .WillOnce(Return(2));
2611bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2612bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_EQ(1, helper.Helper('\1', 2));
2613bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_EQ(2, helper.Helper('a', 1));
2614bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}
2615bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2616e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2617e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches the matcher.
2618e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {
2619e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT(5, Ge(2)) << "This should succeed.";
2620e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT("Foo", EndsWith("oo"));
2621e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too.";
2622e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_THAT("Hello", StartsWith("Hell"));
2623e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2624e35fdd936d133bf8a48de140a3c666897588a05shiqian
2625e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2626e35fdd936d133bf8a48de140a3c666897588a05shiqian// doesn't match the matcher.
2627e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {
2628e35fdd936d133bf8a48de140a3c666897588a05shiqian  // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(),
2629e35fdd936d133bf8a48de140a3c666897588a05shiqian  // which cannot reference auto variables.
2630736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  static unsigned short n;  // NOLINT
2631e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 5;
26322b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
26332b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // VC++ prior to version 8.0 SP1 has a bug where it will not see any
26342b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // functions declared in the namespace scope from within nested classes.
26352b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all
26362b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // namespace-level functions invoked inside them need to be explicitly
26372b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // resolved.
26382b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)),
2639e35fdd936d133bf8a48de140a3c666897588a05shiqian                       "Value of: n\n"
2640b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                       "Expected: is > 10\n"
2641736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan                       "  Actual: 5" + OfType("unsigned short"));
2642e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 0;
26432b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_NONFATAL_FAILURE(
26442b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan      EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))),
26452b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan      "Value of: n\n"
2646b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan      "Expected: (is <= 7) and (is >= 5)\n"
2647736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      "  Actual: 0" + OfType("unsigned short"));
2648e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2649e35fdd936d133bf8a48de140a3c666897588a05shiqian
2650e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument
2651e35fdd936d133bf8a48de140a3c666897588a05shiqian// has a reference type.
2652e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForByRefArguments) {
2653e35fdd936d133bf8a48de140a3c666897588a05shiqian  // We use a static variable here as EXPECT_FATAL_FAILURE() cannot
2654e35fdd936d133bf8a48de140a3c666897588a05shiqian  // reference auto variables.
2655e35fdd936d133bf8a48de140a3c666897588a05shiqian  static int n;
2656e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 0;
2657e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_THAT(n, AllOf(Le(7), Ref(n)));
26582b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
2659e35fdd936d133bf8a48de140a3c666897588a05shiqian                       "Value of: n\n"
2660e35fdd936d133bf8a48de140a3c666897588a05shiqian                       "Expected: does not reference the variable @");
2661e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests the "Actual" part.
26622b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
2663736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan                       "Actual: 0" + OfType("int") + ", which is located @");
2664e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2665e35fdd936d133bf8a48de140a3c666897588a05shiqian
266695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if !GTEST_OS_SYMBIAN
2667e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is
2668e35fdd936d133bf8a48de140a3c666897588a05shiqian// monomorphic.
266995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan
267095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's
267195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// Symbian compiler: it tries to compile
267295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// template<T, U> class MatcherCastImpl { ...
2673db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan//   virtual bool MatchAndExplain(T x, ...) const {
2674db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan//     return source_matcher_.MatchAndExplain(static_cast<U>(x), ...);
267595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// with U == string and T == const char*
267695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... )
267795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// the compiler silently crashes with no output.
267895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x)
267995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// the code compiles but the converted string is bogus.
2680e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) {
2681e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> starts_with_he = StartsWith("he");
2682e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT("hello", starts_with_he);
2683e35fdd936d133bf8a48de140a3c666897588a05shiqian
2684e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> ends_with_ok = EndsWith("ok");
2685e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT("book", ends_with_ok);
2686736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  const string bad = "bad";
2687736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok),
2688736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan                          "Value of: bad\n"
2689736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan                          "Expected: ends with \"ok\"\n"
2690736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan                          "  Actual: \"bad\"");
2691e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> is_greater_than_5 = Gt(5);
2692e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5),
2693e35fdd936d133bf8a48de140a3c666897588a05shiqian                          "Value of: 5\n"
2694b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                          "Expected: is > 5\n"
2695736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan                          "  Actual: 5" + OfType("int"));
2696e35fdd936d133bf8a48de140a3c666897588a05shiqian}
269795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif  // !GTEST_OS_SYMBIAN
2698e35fdd936d133bf8a48de140a3c666897588a05shiqian
2699e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests floating-point matchers.
2700e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2701e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FloatingPointTest : public testing::Test {
2702e35fdd936d133bf8a48de140a3c666897588a05shiqian protected:
270335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  typedef testing::internal::FloatingPoint<RawType> Floating;
2704e35fdd936d133bf8a48de140a3c666897588a05shiqian  typedef typename Floating::Bits Bits;
2705e35fdd936d133bf8a48de140a3c666897588a05shiqian
270635877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  FloatingPointTest()
270735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan      : max_ulps_(Floating::kMaxUlps),
270835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan        zero_bits_(Floating(0).bits()),
270935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan        one_bits_(Floating(1).bits()),
271035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan        infinity_bits_(Floating(Floating::Infinity()).bits()),
27114a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        close_to_positive_zero_(AsBits(zero_bits_ + max_ulps_/2)),
27124a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        close_to_negative_zero_(AsBits(zero_bits_ + max_ulps_ - max_ulps_/2)),
27134a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        further_from_negative_zero_(-AsBits(
2714cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai            zero_bits_ + max_ulps_ + 1 - max_ulps_/2)),
27154a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        close_to_one_(AsBits(one_bits_ + max_ulps_)),
27164a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        further_from_one_(AsBits(one_bits_ + max_ulps_ + 1)),
271735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan        infinity_(Floating::Infinity()),
27184a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        close_to_infinity_(AsBits(infinity_bits_ - max_ulps_)),
27194a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        further_from_infinity_(AsBits(infinity_bits_ - max_ulps_ - 1)),
272035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan        max_(Floating::Max()),
27214a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        nan1_(AsBits(Floating::kExponentBitMask | 1)),
27224a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai        nan2_(AsBits(Floating::kExponentBitMask | 200)) {
2723e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
2724e35fdd936d133bf8a48de140a3c666897588a05shiqian
2725e35fdd936d133bf8a48de140a3c666897588a05shiqian  void TestSize() {
2726e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_EQ(sizeof(RawType), sizeof(Bits));
2727e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
2728e35fdd936d133bf8a48de140a3c666897588a05shiqian
2729e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A battery of tests for FloatingEqMatcher::Matches.
2730e35fdd936d133bf8a48de140a3c666897588a05shiqian  // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
2731e35fdd936d133bf8a48de140a3c666897588a05shiqian  void TestMatches(
2732e35fdd936d133bf8a48de140a3c666897588a05shiqian      testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) {
2733e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m1 = matcher_maker(0.0);
2734e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m1.Matches(-0.0));
2735e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m1.Matches(close_to_positive_zero_));
2736e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m1.Matches(close_to_negative_zero_));
2737e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m1.Matches(1.0));
2738e35fdd936d133bf8a48de140a3c666897588a05shiqian
2739e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_);
2740e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m2.Matches(further_from_negative_zero_));
2741e35fdd936d133bf8a48de140a3c666897588a05shiqian
2742e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m3 = matcher_maker(1.0);
2743e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m3.Matches(close_to_one_));
2744e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m3.Matches(further_from_one_));
2745e35fdd936d133bf8a48de140a3c666897588a05shiqian
2746e35fdd936d133bf8a48de140a3c666897588a05shiqian    // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above.
2747e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m3.Matches(0.0));
2748e35fdd936d133bf8a48de140a3c666897588a05shiqian
2749e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m4 = matcher_maker(-infinity_);
2750e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m4.Matches(-close_to_infinity_));
2751e35fdd936d133bf8a48de140a3c666897588a05shiqian
2752e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m5 = matcher_maker(infinity_);
2753e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m5.Matches(close_to_infinity_));
2754e35fdd936d133bf8a48de140a3c666897588a05shiqian
2755e35fdd936d133bf8a48de140a3c666897588a05shiqian    // This is interesting as the representations of infinity_ and nan1_
2756e35fdd936d133bf8a48de140a3c666897588a05shiqian    // are only 1 DLP apart.
2757e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m5.Matches(nan1_));
2758e35fdd936d133bf8a48de140a3c666897588a05shiqian
2759e35fdd936d133bf8a48de140a3c666897588a05shiqian    // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2760e35fdd936d133bf8a48de140a3c666897588a05shiqian    // some cases.
2761e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<const RawType&> m6 = matcher_maker(0.0);
2762e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m6.Matches(-0.0));
2763e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m6.Matches(close_to_positive_zero_));
2764e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m6.Matches(1.0));
2765e35fdd936d133bf8a48de140a3c666897588a05shiqian
2766e35fdd936d133bf8a48de140a3c666897588a05shiqian    // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2767e35fdd936d133bf8a48de140a3c666897588a05shiqian    // cases.
2768e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType&> m7 = matcher_maker(0.0);
2769e35fdd936d133bf8a48de140a3c666897588a05shiqian    RawType x = 0.0;
2770e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m7.Matches(x));
2771e35fdd936d133bf8a48de140a3c666897588a05shiqian    x = 0.01f;
2772e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m7.Matches(x));
2773e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
2774e35fdd936d133bf8a48de140a3c666897588a05shiqian
2775e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Pre-calculated numbers to be used by the tests.
2776e35fdd936d133bf8a48de140a3c666897588a05shiqian
2777cbce23fb86705aff7f9f1294a295027d7ed674efMark Mentovai  const size_t max_ulps_;
2778e35fdd936d133bf8a48de140a3c666897588a05shiqian
277935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const Bits zero_bits_;  // The bits that represent 0.0.
278035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const Bits one_bits_;  // The bits that represent 1.0.
278135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const Bits infinity_bits_;  // The bits that represent +infinity.
2782e35fdd936d133bf8a48de140a3c666897588a05shiqian
278335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  // Some numbers close to 0.0.
278435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType close_to_positive_zero_;
278535877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType close_to_negative_zero_;
278635877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType further_from_negative_zero_;
2787e35fdd936d133bf8a48de140a3c666897588a05shiqian
278835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  // Some numbers close to 1.0.
278935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType close_to_one_;
279035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType further_from_one_;
2791e35fdd936d133bf8a48de140a3c666897588a05shiqian
279235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  // Some numbers close to +infinity.
279335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType infinity_;
279435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType close_to_infinity_;
279535877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType further_from_infinity_;
2796e35fdd936d133bf8a48de140a3c666897588a05shiqian
279735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  // Maximum representable value that's not infinity.
279835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType max_;
2799e35fdd936d133bf8a48de140a3c666897588a05shiqian
280035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  // Some NaNs.
280135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType nan1_;
280235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan  const RawType nan2_;
2803cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai
2804cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai private:
2805cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai  template <typename T>
28064a8e54401e497794054defc49fde7b208a8c8fabMark Mentovai  static RawType AsBits(T value) {
2807cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai    return Floating::ReinterpretBits(static_cast<Bits>(value));
2808cfe466a0a75333a1c12baa99c172b9036fc5ccf1Mark Mentovai  }
280935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan};
2810e35fdd936d133bf8a48de140a3c666897588a05shiqian
2811616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Tests floating-point matchers with fixed epsilons.
2812616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wantemplate <typename RawType>
2813616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanclass FloatingPointNearTest : public FloatingPointTest<RawType> {
2814616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan protected:
2815616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  typedef FloatingPointTest<RawType> ParentType;
2816616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2817616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon.
2818616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
2819616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  void TestNearMatches(
2820616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      testing::internal::FloatingEqMatcher<RawType>
2821616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan          (*matcher_maker)(RawType, RawType)) {
2822616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    Matcher<RawType> m1 = matcher_maker(0.0, 0.0);
2823616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m1.Matches(0.0));
2824616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m1.Matches(-0.0));
2825616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_));
2826616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_));
2827616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m1.Matches(1.0));
2828616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2829616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    Matcher<RawType> m2 = matcher_maker(0.0, 1.0);
2830616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m2.Matches(0.0));
2831616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m2.Matches(-0.0));
2832616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m2.Matches(1.0));
2833616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m2.Matches(-1.0));
2834616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m2.Matches(ParentType::close_to_one_));
2835616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_));
2836616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2837616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // Check that inf matches inf, regardless of the of the specified max
2838616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // absolute error.
2839616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0);
2840616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m3.Matches(ParentType::infinity_));
2841616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_));
2842616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m3.Matches(-ParentType::infinity_));
2843616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2844616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0);
2845616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m4.Matches(-ParentType::infinity_));
2846616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_));
2847616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m4.Matches(ParentType::infinity_));
2848616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2849616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // Test various overflow scenarios.
285035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_);
285135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_TRUE(m5.Matches(ParentType::max_));
285235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_FALSE(m5.Matches(-ParentType::max_));
285335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan
285435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_);
285535877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_FALSE(m6.Matches(ParentType::max_));
285635877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_TRUE(m6.Matches(-ParentType::max_));
285735877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan
285835877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0);
285935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_TRUE(m7.Matches(ParentType::max_));
286035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_FALSE(m7.Matches(-ParentType::max_));
286135877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan
286235877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0);
286335877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_FALSE(m8.Matches(ParentType::max_));
286435877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_TRUE(m8.Matches(-ParentType::max_));
2865616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2866616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // The difference between max() and -max() normally overflows to infinity,
2867616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // but it should still match if the max_abs_error is also infinity.
2868616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    Matcher<RawType> m9 = matcher_maker(
286935877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan        ParentType::max_, ParentType::infinity_);
287035877b7967315f34fb77edd5077e3bc59eba4072zhanyong.wan    EXPECT_TRUE(m8.Matches(-ParentType::max_));
2871616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2872616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2873616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // some cases.
2874616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0);
2875616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m10.Matches(-0.0));
2876616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_));
2877616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m10.Matches(ParentType::close_to_one_));
2878616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2879616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2880616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    // cases.
2881616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    Matcher<RawType&> m11 = matcher_maker(0.0, 1.0);
2882616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    RawType x = 0.0;
2883616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m11.Matches(x));
2884616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    x = 1.0f;
2885616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m11.Matches(x));
2886616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    x = -1.0f;
2887616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_TRUE(m11.Matches(x));
2888616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    x = 1.1f;
2889616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m11.Matches(x));
2890616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    x = -1.1f;
2891616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan    EXPECT_FALSE(m11.Matches(x));
2892616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  }
2893616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan};
2894616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2895e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing floats.
2896e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<float> FloatTest;
2897e35fdd936d133bf8a48de140a3c666897588a05shiqian
2898e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) {
2899e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&FloatEq);
2900e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2901e35fdd936d133bf8a48de140a3c666897588a05shiqian
2902e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) {
2903e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&NanSensitiveFloatEq);
2904e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2905e35fdd936d133bf8a48de140a3c666897588a05shiqian
2906e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCannotMatchNaN) {
2907e35fdd936d133bf8a48de140a3c666897588a05shiqian  // FloatEq never matches NaN.
2908e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m = FloatEq(nan1_);
2909e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan1_));
2910e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan2_));
2911e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
2912e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2913e35fdd936d133bf8a48de140a3c666897588a05shiqian
2914e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {
2915e35fdd936d133bf8a48de140a3c666897588a05shiqian  // NanSensitiveFloatEq will match NaN.
2916e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m = NanSensitiveFloatEq(nan1_);
2917e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan1_));
2918e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan2_));
2919e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
2920e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2921e35fdd936d133bf8a48de140a3c666897588a05shiqian
2922e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCanDescribeSelf) {
2923e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m1 = FloatEq(2.0f);
2924e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
2925b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2926e35fdd936d133bf8a48de140a3c666897588a05shiqian
2927e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m2 = FloatEq(0.5f);
2928e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
2929b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2930e35fdd936d133bf8a48de140a3c666897588a05shiqian
2931e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m3 = FloatEq(nan1_);
2932e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("never matches", Describe(m3));
2933e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", DescribeNegation(m3));
2934e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2935e35fdd936d133bf8a48de140a3c666897588a05shiqian
2936e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) {
2937e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m1 = NanSensitiveFloatEq(2.0f);
2938e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
2939b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2940e35fdd936d133bf8a48de140a3c666897588a05shiqian
2941e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m2 = NanSensitiveFloatEq(0.5f);
2942e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
2943b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2944e35fdd936d133bf8a48de140a3c666897588a05shiqian
2945e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m3 = NanSensitiveFloatEq(nan1_);
2946e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is NaN", Describe(m3));
2947b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2948e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2949e35fdd936d133bf8a48de140a3c666897588a05shiqian
2950616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Instantiate FloatingPointTest for testing floats with a user-specified
2951616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// max absolute error.
2952616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wantypedef FloatingPointNearTest<float> FloatNearTest;
2953616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2954616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, FloatNearMatches) {
2955616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  TestNearMatches(&FloatNear);
2956616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
2957616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2958616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) {
2959616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  TestNearMatches(&NanSensitiveFloatNear);
2960616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
2961616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2962616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, FloatNearCanDescribeSelf) {
2963616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m1 = FloatNear(2.0f, 0.5f);
2964616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2965616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
2966616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2967616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2968616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m2 = FloatNear(0.5f, 0.5f);
2969616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2970616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
2971616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2972616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2973616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m3 = FloatNear(nan1_, 0.0);
2974616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("never matches", Describe(m3));
2975616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is anything", DescribeNegation(m3));
2976616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
2977616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2978616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) {
2979616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f);
2980616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
2981616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
2982616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
2983616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2984616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f);
2985616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
2986616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
2987616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
2988616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2989616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f);
2990616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is NaN", Describe(m3));
2991616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2992616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
2993616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
2994616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, FloatNearCannotMatchNaN) {
2995616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // FloatNear never matches NaN.
2996616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f);
2997616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(nan1_));
2998616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(nan2_));
2999616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(1.0));
3000616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3001616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3002616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) {
3003616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // NanSensitiveFloatNear will match NaN.
3004616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f);
3005616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_TRUE(m.Matches(nan1_));
3006616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_TRUE(m.Matches(nan2_));
3007616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(1.0));
3008616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3009616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3010e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing doubles.
3011e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<double> DoubleTest;
3012e35fdd936d133bf8a48de140a3c666897588a05shiqian
3013e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) {
3014e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&DoubleEq);
3015e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3016e35fdd936d133bf8a48de140a3c666897588a05shiqian
3017e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) {
3018e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&NanSensitiveDoubleEq);
3019e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3020e35fdd936d133bf8a48de140a3c666897588a05shiqian
3021e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCannotMatchNaN) {
3022e35fdd936d133bf8a48de140a3c666897588a05shiqian  // DoubleEq never matches NaN.
3023e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = DoubleEq(nan1_);
3024e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan1_));
3025e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan2_));
3026e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
3027e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3028e35fdd936d133bf8a48de140a3c666897588a05shiqian
3029e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {
3030e35fdd936d133bf8a48de140a3c666897588a05shiqian  // NanSensitiveDoubleEq will match NaN.
3031e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = NanSensitiveDoubleEq(nan1_);
3032e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan1_));
3033e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan2_));
3034e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
3035e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3036e35fdd936d133bf8a48de140a3c666897588a05shiqian
3037e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCanDescribeSelf) {
3038e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = DoubleEq(2.0);
3039e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
3040b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
3041e35fdd936d133bf8a48de140a3c666897588a05shiqian
3042e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m2 = DoubleEq(0.5);
3043e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
3044b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
3045e35fdd936d133bf8a48de140a3c666897588a05shiqian
3046e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m3 = DoubleEq(nan1_);
3047e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("never matches", Describe(m3));
3048e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", DescribeNegation(m3));
3049e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3050e35fdd936d133bf8a48de140a3c666897588a05shiqian
3051e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) {
3052e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = NanSensitiveDoubleEq(2.0);
3053e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
3054b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
3055e35fdd936d133bf8a48de140a3c666897588a05shiqian
3056e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m2 = NanSensitiveDoubleEq(0.5);
3057e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
3058b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
3059e35fdd936d133bf8a48de140a3c666897588a05shiqian
3060e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m3 = NanSensitiveDoubleEq(nan1_);
3061e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is NaN", Describe(m3));
3062b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NaN", DescribeNegation(m3));
3063e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3064e35fdd936d133bf8a48de140a3c666897588a05shiqian
3065616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// Instantiate FloatingPointTest for testing floats with a user-specified
3066616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan// max absolute error.
3067616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wantypedef FloatingPointNearTest<double> DoubleNearTest;
3068616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3069616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, DoubleNearMatches) {
3070616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  TestNearMatches(&DoubleNear);
3071616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3072616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3073616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) {
3074616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  TestNearMatches(&NanSensitiveDoubleNear);
3075616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3076616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3077616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) {
3078616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m1 = DoubleNear(2.0, 0.5);
3079616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3080616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
3081616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3082616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3083616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m2 = DoubleNear(0.5, 0.5);
3084616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3085616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
3086616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3087616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3088616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m3 = DoubleNear(nan1_, 0.0);
3089616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("never matches", Describe(m3));
3090616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is anything", DescribeNegation(m3));
3091616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3092616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
30936b817803104b30d5951c652a1427492db116a490kosakTEST_F(DoubleNearTest, ExplainsResultWhenMatchFails) {
30946b817803104b30d5951c652a1427492db116a490kosak  EXPECT_EQ("", Explain(DoubleNear(2.0, 0.1), 2.05));
30956b817803104b30d5951c652a1427492db116a490kosak  EXPECT_EQ("which is 0.2 from 2", Explain(DoubleNear(2.0, 0.1), 2.2));
30966b817803104b30d5951c652a1427492db116a490kosak  EXPECT_EQ("which is -0.3 from 2", Explain(DoubleNear(2.0, 0.1), 1.7));
30976b817803104b30d5951c652a1427492db116a490kosak
30986b817803104b30d5951c652a1427492db116a490kosak  const string explanation = Explain(DoubleNear(2.1, 1e-10), 2.1 + 1.2e-10);
30996b817803104b30d5951c652a1427492db116a490kosak  // Different C++ implementations may print floating-point numbers
31006b817803104b30d5951c652a1427492db116a490kosak  // slightly differently.
31016b817803104b30d5951c652a1427492db116a490kosak  EXPECT_TRUE(explanation == "which is 1.2e-10 from 2.1" ||  // GCC
31026b817803104b30d5951c652a1427492db116a490kosak              explanation == "which is 1.2e-010 from 2.1")   // MSVC
31036b817803104b30d5951c652a1427492db116a490kosak      << " where explanation is \"" << explanation << "\".";
31046b817803104b30d5951c652a1427492db116a490kosak}
31056b817803104b30d5951c652a1427492db116a490kosak
3106616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) {
3107616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5);
3108616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1));
3109616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
3110616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1));
3111616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3112616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5);
3113616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2));
3114616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ(
3115616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan      "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2));
3116616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3117616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1);
3118616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("is NaN", Describe(m3));
3119616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_EQ("isn't NaN", DescribeNegation(m3));
3120616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3121616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3122616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) {
3123616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // DoubleNear never matches NaN.
3124616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1);
3125616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(nan1_));
3126616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(nan2_));
3127616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(1.0));
3128616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3129616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3130616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wanTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) {
3131616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  // NanSensitiveDoubleNear will match NaN.
3132616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1);
3133616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_TRUE(m.Matches(nan1_));
3134616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_TRUE(m.Matches(nan2_));
3135616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan  EXPECT_FALSE(m.Matches(1.0));
3136616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan}
3137616180e6847dd3cc6517a59ff2d24e9fd5c8052czhanyong.wan
3138e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointer) {
3139e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int*> m = Pointee(Ge(0));
3140e35fdd936d133bf8a48de140a3c666897588a05shiqian
3141e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 1;
3142e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&n));
3143e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = -1;
3144e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&n));
3145e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3146e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3147e35fdd936d133bf8a48de140a3c666897588a05shiqian
3148e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointerToConst) {
3149e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const double*> m = Pointee(Ge(0));
3150e35fdd936d133bf8a48de140a3c666897588a05shiqian
3151e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 1;
3152e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&x));
3153e35fdd936d133bf8a48de140a3c666897588a05shiqian  x = -1;
3154e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&x));
3155e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3156e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3157e35fdd936d133bf8a48de140a3c666897588a05shiqian
3158e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToConstRawPointer) {
3159e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int* const &> m = Pointee(Ge(0));
3160e35fdd936d133bf8a48de140a3c666897588a05shiqian
3161e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 1;
3162e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&n));
3163e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = -1;
3164e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&n));
3165e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3166e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3167e35fdd936d133bf8a48de140a3c666897588a05shiqian
3168e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToNonConstRawPointer) {
3169e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<double* &> m = Pointee(Ge(0));
3170e35fdd936d133bf8a48de140a3c666897588a05shiqian
3171e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 1.0;
3172e35fdd936d133bf8a48de140a3c666897588a05shiqian  double* p = &x;
3173e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(p));
3174e35fdd936d133bf8a48de140a3c666897588a05shiqian  x = -1;
3175e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(p));
3176e35fdd936d133bf8a48de140a3c666897588a05shiqian  p = NULL;
3177e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(p));
3178e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3179e35fdd936d133bf8a48de140a3c666897588a05shiqian
31801f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueMATCHER_P(FieldIIs, inner_matcher, "") {
31811f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  return ExplainMatchResult(inner_matcher, arg.i, result_listener);
31821f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
31831f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
3184c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai#if GTEST_HAS_RTTI
3185c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai
31861f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, SameType) {
31871f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Derived derived;
31881f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  derived.i = 4;
31891f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
31901f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  // Right type. A pointer is passed down.
31911f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base* as_base_ptr = &derived;
31921f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull())));
31931f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4))));
31941f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr,
31951f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue              Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5)))));
31961f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
31971f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
31981f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, WrongTypes) {
31991f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base base;
32001f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Derived derived;
32011f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  OtherDerived other_derived;
32021f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32031f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  // Wrong types. NULL is passed.
32041f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
32051f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull()));
32061f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base* as_base_ptr = &derived;
32071f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_))));
32081f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull()));
32091f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  as_base_ptr = &other_derived;
32101f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
32111f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
32121f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
32131f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32141f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, AlreadyNull) {
32151f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  // Already NULL.
32161f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base* as_base_ptr = NULL;
32171f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
32181f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
32191f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32201f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahuestruct AmbiguousCastTypes {
32211f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  class VirtualDerived : public virtual Base {};
32221f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  class DerivedSub1 : public VirtualDerived {};
32231f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  class DerivedSub2 : public VirtualDerived {};
32241f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {};
32251f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue};
32261f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32271f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, AmbiguousCast) {
32281f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  AmbiguousCastTypes::DerivedSub1 sub1;
32291f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  AmbiguousCastTypes::ManyDerivedInHierarchy many_derived;
32301f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  // Multiply derived from Base. dynamic_cast<> returns NULL.
32311f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base* as_base_ptr =
32321f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue      static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived);
32331f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ptr,
32341f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue              WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull()));
32351f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  as_base_ptr = &sub1;
32361f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(
32371f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue      as_base_ptr,
32381f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue      WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull())));
32391f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
32401f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32411f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, Describe) {
32421f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
32431f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  const string prefix =
32441f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue      "when dynamic_cast to " + internal::GetTypeName<Derived*>() + ", ";
32451f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_EQ(prefix + "points to a value that is anything", Describe(matcher));
32461f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_EQ(prefix + "does not point to a value that is anything",
32471f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue            DescribeNegation(matcher));
32481f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
32491f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32501f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, Explain) {
32511f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
32521f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base* null = NULL;
32531f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(Explain(matcher, null), HasSubstr("NULL"));
32541f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Derived derived;
32551f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_TRUE(matcher.Matches(&derived));
32561f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(Explain(matcher, &derived), HasSubstr("which points to "));
32571f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32581f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  // With references, the matcher itself can fail. Test for that one.
32591f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_);
32601f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(Explain(ref_matcher, derived),
32611f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue              HasSubstr("which cannot be dynamic_cast"));
32621f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
32631f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32641f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, GoodReference) {
32651f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Derived derived;
32661f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  derived.i = 4;
32671f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base& as_base_ref = derived;
32681f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4)));
32691f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5))));
32701f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
32711f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
32721f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(WhenDynamicCastToTest, BadReference) {
32731f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Derived derived;
32741f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Base& as_base_ref = derived;
32751f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_)));
32761f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
32771f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
3278c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai#endif  // GTEST_HAS_RTTI
3279c8a1050704af1cc09a7a05820a6dbefc88fb3b4aMark Mentovai
3280ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev// Minimal const-propagating pointer.
3281ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosevtemplate <typename T>
3282ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosevclass ConstPropagatingPtr {
3283ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev public:
3284ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  typedef T element_type;
3285ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev
3286ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  ConstPropagatingPtr() : val_() {}
3287ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  explicit ConstPropagatingPtr(T* t) : val_(t) {}
3288ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {}
3289ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev
3290ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  T* get() { return val_; }
3291ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  T& operator*() { return *val_; }
3292ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  // Most smart pointers return non-const T* and T& from the next methods.
3293ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  const T* get() const { return val_; }
3294ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  const T& operator*() const { return *val_; }
3295ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev
3296ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev private:
3297ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  T* val_;
3298ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev};
3299ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev
3300ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosevTEST(PointeeTest, WorksWithConstPropagatingPointers) {
3301ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5));
3302ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  int three = 3;
3303ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  const ConstPropagatingPtr<int> co(&three);
3304ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  ConstPropagatingPtr<int> o(&three);
3305ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  EXPECT_TRUE(m.Matches(o));
3306ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  EXPECT_TRUE(m.Matches(co));
3307ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  *o = 6;
3308ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  EXPECT_FALSE(m.Matches(o));
3309ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev  EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>()));
3310ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev}
3311ada23475e27babd85fb9c13250243f6acfd3ffd8vladlosev
3312e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, NeverMatchesNull) {
3313e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m = Pointee(_);
3314e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3315e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3316e35fdd936d133bf8a48de140a3c666897588a05shiqian
3317e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that we can write Pointee(value) instead of Pointee(Eq(value)).
3318e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, MatchesAgainstAValue) {
3319e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int*> m = Pointee(5);
3320e35fdd936d133bf8a48de140a3c666897588a05shiqian
3321e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 5;
3322e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&n));
3323e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = -1;
3324e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&n));
3325e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3326e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3327e35fdd936d133bf8a48de140a3c666897588a05shiqian
3328e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanDescribeSelf) {
3329e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int*> m = Pointee(Gt(3));
3330b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("points to a value that is > 3", Describe(m));
3331b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("does not point to a value that is > 3",
3332e35fdd936d133bf8a48de140a3c666897588a05shiqian            DescribeNegation(m));
3333e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3334e35fdd936d133bf8a48de140a3c666897588a05shiqian
3335e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanExplainMatchResult) {
3336e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string*> m = Pointee(StartsWith("Hi"));
3337e35fdd936d133bf8a48de140a3c666897588a05shiqian
3338e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL)));
3339e35fdd936d133bf8a48de140a3c666897588a05shiqian
3340736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  const Matcher<long*> m2 = Pointee(GreaterThan(1));  // NOLINT
3341736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  long n = 3;  // NOLINT
3342736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1",
3343676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            Explain(m2, &n));
3344676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan}
3345676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan
3346676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wanTEST(PointeeTest, AlwaysExplainsPointee) {
3347676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  const Matcher<int*> m = Pointee(0);
3348676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  int n = 42;
3349736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n));
3350e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3351e35fdd936d133bf8a48de140a3c666897588a05shiqian
3352e35fdd936d133bf8a48de140a3c666897588a05shiqian// An uncopyable class.
3353e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Uncopyable {
3354e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
33551f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Uncopyable() : value_(-1) {}
335632de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit Uncopyable(int a_value) : value_(a_value) {}
3357e35fdd936d133bf8a48de140a3c666897588a05shiqian
3358e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value() const { return value_; }
33591f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  void set_value(int i) { value_ = i; }
33601f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
3361e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
33621f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  int value_;
3363e35fdd936d133bf8a48de140a3c666897588a05shiqian  GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable);
3364e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3365e35fdd936d133bf8a48de140a3c666897588a05shiqian
3366e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns true iff x.value() is positive.
3367e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; }
3368e35fdd936d133bf8a48de140a3c666897588a05shiqian
33691f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueMATCHER_P(UncopyableIs, inner_matcher, "") {
33701f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  return ExplainMatchResult(inner_matcher, arg.value(), result_listener);
33711f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
33721f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
3373e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined struct for testing Field().
3374e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct AStruct {
3375e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct() : x(0), y(1.0), z(5), p(NULL) {}
3376e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct(const AStruct& rhs)
3377e35fdd936d133bf8a48de140a3c666897588a05shiqian      : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {}
3378e35fdd936d133bf8a48de140a3c666897588a05shiqian
3379e35fdd936d133bf8a48de140a3c666897588a05shiqian  int x;           // A non-const field.
3380e35fdd936d133bf8a48de140a3c666897588a05shiqian  const double y;  // A const field.
3381e35fdd936d133bf8a48de140a3c666897588a05shiqian  Uncopyable z;    // An uncopyable field.
3382e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char* p;   // A pointer field.
338332de5f53763125925e078498250f7e73a88de9edzhanyong.wan
338432de5f53763125925e078498250f7e73a88de9edzhanyong.wan private:
338532de5f53763125925e078498250f7e73a88de9edzhanyong.wan  GTEST_DISALLOW_ASSIGN_(AStruct);
3386e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3387e35fdd936d133bf8a48de140a3c666897588a05shiqian
3388e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived struct for testing Field().
3389e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct DerivedStruct : public AStruct {
3390e35fdd936d133bf8a48de140a3c666897588a05shiqian  char ch;
339132de5f53763125925e078498250f7e73a88de9edzhanyong.wan
339232de5f53763125925e078498250f7e73a88de9edzhanyong.wan private:
339332de5f53763125925e078498250f7e73a88de9edzhanyong.wan  GTEST_DISALLOW_ASSIGN_(DerivedStruct);
3394e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3395e35fdd936d133bf8a48de140a3c666897588a05shiqian
3396e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is non-const.
3397e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForNonConstField) {
3398e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::x, Ge(0));
3399e35fdd936d133bf8a48de140a3c666897588a05shiqian
3400e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3401e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3402e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
3403e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3404e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3405e35fdd936d133bf8a48de140a3c666897588a05shiqian
3406e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is const.
3407e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForConstField) {
3408e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3409e35fdd936d133bf8a48de140a3c666897588a05shiqian
3410e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0));
3411e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3412e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::y, Le(0.0));
3413e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3414e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3415e35fdd936d133bf8a48de140a3c666897588a05shiqian
3416e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is not copyable.
3417e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForUncopyableField) {
3418e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3419e35fdd936d133bf8a48de140a3c666897588a05shiqian
3420e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive));
3421e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3422e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::z, Not(Truly(ValueIsPositive)));
3423e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3424e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3425e35fdd936d133bf8a48de140a3c666897588a05shiqian
3426e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is a pointer.
3427e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForPointerField) {
3428e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Matching against NULL.
3429e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL));
3430e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3431e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3432e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.p = "hi";
3433e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3434e35fdd936d133bf8a48de140a3c666897588a05shiqian
3435e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Matching a pointer that is not NULL.
3436e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::p, StartsWith("hi"));
3437e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.p = "hill";
3438e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3439e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.p = "hole";
3440e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3441e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3442e35fdd936d133bf8a48de140a3c666897588a05shiqian
3443e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the object is passed by reference.
3444e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForByRefArgument) {
3445e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3446e35fdd936d133bf8a48de140a3c666897588a05shiqian
3447e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3448e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3449e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
3450e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3451e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3452e35fdd936d133bf8a48de140a3c666897588a05shiqian
3453e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type
3454e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of Foo.
3455e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForArgumentOfSubType) {
3456e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Note that the matcher expects DerivedStruct but we say AStruct
3457e35fdd936d133bf8a48de140a3c666897588a05shiqian  // inside Field().
3458e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0));
3459e35fdd936d133bf8a48de140a3c666897588a05shiqian
3460e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedStruct d;
3461e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(d));
3462e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.x = -1;
3463e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(d));
3464e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3465e35fdd936d133bf8a48de140a3c666897588a05shiqian
3466e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, m) works when field's type and m's
3467e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument type are compatible but not the same.
3468e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForCompatibleMatcherType) {
3469e35fdd936d133bf8a48de140a3c666897588a05shiqian  // The field is an int, but the inner matcher expects a signed char.
3470e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x,
3471e35fdd936d133bf8a48de140a3c666897588a05shiqian                                    Matcher<signed char>(Ge(0)));
3472e35fdd936d133bf8a48de140a3c666897588a05shiqian
3473e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3474e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3475e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
3476e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3477e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3478e35fdd936d133bf8a48de140a3c666897588a05shiqian
3479e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself.
3480e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanDescribeSelf) {
3481e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3482e35fdd936d133bf8a48de140a3c666897588a05shiqian
3483b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3484b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
3485e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3486e35fdd936d133bf8a48de140a3c666897588a05shiqian
3487e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the match result.
3488e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanExplainMatchResult) {
3489e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
3490e35fdd936d133bf8a48de140a3c666897588a05shiqian
3491e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3492e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = 1;
3493736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a));
3494e35fdd936d133bf8a48de140a3c666897588a05shiqian
3495e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::x, GreaterThan(0));
3496736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ(
3497736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      "whose given field is 1" + OfType("int") + ", which is 1 more than 0",
3498736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      Explain(m, a));
3499e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3500e35fdd936d133bf8a48de140a3c666897588a05shiqian
3501e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to const.
3502e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToConst) {
3503e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3504e35fdd936d133bf8a48de140a3c666897588a05shiqian
3505e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3506e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
3507e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
3508e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
3509e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3510e35fdd936d133bf8a48de140a3c666897588a05shiqian
3511e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to non-const.
3512e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToNonConst) {
3513e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct*> m = Field(&AStruct::x, Ge(0));
3514e35fdd936d133bf8a48de140a3c666897588a05shiqian
3515e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3516e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
3517e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
3518e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
3519e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3520e35fdd936d133bf8a48de140a3c666897588a05shiqian
35216953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// Tests that Field() works when the argument is a reference to a const pointer.
35226953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wanTEST(FieldForPointerTest, WorksForReferenceToConstPointer) {
35236953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0));
35246953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
35256953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  AStruct a;
35266953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_TRUE(m.Matches(&a));
35276953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  a.x = -1;
35286953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_FALSE(m.Matches(&a));
35296953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan}
35306953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
3531e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() does not match the NULL pointer.
3532e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, DoesNotMatchNull) {
3533e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, _);
3534e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3535e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3536e35fdd936d133bf8a48de140a3c666897588a05shiqian
3537e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type
3538e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of const Foo*.
3539e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForArgumentOfSubType) {
3540e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Note that the matcher expects DerivedStruct but we say AStruct
3541e35fdd936d133bf8a48de140a3c666897588a05shiqian  // inside Field().
3542e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0));
3543e35fdd936d133bf8a48de140a3c666897588a05shiqian
3544e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedStruct d;
3545e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&d));
3546e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.x = -1;
3547e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&d));
3548e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3549e35fdd936d133bf8a48de140a3c666897588a05shiqian
3550e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself when used to match a pointer.
3551e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanDescribeSelf) {
3552e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3553e35fdd936d133bf8a48de140a3c666897588a05shiqian
3554b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
3555b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
3556e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3557e35fdd936d133bf8a48de140a3c666897588a05shiqian
3558e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the result of matching a pointer.
3559e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanExplainMatchResult) {
3560e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
3561e35fdd936d133bf8a48de140a3c666897588a05shiqian
3562e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
3563e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = 1;
3564e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL)));
3565736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"),
3566736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan            Explain(m, &a));
3567e35fdd936d133bf8a48de140a3c666897588a05shiqian
3568e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::x, GreaterThan(0));
3569736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") +
3570736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan            ", which is 1 more than 0", Explain(m, &a));
3571e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3572e35fdd936d133bf8a48de140a3c666897588a05shiqian
3573e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined class for testing Property().
3574e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AClass {
3575e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
3576e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass() : n_(0) {}
3577e35fdd936d133bf8a48de140a3c666897588a05shiqian
3578e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A getter that returns a non-reference.
3579e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n() const { return n_; }
3580e35fdd936d133bf8a48de140a3c666897588a05shiqian
3581e35fdd936d133bf8a48de140a3c666897588a05shiqian  void set_n(int new_n) { n_ = new_n; }
3582e35fdd936d133bf8a48de140a3c666897588a05shiqian
3583e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A getter that returns a reference to const.
3584e35fdd936d133bf8a48de140a3c666897588a05shiqian  const string& s() const { return s_; }
3585e35fdd936d133bf8a48de140a3c666897588a05shiqian
3586e35fdd936d133bf8a48de140a3c666897588a05shiqian  void set_s(const string& new_s) { s_ = new_s; }
3587e35fdd936d133bf8a48de140a3c666897588a05shiqian
3588e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A getter that returns a reference to non-const.
3589e35fdd936d133bf8a48de140a3c666897588a05shiqian  double& x() const { return x_; }
3590e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
3591e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n_;
3592e35fdd936d133bf8a48de140a3c666897588a05shiqian  string s_;
3593e35fdd936d133bf8a48de140a3c666897588a05shiqian
3594e35fdd936d133bf8a48de140a3c666897588a05shiqian  static double x_;
3595e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3596e35fdd936d133bf8a48de140a3c666897588a05shiqian
3597e35fdd936d133bf8a48de140a3c666897588a05shiqiandouble AClass::x_ = 0.0;
3598e35fdd936d133bf8a48de140a3c666897588a05shiqian
3599e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived class for testing Property().
3600e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DerivedClass : public AClass {
36016414d806cd7d0954cce81348552fdd1e5bd31515kosak public:
36026414d806cd7d0954cce81348552fdd1e5bd31515kosak  int k() const { return k_; }
3603e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
3604e35fdd936d133bf8a48de140a3c666897588a05shiqian  int k_;
3605e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3606e35fdd936d133bf8a48de140a3c666897588a05shiqian
3607e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property()
3608e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference.
3609e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForNonReferenceProperty) {
3610e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3611e35fdd936d133bf8a48de140a3c666897588a05shiqian
3612e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3613e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
3614e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3615e35fdd936d133bf8a48de140a3c666897588a05shiqian
3616e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(-1);
3617e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3618e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3619e35fdd936d133bf8a48de140a3c666897588a05shiqian
3620e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property()
3621e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const.
3622e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToConstProperty) {
3623e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi"));
3624e35fdd936d133bf8a48de140a3c666897588a05shiqian
3625e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3626e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hill");
3627e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3628e35fdd936d133bf8a48de140a3c666897588a05shiqian
3629e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hole");
3630e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3631e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3632e35fdd936d133bf8a48de140a3c666897588a05shiqian
3633e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property()
3634e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const.
3635e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToNonConstProperty) {
3636e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 0.0;
3637e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3638e35fdd936d133bf8a48de140a3c666897588a05shiqian
3639e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::x, Ref(x));
3640e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3641e35fdd936d133bf8a48de140a3c666897588a05shiqian
3642e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Property(&AClass::x, Not(Ref(x)));
3643e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3644e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3645e35fdd936d133bf8a48de140a3c666897588a05shiqian
3646e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument is
3647e35fdd936d133bf8a48de140a3c666897588a05shiqian// passed by value.
3648e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForByValueArgument) {
3649e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AClass> m = Property(&AClass::s, StartsWith("hi"));
3650e35fdd936d133bf8a48de140a3c666897588a05shiqian
3651e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3652e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hill");
3653e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3654e35fdd936d133bf8a48de140a3c666897588a05shiqian
3655e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hole");
3656e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3657e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3658e35fdd936d133bf8a48de140a3c666897588a05shiqian
3659e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's
3660e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of Foo.
3661e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForArgumentOfSubType) {
3662e35fdd936d133bf8a48de140a3c666897588a05shiqian  // The matcher expects a DerivedClass, but inside the Property() we
3663e35fdd936d133bf8a48de140a3c666897588a05shiqian  // say AClass.
3664e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0));
3665e35fdd936d133bf8a48de140a3c666897588a05shiqian
3666e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedClass d;
3667e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(1);
3668e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(d));
3669e35fdd936d133bf8a48de140a3c666897588a05shiqian
3670e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(-1);
3671e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(d));
3672e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3673e35fdd936d133bf8a48de140a3c666897588a05shiqian
3674e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, m) works when property()'s type
3675e35fdd936d133bf8a48de140a3c666897588a05shiqian// and m's argument type are compatible but different.
3676e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForCompatibleMatcherType) {
3677e35fdd936d133bf8a48de140a3c666897588a05shiqian  // n() returns an int but the inner matcher expects a signed char.
3678e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n,
3679e35fdd936d133bf8a48de140a3c666897588a05shiqian                                      Matcher<signed char>(Ge(0)));
3680e35fdd936d133bf8a48de140a3c666897588a05shiqian
3681e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3682e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3683e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(-1);
3684e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3685e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3686e35fdd936d133bf8a48de140a3c666897588a05shiqian
3687e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself.
3688e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanDescribeSelf) {
3689e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3690e35fdd936d133bf8a48de140a3c666897588a05shiqian
3691b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3692b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property isn't >= 0",
3693b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
3694e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3695e35fdd936d133bf8a48de140a3c666897588a05shiqian
3696e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the match result.
3697e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanExplainMatchResult) {
3698e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3699e35fdd936d133bf8a48de140a3c666897588a05shiqian
3700e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3701e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
3702736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a));
3703e35fdd936d133bf8a48de140a3c666897588a05shiqian
3704e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Property(&AClass::n, GreaterThan(0));
3705736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ(
3706736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      "whose given property is 1" + OfType("int") + ", which is 1 more than 0",
3707736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      Explain(m, a));
3708e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3709e35fdd936d133bf8a48de140a3c666897588a05shiqian
3710e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to const.
3711e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToConst) {
3712e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3713e35fdd936d133bf8a48de140a3c666897588a05shiqian
3714e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3715e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
3716e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
3717e35fdd936d133bf8a48de140a3c666897588a05shiqian
3718e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(-1);
3719e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
3720e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3721e35fdd936d133bf8a48de140a3c666897588a05shiqian
3722e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to non-const.
3723e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToNonConst) {
3724e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi"));
3725e35fdd936d133bf8a48de140a3c666897588a05shiqian
3726e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3727e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hill");
37286953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_TRUE(m.Matches(&a));
37296953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
37306953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  a.set_s("hole");
37316953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_FALSE(m.Matches(&a));
37326953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan}
37336953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
37346953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// Tests that Property() works when the argument is a reference to a
37356953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// const pointer.
37366953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wanTEST(PropertyForPointerTest, WorksForReferenceToConstPointer) {
37376953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi"));
37386953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
37396953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  AClass a;
37406953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  a.set_s("hill");
3741e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
3742e35fdd936d133bf8a48de140a3c666897588a05shiqian
3743e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hole");
3744e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
3745e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3746e35fdd936d133bf8a48de140a3c666897588a05shiqian
3747e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() does not match the NULL pointer.
3748e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) {
3749e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::x, _);
3750e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3751e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3752e35fdd936d133bf8a48de140a3c666897588a05shiqian
3753e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's
3754e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of const Foo*.
3755e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForArgumentOfSubType) {
3756e35fdd936d133bf8a48de140a3c666897588a05shiqian  // The matcher expects a DerivedClass, but inside the Property() we
3757e35fdd936d133bf8a48de140a3c666897588a05shiqian  // say AClass.
3758e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0));
3759e35fdd936d133bf8a48de140a3c666897588a05shiqian
3760e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedClass d;
3761e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(1);
3762e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&d));
3763e35fdd936d133bf8a48de140a3c666897588a05shiqian
3764e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(-1);
3765e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&d));
3766e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3767e35fdd936d133bf8a48de140a3c666897588a05shiqian
3768e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself when used to match a pointer.
3769e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanDescribeSelf) {
3770e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3771e35fdd936d133bf8a48de140a3c666897588a05shiqian
3772b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3773b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property isn't >= 0",
3774b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
3775e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3776e35fdd936d133bf8a48de140a3c666897588a05shiqian
3777e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the result of matching a pointer.
3778e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanExplainMatchResult) {
3779e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3780e35fdd936d133bf8a48de140a3c666897588a05shiqian
3781e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3782e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
3783e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL)));
3784736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ(
3785736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      "which points to an object whose given property is 1" + OfType("int"),
3786736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      Explain(m, &a));
3787e35fdd936d133bf8a48de140a3c666897588a05shiqian
3788e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Property(&AClass::n, GreaterThan(0));
3789736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("which points to an object whose given property is 1" +
3790736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan            OfType("int") + ", which is 1 more than 0",
3791736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan            Explain(m, &a));
3792e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3793e35fdd936d133bf8a48de140a3c666897588a05shiqian
3794e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ResultOf.
3795e35fdd936d133bf8a48de140a3c666897588a05shiqian
3796e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3797e35fdd936d133bf8a48de140a3c666897588a05shiqian// function pointer.
3798e35fdd936d133bf8a48de140a3c666897588a05shiqianstring IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; }
3799e35fdd936d133bf8a48de140a3c666897588a05shiqian
3800e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionPointers) {
3801e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo")));
3802e35fdd936d133bf8a48de140a3c666897588a05shiqian
3803e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(1));
3804e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(2));
3805e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3806e35fdd936d133bf8a48de140a3c666897588a05shiqian
3807e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can describe itself.
3808e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanDescribeItself) {
3809e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo"));
3810e35fdd936d133bf8a48de140a3c666897588a05shiqian
3811676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("is mapped by the given callable to a value that "
3812676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "is equal to \"foo\"", Describe(matcher));
3813676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("is mapped by the given callable to a value that "
3814b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "isn't equal to \"foo\"", DescribeNegation(matcher));
3815e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3816e35fdd936d133bf8a48de140a3c666897588a05shiqian
3817e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can explain the match result.
3818e35fdd936d133bf8a48de140a3c666897588a05shiqianint IntFunction(int input) { return input == 42 ? 80 : 90; }
3819e35fdd936d133bf8a48de140a3c666897588a05shiqian
3820e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanExplainMatchResult) {
3821e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntFunction, Ge(85));
3822736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"),
3823676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            Explain(matcher, 36));
3824e35fdd936d133bf8a48de140a3c666897588a05shiqian
3825e35fdd936d133bf8a48de140a3c666897588a05shiqian  matcher = ResultOf(&IntFunction, GreaterThan(85));
3826736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") +
3827736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan            ", which is 5 more than 85", Explain(matcher, 36));
3828e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3829e35fdd936d133bf8a48de140a3c666897588a05shiqian
3830e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3831e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference.
3832e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForNonReferenceResults) {
3833e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntFunction, Eq(80));
3834e35fdd936d133bf8a48de140a3c666897588a05shiqian
3835e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(42));
3836e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(36));
3837e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3838e35fdd936d133bf8a48de140a3c666897588a05shiqian
3839e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3840e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const.
3841736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wandouble& DoubleFunction(double& input) { return input; }  // NOLINT
3842e35fdd936d133bf8a48de140a3c666897588a05shiqian
3843736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanUncopyable& RefUncopyableFunction(Uncopyable& obj) {  // NOLINT
3844e35fdd936d133bf8a48de140a3c666897588a05shiqian  return obj;
3845e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3846e35fdd936d133bf8a48de140a3c666897588a05shiqian
3847e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToNonConstResults) {
3848e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 3.14;
3849e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x2 = x;
3850e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x));
3851e35fdd936d133bf8a48de140a3c666897588a05shiqian
3852e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(x));
3853e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(x2));
3854e35fdd936d133bf8a48de140a3c666897588a05shiqian
3855e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Test that ResultOf works with uncopyable objects
3856e35fdd936d133bf8a48de140a3c666897588a05shiqian  Uncopyable obj(0);
3857e35fdd936d133bf8a48de140a3c666897588a05shiqian  Uncopyable obj2(0);
3858e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<Uncopyable&> matcher2 =
3859e35fdd936d133bf8a48de140a3c666897588a05shiqian      ResultOf(&RefUncopyableFunction, Ref(obj));
3860e35fdd936d133bf8a48de140a3c666897588a05shiqian
3861e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher2.Matches(obj));
3862e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher2.Matches(obj2));
3863e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3864e35fdd936d133bf8a48de140a3c666897588a05shiqian
3865e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3866e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const.
3867e35fdd936d133bf8a48de140a3c666897588a05shiqianconst string& StringFunction(const string& input) { return input; }
3868e35fdd936d133bf8a48de140a3c666897588a05shiqian
3869e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToConstResults) {
3870e35fdd936d133bf8a48de140a3c666897588a05shiqian  string s = "foo";
3871e35fdd936d133bf8a48de140a3c666897588a05shiqian  string s2 = s;
3872e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s));
3873e35fdd936d133bf8a48de140a3c666897588a05shiqian
3874e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(s));
3875e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(s2));
3876e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3877e35fdd936d133bf8a48de140a3c666897588a05shiqian
3878e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, m) works when f(x) and m's
3879e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument types are compatible but different.
3880e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForCompatibleMatcherTypes) {
3881e35fdd936d133bf8a48de140a3c666897588a05shiqian  // IntFunction() returns int but the inner matcher expects a signed char.
3882e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85)));
3883e35fdd936d133bf8a48de140a3c666897588a05shiqian
3884e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(36));
3885e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(42));
3886e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3887e35fdd936d133bf8a48de140a3c666897588a05shiqian
3888e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that the program aborts when ResultOf is passed
3889e35fdd936d133bf8a48de140a3c666897588a05shiqian// a NULL function pointer.
3890e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) {
389104d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
3892736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      ResultOf(static_cast<string(*)(int dummy)>(NULL), Eq(string("foo"))),
3893e35fdd936d133bf8a48de140a3c666897588a05shiqian               "NULL function pointer is passed into ResultOf\\(\\)\\.");
3894e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3895e35fdd936d133bf8a48de140a3c666897588a05shiqian
3896e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3897e35fdd936d133bf8a48de140a3c666897588a05shiqian// function reference.
3898e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionReferences) {
3899e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo"));
3900e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(1));
3901e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(2));
3902e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3903e35fdd936d133bf8a48de140a3c666897588a05shiqian
3904e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3905e35fdd936d133bf8a48de140a3c666897588a05shiqian// function object.
3906e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Functor : public ::std::unary_function<int, string> {
3907e35fdd936d133bf8a48de140a3c666897588a05shiqian  result_type operator()(argument_type input) const {
3908e35fdd936d133bf8a48de140a3c666897588a05shiqian    return IntToStringFunction(input);
3909e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3910e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3911e35fdd936d133bf8a48de140a3c666897588a05shiqian
3912e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctors) {
3913e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo")));
3914e35fdd936d133bf8a48de140a3c666897588a05shiqian
3915e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(1));
3916e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(2));
3917e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3918e35fdd936d133bf8a48de140a3c666897588a05shiqian
3919e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3920e35fdd936d133bf8a48de140a3c666897588a05shiqian// functor with more then one operator() defined. ResultOf() must work
3921e35fdd936d133bf8a48de140a3c666897588a05shiqian// for each defined operator().
3922e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct PolymorphicFunctor {
3923e35fdd936d133bf8a48de140a3c666897588a05shiqian  typedef int result_type;
3924e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()(int n) { return n; }
3925e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()(const char* s) { return static_cast<int>(strlen(s)); }
3926e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3927e35fdd936d133bf8a48de140a3c666897588a05shiqian
3928e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForPolymorphicFunctors) {
3929e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5));
3930e35fdd936d133bf8a48de140a3c666897588a05shiqian
3931e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher_int.Matches(10));
3932e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher_int.Matches(2));
3933e35fdd936d133bf8a48de140a3c666897588a05shiqian
3934e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5));
3935e35fdd936d133bf8a48de140a3c666897588a05shiqian
3936e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher_string.Matches("long string"));
3937e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher_string.Matches("shrt"));
3938e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3939e35fdd936d133bf8a48de140a3c666897588a05shiqian
3940e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int* ReferencingFunction(const int& n) { return &n; }
3941e35fdd936d133bf8a48de140a3c666897588a05shiqian
3942e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct ReferencingFunctor {
3943e35fdd936d133bf8a48de140a3c666897588a05shiqian  typedef const int* result_type;
3944e35fdd936d133bf8a48de140a3c666897588a05shiqian  result_type operator()(const int& n) { return &n; }
3945e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3946e35fdd936d133bf8a48de140a3c666897588a05shiqian
3947e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferencingCallables) {
3948e35fdd936d133bf8a48de140a3c666897588a05shiqian  const int n = 1;
3949e35fdd936d133bf8a48de140a3c666897588a05shiqian  const int n2 = 1;
3950e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n));
3951e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher2.Matches(n));
3952e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher2.Matches(n2));
3953e35fdd936d133bf8a48de140a3c666897588a05shiqian
3954e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n));
3955e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher3.Matches(n));
3956e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher3.Matches(n2));
3957e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3958e35fdd936d133bf8a48de140a3c666897588a05shiqian
3959e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DivisibleByImpl {
3960e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
396132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {}
3962e35fdd936d133bf8a48de140a3c666897588a05shiqian
3963db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  // For testing using ExplainMatchResultTo() with polymorphic matchers.
3964e35fdd936d133bf8a48de140a3c666897588a05shiqian  template <typename T>
3965db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  bool MatchAndExplain(const T& n, MatchResultListener* listener) const {
3966b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan    *listener << "which is " << (n % divider_) << " modulo "
3967db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan              << divider_;
3968e35fdd936d133bf8a48de140a3c666897588a05shiqian    return (n % divider_) == 0;
3969e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3970e35fdd936d133bf8a48de140a3c666897588a05shiqian
3971ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeTo(ostream* os) const {
3972e35fdd936d133bf8a48de140a3c666897588a05shiqian    *os << "is divisible by " << divider_;
3973e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3974e35fdd936d133bf8a48de140a3c666897588a05shiqian
3975ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeNegationTo(ostream* os) const {
3976e35fdd936d133bf8a48de140a3c666897588a05shiqian    *os << "is not divisible by " << divider_;
3977e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3978e35fdd936d133bf8a48de140a3c666897588a05shiqian
397932de5f53763125925e078498250f7e73a88de9edzhanyong.wan  void set_divider(int a_divider) { divider_ = a_divider; }
3980e35fdd936d133bf8a48de140a3c666897588a05shiqian  int divider() const { return divider_; }
39812b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
3982e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
39832b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  int divider_;
3984e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3985e35fdd936d133bf8a48de140a3c666897588a05shiqian
3986e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {
3987e35fdd936d133bf8a48de140a3c666897588a05shiqian  return MakePolymorphicMatcher(DivisibleByImpl(n));
3988e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3989e35fdd936d133bf8a48de140a3c666897588a05shiqian
3990e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is
3991e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why.
3992e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_False) {
3993e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
3994b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 1 modulo 4", Explain(m, 5));
3995e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3996e35fdd936d133bf8a48de140a3c666897588a05shiqian
3997e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is
3998e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why.
3999e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_True) {
4000e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
4001b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 2 modulo 4", Explain(m, 6));
4002e35fdd936d133bf8a48de140a3c666897588a05shiqian}
4003e35fdd936d133bf8a48de140a3c666897588a05shiqian
4004e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is
4005e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why.
4006e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_False) {
4007e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3));
4008b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 2 modulo 3", Explain(m, 5));
4009e35fdd936d133bf8a48de140a3c666897588a05shiqian}
4010e35fdd936d133bf8a48de140a3c666897588a05shiqian
4011e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() succeeds, all matchers are asked to explain
4012e35fdd936d133bf8a48de140a3c666897588a05shiqian// why.
4013e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True) {
4014e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3));
4015b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6));
4016e35fdd936d133bf8a48de140a3c666897588a05shiqian}
4017e35fdd936d133bf8a48de140a3c666897588a05shiqian
4018e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True_2) {
4019e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(Ge(2), Le(3));
4020e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, 2));
4021e35fdd936d133bf8a48de140a3c666897588a05shiqian}
4022e35fdd936d133bf8a48de140a3c666897588a05shiqian
4023e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainmatcherResultTest, MonomorphicMatcher) {
4024e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = GreaterThan(5);
4025676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is 1 more than 5", Explain(m, 6));
4026e35fdd936d133bf8a48de140a3c666897588a05shiqian}
4027e35fdd936d133bf8a48de140a3c666897588a05shiqian
4028e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following two tests verify that values without a public copy
4029e35fdd936d133bf8a48de140a3c666897588a05shiqian// ctor can be used as arguments to matchers like Eq(), Ge(), and etc
4030e35fdd936d133bf8a48de140a3c666897588a05shiqian// with the help of ByRef().
4031e35fdd936d133bf8a48de140a3c666897588a05shiqian
4032e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotCopyable {
4033e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
403432de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit NotCopyable(int a_value) : value_(a_value) {}
4035e35fdd936d133bf8a48de140a3c666897588a05shiqian
4036e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value() const { return value_; }
4037e35fdd936d133bf8a48de140a3c666897588a05shiqian
4038e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool operator==(const NotCopyable& rhs) const {
4039e35fdd936d133bf8a48de140a3c666897588a05shiqian    return value() == rhs.value();
4040e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
4041e35fdd936d133bf8a48de140a3c666897588a05shiqian
4042e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool operator>=(const NotCopyable& rhs) const {
4043e35fdd936d133bf8a48de140a3c666897588a05shiqian    return value() >= rhs.value();
4044e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
4045e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
4046e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value_;
4047e35fdd936d133bf8a48de140a3c666897588a05shiqian
4048e35fdd936d133bf8a48de140a3c666897588a05shiqian  GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable);
4049e35fdd936d133bf8a48de140a3c666897588a05shiqian};
4050e35fdd936d133bf8a48de140a3c666897588a05shiqian
4051e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) {
4052e35fdd936d133bf8a48de140a3c666897588a05shiqian  const NotCopyable const_value1(1);
4053e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1));
4054e35fdd936d133bf8a48de140a3c666897588a05shiqian
4055e35fdd936d133bf8a48de140a3c666897588a05shiqian  const NotCopyable n1(1), n2(2);
4056e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(n1));
4057e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(n2));
4058e35fdd936d133bf8a48de140a3c666897588a05shiqian}
4059e35fdd936d133bf8a48de140a3c666897588a05shiqian
4060e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableValueInMatchers) {
4061e35fdd936d133bf8a48de140a3c666897588a05shiqian  NotCopyable value2(2);
4062e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<NotCopyable&> m = Ge(ByRef(value2));
4063e35fdd936d133bf8a48de140a3c666897588a05shiqian
4064e35fdd936d133bf8a48de140a3c666897588a05shiqian  NotCopyable n1(1), n2(2);
4065e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(n1));
4066e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(n2));
4067e35fdd936d133bf8a48de140a3c666897588a05shiqian}
4068e35fdd936d133bf8a48de140a3c666897588a05shiqian
4069320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, ImplementsIsEmpty) {
4070320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  vector<int> container;
4071320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_THAT(container, IsEmpty());
4072320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  container.push_back(0);
4073320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_THAT(container, Not(IsEmpty()));
4074320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  container.push_back(1);
4075320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_THAT(container, Not(IsEmpty()));
4076320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan}
4077320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan
4078320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, WorksWithString) {
4079320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  string text;
4080320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_THAT(text, IsEmpty());
4081320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  text = "foo";
4082320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_THAT(text, Not(IsEmpty()));
4083320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  text = string("\0", 1);
4084320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_THAT(text, Not(IsEmpty()));
4085320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan}
4086320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan
4087320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, CanDescribeSelf) {
4088320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  Matcher<vector<int> > m = IsEmpty();
4089320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_EQ("is empty", Describe(m));
4090320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_EQ("isn't empty", DescribeNegation(m));
4091320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan}
4092320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan
4093320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wanTEST(IsEmptyTest, ExplainsResult) {
4094320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  Matcher<vector<int> > m = IsEmpty();
4095320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  vector<int> container;
4096320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_EQ("", Explain(m, container));
4097320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  container.push_back(0);
4098320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan  EXPECT_EQ("whose size is 1", Explain(m, container));
4099320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan}
4100320814aca02dfb6b5f116bc5de1785a478cc6d42zhanyong.wan
4101a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, ImplementsSizeIs) {
4102a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  vector<int> container;
4103a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, SizeIs(0));
4104a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, Not(SizeIs(1)));
4105a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  container.push_back(0);
4106a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, Not(SizeIs(0)));
4107a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, SizeIs(1));
4108a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  container.push_back(0);
4109a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, Not(SizeIs(0)));
4110a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, SizeIs(2));
4111a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan}
4112a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan
4113a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, WorksWithMap) {
4114a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  map<string, int> container;
4115a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, SizeIs(0));
4116a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, Not(SizeIs(1)));
4117a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  container.insert(make_pair("foo", 1));
4118a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, Not(SizeIs(0)));
4119a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, SizeIs(1));
4120a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  container.insert(make_pair("bar", 2));
4121a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, Not(SizeIs(0)));
4122a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, SizeIs(2));
4123a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan}
4124a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan
4125a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, WorksWithReferences) {
4126a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  vector<int> container;
4127a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  Matcher<const vector<int>&> m = SizeIs(1);
4128a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, Not(m));
4129a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  container.push_back(0);
4130a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_THAT(container, m);
4131a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan}
4132a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan
4133a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, CanDescribeSelf) {
4134a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  Matcher<vector<int> > m = SizeIs(2);
4135a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("size is equal to 2", Describe(m));
4136a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("size isn't equal to 2", DescribeNegation(m));
4137a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan}
4138a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan
4139a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanTEST(SizeIsTest, ExplainsResult) {
4140a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  Matcher<vector<int> > m1 = SizeIs(2);
4141a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  Matcher<vector<int> > m2 = SizeIs(Lt(2u));
4142a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  Matcher<vector<int> > m3 = SizeIs(AnyOf(0, 3));
4143a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  Matcher<vector<int> > m4 = SizeIs(GreaterThan(1));
4144a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  vector<int> container;
4145a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 0 doesn't match", Explain(m1, container));
4146a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 0 matches", Explain(m2, container));
4147a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 0 matches", Explain(m3, container));
4148a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 0 doesn't match, which is 1 less than 1",
4149a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan            Explain(m4, container));
4150a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  container.push_back(0);
4151a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  container.push_back(0);
4152a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 2 matches", Explain(m1, container));
4153a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 2 doesn't match", Explain(m2, container));
4154a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 2 doesn't match", Explain(m3, container));
4155a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan  EXPECT_EQ("whose size 2 matches, which is 1 more than 1",
4156a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan            Explain(m4, container));
4157a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan}
4158a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan
41592b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#if GTEST_HAS_TYPED_TEST
41606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests ContainerEq with different container types, and
41616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// different element types.
41626a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
41636a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename T>
4164b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanclass ContainerEqTest : public testing::Test {};
41656a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
41666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantypedef testing::Types<
4167ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    set<int>,
4168ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    vector<size_t>,
4169ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    multiset<size_t>,
4170ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    list<int> >
41716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan    ContainerEqTestTypes;
41726a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
41736a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes);
41746a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
41756a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that the filled container is equal to itself.
41766a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, EqualsSelf) {
41776a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
41786a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
41796a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<TypeParam> m = ContainerEq(my_set);
41806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_TRUE(m.Matches(my_set));
41816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_EQ("", Explain(m, my_set));
41826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
41836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
41846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that missing values are reported.
41856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueMissing) {
41866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
41876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {2, 1, 8, 5};
41886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
41896a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 4);
41906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<TypeParam> m = ContainerEq(my_set);
41916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
4192b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which doesn't have these expected elements: 3",
4193b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
41946a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
41956a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
41966a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported.
41976a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAdded) {
41986a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
41996a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 5, 8, 46};
42006a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
42016a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 6);
42026a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<const TypeParam&> m = ContainerEq(my_set);
42036a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
4204b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set));
42056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
42066a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
42076a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together.
42086a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) {
42096a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
42106a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 8, 46};
42116a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
42126a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 5);
42136a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<TypeParam> m = ContainerEq(my_set);
42146a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
4215b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 46,\n"
4216b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and doesn't have these expected elements: 5",
4217b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
42186a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
42196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
42206a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests duplicated value -- expect no explanation.
42216a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, DuplicateDifference) {
42226a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
42236a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 5, 8};
42246a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
42256a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 5);
42266a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<const TypeParam&> m = ContainerEq(my_set);
42276a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  // Depending on the container, match may be true or false
42286a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  // But in any case there should be no explanation.
42296a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_EQ("", Explain(m, test_set));
42306a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
42312b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#endif  // GTEST_HAS_TYPED_TEST
42326a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
42336a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that mutliple missing values are reported.
42346a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble.
42356a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesMissing) {
42366a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
42376a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {2, 1, 5};
4238ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  vector<int> my_set(vals, vals + 6);
4239ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  vector<int> test_set(test_vals, test_vals + 3);
4240ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<vector<int> > m = ContainerEq(my_set);
42416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
4242b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which doesn't have these expected elements: 3, 8",
4243b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
42446a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
42456a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
42466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported.
42476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble.
42486a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAdded) {
42496a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
42506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46};
4251ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  list<size_t> my_set(vals, vals + 6);
4252ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  list<size_t> test_set(test_vals, test_vals + 7);
4253ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<const list<size_t>&> m = ContainerEq(my_set);
42546a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
4255b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 92, 46",
4256b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
42576a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
42586a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
42596a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together.
42606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) {
42616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
42626a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 92, 46};
4263ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  list<size_t> my_set(vals, vals + 6);
4264ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  list<size_t> test_set(test_vals, test_vals + 5);
4265ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<const list<size_t> > m = ContainerEq(my_set);
42666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
4267b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 92, 46,\n"
4268b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and doesn't have these expected elements: 5, 8",
42696a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan            Explain(m, test_set));
42706a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
42716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
42726a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests to see that duplicate elements are detected,
42736a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// but (as above) not reported in the explanation.
42746a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) {
42756a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
42766a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 5, 8};
4277ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  vector<int> my_set(vals, vals + 6);
4278ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  vector<int> test_set(test_vals, test_vals + 5);
4279ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<vector<int> > m = ContainerEq(my_set);
42806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_TRUE(m.Matches(my_set));
42816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
42826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  // There is nothing to report when both sets contain all the same values.
42836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_EQ("", Explain(m, test_set));
42846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
42856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
42866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that ContainerEq works for non-trivial associative containers,
42876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// like maps.
42886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, WorksForMaps) {
4289ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  map<int, std::string> my_map;
42906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  my_map[0] = "a";
42916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  my_map[1] = "b";
42926a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
4293ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  map<int, std::string> test_map;
42946a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  test_map[0] = "aa";
42956a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  test_map[1] = "b";
42966a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
4297ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<const map<int, std::string>&> m = ContainerEq(my_map);
42986a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_TRUE(m.Matches(my_map));
42996a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_map));
43006a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
4301b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n"
4302b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and doesn't have these expected elements: (0, \"a\")",
43036a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan            Explain(m, test_map));
43046a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
43056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
4306b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArray) {
43072336e9c171b5894bac98f828289f537e29691896kosak  int a1[] = {1, 2, 3};
43082336e9c171b5894bac98f828289f537e29691896kosak  int a2[] = {1, 2, 3};
43092336e9c171b5894bac98f828289f537e29691896kosak  int b[] = {1, 2, 4};
4310b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4311b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ContainerEq(a2));
4312b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, Not(ContainerEq(b)));
4313b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
4314b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4315b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) {
43162336e9c171b5894bac98f828289f537e29691896kosak  const char a1[][3] = {"hi", "lo"};
43172336e9c171b5894bac98f828289f537e29691896kosak  const char a2[][3] = {"hi", "lo"};
43182336e9c171b5894bac98f828289f537e29691896kosak  const char b[][3] = {"lo", "hi"};
4319b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4320b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  // Tests using ContainerEq() in the first dimension.
4321b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ContainerEq(a2));
4322b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, Not(ContainerEq(b)));
4323b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4324b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  // Tests using ContainerEq() in the second dimension.
4325b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1])));
4326b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1])));
4327b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
4328b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4329b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) {
43302336e9c171b5894bac98f828289f537e29691896kosak  const int a1[] = {1, 2, 3};
43312336e9c171b5894bac98f828289f537e29691896kosak  const int a2[] = {1, 2, 3};
43322336e9c171b5894bac98f828289f537e29691896kosak  const int b[] = {1, 2, 3, 4};
4333b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
43342661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  const int* const p1 = a1;
43352661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2));
43362661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b)));
4337b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
43382336e9c171b5894bac98f828289f537e29691896kosak  const int c[] = {1, 3, 2};
43392661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c)));
4340b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
4341b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4342b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, CopiesNativeArrayParameter) {
4343b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  std::string a1[][3] = {
43442336e9c171b5894bac98f828289f537e29691896kosak    {"hi", "hello", "ciao"},
43452336e9c171b5894bac98f828289f537e29691896kosak    {"bye", "see you", "ciao"}
4346b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  };
4347b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4348b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  std::string a2[][3] = {
43492336e9c171b5894bac98f828289f537e29691896kosak    {"hi", "hello", "ciao"},
43502336e9c171b5894bac98f828289f537e29691896kosak    {"bye", "see you", "ciao"}
4351b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  };
4352b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4353b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2);
4354b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, m);
4355b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4356b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  a2[0][0] = "ha";
4357b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, m);
4358b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
4359b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
4360898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForEmptyContainer) {
4361898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  const vector<int> numbers;
4362898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre()));
4363898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1))));
4364898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4365898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4366898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForNonEmptyContainer) {
4367898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  vector<unsigned> numbers;
4368898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  numbers.push_back(3);
4369898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  numbers.push_back(1);
4370898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  numbers.push_back(2);
4371898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  numbers.push_back(2);
4372898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(),
4373898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan                                    ElementsAre(3, 2, 2, 1)));
4374898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(),
4375898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan                                        ElementsAre(1, 2, 2, 3))));
4376898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4377898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4378898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForNonVectorContainer) {
4379898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  list<string> words;
4380898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  words.push_back("say");
4381898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  words.push_back("hello");
4382898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  words.push_back("world");
4383898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(words, WhenSortedBy(less<string>(),
4384898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan                                  ElementsAre("hello", "say", "world")));
4385898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(words, Not(WhenSortedBy(less<string>(),
4386898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan                                      ElementsAre("say", "hello", "world"))));
4387898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4388898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4389898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, WorksForNativeArray) {
43902336e9c171b5894bac98f828289f537e29691896kosak  const int numbers[] = {1, 3, 2, 4};
43912336e9c171b5894bac98f828289f537e29691896kosak  const int sorted_numbers[] = {1, 2, 3, 4};
4392898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4)));
4393898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, WhenSortedBy(less<int>(),
4394898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan                                    ElementsAreArray(sorted_numbers)));
4395898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4))));
4396898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4397898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4398898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, CanDescribeSelf) {
4399898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2));
4400898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_EQ("(when sorted) has 2 elements where\n"
4401898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            "element #0 is equal to 1,\n"
4402898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            "element #1 is equal to 2",
4403898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            Describe(m));
4404898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n"
4405898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            "element #0 isn't equal to 1, or\n"
4406898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            "element #1 isn't equal to 2",
4407898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            DescribeNegation(m));
4408898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4409898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4410898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedByTest, ExplainsMatchResult) {
44112336e9c171b5894bac98f828289f537e29691896kosak  const int a[] = {2, 1};
4412898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match",
4413898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a));
4414898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_EQ("which is { 1, 2 } when sorted",
4415898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan            Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a));
4416898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4417898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4418898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// WhenSorted() is a simple wrapper on WhenSortedBy().  Hence we don't
4419898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// need to test it as exhaustively as we test the latter.
4420898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4421898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedTest, WorksForEmptyContainer) {
4422898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  const vector<int> numbers;
4423898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, WhenSorted(ElementsAre()));
4424898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1))));
4425898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4426898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4427898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanTEST(WhenSortedTest, WorksForNonEmptyContainer) {
4428898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  list<string> words;
4429898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  words.push_back("3");
4430898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  words.push_back("1");
4431898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  words.push_back("2");
4432898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  words.push_back("2");
4433898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3")));
4434898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan  EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2"))));
4435898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}
4436898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan
4437a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForMapTypes) {
4438a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    map<string, int> word_counts;
4439a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    word_counts["and"] = 1;
4440a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    word_counts["the"] = 1;
4441a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    word_counts["buffalo"] = 2;
4442a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(word_counts, WhenSorted(ElementsAre(
4443a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan            Pair("and", 1), Pair("buffalo", 2), Pair("the", 1))));
4444a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(word_counts, Not(WhenSorted(ElementsAre(
4445a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan            Pair("and", 1), Pair("the", 1), Pair("buffalo", 2)))));
4446a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}
4447a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4448a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForMultiMapTypes) {
4449a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    multimap<int, int> ifib;
4450a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ifib.insert(make_pair(8, 6));
4451a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ifib.insert(make_pair(2, 3));
4452a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ifib.insert(make_pair(1, 1));
4453a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ifib.insert(make_pair(3, 4));
4454a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ifib.insert(make_pair(1, 2));
4455a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ifib.insert(make_pair(5, 5));
4456a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(ifib, WhenSorted(ElementsAre(Pair(1, 1),
4457a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                             Pair(1, 2),
4458a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                             Pair(2, 3),
4459a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                             Pair(3, 4),
4460a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                             Pair(5, 5),
4461a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                             Pair(8, 6))));
4462a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(ifib, Not(WhenSorted(ElementsAre(Pair(8, 6),
4463a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                                 Pair(2, 3),
4464a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                                 Pair(1, 1),
4465a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                                 Pair(3, 4),
4466a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                                 Pair(1, 2),
4467a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                                 Pair(5, 5)))));
4468a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}
4469a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4470a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForPolymorphicMatcher) {
4471a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    std::deque<int> d;
4472a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    d.push_back(2);
4473a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    d.push_back(1);
4474a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2)));
4475a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1))));
4476a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}
4477a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4478a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForVectorConstRefMatcher) {
4479a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    std::deque<int> d;
4480a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    d.push_back(2);
4481a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    d.push_back(1);
4482a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2);
4483a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(d, WhenSorted(vector_match));
4484a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1);
4485a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_THAT(d, Not(WhenSorted(not_vector_match)));
4486a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}
4487a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4488a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan// Deliberately bare pseudo-container.
4489a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan// Offers only begin() and end() accessors, yielding InputIterator.
4490a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wantemplate <typename T>
4491a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanclass Streamlike {
4492a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan private:
4493a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  class ConstIter;
4494a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan public:
4495a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  typedef ConstIter const_iterator;
4496a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  typedef T value_type;
4497a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4498a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  template <typename InIter>
4499a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  Streamlike(InIter first, InIter last) : remainder_(first, last) {}
4500a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4501a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  const_iterator begin() const {
4502a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    return const_iterator(this, remainder_.begin());
4503a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  }
4504a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  const_iterator end() const {
4505a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    return const_iterator(this, remainder_.end());
4506a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  }
4507a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4508a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan private:
4509a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  class ConstIter : public std::iterator<std::input_iterator_tag,
4510a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                         value_type,
4511a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan                                         ptrdiff_t,
4512cd99eb0bbd8391029cae1e05ad740f8404eb0b71kosak                                         const value_type*,
4513cd99eb0bbd8391029cae1e05ad740f8404eb0b71kosak                                         const value_type&> {
4514a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan   public:
4515a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ConstIter(const Streamlike* s,
4516a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan              typename std::list<value_type>::iterator pos)
4517a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan        : s_(s), pos_(pos) {}
4518a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4519a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    const value_type& operator*() const { return *pos_; }
4520a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    const value_type* operator->() const { return &*pos_; }
4521a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    ConstIter& operator++() {
4522a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      s_->remainder_.erase(pos_++);
4523a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      return *this;
4524a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    }
4525a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4526a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    // *iter++ is required to work (see std::istreambuf_iterator).
4527a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    // (void)iter++ is also required to work.
4528a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    class PostIncrProxy {
4529a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan     public:
4530a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      explicit PostIncrProxy(const value_type& value) : value_(value) {}
4531a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      value_type operator*() const { return value_; }
4532a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan     private:
4533a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      value_type value_;
4534a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    };
4535a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    PostIncrProxy operator++(int) {
4536a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      PostIncrProxy proxy(**this);
4537a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      ++(*this);
4538a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      return proxy;
4539a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    }
4540a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4541a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    friend bool operator==(const ConstIter& a, const ConstIter& b) {
4542a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      return a.s_ == b.s_ && a.pos_ == b.pos_;
4543a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    }
4544a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    friend bool operator!=(const ConstIter& a, const ConstIter& b) {
4545a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      return !(a == b);
4546a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    }
4547a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4548a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan   private:
4549a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    const Streamlike* s_;
4550a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    typename std::list<value_type>::iterator pos_;
4551a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  };
4552a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4553a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) {
4554a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    os << "[";
4555a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    typedef typename std::list<value_type>::const_iterator Iter;
4556a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    const char* sep = "";
4557a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) {
4558a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      os << sep << *it;
4559a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan      sep = ",";
4560a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    }
4561a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    os << "]";
4562a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    return os;
4563a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  }
4564a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4565a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  mutable std::list<value_type> remainder_;  // modified by iteration
4566a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan};
4567a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4568a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(StreamlikeTest, Iteration) {
45692336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {2, 1, 4, 5, 3};
4570a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  Streamlike<int> s(a, a + 5);
4571a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  Streamlike<int>::const_iterator it = s.begin();
4572a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  const int* ip = a;
4573a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  while (it != s.end()) {
4574a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    SCOPED_TRACE(ip - a);
4575a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan    EXPECT_EQ(*ip++, *it++);
4576a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  }
4577a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}
4578a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
45795b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#if GTEST_HAS_STD_FORWARD_LIST_
4580b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, WorksWithForwardList) {
4581b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  std::forward_list<int> container;
4582b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_THAT(container, BeginEndDistanceIs(0));
4583b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_THAT(container, Not(BeginEndDistanceIs(1)));
4584b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  container.push_front(0);
4585b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));
4586b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_THAT(container, BeginEndDistanceIs(1));
4587b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  container.push_front(0);
4588b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_THAT(container, Not(BeginEndDistanceIs(0)));
4589b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_THAT(container, BeginEndDistanceIs(2));
4590b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak}
45915b9cbbb16d774bfcb51572d52eda3f7319088e23kosak#endif  // GTEST_HAS_STD_FORWARD_LIST_
4592b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak
4593b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, WorksWithNonStdList) {
45942336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {1, 2, 3, 4, 5};
4595b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  Streamlike<int> s(a, a + 5);
4596b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_THAT(s, BeginEndDistanceIs(5));
4597b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak}
4598b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak
4599b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, CanDescribeSelf) {
4600b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  Matcher<vector<int> > m = BeginEndDistanceIs(2);
4601b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("distance between begin() and end() is equal to 2", Describe(m));
4602b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("distance between begin() and end() isn't equal to 2",
4603b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak            DescribeNegation(m));
4604b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak}
4605b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak
4606b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosakTEST(BeginEndDistanceIsTest, ExplainsResult) {
4607b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  Matcher<vector<int> > m1 = BeginEndDistanceIs(2);
4608b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  Matcher<vector<int> > m2 = BeginEndDistanceIs(Lt(2));
4609b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  Matcher<vector<int> > m3 = BeginEndDistanceIs(AnyOf(0, 3));
4610b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  Matcher<vector<int> > m4 = BeginEndDistanceIs(GreaterThan(1));
4611b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  vector<int> container;
4612b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("whose distance between begin() and end() 0 doesn't match",
4613b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak            Explain(m1, container));
4614b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("whose distance between begin() and end() 0 matches",
4615b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak            Explain(m2, container));
4616b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("whose distance between begin() and end() 0 matches",
4617b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak            Explain(m3, container));
4618b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ(
4619b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak      "whose distance between begin() and end() 0 doesn't match, which is 1 "
4620b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak      "less than 1",
4621b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak      Explain(m4, container));
4622b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  container.push_back(0);
4623b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  container.push_back(0);
4624b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("whose distance between begin() and end() 2 matches",
4625b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak            Explain(m1, container));
4626b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("whose distance between begin() and end() 2 doesn't match",
4627b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak            Explain(m2, container));
4628b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ("whose distance between begin() and end() 2 doesn't match",
4629b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak            Explain(m3, container));
4630b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak  EXPECT_EQ(
4631b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak      "whose distance between begin() and end() 2 matches, which is 1 more "
4632b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak      "than 1",
4633b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak      Explain(m4, container));
4634b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak}
4635b6a348862b3ef745ae4c43117b67c7c6f877cd7ekosak
4636a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForStreamlike) {
4637a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  // Streamlike 'container' provides only minimal iterator support.
4638a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  // Its iterators are tagged with input_iterator_tag.
46392336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {2, 1, 4, 5, 3};
46406414d806cd7d0954cce81348552fdd1e5bd31515kosak  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
4641a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5)));
4642a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4643a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}
4644a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
4645a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wanTEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) {
46462336e9c171b5894bac98f828289f537e29691896kosak  const int a[] = {2, 1, 4, 5, 3};
46476414d806cd7d0954cce81348552fdd1e5bd31515kosak  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
4648a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5);
4649a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  EXPECT_THAT(s, WhenSorted(vector_match));
4650a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan  EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3))));
4651a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan}
4652a9a59e06dd7cdfe52c988bf065bc156a7ed96a5czhanyong.wan
46531cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan// Tests using ElementsAre() and ElementsAreArray() with stream-like
46541cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan// "containers".
46551cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
46561cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(ElemensAreStreamTest, WorksForStreamlike) {
46572336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {1, 2, 3, 4, 5};
46586414d806cd7d0954cce81348552fdd1e5bd31515kosak  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
46591cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5));
46601cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3)));
46611cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan}
46621cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
46631cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(ElemensAreArrayStreamTest, WorksForStreamlike) {
46642336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {1, 2, 3, 4, 5};
46656414d806cd7d0954cce81348552fdd1e5bd31515kosak  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
46661cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
46671cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  vector<int> expected;
46681cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  expected.push_back(1);
46691cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  expected.push_back(2);
46701cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  expected.push_back(3);
46711cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  expected.push_back(4);
46721cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  expected.push_back(5);
46731cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(s, ElementsAreArray(expected));
46741cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
46751cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  expected[3] = 0;
46761cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(s, Not(ElementsAreArray(expected)));
46771cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan}
46781cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
46791f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST(ElementsAreTest, WorksWithUncopyable) {
46801f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Uncopyable objs[2];
46811f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  objs[0].set_value(-3);
46821f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  objs[1].set_value(1);
46831f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive)));
46841f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
46851f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
468606678924fa3a48708f2c90e7226dfda54badc808kosakTEST(ElementsAreTest, TakesStlContainer) {
468706678924fa3a48708f2c90e7226dfda54badc808kosak  const int actual[] = {3, 1, 2};
468806678924fa3a48708f2c90e7226dfda54badc808kosak
468906678924fa3a48708f2c90e7226dfda54badc808kosak  ::std::list<int> expected;
469006678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(3);
469106678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(1);
469206678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(2);
469306678924fa3a48708f2c90e7226dfda54badc808kosak  EXPECT_THAT(actual, ElementsAreArray(expected));
469406678924fa3a48708f2c90e7226dfda54badc808kosak
469506678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(4);
469606678924fa3a48708f2c90e7226dfda54badc808kosak  EXPECT_THAT(actual, Not(ElementsAreArray(expected)));
469706678924fa3a48708f2c90e7226dfda54badc808kosak}
469806678924fa3a48708f2c90e7226dfda54badc808kosak
4699fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Tests for UnorderedElementsAreArray()
4700fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4701fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) {
47022336e9c171b5894bac98f828289f537e29691896kosak  const int a[] = {0, 1, 2, 3, 4};
47036414d806cd7d0954cce81348552fdd1e5bd31515kosak  std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
4704fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  do {
4705fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    StringMatchResultListener listener;
4706fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a),
4707fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                   s, &listener)) << listener.str();
4708fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  } while (std::next_permutation(s.begin(), s.end()));
4709fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4710fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4711fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST(UnorderedElementsAreArrayTest, VectorBool) {
47122336e9c171b5894bac98f828289f537e29691896kosak  const bool a[] = {0, 1, 0, 1, 1};
47132336e9c171b5894bac98f828289f537e29691896kosak  const bool b[] = {1, 0, 1, 1, 0};
47146414d806cd7d0954cce81348552fdd1e5bd31515kosak  std::vector<bool> expected(a, a + GTEST_ARRAY_SIZE_(a));
47156414d806cd7d0954cce81348552fdd1e5bd31515kosak  std::vector<bool> actual(b, b + GTEST_ARRAY_SIZE_(b));
4716fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4717fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected),
4718fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                 actual, &listener)) << listener.str();
4719fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4720fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
47215579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wanTEST(UnorderedElementsAreArrayTest, WorksForStreamlike) {
47225579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  // Streamlike 'container' provides only minimal iterator support.
47235579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  // Its iterators are tagged with input_iterator_tag, and it has no
47245579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  // size() or empty() methods.
47252336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {2, 1, 4, 5, 3};
47266414d806cd7d0954cce81348552fdd1e5bd31515kosak  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
47275579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan
47285579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  ::std::vector<int> expected;
47295579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  expected.push_back(1);
47305579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  expected.push_back(2);
47315579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  expected.push_back(3);
47325579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  expected.push_back(4);
47335579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  expected.push_back(5);
47345579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  EXPECT_THAT(s, UnorderedElementsAreArray(expected));
47355579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan
47365579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  expected.push_back(6);
47375579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected)));
47385579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan}
47395579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan
474006678924fa3a48708f2c90e7226dfda54badc808kosakTEST(UnorderedElementsAreArrayTest, TakesStlContainer) {
474106678924fa3a48708f2c90e7226dfda54badc808kosak  const int actual[] = {3, 1, 2};
474206678924fa3a48708f2c90e7226dfda54badc808kosak
474306678924fa3a48708f2c90e7226dfda54badc808kosak  ::std::list<int> expected;
474406678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(1);
474506678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(2);
474606678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(3);
474706678924fa3a48708f2c90e7226dfda54badc808kosak  EXPECT_THAT(actual, UnorderedElementsAreArray(expected));
474806678924fa3a48708f2c90e7226dfda54badc808kosak
474906678924fa3a48708f2c90e7226dfda54badc808kosak  expected.push_back(4);
475006678924fa3a48708f2c90e7226dfda54badc808kosak  EXPECT_THAT(actual, Not(UnorderedElementsAreArray(expected)));
475106678924fa3a48708f2c90e7226dfda54badc808kosak}
475206678924fa3a48708f2c90e7226dfda54badc808kosak
475318489fa4f81a65ab5f42a6705c28ca2f80eab3bdkosak#if GTEST_HAS_STD_INITIALIZER_LIST_
47541cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
47551cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest, TakesInitializerList) {
47562336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {2, 1, 4, 5, 3};
47572336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(a, UnorderedElementsAreArray({1, 2, 3, 4, 5}));
47582336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(a, Not(UnorderedElementsAreArray({1, 2, 3, 4, 6})));
47591cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan}
47601cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
47611cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) {
47622336e9c171b5894bac98f828289f537e29691896kosak  const string a[5] = {"a", "b", "c", "d", "e"};
47632336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(a, UnorderedElementsAreArray({"a", "b", "c", "d", "e"}));
47642336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(a, Not(UnorderedElementsAreArray({"a", "b", "c", "d", "ef"})));
47651cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan}
47661cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
47671cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) {
47682336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {2, 1, 4, 5, 3};
47691cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(a, UnorderedElementsAreArray(
47702336e9c171b5894bac98f828289f537e29691896kosak      {Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)}));
47711cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(a, Not(UnorderedElementsAreArray(
47722336e9c171b5894bac98f828289f537e29691896kosak      {Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)})));
47731cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan}
47741cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
47751cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wanTEST(UnorderedElementsAreArrayTest,
47761cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan     TakesInitializerListOfDifferentTypedMatchers) {
47772336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {2, 1, 4, 5, 3};
47781cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  // The compiler cannot infer the type of the initializer list if its
47791cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  // elements have different types.  We must explicitly specify the
47801cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  // unified element type in this case.
47811cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int> >(
47822336e9c171b5894bac98f828289f537e29691896kosak      {Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)}));
47831cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan  EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int> >(
47842336e9c171b5894bac98f828289f537e29691896kosak      {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)})));
47851cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan}
47861cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
478718489fa4f81a65ab5f42a6705c28ca2f80eab3bdkosak#endif  // GTEST_HAS_STD_INITIALIZER_LIST_
47881cc1d4bcecdac906250f863bef2636b278eb679dzhanyong.wan
4789fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass UnorderedElementsAreTest : public testing::Test {
4790fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan protected:
4791fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  typedef std::vector<int> IntVec;
4792fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan};
4793fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
47941f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahueTEST_F(UnorderedElementsAreTest, WorksWithUncopyable) {
47951f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  Uncopyable objs[2];
47961f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  objs[0].set_value(-3);
47971f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  objs[1].set_value(1);
47981f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue  EXPECT_THAT(objs,
47991f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue              UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3)));
48001f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue}
48011f5fdea417f1a55cffcfc0711d345d1d8ca2bc01billydonahue
4802fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) {
48032336e9c171b5894bac98f828289f537e29691896kosak  const int a[] = {1, 2, 3};
48046414d806cd7d0954cce81348552fdd1e5bd31515kosak  std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
4805fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  do {
4806fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    StringMatchResultListener listener;
4807fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4808fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                   s, &listener)) << listener.str();
4809fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  } while (std::next_permutation(s.begin(), s.end()));
4810fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4811fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4812fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) {
48132336e9c171b5894bac98f828289f537e29691896kosak  const int a[] = {1, 2, 3};
48146414d806cd7d0954cce81348552fdd1e5bd31515kosak  std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
4815fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<Matcher<int> > mv;
4816fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  mv.push_back(1);
4817fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  mv.push_back(2);
4818fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  mv.push_back(2);
4819fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // The element with value '3' matches nothing: fail fast.
4820fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4821fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4822fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                  s, &listener)) << listener.str();
4823fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4824fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
48255579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wanTEST_F(UnorderedElementsAreTest, WorksForStreamlike) {
48265579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  // Streamlike 'container' provides only minimal iterator support.
48275579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  // Its iterators are tagged with input_iterator_tag, and it has no
48285579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  // size() or empty() methods.
48292336e9c171b5894bac98f828289f537e29691896kosak  const int a[5] = {2, 1, 4, 5, 3};
48306414d806cd7d0954cce81348552fdd1e5bd31515kosak  Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a));
48315579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan
48325579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5));
48335579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan  EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5)));
48345579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan}
48355579c1a8b1591d4932495b8cb3cc61f3edca2555zhanyong.wan
4836fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// One naive implementation of the matcher runs in O(N!) time, which is too
4837fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// slow for many real-world inputs. This test shows that our matcher can match
4838fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// 100 inputs very quickly (a few milliseconds).  An O(100!) is 10^158
4839fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// iterations and obviously effectively incomputable.
4840fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [ RUN      ] UnorderedElementsAreTest.Performance
4841fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [       OK ] UnorderedElementsAreTest.Performance (4 ms)
4842fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, Performance) {
4843fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<int> s;
4844fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<Matcher<int> > mv;
4845fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  for (int i = 0; i < 100; ++i) {
4846fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    s.push_back(i);
4847fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    mv.push_back(_);
4848fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
4849fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  mv[50] = Eq(0);
4850fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4851fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4852fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                 s, &listener)) << listener.str();
4853fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4854fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4855fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Another variant of 'Performance' with similar expectations.
4856fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [ RUN      ] UnorderedElementsAreTest.PerformanceHalfStrict
4857fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// [       OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms)
4858fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) {
4859fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<int> s;
4860fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<Matcher<int> > mv;
4861fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  for (int i = 0; i < 100; ++i) {
4862fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    s.push_back(i);
4863fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    if (i & 1) {
4864fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      mv.push_back(_);
4865fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    } else {
4866fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      mv.push_back(i);
4867fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    }
4868fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
4869fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4870fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv),
4871fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                 s, &listener)) << listener.str();
4872fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4873fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4874fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageCountWrong) {
4875fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<int> v;
4876fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back(4);
4877fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4878fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4879fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                  v, &listener)) << listener.str();
4880fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(listener.str(), Eq("which has 1 element"));
4881fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4882fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4883fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) {
4884fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<int> v;
4885fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4886fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3),
4887fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                  v, &listener)) << listener.str();
4888fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(listener.str(), Eq(""));
4889fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4890fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4891fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) {
4892fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<int> v;
4893fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back(1);
4894fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back(1);
4895fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4896fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4897fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                  v, &listener)) << listener.str();
4898fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4899fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      listener.str(),
4900fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Eq("where the following matchers don't match any elements:\n"
4901fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         "matcher #1: is equal to 2"));
4902fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4903fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4904fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) {
4905fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<int> v;
4906fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back(1);
4907fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back(2);
4908fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4909fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1),
4910fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                  v, &listener)) << listener.str();
4911fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4912fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      listener.str(),
4913fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Eq("where the following elements don't match any matchers:\n"
4914fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         "element #1: 2"));
4915fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4916fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4917fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) {
4918fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<int> v;
4919fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back(2);
4920fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back(3);
4921fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4922fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2),
4923fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                                  v, &listener)) << listener.str();
4924fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4925fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      listener.str(),
4926fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Eq("where"
4927fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " the following matchers don't match any elements:\n"
4928fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         "matcher #0: is equal to 1\n"
4929fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         "and"
4930fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " where"
4931fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " the following elements don't match any matchers:\n"
4932fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         "element #1: 3"));
4933fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4934fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4935fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Test helper for formatting element, matcher index pairs in expectations.
4936fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanstatic string EMString(int element, int matcher) {
4937fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  stringstream ss;
4938fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  ss << "(element #" << element << ", matcher #" << matcher << ")";
4939fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  return ss.str();
4940fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4941fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4942fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) {
4943fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // A situation where all elements and matchers have a match
4944fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // associated with them, but the max matching is not perfect.
4945fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<string> v;
4946fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back("a");
4947fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back("b");
4948fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  v.push_back("c");
4949fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  StringMatchResultListener listener;
4950fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_FALSE(ExplainMatchResult(
4951fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      UnorderedElementsAre("a", "a", AnyOf("b", "c")), v, &listener))
4952fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      << listener.str();
4953fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4954fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  string prefix =
4955fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      "where no permutation of the elements can satisfy all matchers, "
4956fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      "and the closest match is 2 of 3 matchers with the "
4957fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      "pairings:\n";
4958fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4959fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // We have to be a bit loose here, because there are 4 valid max matches.
4960fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4961fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      listener.str(),
4962fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      AnyOf(prefix + "{\n  " + EMString(0, 0) +
4963fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                     ",\n  " + EMString(1, 2) + "\n}",
4964fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan            prefix + "{\n  " + EMString(0, 1) +
4965fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                     ",\n  " + EMString(1, 2) + "\n}",
4966fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan            prefix + "{\n  " + EMString(0, 0) +
4967fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                     ",\n  " + EMString(2, 2) + "\n}",
4968fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan            prefix + "{\n  " + EMString(0, 1) +
4969fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                     ",\n  " + EMString(2, 2) + "\n}"));
4970fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4971fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4972fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, Describe) {
4973fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()),
4974fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan              Eq("is empty"));
4975fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4976fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Describe<IntVec>(UnorderedElementsAre(345)),
4977fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Eq("has 1 element and that element is equal to 345"));
4978fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4979fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Describe<IntVec>(UnorderedElementsAre(111, 222, 333)),
4980fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Eq("has 3 elements and there exists some permutation "
4981fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         "of elements such that:\n"
4982fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " - element #0 is equal to 111, and\n"
4983fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " - element #1 is equal to 222, and\n"
4984fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " - element #2 is equal to 333"));
4985fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
4986fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
4987fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(UnorderedElementsAreTest, DescribeNegation) {
4988fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()),
4989fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan              Eq("isn't empty"));
4990fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4991fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      DescribeNegation<IntVec>(UnorderedElementsAre(345)),
4992fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Eq("doesn't have 1 element, or has 1 element that isn't equal to 345"));
4993fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(
4994fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)),
4995fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      Eq("doesn't have 3 elements, or there exists no permutation "
4996fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         "of elements such that:\n"
4997fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " - element #0 is equal to 123, and\n"
4998fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " - element #1 is equal to 234, and\n"
4999fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan         " - element #2 is equal to 345"));
5000fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
5001fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5002fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wannamespace {
5003fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5004fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Used as a check on the more complex max flow method used in the
5005fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// real testing::internal::FindMaxBipartiteMatching. This method is
5006fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// compatible but runs in worst-case factorial time, so we only
5007fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// use it in testing for small problem sizes.
5008fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wantemplate <typename Graph>
5009fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BacktrackingMaxBPMState {
5010fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan public:
5011fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // Does not take ownership of 'g'.
5012fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  explicit BacktrackingMaxBPMState(const Graph* g) : graph_(g) { }
5013fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5014fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  ElementMatcherPairs Compute() {
5015fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    if (graph_->LhsSize() == 0 || graph_->RhsSize() == 0) {
5016fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      return best_so_far_;
5017fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    }
5018fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    lhs_used_.assign(graph_->LhsSize(), kUnused);
5019fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    rhs_used_.assign(graph_->RhsSize(), kUnused);
5020fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) {
5021fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      matches_.clear();
5022fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      RecurseInto(irhs);
5023fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      if (best_so_far_.size() == graph_->RhsSize())
5024fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        break;
5025fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    }
5026fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    return best_so_far_;
5027fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
5028fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5029fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan private:
5030fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  static const size_t kUnused = static_cast<size_t>(-1);
5031fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5032fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  void PushMatch(size_t lhs, size_t rhs) {
5033fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    matches_.push_back(ElementMatcherPair(lhs, rhs));
5034fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    lhs_used_[lhs] = rhs;
5035fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    rhs_used_[rhs] = lhs;
5036fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    if (matches_.size() > best_so_far_.size()) {
5037fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      best_so_far_ = matches_;
5038fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    }
5039fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
5040fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5041fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  void PopMatch() {
5042fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    const ElementMatcherPair& back = matches_.back();
5043fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    lhs_used_[back.first] = kUnused;
5044fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    rhs_used_[back.second] = kUnused;
5045fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    matches_.pop_back();
5046fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
5047fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5048fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  bool RecurseInto(size_t irhs) {
5049fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    if (rhs_used_[irhs] != kUnused) {
5050fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      return true;
5051fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    }
5052fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) {
5053fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      if (lhs_used_[ilhs] != kUnused) {
5054fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        continue;
5055fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      }
5056fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      if (!graph_->HasEdge(ilhs, irhs)) {
5057fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        continue;
5058fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      }
5059fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      PushMatch(ilhs, irhs);
5060fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      if (best_so_far_.size() == graph_->RhsSize()) {
5061fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        return false;
5062fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      }
5063fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      for (size_t mi = irhs + 1; mi < graph_->RhsSize(); ++mi) {
5064fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        if (!RecurseInto(mi)) return false;
5065fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      }
5066fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      PopMatch();
5067fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    }
5068fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    return true;
5069fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
5070fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5071fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  const Graph* graph_;  // not owned
5072fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<size_t> lhs_used_;
5073fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  std::vector<size_t> rhs_used_;
5074fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  ElementMatcherPairs matches_;
5075fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  ElementMatcherPairs best_so_far_;
5076fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan};
5077fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5078fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wantemplate <typename Graph>
5079fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanconst size_t BacktrackingMaxBPMState<Graph>::kUnused;
5080fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5081fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}  // namespace
5082fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5083fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Implement a simple backtracking algorithm to determine if it is possible
5084fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// to find one element per matcher, without reusing elements.
5085fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wantemplate <typename Graph>
5086fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanElementMatcherPairs
5087fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanFindBacktrackingMaxBPM(const Graph& g) {
5088fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  return BacktrackingMaxBPMState<Graph>(&g).Compute();
5089fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
5090fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5091fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BacktrackingBPMTest : public ::testing::Test { };
5092fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5093fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Tests the MaxBipartiteMatching algorithm with square matrices.
5094fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// The single int param is the # of nodes on each of the left and right sides.
5095fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BipartiteTest : public ::testing::TestWithParam<int> { };
5096fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5097fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Verify all match graphs up to some moderate number of edges.
5098fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_P(BipartiteTest, Exhaustive) {
5099fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  int nodes = GetParam();
5100fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  MatchMatrix graph(nodes, nodes);
5101fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  do {
5102fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    ElementMatcherPairs matches =
5103fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        internal::FindMaxBipartiteMatching(graph);
5104fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), matches.size())
5105fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << "graph: " << graph.DebugString();
5106fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    // Check that all elements of matches are in the graph.
5107fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    // Check that elements of first and second are unique.
5108fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    std::vector<bool> seen_element(graph.LhsSize());
5109fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    std::vector<bool> seen_matcher(graph.RhsSize());
5110fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    SCOPED_TRACE(PrintToString(matches));
5111fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    for (size_t i = 0; i < matches.size(); ++i) {
5112fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      size_t ilhs = matches[i].first;
5113fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      size_t irhs = matches[i].second;
5114fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      EXPECT_TRUE(graph.HasEdge(ilhs, irhs));
5115fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      EXPECT_FALSE(seen_element[ilhs]);
5116fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      EXPECT_FALSE(seen_matcher[irhs]);
5117fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      seen_element[ilhs] = true;
5118fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan      seen_matcher[irhs] = true;
5119fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    }
5120fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  } while (graph.NextGraph());
5121fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
5122fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5123fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteTest,
5124fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                        ::testing::Range(0, 5));
5125fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5126fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Parameterized by a pair interpreted as (LhsSize, RhsSize).
5127fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BipartiteNonSquareTest
5128fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    : public ::testing::TestWithParam<std::pair<size_t, size_t> > {
5129fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan};
5130fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5131fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_F(BipartiteNonSquareTest, SimpleBacktracking) {
5132fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  //   .......
5133fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // 0:-----\ :
5134fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // 1:---\ | :
5135fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // 2:---\ | :
5136fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  // 3:-\ | | :
5137fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  //  :.......:
5138fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  //    0 1 2
5139fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  MatchMatrix g(4, 3);
51402336e9c171b5894bac98f828289f537e29691896kosak  static const int kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}};
51416414d806cd7d0954cce81348552fdd1e5bd31515kosak  for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) {
5142fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    g.SetEdge(kEdges[i][0], kEdges[i][1], true);
5143fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
5144fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  EXPECT_THAT(FindBacktrackingMaxBPM(g),
5145fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan              ElementsAre(Pair(3, 0),
5146fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                          Pair(AnyOf(1, 2), 1),
5147fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan                          Pair(0, 2))) << g.DebugString();
5148fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
5149fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5150fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Verify a few nonsquare matrices.
5151fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_P(BipartiteNonSquareTest, Exhaustive) {
5152fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  size_t nlhs = GetParam().first;
5153fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  size_t nrhs = GetParam().second;
5154fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  MatchMatrix graph(nlhs, nrhs);
5155fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  do {
5156fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
5157fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan              internal::FindMaxBipartiteMatching(graph).size())
5158fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << "graph: " << graph.DebugString()
5159fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << "\nbacktracking: "
5160fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << PrintToString(FindBacktrackingMaxBPM(graph))
5161fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << "\nmax flow: "
5162fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << PrintToString(internal::FindMaxBipartiteMatching(graph));
5163fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  } while (graph.NextGraph());
5164fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
5165fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5166fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteNonSquareTest,
5167fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    testing::Values(
5168fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(1, 2),
5169fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(2, 1),
5170fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(3, 2),
5171fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(2, 3),
5172fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(4, 1),
5173fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(1, 4),
5174fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(4, 3),
5175fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(3, 4)));
5176fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5177fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanclass BipartiteRandomTest
5178fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    : public ::testing::TestWithParam<std::pair<int, int> > {
5179fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan};
5180fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5181fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Verifies a large sample of larger graphs.
5182fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanTEST_P(BipartiteRandomTest, LargerNets) {
5183fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  int nodes = GetParam().first;
5184fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  int iters = GetParam().second;
5185fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  MatchMatrix graph(nodes, nodes);
5186fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5187fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  testing::internal::Int32 seed = GTEST_FLAG(random_seed);
5188fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  if (seed == 0) {
5189fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    seed = static_cast<testing::internal::Int32>(time(NULL));
5190fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
5191fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5192fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  for (; iters > 0; --iters, ++seed) {
5193fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    srand(static_cast<int>(seed));
5194fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    graph.Randomize();
5195fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
5196fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan              internal::FindMaxBipartiteMatching(graph).size())
5197fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << " graph: " << graph.DebugString()
5198fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        << "\nTo reproduce the failure, rerun the test with the flag"
5199fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan           " --" << GTEST_FLAG_PREFIX_ << "random_seed=" << seed;
5200fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan  }
5201fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan}
5202fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5203fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan// Test argument is a std::pair<int, int> representing (nodes, iters).
5204fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wanINSTANTIATE_TEST_CASE_P(Samples, BipartiteRandomTest,
5205fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan    testing::Values(
5206fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(5, 10000),
5207fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(6, 5000),
5208fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(7, 2000),
5209fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(8, 500),
5210fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan        std::make_pair(9, 100)));
5211fb25d5391143a0fd4cbce862f19472ddc2a1ecabzhanyong.wan
5212736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// Tests IsReadableTypeName().
5213736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan
5214736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) {
5215736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_TRUE(IsReadableTypeName("int"));
5216736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_TRUE(IsReadableTypeName("const unsigned char*"));
5217736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_TRUE(IsReadableTypeName("MyMap<int, void*>"));
5218736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_TRUE(IsReadableTypeName("void (*)(int, bool)"));
5219736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan}
5220736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan
5221736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) {
5222736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_TRUE(IsReadableTypeName("my_long_namespace::MyClassName"));
5223736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_TRUE(IsReadableTypeName("int [5][6][7][8][9][10][11]"));
5224736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_TRUE(IsReadableTypeName("my_namespace::MyOuterClass::MyInnerClass"));
5225736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan}
5226736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan
5227736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) {
5228736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_FALSE(
5229736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan      IsReadableTypeName("basic_string<char, std::char_traits<char> >"));
5230736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_FALSE(IsReadableTypeName("std::vector<int, std::alloc_traits<int> >"));
5231736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan}
5232736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan
5233736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wanTEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) {
5234736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  EXPECT_FALSE(IsReadableTypeName("void (&)(int, bool, char, float)"));
5235736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan}
5236736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan
52374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests JoinAsTuple().
52384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsEmptyTuple) {
52404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("", JoinAsTuple(Strings()));
52414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
52424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsOneTuple) {
52442336e9c171b5894bac98f828289f537e29691896kosak  const char* fields[] = {"1"};
52454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1)));
52464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
52474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTwoTuple) {
52492336e9c171b5894bac98f828289f537e29691896kosak  const char* fields[] = {"1", "a"};
52504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2)));
52514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
52524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTenTuple) {
52542336e9c171b5894bac98f828289f537e29691896kosak  const char* fields[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
52554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)",
52564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            JoinAsTuple(Strings(fields, fields + 10)));
52574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
52584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests FormatMatcherDescription().
52604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) {
52624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("is even",
5263b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan            FormatMatcherDescription(false, "IsEven", Strings()));
5264b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan  EXPECT_EQ("not (is even)",
5265b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan            FormatMatcherDescription(true, "IsEven", Strings()));
52664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52672336e9c171b5894bac98f828289f537e29691896kosak  const char* params[] = {"5"};
52684a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("equals 5",
5269b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan            FormatMatcherDescription(false, "Equals",
52704a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 1)));
52714a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52722336e9c171b5894bac98f828289f537e29691896kosak  const char* params2[] = {"5", "8"};
52734a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("is in range (5, 8)",
5274b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan            FormatMatcherDescription(false, "IsInRange",
52754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params2, params2 + 2)));
52764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
52774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
52782b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::mutable_impl().
52792b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessMutableImpl) {
52802b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
52812b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  DivisibleByImpl& impl = m.mutable_impl();
52822b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_EQ(42, impl.divider());
52832b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
52842b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  impl.set_divider(0);
52852b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_EQ(0, m.mutable_impl().divider());
52862b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan}
52872b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
52882b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::impl().
52892b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessImpl) {
52902b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
52912b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  const DivisibleByImpl& impl = m.impl();
52922b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_EQ(42, impl.divider());
52932b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan}
52942b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
5295b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(MatcherTupleTest, ExplainsMatchFailure) {
5296b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  stringstream ss1;
5297b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)),
5298b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                             make_tuple('a', 10), &ss1);
5299b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("", ss1.str());  // Successful match.
5300b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
5301b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  stringstream ss2;
5302b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5303b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                             make_tuple(2, 'b'), &ss2);
5304b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("  Expected arg #0: is > 5\n"
5305b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "           Actual: 2, which is 3 less than 5\n"
5306d60c5f41c2842effec130a9b0483b92dbbed6e55zhanyong.wan            "  Expected arg #1: is equal to 'a' (97, 0x61)\n"
5307d60c5f41c2842effec130a9b0483b92dbbed6e55zhanyong.wan            "           Actual: 'b' (98, 0x62)\n",
5308b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            ss2.str());  // Failed match where both arguments need explanation.
5309b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
5310b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  stringstream ss3;
5311b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
5312b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                             make_tuple(2, 'a'), &ss3);
5313b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("  Expected arg #0: is > 5\n"
5314b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "           Actual: 2, which is 3 less than 5\n",
5315b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            ss3.str());  // Failed match where only one argument needs
5316b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                         // explanation.
5317b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
5318b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
531933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Tests Each().
532033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
532133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, ExplainsMatchResultCorrectly) {
532233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  set<int> a;  // empty
532333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
532433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  Matcher<set<int> > m = Each(2);
532533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("", Explain(m, a));
532633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
5327736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan  Matcher<const int(&)[1]> n = Each(1);  // NOLINT
532833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
53292336e9c171b5894bac98f828289f537e29691896kosak  const int b[1] = {1};
533033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("", Explain(n, b));
533133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
533233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  n = Each(3);
533333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("whose element #0 doesn't match", Explain(n, b));
533433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
533533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  a.insert(1);
533633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  a.insert(2);
533733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  a.insert(3);
533833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  m = Each(GreaterThan(0));
533933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("", Explain(m, a));
534033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
534133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  m = Each(GreaterThan(10));
534233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10",
534333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan            Explain(m, a));
534433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
534533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
534633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, DescribesItselfCorrectly) {
534733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  Matcher<vector<int> > m = Each(1);
534833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("only contains elements that is equal to 1", Describe(m));
534933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
535033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  Matcher<vector<int> > m2 = Not(m);
535133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2));
535233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
535333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
535433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, MatchesVectorWhenAllElementsMatch) {
535533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  vector<int> some_vector;
535633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Each(1));
535733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  some_vector.push_back(3);
535833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Not(Each(1)));
535933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Each(3));
536033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  some_vector.push_back(1);
536133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  some_vector.push_back(2);
536233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Not(Each(3)));
536333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Each(Lt(3.5)));
536433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
536533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  vector<string> another_vector;
536633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("fee");
536733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_vector, Each(string("fee")));
536833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("fie");
536933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("foe");
537033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("fum");
537133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_vector, Not(Each(string("fee"))));
537233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
537333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
537433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, MatchesMapWhenAllElementsMatch) {
537533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  map<const char*, int> my_map;
537633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  const char* bar = "a string";
537733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  my_map[bar] = 2;
537833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(my_map, Each(make_pair(bar, 2)));
537933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
538033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  map<string, int> another_map;
538133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
538233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["fee"] = 1;
538333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
538433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["fie"] = 2;
538533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["foe"] = 3;
538633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["fum"] = 4;
538733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1))));
538833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1))));
538933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Each(Pair(_, Gt(0))));
539033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
539133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
539233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, AcceptsMatcher) {
53932336e9c171b5894bac98f828289f537e29691896kosak  const int a[] = {1, 2, 3};
539433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(a, Each(Gt(0)));
539533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(a, Not(Each(Gt(1))));
539633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
539733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
539833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, WorksForNativeArrayAsTuple) {
53992336e9c171b5894bac98f828289f537e29691896kosak  const int a[] = {1, 2};
540033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  const int* const pointer = a;
540133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0)));
540233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1))));
540333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
540433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
5405ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// For testing Pointwise().
5406ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanclass IsHalfOfMatcher {
5407ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan public:
5408ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  template <typename T1, typename T2>
5409ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  bool MatchAndExplain(const tuple<T1, T2>& a_pair,
5410ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan                       MatchResultListener* listener) const {
5411ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    if (get<0>(a_pair) == get<1>(a_pair)/2) {
5412ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan      *listener << "where the second is " << get<1>(a_pair);
5413ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan      return true;
5414ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    } else {
5415ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan      *listener << "where the second/2 is " << get<1>(a_pair)/2;
5416ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan      return false;
5417ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    }
5418ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  }
5419ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5420ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeTo(ostream* os) const {
5421ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    *os << "are a pair where the first is half of the second";
5422ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  }
5423ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5424ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  void DescribeNegationTo(ostream* os) const {
5425ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan    *os << "are a pair where the first isn't half of the second";
5426ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  }
5427ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan};
5428ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5429ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanPolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() {
5430ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  return MakePolymorphicMatcher(IsHalfOfMatcher());
5431ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5432ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5433ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, DescribesSelf) {
5434ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  vector<int> rhs;
5435ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(1);
5436ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(2);
5437ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(3);
5438ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs);
5439ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("contains 3 values, where each value and its corresponding value "
5440ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            "in { 1, 2, 3 } are a pair where the first is half of the second",
5441ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            Describe(m));
5442ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("doesn't contain exactly 3 values, or contains a value x at some "
5443ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            "index i where x and the i-th value of { 1, 2, 3 } are a pair "
5444ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            "where the first isn't half of the second",
5445ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            DescribeNegation(m));
5446ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5447ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5448ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, MakesCopyOfRhs) {
5449ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  list<signed char> rhs;
5450ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(2);
5451ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(4);
5452ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
54532336e9c171b5894bac98f828289f537e29691896kosak  int lhs[] = {1, 2};
5454ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs);
5455ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, m);
5456ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5457ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  // Changing rhs now shouldn't affect m, which made a copy of rhs.
5458ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(6);
5459ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, m);
5460ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5461ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5462ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, WorksForLhsNativeArray) {
54632336e9c171b5894bac98f828289f537e29691896kosak  const int lhs[] = {1, 2, 3};
5464ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  vector<int> rhs;
5465ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(2);
5466ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(4);
5467ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  rhs.push_back(6);
5468ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Pointwise(Lt(), rhs));
5469ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5470ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5471ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5472ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, WorksForRhsNativeArray) {
54732336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[] = {1, 2, 3};
5474ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  vector<int> lhs;
5475ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  lhs.push_back(2);
5476ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  lhs.push_back(4);
5477ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  lhs.push_back(6);
5478ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Pointwise(Gt(), rhs));
5479ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs)));
5480ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5481ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
54822336e9c171b5894bac98f828289f537e29691896kosak#if GTEST_HAS_STD_INITIALIZER_LIST_
54832336e9c171b5894bac98f828289f537e29691896kosak
54842336e9c171b5894bac98f828289f537e29691896kosakTEST(PointwiseTest, WorksForRhsInitializerList) {
54852336e9c171b5894bac98f828289f537e29691896kosak  const vector<int> lhs{2, 4, 6};
54862336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Pointwise(Gt(), {1, 2, 3}));
54872336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Not(Pointwise(Lt(), {3, 3, 7})));
54882336e9c171b5894bac98f828289f537e29691896kosak}
54892336e9c171b5894bac98f828289f537e29691896kosak
54902336e9c171b5894bac98f828289f537e29691896kosak#endif  // GTEST_HAS_STD_INITIALIZER_LIST_
54912336e9c171b5894bac98f828289f537e29691896kosak
5492ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, RejectsWrongSize) {
54932336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[2] = {1, 2};
54942336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[1] = {0};
5495ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs)));
5496ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("which contains 2 values",
5497ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            Explain(Pointwise(Gt(), rhs), lhs));
5498ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
54992336e9c171b5894bac98f828289f537e29691896kosak  const int rhs2[3] = {0, 1, 2};
5500ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2)));
5501ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5502ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5503ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, RejectsWrongContent) {
55042336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[3] = {1, 2, 3};
55052336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[3] = {2, 6, 4};
5506ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs)));
5507ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("where the value pair (2, 6) at index #1 don't match, "
5508ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            "where the second/2 is 3",
5509ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan            Explain(Pointwise(IsHalfOf(), rhs), lhs));
5510ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5511ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5512ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, AcceptsCorrectContent) {
55132336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[3] = {1, 2, 3};
55142336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[3] = {2, 4, 6};
5515ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs));
5516ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs));
5517ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5518ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5519ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanTEST(PointwiseTest, AllowsMonomorphicInnerMatcher) {
55202336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[3] = {1, 2, 3};
55212336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[3] = {2, 4, 6};
5522ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();
5523ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Pointwise(m1, rhs));
5524ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs));
5525ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
5526ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  // This type works as a tuple<const double&, const int&> can be
5527ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  // implicitly cast to tuple<double, int>.
5528ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  const Matcher<tuple<double, int> > m2 = IsHalfOf();
5529ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_THAT(lhs, Pointwise(m2, rhs));
5530ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan  EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs));
5531ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}
5532ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan
55332336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, DescribesSelf) {
55342336e9c171b5894bac98f828289f537e29691896kosak  vector<int> rhs;
55352336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(1);
55362336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(2);
55372336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(3);
55382336e9c171b5894bac98f828289f537e29691896kosak  const Matcher<const vector<int>&> m = UnorderedPointwise(IsHalfOf(), rhs);
55392336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_EQ(
55402336e9c171b5894bac98f828289f537e29691896kosak      "has 3 elements and there exists some permutation of elements such "
55412336e9c171b5894bac98f828289f537e29691896kosak      "that:\n"
55422336e9c171b5894bac98f828289f537e29691896kosak      " - element #0 and 1 are a pair where the first is half of the second, "
55432336e9c171b5894bac98f828289f537e29691896kosak      "and\n"
55442336e9c171b5894bac98f828289f537e29691896kosak      " - element #1 and 2 are a pair where the first is half of the second, "
55452336e9c171b5894bac98f828289f537e29691896kosak      "and\n"
55462336e9c171b5894bac98f828289f537e29691896kosak      " - element #2 and 3 are a pair where the first is half of the second",
55472336e9c171b5894bac98f828289f537e29691896kosak      Describe(m));
55482336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_EQ(
55492336e9c171b5894bac98f828289f537e29691896kosak      "doesn't have 3 elements, or there exists no permutation of elements "
55502336e9c171b5894bac98f828289f537e29691896kosak      "such that:\n"
55512336e9c171b5894bac98f828289f537e29691896kosak      " - element #0 and 1 are a pair where the first is half of the second, "
55522336e9c171b5894bac98f828289f537e29691896kosak      "and\n"
55532336e9c171b5894bac98f828289f537e29691896kosak      " - element #1 and 2 are a pair where the first is half of the second, "
55542336e9c171b5894bac98f828289f537e29691896kosak      "and\n"
55552336e9c171b5894bac98f828289f537e29691896kosak      " - element #2 and 3 are a pair where the first is half of the second",
55562336e9c171b5894bac98f828289f537e29691896kosak      DescribeNegation(m));
55572336e9c171b5894bac98f828289f537e29691896kosak}
55582336e9c171b5894bac98f828289f537e29691896kosak
55592336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, MakesCopyOfRhs) {
55602336e9c171b5894bac98f828289f537e29691896kosak  list<signed char> rhs;
55612336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(2);
55622336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(4);
55632336e9c171b5894bac98f828289f537e29691896kosak
55642336e9c171b5894bac98f828289f537e29691896kosak  int lhs[] = {2, 1};
55652336e9c171b5894bac98f828289f537e29691896kosak  const Matcher<const int (&)[2]> m = UnorderedPointwise(IsHalfOf(), rhs);
55662336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, m);
55672336e9c171b5894bac98f828289f537e29691896kosak
55682336e9c171b5894bac98f828289f537e29691896kosak  // Changing rhs now shouldn't affect m, which made a copy of rhs.
55692336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(6);
55702336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, m);
55712336e9c171b5894bac98f828289f537e29691896kosak}
55722336e9c171b5894bac98f828289f537e29691896kosak
55732336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, WorksForLhsNativeArray) {
55742336e9c171b5894bac98f828289f537e29691896kosak  const int lhs[] = {1, 2, 3};
55752336e9c171b5894bac98f828289f537e29691896kosak  vector<int> rhs;
55762336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(4);
55772336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(6);
55782336e9c171b5894bac98f828289f537e29691896kosak  rhs.push_back(2);
55792336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, UnorderedPointwise(Lt(), rhs));
55802336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));
55812336e9c171b5894bac98f828289f537e29691896kosak}
55822336e9c171b5894bac98f828289f537e29691896kosak
55832336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, WorksForRhsNativeArray) {
55842336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[] = {1, 2, 3};
55852336e9c171b5894bac98f828289f537e29691896kosak  vector<int> lhs;
55862336e9c171b5894bac98f828289f537e29691896kosak  lhs.push_back(4);
55872336e9c171b5894bac98f828289f537e29691896kosak  lhs.push_back(2);
55882336e9c171b5894bac98f828289f537e29691896kosak  lhs.push_back(6);
55892336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, UnorderedPointwise(Gt(), rhs));
55902336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), rhs)));
55912336e9c171b5894bac98f828289f537e29691896kosak}
55922336e9c171b5894bac98f828289f537e29691896kosak
55932336e9c171b5894bac98f828289f537e29691896kosak#if GTEST_HAS_STD_INITIALIZER_LIST_
55942336e9c171b5894bac98f828289f537e29691896kosak
55952336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, WorksForRhsInitializerList) {
55962336e9c171b5894bac98f828289f537e29691896kosak  const vector<int> lhs{2, 4, 6};
55972336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, UnorderedPointwise(Gt(), {5, 1, 3}));
55982336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), {1, 1, 7})));
55992336e9c171b5894bac98f828289f537e29691896kosak}
56002336e9c171b5894bac98f828289f537e29691896kosak
56012336e9c171b5894bac98f828289f537e29691896kosak#endif  // GTEST_HAS_STD_INITIALIZER_LIST_
56022336e9c171b5894bac98f828289f537e29691896kosak
56032336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, RejectsWrongSize) {
56042336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[2] = {1, 2};
56052336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[1] = {0};
56062336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs)));
56072336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_EQ("which has 2 elements",
56082336e9c171b5894bac98f828289f537e29691896kosak            Explain(UnorderedPointwise(Gt(), rhs), lhs));
56092336e9c171b5894bac98f828289f537e29691896kosak
56102336e9c171b5894bac98f828289f537e29691896kosak  const int rhs2[3] = {0, 1, 2};
56112336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs2)));
56122336e9c171b5894bac98f828289f537e29691896kosak}
56132336e9c171b5894bac98f828289f537e29691896kosak
56142336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, RejectsWrongContent) {
56152336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[3] = {1, 2, 3};
56162336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[3] = {2, 6, 6};
56172336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, Not(UnorderedPointwise(IsHalfOf(), rhs)));
56182336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_EQ("where the following elements don't match any matchers:\n"
56192336e9c171b5894bac98f828289f537e29691896kosak            "element #1: 2",
56202336e9c171b5894bac98f828289f537e29691896kosak            Explain(UnorderedPointwise(IsHalfOf(), rhs), lhs));
56212336e9c171b5894bac98f828289f537e29691896kosak}
56222336e9c171b5894bac98f828289f537e29691896kosak
56232336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, AcceptsCorrectContentInSameOrder) {
56242336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[3] = {1, 2, 3};
56252336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[3] = {2, 4, 6};
56262336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));
56272336e9c171b5894bac98f828289f537e29691896kosak}
56282336e9c171b5894bac98f828289f537e29691896kosak
56292336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, AcceptsCorrectContentInDifferentOrder) {
56302336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[3] = {1, 2, 3};
56312336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[3] = {6, 4, 2};
56322336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs));
56332336e9c171b5894bac98f828289f537e29691896kosak}
56342336e9c171b5894bac98f828289f537e29691896kosak
56352336e9c171b5894bac98f828289f537e29691896kosakTEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) {
56362336e9c171b5894bac98f828289f537e29691896kosak  const double lhs[3] = {1, 2, 3};
56372336e9c171b5894bac98f828289f537e29691896kosak  const int rhs[3] = {4, 6, 2};
56382336e9c171b5894bac98f828289f537e29691896kosak  const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf();
56392336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, UnorderedPointwise(m1, rhs));
56402336e9c171b5894bac98f828289f537e29691896kosak
56412336e9c171b5894bac98f828289f537e29691896kosak  // This type works as a tuple<const double&, const int&> can be
56422336e9c171b5894bac98f828289f537e29691896kosak  // implicitly cast to tuple<double, int>.
56432336e9c171b5894bac98f828289f537e29691896kosak  const Matcher<tuple<double, int> > m2 = IsHalfOf();
56442336e9c171b5894bac98f828289f537e29691896kosak  EXPECT_THAT(lhs, UnorderedPointwise(m2, rhs));
56452336e9c171b5894bac98f828289f537e29691896kosak}
56462336e9c171b5894bac98f828289f537e29691896kosak
5647e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace gmock_matchers_test
5648e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace testing
5649