gmock-matchers_test.cc revision 33605ba45417979cff7254c1196dfee65a7275b3
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
36e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gmock/gmock-matchers.h>
37e35fdd936d133bf8a48de140a3c666897588a05shiqian
38e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string.h>
39e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <functional>
40a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan#include <iostream>
416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <list>
426a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <map>
436a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <set>
44e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <sstream>
456a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <string>
46f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan#include <utility>
476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <vector>
48e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gmock/gmock.h>
49e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gtest/gtest.h>
50e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <gtest/gtest-spi.h>
51e35fdd936d133bf8a48de140a3c666897588a05shiqian
52e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing {
534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wannamespace internal {
554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanstring FormatMatcherDescriptionSyntaxError(const char* description,
564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                           const char* error_pos);
574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanint GetParamIndex(const char* param_names[], const string& param_name);
584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanstring JoinAsTuple(const Strings& fields);
594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanbool SkipPrefix(const char* prefix, const char** pstr);
604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}  // namespace internal
614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
62e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace gmock_matchers_test {
63e35fdd936d133bf8a48de140a3c666897588a05shiqian
64b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing std::make_pair;
65b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::map;
66b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing std::multimap;
67b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing std::pair;
6833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanusing std::set;
69e35fdd936d133bf8a48de140a3c666897588a05shiqianusing std::stringstream;
70b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanusing std::tr1::make_tuple;
7133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanusing std::vector;
72e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::A;
73bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanusing testing::AllArgs;
74e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AllOf;
75e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::An;
76e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::AnyOf;
77e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ByRef;
78b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::ContainsRegex;
79e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::DoubleEq;
80e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::EndsWith;
81e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Eq;
82b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::ExplainMatchResult;
83e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Field;
84e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::FloatEq;
85e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ge;
86e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Gt;
87e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::HasSubstr;
882d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanusing testing::IsNull;
89b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanusing testing::Key;
90e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Le;
91e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Lt;
92e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakeMatcher;
93e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MakePolymorphicMatcher;
94b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::MatchResultListener;
95e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matcher;
96e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherCast;
97e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::MatcherInterface;
98e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Matches;
99b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::MatchesRegex;
100e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveDoubleEq;
101e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NanSensitiveFloatEq;
102e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ne;
103e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Not;
104e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::NotNull;
105f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanusing testing::Pair;
106e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Pointee;
107e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::PolymorphicMatcher;
108e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Property;
109e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Ref;
110e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::ResultOf;
111e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StartsWith;
112e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseEq;
113e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrCaseNe;
114e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrEq;
115e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::StrNe;
116e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::Truly;
117e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::TypedEq;
118b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanusing testing::Value;
119e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::_;
120a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanusing testing::internal::DummyMatchResultListener;
121b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::ExplainMatchFailureTupleTo;
122e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::FloatingEqMatcher;
1234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::FormatMatcherDescriptionSyntaxError;
1244a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::GetParamIndex;
1254a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::Interpolation;
1264a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::Interpolations;
1274a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::JoinAsTuple;
128b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::RE;
1294a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::SkipPrefix;
130a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanusing testing::internal::StreamMatchResultListener;
131e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::String;
13234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wanusing testing::internal::StringMatchResultListener;
133b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanusing testing::internal::Strings;
1344a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::ValidateMatcherDescription;
1354a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::kInvalidInterpolation;
1364a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::kPercentInterpolation;
1374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanusing testing::internal::kTupleInterpolation;
13879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevusing testing::internal::linked_ptr;
139e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosevusing testing::internal::scoped_ptr;
140e35fdd936d133bf8a48de140a3c666897588a05shiqianusing testing::internal::string;
141e35fdd936d133bf8a48de140a3c666897588a05shiqian
142f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// For testing ExplainMatchResultTo().
143f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass GreaterThanMatcher : public MatcherInterface<int> {
144f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public:
145f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {}
146f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
147f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  virtual void DescribeTo(::std::ostream* os) const {
148b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan    *os << "is > " << rhs_;
149f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  }
150f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
151db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  virtual bool MatchAndExplain(int lhs,
152db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan                               MatchResultListener* listener) const {
153f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    const int diff = lhs - rhs_;
154f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    if (diff > 0) {
155676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan      *listener << "which is " << diff << " more than " << rhs_;
156f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    } else if (diff == 0) {
157676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan      *listener << "which is the same as " << rhs_;
158f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    } else {
159676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan      *listener << "which is " << -diff << " less than " << rhs_;
160f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan    }
161db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan
162db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    return lhs > rhs_;
163f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  }
16432de5f53763125925e078498250f7e73a88de9edzhanyong.wan
165f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private:
16632de5f53763125925e078498250f7e73a88de9edzhanyong.wan  int rhs_;
167f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan};
168f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
169f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanMatcher<int> GreaterThan(int n) {
170f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  return MakeMatcher(new GreaterThanMatcher(n));
171f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
172f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
173e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the given matcher.
174e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T>
175e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Describe(const Matcher<T>& m) {
176e35fdd936d133bf8a48de140a3c666897588a05shiqian  stringstream ss;
177e35fdd936d133bf8a48de140a3c666897588a05shiqian  m.DescribeTo(&ss);
178e35fdd936d133bf8a48de140a3c666897588a05shiqian  return ss.str();
179e35fdd936d133bf8a48de140a3c666897588a05shiqian}
180e35fdd936d133bf8a48de140a3c666897588a05shiqian
181e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the description of the negation of the given matcher.
182e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T>
183e35fdd936d133bf8a48de140a3c666897588a05shiqianstring DescribeNegation(const Matcher<T>& m) {
184e35fdd936d133bf8a48de140a3c666897588a05shiqian  stringstream ss;
185e35fdd936d133bf8a48de140a3c666897588a05shiqian  m.DescribeNegationTo(&ss);
186e35fdd936d133bf8a48de140a3c666897588a05shiqian  return ss.str();
187e35fdd936d133bf8a48de140a3c666897588a05shiqian}
188e35fdd936d133bf8a48de140a3c666897588a05shiqian
189e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns the reason why x matches, or doesn't match, m.
190e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherType, typename Value>
191e35fdd936d133bf8a48de140a3c666897588a05shiqianstring Explain(const MatcherType& m, const Value& x) {
192e35fdd936d133bf8a48de140a3c666897588a05shiqian  stringstream ss;
193e35fdd936d133bf8a48de140a3c666897588a05shiqian  m.ExplainMatchResultTo(x, &ss);
194e35fdd936d133bf8a48de140a3c666897588a05shiqian  return ss.str();
195e35fdd936d133bf8a48de140a3c666897588a05shiqian}
196e35fdd936d133bf8a48de140a3c666897588a05shiqian
197a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, StreamingWorks) {
198a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  StringMatchResultListener listener;
199a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  listener << "hi" << 5;
200a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_EQ("hi5", listener.str());
201a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
202a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  // Streaming shouldn't crash when the underlying ostream is NULL.
203a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  DummyMatchResultListener dummy;
204a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  dummy << "hi" << 5;
205a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
206a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
207a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, CanAccessUnderlyingStream) {
208a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(DummyMatchResultListener().stream() == NULL);
209a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL);
210a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
211a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream());
212a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
213a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
214a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatchResultListenerTest, IsInterestedWorks) {
215a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(StringMatchResultListener().IsInterested());
216a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested());
217a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
218a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(DummyMatchResultListener().IsInterested());
219a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested());
220a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
221a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
222e35fdd936d133bf8a48de140a3c666897588a05shiqian// Makes sure that the MatcherInterface<T> interface doesn't
223e35fdd936d133bf8a48de140a3c666897588a05shiqian// change.
224e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EvenMatcherImpl : public MatcherInterface<int> {
225e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
226db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  virtual bool MatchAndExplain(int x,
227db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan                               MatchResultListener* /* listener */) const {
228db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    return x % 2 == 0;
229db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  }
230e35fdd936d133bf8a48de140a3c666897588a05shiqian
231e35fdd936d133bf8a48de140a3c666897588a05shiqian  virtual void DescribeTo(::std::ostream* os) const {
232e35fdd936d133bf8a48de140a3c666897588a05shiqian    *os << "is an even number";
233e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
234e35fdd936d133bf8a48de140a3c666897588a05shiqian
235e35fdd936d133bf8a48de140a3c666897588a05shiqian  // We deliberately don't define DescribeNegationTo() and
236e35fdd936d133bf8a48de140a3c666897588a05shiqian  // ExplainMatchResultTo() here, to make sure the definition of these
237e35fdd936d133bf8a48de140a3c666897588a05shiqian  // two methods is optional.
238e35fdd936d133bf8a48de140a3c666897588a05shiqian};
239e35fdd936d133bf8a48de140a3c666897588a05shiqian
240a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan// Makes sure that the MatcherInterface API doesn't change.
241a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) {
242e35fdd936d133bf8a48de140a3c666897588a05shiqian  EvenMatcherImpl m;
243e35fdd936d133bf8a48de140a3c666897588a05shiqian}
244e35fdd936d133bf8a48de140a3c666897588a05shiqian
245821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests implementing a monomorphic matcher using MatchAndExplain().
246821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
247821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass NewEvenMatcherImpl : public MatcherInterface<int> {
248821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public:
249821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  virtual bool MatchAndExplain(int x, MatchResultListener* listener) const {
250821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    const bool match = x % 2 == 0;
251821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    // Verifies that we can stream to a listener directly.
252821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    *listener << "value % " << 2;
253821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    if (listener->stream() != NULL) {
254821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan      // Verifies that we can stream to a listener's underlying stream
255821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan      // too.
256821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan      *listener->stream() << " == " << (x % 2);
257821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    }
258821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    return match;
259821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
260821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
261821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  virtual void DescribeTo(::std::ostream* os) const {
262821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    *os << "is an even number";
263821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
264821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan};
265821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
266821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) {
267821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl);
268821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m.Matches(2));
269821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m.Matches(3));
270821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("value % 2 == 0", Explain(m, 2));
271821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("value % 2 == 1", Explain(m, 3));
272821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
273821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
274e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests default-constructing a matcher.
275e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeDefaultConstructed) {
276e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m;
277e35fdd936d133bf8a48de140a3c666897588a05shiqian}
278e35fdd936d133bf8a48de140a3c666897588a05shiqian
279e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*.
280e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeConstructedFromMatcherInterface) {
281e35fdd936d133bf8a48de140a3c666897588a05shiqian  const MatcherInterface<int>* impl = new EvenMatcherImpl;
282e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m(impl);
283e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(4));
284e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(5));
285e35fdd936d133bf8a48de140a3c666897588a05shiqian}
286e35fdd936d133bf8a48de140a3c666897588a05shiqian
287e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that value can be used in place of Eq(value).
288e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) {
289e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = 5;
290e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(5));
291e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(6));
292e35fdd936d133bf8a48de140a3c666897588a05shiqian}
293e35fdd936d133bf8a48de140a3c666897588a05shiqian
294e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NULL can be used in place of Eq(NULL).
295e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) {
296e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int*> m1 = NULL;
297e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(NULL));
298e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
299e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(&n));
300e35fdd936d133bf8a48de140a3c666897588a05shiqian}
301e35fdd936d133bf8a48de140a3c666897588a05shiqian
302e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that matchers are copyable.
303e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, IsCopyable) {
304e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests the copy constructor.
305e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<bool> m1 = Eq(false);
306e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(false));
307e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(true));
308e35fdd936d133bf8a48de140a3c666897588a05shiqian
309e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests the assignment operator.
310e35fdd936d133bf8a48de140a3c666897588a05shiqian  m1 = Eq(true);
311e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(true));
312e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(false));
313e35fdd936d133bf8a48de140a3c666897588a05shiqian}
314e35fdd936d133bf8a48de140a3c666897588a05shiqian
315e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matcher<T>::DescribeTo() calls
316e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T>::DescribeTo().
317e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherTest, CanDescribeItself) {
318e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is an even number",
319e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(Matcher<int>(new EvenMatcherImpl)));
320e35fdd936d133bf8a48de140a3c666897588a05shiqian}
321e35fdd936d133bf8a48de140a3c666897588a05shiqian
322821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests Matcher<T>::MatchAndExplain().
323821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MatcherTest, MatchAndExplain) {
324821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  Matcher<int> m = GreaterThan(0);
32534b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener1;
326821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m.MatchAndExplain(42, &listener1));
327676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is 42 more than 0", listener1.str());
328821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
32934b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener2;
330821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m.MatchAndExplain(-9, &listener2));
331676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is 9 less than 0", listener2.str());
332821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
333821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
334e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a C-string literal can be implicitly converted to a
335e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>.
336e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) {
337e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m1 = "hi";
338e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("hi"));
339e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("hello"));
340e35fdd936d133bf8a48de140a3c666897588a05shiqian
341e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = "hi";
342e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hi"));
343e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("hello"));
344e35fdd936d133bf8a48de140a3c666897588a05shiqian}
345e35fdd936d133bf8a48de140a3c666897588a05shiqian
346e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a string object can be implicitly converted to a
347e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<string> or Matcher<const string&>.
348e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) {
349e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m1 = string("hi");
350e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("hi"));
351e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("hello"));
352e35fdd936d133bf8a48de140a3c666897588a05shiqian
353e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = string("hi");
354e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hi"));
355e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("hello"));
356e35fdd936d133bf8a48de140a3c666897588a05shiqian}
357e35fdd936d133bf8a48de140a3c666897588a05shiqian
358e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MakeMatcher() constructs a Matcher<T> from a
359e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface* without requiring the user to explicitly
360e35fdd936d133bf8a48de140a3c666897588a05shiqian// write the type.
361e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) {
362e35fdd936d133bf8a48de140a3c666897588a05shiqian  const MatcherInterface<int>* dummy_impl = NULL;
363e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = MakeMatcher(dummy_impl);
364e35fdd936d133bf8a48de140a3c666897588a05shiqian}
365e35fdd936d133bf8a48de140a3c666897588a05shiqian
366821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests that MakePolymorphicMatcher() can construct a polymorphic
367821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// matcher from its implementation using the old API.
36833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanconst int g_bar = 1;
369e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ReferencesBarOrIsZeroImpl {
370e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
371e35fdd936d133bf8a48de140a3c666897588a05shiqian  template <typename T>
372db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  bool MatchAndExplain(const T& x,
373db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan                       MatchResultListener* /* listener */) const {
374e35fdd936d133bf8a48de140a3c666897588a05shiqian    const void* p = &x;
37533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan    return p == &g_bar || x == 0;
376e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
377e35fdd936d133bf8a48de140a3c666897588a05shiqian
37833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  void DescribeTo(::std::ostream* os) const { *os << "g_bar or zero"; }
379e35fdd936d133bf8a48de140a3c666897588a05shiqian
380e35fdd936d133bf8a48de140a3c666897588a05shiqian  void DescribeNegationTo(::std::ostream* os) const {
38133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan    *os << "doesn't reference g_bar and is not zero";
382e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
383e35fdd936d133bf8a48de140a3c666897588a05shiqian};
384e35fdd936d133bf8a48de140a3c666897588a05shiqian
385e35fdd936d133bf8a48de140a3c666897588a05shiqian// This function verifies that MakePolymorphicMatcher() returns a
386e35fdd936d133bf8a48de140a3c666897588a05shiqian// PolymorphicMatcher<T> where T is the argument's type.
387e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() {
388e35fdd936d133bf8a48de140a3c666897588a05shiqian  return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl());
389e35fdd936d133bf8a48de140a3c666897588a05shiqian}
390e35fdd936d133bf8a48de140a3c666897588a05shiqian
391821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) {
392e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Using a polymorphic matcher to match a reference type.
393e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m1 = ReferencesBarOrIsZero();
394e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(0));
395e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Verifies that the identity of a by-reference argument is preserved.
39633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_TRUE(m1.Matches(g_bar));
397e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(1));
39833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("g_bar or zero", Describe(m1));
399e35fdd936d133bf8a48de140a3c666897588a05shiqian
400e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Using a polymorphic matcher to match a value type.
401e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m2 = ReferencesBarOrIsZero();
402e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0.0));
403e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(0.1));
40433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("g_bar or zero", Describe(m2));
405e35fdd936d133bf8a48de140a3c666897588a05shiqian}
406e35fdd936d133bf8a48de140a3c666897588a05shiqian
407821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// Tests implementing a polymorphic matcher using MatchAndExplain().
408821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
409821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass PolymorphicIsEvenImpl {
410821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public:
411821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  void DescribeTo(::std::ostream* os) const { *os << "is even"; }
412821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
413821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  void DescribeNegationTo(::std::ostream* os) const {
414821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan    *os << "is odd";
415821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
416821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
417db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  template <typename T>
418db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  bool MatchAndExplain(const T& x, MatchResultListener* listener) const {
419db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    // Verifies that we can stream to the listener directly.
420db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    *listener << "% " << 2;
421db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    if (listener->stream() != NULL) {
422db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan      // Verifies that we can stream to the listener's underlying stream
423db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan      // too.
424db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan      *listener->stream() << " == " << (x % 2);
425db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    }
426db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan    return (x % 2) == 0;
427821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  }
428db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan};
429821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
430821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanPolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() {
431821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  return MakePolymorphicMatcher(PolymorphicIsEvenImpl());
432821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
433821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
434821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) {
435821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // Using PolymorphicIsEven() as a Matcher<int>.
436821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<int> m1 = PolymorphicIsEven();
437821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m1.Matches(42));
438821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m1.Matches(43));
439821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is even", Describe(m1));
440821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
441821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<int> not_m1 = Not(m1);
442821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is odd", Describe(not_m1));
443821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
444821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("% 2 == 0", Explain(m1, 42));
445821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
446821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // Using PolymorphicIsEven() as a Matcher<char>.
447821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<char> m2 = PolymorphicIsEven();
448821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_TRUE(m2.Matches('\x42'));
449821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_FALSE(m2.Matches('\x43'));
450821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is even", Describe(m2));
451821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
452821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  const Matcher<char> not_m2 = Not(m2);
453821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("is odd", Describe(not_m2));
454821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
455821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  EXPECT_EQ("% 2 == 0", Explain(m2, '\x42'));
456821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}
457821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
458e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher.
459e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromPolymorphicMatcher) {
460e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = MatcherCast<int>(Eq(5));
461e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(5));
462e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(6));
463e35fdd936d133bf8a48de140a3c666897588a05shiqian}
464e35fdd936d133bf8a48de140a3c666897588a05shiqian
465e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types.
466e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IntValue {
467e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
468e35fdd936d133bf8a48de140a3c666897588a05shiqian  // An int can be statically (although not implicitly) cast to a
469e35fdd936d133bf8a48de140a3c666897588a05shiqian  // IntValue.
47032de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit IntValue(int a_value) : value_(a_value) {}
471e35fdd936d133bf8a48de140a3c666897588a05shiqian
472e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value() const { return value_; }
473e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
474e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value_;
475e35fdd936d133bf8a48de140a3c666897588a05shiqian};
476e35fdd936d133bf8a48de140a3c666897588a05shiqian
477e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing casting matchers between compatible types.
478e35fdd936d133bf8a48de140a3c666897588a05shiqianbool IsPositiveIntValue(const IntValue& foo) {
479e35fdd936d133bf8a48de140a3c666897588a05shiqian  return foo.value() > 0;
480e35fdd936d133bf8a48de140a3c666897588a05shiqian}
481e35fdd936d133bf8a48de140a3c666897588a05shiqian
482e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T
483e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be statically converted to U.
484e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromCompatibleType) {
485e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = Eq(2.0);
486e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
487e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(2));
488e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(3));
489e35fdd936d133bf8a48de140a3c666897588a05shiqian
490e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<IntValue> m3 = Truly(IsPositiveIntValue);
491e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m4 = MatcherCast<int>(m3);
492e35fdd936d133bf8a48de140a3c666897588a05shiqian  // In the following, the arguments 1 and 0 are statically converted
493e35fdd936d133bf8a48de140a3c666897588a05shiqian  // to IntValue objects, and then tested by the IsPositiveIntValue()
494e35fdd936d133bf8a48de140a3c666897588a05shiqian  // predicate.
495e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m4.Matches(1));
496e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m4.Matches(0));
497e35fdd936d133bf8a48de140a3c666897588a05shiqian}
498e35fdd936d133bf8a48de140a3c666897588a05shiqian
499e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>.
500e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromConstReferenceToNonReference) {
501e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m1 = Eq(0);
502e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
503e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
504e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
505e35fdd936d133bf8a48de140a3c666897588a05shiqian}
506e35fdd936d133bf8a48de140a3c666897588a05shiqian
507e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>.
508e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromReferenceToNonReference) {
509e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m1 = Eq(0);
510e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
511e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
512e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
513e35fdd936d133bf8a48de140a3c666897588a05shiqian}
514e35fdd936d133bf8a48de140a3c666897588a05shiqian
515e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
516e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToConstReference) {
517e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(0);
518e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m2 = MatcherCast<const int&>(m1);
519e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
520e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
521e35fdd936d133bf8a48de140a3c666897588a05shiqian}
522e35fdd936d133bf8a48de140a3c666897588a05shiqian
523e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>.
524e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromNonReferenceToReference) {
525e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(0);
526e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m2 = MatcherCast<int&>(m1);
527e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
528e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(n));
529e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 1;
530e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(n));
531e35fdd936d133bf8a48de140a3c666897588a05shiqian}
532e35fdd936d133bf8a48de140a3c666897588a05shiqian
533e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that MatcherCast<T>(m) works when m is a Matcher<T>.
534e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherCastTest, FromSameType) {
535e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(0);
536e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = MatcherCast<int>(m1);
537e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(0));
538e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(1));
539e35fdd936d133bf8a48de140a3c666897588a05shiqian}
540e35fdd936d133bf8a48de140a3c666897588a05shiqian
54118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanclass Base {};
54218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanclass Derived : public Base {};
54318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
54418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher.
54518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromPolymorphicMatcher) {
54618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<char> m2 = SafeMatcherCast<char>(Eq(32));
54718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(' '));
54818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches('\n'));
54918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
55018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
55116cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where
55216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// T and U are arithmetic types and T can be losslessly converted to
55316cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan// U.
55416cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wanTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) {
55518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<double> m1 = DoubleEq(1.0);
55616cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  Matcher<float> m2 = SafeMatcherCast<float>(m1);
55716cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_TRUE(m2.Matches(1.0f));
55816cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_FALSE(m2.Matches(2.0f));
55916cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan
56016cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a'));
56116cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_TRUE(m3.Matches('a'));
56216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan  EXPECT_FALSE(m3.Matches('b'));
56318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
56418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
56518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U
56618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// are pointers or references to a derived and a base class, correspondingly.
56718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromBaseClass) {
56818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Derived d, d2;
56918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Base*> m1 = Eq(&d);
57018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1);
57118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(&d));
57218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(&d2));
57318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
57418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Base&> m3 = Ref(d);
57518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3);
57618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m4.Matches(d));
57718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m4.Matches(d2));
57818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
57918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
58018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>.
58118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromConstReferenceToReference) {
58218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int n = 0;
58318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m1 = Ref(n);
58418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
58518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int n1 = 0;
58618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(n));
58718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(n1));
58818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
58918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
59018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>.
59118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) {
59218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m1 = Eq(0);
59318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1);
59418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(0));
59518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(1));
59618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
59718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
59818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>.
59918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromNonReferenceToReference) {
60018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m1 = Eq(0);
60118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = SafeMatcherCast<int&>(m1);
60218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  int n = 0;
60318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(n));
60418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  n = 1;
60518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(n));
60618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
60718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
60818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>.
60918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(SafeMatcherCastTest, FromSameType) {
61018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m1 = Eq(0);
61118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> m2 = SafeMatcherCast<int>(m1);
61218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_TRUE(m2.Matches(0));
61318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  EXPECT_FALSE(m2.Matches(1));
61418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
61518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
616e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() matches any value of type T.
617e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, MatchesAnyValue) {
618e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a value type.
619e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = A<double>();
620e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(91.43));
621e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-15.32));
622e35fdd936d133bf8a48de140a3c666897588a05shiqian
623e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a reference type.
624e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 2;
625e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = -6;
626e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m2 = A<int&>();
627e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(a));
628e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(b));
629e35fdd936d133bf8a48de140a3c666897588a05shiqian}
630e35fdd936d133bf8a48de140a3c666897588a05shiqian
631e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that A<T>() describes itself properly.
632e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ATest, CanDescribeSelf) {
633e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", Describe(A<bool>()));
634e35fdd936d133bf8a48de140a3c666897588a05shiqian}
635e35fdd936d133bf8a48de140a3c666897588a05shiqian
636e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() matches any value of type T.
637e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, MatchesAnyValue) {
638e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a value type.
639e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = An<int>();
640e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(9143));
641e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-1532));
642e35fdd936d133bf8a48de140a3c666897588a05shiqian
643e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests a matcher for a reference type.
644e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 2;
645e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = -6;
646e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m2 = An<int&>();
647e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(a));
648e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(b));
649e35fdd936d133bf8a48de140a3c666897588a05shiqian}
650e35fdd936d133bf8a48de140a3c666897588a05shiqian
651e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that An<T>() describes itself properly.
652e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnTest, CanDescribeSelf) {
653e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", Describe(An<int>()));
654e35fdd936d133bf8a48de140a3c666897588a05shiqian}
655e35fdd936d133bf8a48de140a3c666897588a05shiqian
656e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ can be used as a matcher for any type and matches any
657e35fdd936d133bf8a48de140a3c666897588a05shiqian// value of that type.
658e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, MatchesAnyValue) {
659e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Uses _ as a matcher for a value type.
660e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = _;
661e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(123));
662e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-242));
663e35fdd936d133bf8a48de140a3c666897588a05shiqian
664e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Uses _ as a matcher for a reference type.
665e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool a = false;
666e35fdd936d133bf8a48de140a3c666897588a05shiqian  const bool b = true;
667e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const bool&> m2 = _;
668e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(a));
669e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(b));
670e35fdd936d133bf8a48de140a3c666897588a05shiqian}
671e35fdd936d133bf8a48de140a3c666897588a05shiqian
672e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that _ describes itself properly.
673e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(UnderscoreTest, CanDescribeSelf) {
674e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = _;
675e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", Describe(m));
676e35fdd936d133bf8a48de140a3c666897588a05shiqian}
677e35fdd936d133bf8a48de140a3c666897588a05shiqian
678e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(x) matches any value equal to x.
679e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, MatchesEqualValue) {
680e35fdd936d133bf8a48de140a3c666897588a05shiqian  // 2 C-strings with same content but different addresses.
681e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char a1[] = "hi";
682e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char a2[] = "hi";
683e35fdd936d133bf8a48de140a3c666897588a05shiqian
684e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m1 = Eq(a1);
685e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(a1));
686e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(a2));
687e35fdd936d133bf8a48de140a3c666897588a05shiqian}
688e35fdd936d133bf8a48de140a3c666897588a05shiqian
689e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) describes itself properly.
690e35fdd936d133bf8a48de140a3c666897588a05shiqian
691e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Unprintable {
692e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
693e35fdd936d133bf8a48de140a3c666897588a05shiqian  Unprintable() : c_('a') {}
694e35fdd936d133bf8a48de140a3c666897588a05shiqian
69532de5f53763125925e078498250f7e73a88de9edzhanyong.wan  bool operator==(const Unprintable& /* rhs */) { return true; }
696e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
697e35fdd936d133bf8a48de140a3c666897588a05shiqian  char c_;
698e35fdd936d133bf8a48de140a3c666897588a05shiqian};
699e35fdd936d133bf8a48de140a3c666897588a05shiqian
700e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, CanDescribeSelf) {
701e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<Unprintable> m = Eq(Unprintable());
702e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to 1-byte object <61>", Describe(m));
703e35fdd936d133bf8a48de140a3c666897588a05shiqian}
704e35fdd936d133bf8a48de140a3c666897588a05shiqian
705e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq(v) can be used to match any type that supports
706e35fdd936d133bf8a48de140a3c666897588a05shiqian// comparing with type T, where T is v's type.
707e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EqTest, IsPolymorphic) {
708e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Eq(1);
709e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1));
710e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(2));
711e35fdd936d133bf8a48de140a3c666897588a05shiqian
712e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<char> m2 = Eq(1);
713e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches('\1'));
714e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches('a'));
715e35fdd936d133bf8a48de140a3c666897588a05shiqian}
716e35fdd936d133bf8a48de140a3c666897588a05shiqian
717e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) matches values of type T that's equal to v.
718e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, ChecksEqualityForGivenType) {
719e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<char> m1 = TypedEq<char>('a');
720e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches('a'));
721e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches('b'));
722e35fdd936d133bf8a48de140a3c666897588a05shiqian
723e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m2 = TypedEq<int>(6);
724e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(6));
725e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(7));
726e35fdd936d133bf8a48de140a3c666897588a05shiqian}
727e35fdd936d133bf8a48de140a3c666897588a05shiqian
728e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq(v) describes itself properly.
729e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, CanDescribeSelf) {
730e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2)));
731e35fdd936d133bf8a48de140a3c666897588a05shiqian}
732e35fdd936d133bf8a48de140a3c666897588a05shiqian
733e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that TypedEq<T>(v) has type Matcher<T>.
734e35fdd936d133bf8a48de140a3c666897588a05shiqian
735e35fdd936d133bf8a48de140a3c666897588a05shiqian// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T
736e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a "bare" type (i.e. not in the form of const U or U&).  If v's
737e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is not T, the compiler will generate a message about
738e35fdd936d133bf8a48de140a3c666897588a05shiqian// "undefined referece".
739e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T>
740e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Type {
74132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  static bool IsTypeOf(const T& /* v */) { return true; }
742e35fdd936d133bf8a48de140a3c666897588a05shiqian
743e35fdd936d133bf8a48de140a3c666897588a05shiqian  template <typename T2>
744e35fdd936d133bf8a48de140a3c666897588a05shiqian  static void IsTypeOf(T2 v);
745e35fdd936d133bf8a48de140a3c666897588a05shiqian};
746e35fdd936d133bf8a48de140a3c666897588a05shiqian
747e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TypedEqTest, HasSpecifiedType) {
748e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Verfies that the type of TypedEq<T>(v) is Matcher<T>.
749e35fdd936d133bf8a48de140a3c666897588a05shiqian  Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5));
750e35fdd936d133bf8a48de140a3c666897588a05shiqian  Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5));
751e35fdd936d133bf8a48de140a3c666897588a05shiqian}
752e35fdd936d133bf8a48de140a3c666897588a05shiqian
753e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) matches anything >= v.
754e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, ImplementsGreaterThanOrEqual) {
755e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Ge(0);
756e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1));
757e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(0));
758e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(-1));
759e35fdd936d133bf8a48de140a3c666897588a05shiqian}
760e35fdd936d133bf8a48de140a3c666897588a05shiqian
761e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge(v) describes itself properly.
762e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GeTest, CanDescribeSelf) {
763e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Ge(5);
764b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is >= 5", Describe(m));
765e35fdd936d133bf8a48de140a3c666897588a05shiqian}
766e35fdd936d133bf8a48de140a3c666897588a05shiqian
767e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) matches anything > v.
768e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, ImplementsGreaterThan) {
769e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = Gt(0);
770e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1.0));
771e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(0.0));
772e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(-1.0));
773e35fdd936d133bf8a48de140a3c666897588a05shiqian}
774e35fdd936d133bf8a48de140a3c666897588a05shiqian
775e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt(v) describes itself properly.
776e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GtTest, CanDescribeSelf) {
777e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Gt(5);
778b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is > 5", Describe(m));
779e35fdd936d133bf8a48de140a3c666897588a05shiqian}
780e35fdd936d133bf8a48de140a3c666897588a05shiqian
781e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) matches anything <= v.
782e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, ImplementsLessThanOrEqual) {
783e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<char> m1 = Le('b');
784e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches('a'));
785e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches('b'));
786e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches('c'));
787e35fdd936d133bf8a48de140a3c666897588a05shiqian}
788e35fdd936d133bf8a48de140a3c666897588a05shiqian
789e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le(v) describes itself properly.
790e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LeTest, CanDescribeSelf) {
791e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Le(5);
792b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is <= 5", Describe(m));
793e35fdd936d133bf8a48de140a3c666897588a05shiqian}
794e35fdd936d133bf8a48de140a3c666897588a05shiqian
795e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) matches anything < v.
796e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, ImplementsLessThan) {
797e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m1 = Lt("Hello");
798e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("Abc"));
799e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("Hello"));
800e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches("Hello, world!"));
801e35fdd936d133bf8a48de140a3c666897588a05shiqian}
802e35fdd936d133bf8a48de140a3c666897588a05shiqian
803e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt(v) describes itself properly.
804e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(LtTest, CanDescribeSelf) {
805e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Lt(5);
806b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is < 5", Describe(m));
807e35fdd936d133bf8a48de140a3c666897588a05shiqian}
808e35fdd936d133bf8a48de140a3c666897588a05shiqian
809e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) matches anything != v.
810e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, ImplementsNotEqual) {
811e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m1 = Ne(0);
812e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(1));
813e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(-1));
814e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(0));
815e35fdd936d133bf8a48de140a3c666897588a05shiqian}
816e35fdd936d133bf8a48de140a3c666897588a05shiqian
817e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne(v) describes itself properly.
818e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NeTest, CanDescribeSelf) {
819e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Ne(5);
820b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to 5", Describe(m));
821e35fdd936d133bf8a48de140a3c666897588a05shiqian}
822e35fdd936d133bf8a48de140a3c666897588a05shiqian
8232d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() matches any NULL pointer of any type.
8242d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, MatchesNullPointer) {
8252d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<int*> m1 = IsNull();
8262d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  int* p1 = NULL;
8272d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  int n = 0;
8282d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_TRUE(m1.Matches(p1));
8292d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_FALSE(m1.Matches(&n));
8302d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
8312d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<const char*> m2 = IsNull();
8322d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  const char* p2 = NULL;
8332d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_TRUE(m2.Matches(p2));
8342d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_FALSE(m2.Matches("hi"));
8352d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
83695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if !GTEST_OS_SYMBIAN
83795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // Nokia's Symbian compiler generates:
83895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h: ambiguous access to overloaded function
83995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)'
84095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing::
84195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  //     MatcherInterface<void *> *)'
84295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h:  (point of instantiation: 'testing::
84395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  //     gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()')
84495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  // gmock-matchers.h:   (instantiating: 'testing::PolymorphicMatc
8452d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<void*> m3 = IsNull();
8462d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  void* p3 = NULL;
8472d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_TRUE(m3.Matches(p3));
8482d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef)));
84995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif
8502d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan}
8512d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
85279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(IsNullTest, LinkedPtr) {
85379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<linked_ptr<int> > m = IsNull();
85479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> null_p;
85579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> non_null_p(new int);
85679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
85779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(null_p));
85879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(non_null_p));
85979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
86079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
86179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(IsNullTest, ReferenceToConstLinkedPtr) {
86279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<const linked_ptr<double>&> m = IsNull();
86379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> null_p;
86479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> non_null_p(new double);
86579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
86679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(null_p));
86779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(non_null_p));
86879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
86979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
870e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosevTEST(IsNullTest, ReferenceToConstScopedPtr) {
871e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  const Matcher<const scoped_ptr<double>&> m = IsNull();
872e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  const scoped_ptr<double> null_p;
873e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  const scoped_ptr<double> non_null_p(new double);
874e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev
875e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  EXPECT_TRUE(m.Matches(null_p));
876e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  EXPECT_FALSE(m.Matches(non_null_p));
877e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev}
878e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev
8792d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Tests that IsNull() describes itself properly.
8802d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanTEST(IsNullTest, CanDescribeSelf) {
8812d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  Matcher<int*> m = IsNull();
8822d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan  EXPECT_EQ("is NULL", Describe(m));
883b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NULL", DescribeNegation(m));
8842d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan}
8852d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan
886e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() matches any non-NULL pointer of any type.
887e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, MatchesNonNullPointer) {
888e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int*> m1 = NotNull();
889e35fdd936d133bf8a48de140a3c666897588a05shiqian  int* p1 = NULL;
890e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
891e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(p1));
892e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(&n));
893e35fdd936d133bf8a48de140a3c666897588a05shiqian
894e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m2 = NotNull();
895e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char* p2 = NULL;
896e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(p2));
897e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hi"));
898e35fdd936d133bf8a48de140a3c666897588a05shiqian}
899e35fdd936d133bf8a48de140a3c666897588a05shiqian
90079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(NotNullTest, LinkedPtr) {
90179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<linked_ptr<int> > m = NotNull();
90279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> null_p;
90379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<int> non_null_p(new int);
90479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
90579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(null_p));
90679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(non_null_p));
90779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
90879b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
90979b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosevTEST(NotNullTest, ReferenceToConstLinkedPtr) {
91079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const Matcher<const linked_ptr<double>&> m = NotNull();
91179b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> null_p;
91279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  const linked_ptr<double> non_null_p(new double);
91379b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
91479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_FALSE(m.Matches(null_p));
91579b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev  EXPECT_TRUE(m.Matches(non_null_p));
91679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev}
91779b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev
918e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosevTEST(NotNullTest, ReferenceToConstScopedPtr) {
919e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  const Matcher<const scoped_ptr<double>&> m = NotNull();
920e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  const scoped_ptr<double> null_p;
921e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  const scoped_ptr<double> non_null_p(new double);
922e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev
923e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  EXPECT_FALSE(m.Matches(null_p));
924e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev  EXPECT_TRUE(m.Matches(non_null_p));
925e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev}
926e56daa7de1d85c35d1cdc252b500ab276b5c1c9cvladlosev
927e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that NotNull() describes itself properly.
928e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotNullTest, CanDescribeSelf) {
929e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int*> m = NotNull();
930b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NULL", Describe(m));
931e35fdd936d133bf8a48de140a3c666897588a05shiqian}
932e35fdd936d133bf8a48de140a3c666897588a05shiqian
933e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) matches an argument that references
934e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'variable'.
935e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, MatchesSameVariable) {
936e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 0;
937e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = 0;
938e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m = Ref(a);
939e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
940e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(b));
941e35fdd936d133bf8a48de140a3c666897588a05shiqian}
942e35fdd936d133bf8a48de140a3c666897588a05shiqian
943e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) describes itself properly.
944e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanDescribeSelf) {
945e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 5;
946e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int&> m = Ref(n);
947e35fdd936d133bf8a48de140a3c666897588a05shiqian  stringstream ss;
948e35fdd936d133bf8a48de140a3c666897588a05shiqian  ss << "references the variable @" << &n << " 5";
949e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ(string(ss.str()), Describe(m));
950e35fdd936d133bf8a48de140a3c666897588a05shiqian}
951e35fdd936d133bf8a48de140a3c666897588a05shiqian
952e35fdd936d133bf8a48de140a3c666897588a05shiqian// Test that Ref(non_const_varialbe) can be used as a matcher for a
953e35fdd936d133bf8a48de140a3c666897588a05shiqian// const reference.
954e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, CanBeUsedAsMatcherForConstReference) {
955e35fdd936d133bf8a48de140a3c666897588a05shiqian  int a = 0;
956e35fdd936d133bf8a48de140a3c666897588a05shiqian  int b = 0;
957e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m = Ref(a);
958e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
959e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(b));
960e35fdd936d133bf8a48de140a3c666897588a05shiqian}
961e35fdd936d133bf8a48de140a3c666897588a05shiqian
962e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be
963e35fdd936d133bf8a48de140a3c666897588a05shiqian// used wherever Ref(base) can be used (Ref(derived) is a sub-type
964e35fdd936d133bf8a48de140a3c666897588a05shiqian// of Ref(base), but not vice versa.
965e35fdd936d133bf8a48de140a3c666897588a05shiqian
966e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(RefTest, IsCovariant) {
967e35fdd936d133bf8a48de140a3c666897588a05shiqian  Base base, base2;
968e35fdd936d133bf8a48de140a3c666897588a05shiqian  Derived derived;
969e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Base&> m1 = Ref(base);
970e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(base));
971e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(base2));
972e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(derived));
973e35fdd936d133bf8a48de140a3c666897588a05shiqian
974e35fdd936d133bf8a48de140a3c666897588a05shiqian  m1 = Ref(derived);
975e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(derived));
976e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(base));
977e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(base2));
978e35fdd936d133bf8a48de140a3c666897588a05shiqian}
979e35fdd936d133bf8a48de140a3c666897588a05shiqian
980b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(RefTest, ExplainsResult) {
981b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  int n = 0;
982b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n),
983b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan              StartsWith("which is located @"));
984b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
985b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  int m = 0;
986b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m),
987b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan              StartsWith("which is located @"));
988b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
989b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
990e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests string comparison matchers.
991e35fdd936d133bf8a48de140a3c666897588a05shiqian
992e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, MatchesEqualString) {
993e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrEq(string("Hello"));
994e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("Hello"));
995e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("hello"));
996e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
997e35fdd936d133bf8a48de140a3c666897588a05shiqian
998e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = StrEq("Hello");
999e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hello"));
1000e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hi"));
1001e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1002e35fdd936d133bf8a48de140a3c666897588a05shiqian
1003e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrEqTest, CanDescribeSelf) {
1004e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m = StrEq("Hi-\'\"\?\\\a\b\f\n\r\t\v\xD3");
1005e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to \"Hi-\'\\\"\\?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"",
1006e35fdd936d133bf8a48de140a3c666897588a05shiqian      Describe(m));
1007e35fdd936d133bf8a48de140a3c666897588a05shiqian
1008e35fdd936d133bf8a48de140a3c666897588a05shiqian  string str("01204500800");
1009e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = '\0';
1010e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m2 = StrEq(str);
1011e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2));
1012e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = '\0';
1013e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m3 = StrEq(str);
1014e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3));
1015e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1016e35fdd936d133bf8a48de140a3c666897588a05shiqian
1017e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, MatchesUnequalString) {
1018e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrNe("Hello");
1019e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(""));
1020e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1021e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("Hello"));
1022e35fdd936d133bf8a48de140a3c666897588a05shiqian
1023e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m2 = StrNe(string("Hello"));
1024e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hello"));
1025e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hello"));
1026e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1027e35fdd936d133bf8a48de140a3c666897588a05shiqian
1028e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrNeTest, CanDescribeSelf) {
1029e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrNe("Hi");
1030b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to \"Hi\"", Describe(m));
1031e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1032e35fdd936d133bf8a48de140a3c666897588a05shiqian
1033e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) {
1034e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrCaseEq(string("Hello"));
1035e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("Hello"));
1036e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("hello"));
1037e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("Hi"));
1038e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1039e35fdd936d133bf8a48de140a3c666897588a05shiqian
1040e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = StrCaseEq("Hello");
1041e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("hello"));
1042e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hi"));
1043e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1044e35fdd936d133bf8a48de140a3c666897588a05shiqian
1045e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1046e35fdd936d133bf8a48de140a3c666897588a05shiqian  string str1("oabocdooeoo");
1047e35fdd936d133bf8a48de140a3c666897588a05shiqian  string str2("OABOCDOOEOO");
1048e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m0 = StrCaseEq(str1);
1049e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m0.Matches(str2 + string(1, '\0')));
1050e35fdd936d133bf8a48de140a3c666897588a05shiqian
1051e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[3] = str2[3] = '\0';
1052e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m1 = StrCaseEq(str1);
1053e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(str2));
1054e35fdd936d133bf8a48de140a3c666897588a05shiqian
1055e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[0] = str1[6] = str1[7] = str1[10] = '\0';
1056e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2[0] = str2[6] = str2[7] = str2[10] = '\0';
1057e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m2 = StrCaseEq(str1);
1058e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[9] = str2[9] = '\0';
1059e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(str2));
1060e35fdd936d133bf8a48de140a3c666897588a05shiqian
1061e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> m3 = StrCaseEq(str1);
1062e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(str2));
1063e35fdd936d133bf8a48de140a3c666897588a05shiqian
1064e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2 + "x"));
1065e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2.append(1, '\0');
1066e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2));
1067e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(string(str2, 0, 9)));
1068e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1069e35fdd936d133bf8a48de140a3c666897588a05shiqian
1070e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseEqTest, CanDescribeSelf) {
1071e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m = StrCaseEq("Hi");
1072e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m));
1073e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1074e35fdd936d133bf8a48de140a3c666897588a05shiqian
1075e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1076e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrCaseNe("Hello");
1077e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches("Hi"));
1078e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1079e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("Hello"));
1080e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches("hello"));
1081e35fdd936d133bf8a48de140a3c666897588a05shiqian
1082e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m2 = StrCaseNe(string("Hello"));
1083e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(""));
1084e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hello"));
1085e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1086e35fdd936d133bf8a48de140a3c666897588a05shiqian
1087e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StrCaseNeTest, CanDescribeSelf) {
1088e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> m = StrCaseNe("Hi");
1089b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m));
1090e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1091e35fdd936d133bf8a48de140a3c666897588a05shiqian
1092e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching string-typed values.
1093e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForStringClasses) {
1094e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<string> m1 = HasSubstr("foo");
1095e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(string("I love food.")));
1096e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(string("tofo")));
1097e35fdd936d133bf8a48de140a3c666897588a05shiqian
1098e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const std::string&> m2 = HasSubstr("foo");
1099e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(std::string("I love food.")));
1100e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(std::string("tofo")));
1101e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1102e35fdd936d133bf8a48de140a3c666897588a05shiqian
1103e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-string-typed values.
1104e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, WorksForCStrings) {
1105e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<char*> m1 = HasSubstr("foo");
1106e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food.")));
1107e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo")));
1108e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1109e35fdd936d133bf8a48de140a3c666897588a05shiqian
1110e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m2 = HasSubstr("foo");
1111e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("I love food."));
1112e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("tofo"));
1113e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(NULL));
1114e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1115e35fdd936d133bf8a48de140a3c666897588a05shiqian
1116e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly.
1117e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(HasSubstrTest, CanDescribeSelf) {
1118e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<string> m = HasSubstr("foo\n\"");
1119e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m));
1120e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1121e35fdd936d133bf8a48de140a3c666897588a05shiqian
1122b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, CanDescribeSelf) {
1123b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<std::string, int>&> m = Key("foo");
1124b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m));
1125b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m));
1126b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
1127b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1128b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(KeyTest, ExplainsResult) {
1129b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<int, bool> > m = Key(GreaterThan(10));
1130b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("whose first field is a value which is 5 less than 10",
1131b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(5, true)));
1132b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("whose first field is a value which is 5 more than 10",
1133b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(15, true)));
1134b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1135b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1136b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, MatchesCorrectly) {
1137b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<int, std::string> p(25, "foo");
1138b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Key(25));
1139b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Not(Key(42)));
1140b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Key(Ge(20)));
1141b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Not(Key(Lt(25))));
1142b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1143b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1144b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, SafelyCastsInnerMatcher) {
1145b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  Matcher<int> is_positive = Gt(0);
1146b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  Matcher<int> is_negative = Lt(0);
1147b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<char, bool> p('a', true);
1148b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Key(is_positive));
1149b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(p, Not(Key(is_negative)));
1150b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1151b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1152b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMap) {
115395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  std::map<int, char> container;
1154b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(1, 'a'));
1155b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(2, 'b'));
1156b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(4, 'c'));
1157b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(1)));
1158b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Not(Contains(Key(3))));
1159b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1160b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1161b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanTEST(KeyTest, InsideContainsUsingMultimap) {
116295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  std::multimap<int, char> container;
1163b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(1, 'a'));
1164b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(2, 'b'));
1165b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(4, 'c'));
1166b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1167b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Not(Contains(Key(25))));
1168b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(25, 'd'));
1169b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(25)));
1170b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(25, 'e'));
1171b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(25)));
1172b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1173b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Contains(Key(1)));
1174b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan  EXPECT_THAT(container, Not(Contains(Key(3))));
1175b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}
1176b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan
1177f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, Typing) {
1178f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Test verifies the following type conversions can be compiled.
1179b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42);
1180b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<const char*, int> > m2 = Pair("foo", 42);
1181b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<const char*, int> > m3 = Pair("foo", 42);
1182f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1183b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<int, const std::string> > m4 = Pair(25, "42");
1184b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<pair<const std::string, int> > m5 = Pair("25", 42);
1185f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1186f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1187f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanDescribeSelf) {
1188b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42);
1189f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_EQ("has a first field that is equal to \"foo\""
1190f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            ", and has a second field that is equal to 42",
1191f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            Describe(m1));
1192b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("has a first field that isn't equal to \"foo\""
1193b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            ", or has a second field that isn't equal to 42",
1194f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            DescribeNegation(m1));
1195f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Double and triple negation (1 or 2 times not and description of negation).
1196b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42));
1197b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("has a first field that isn't equal to 13"
1198f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            ", and has a second field that is equal to 42",
1199f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan            DescribeNegation(m2));
1200f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1201f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1202f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, CanExplainMatchResultTo) {
1203821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If neither field matches, Pair() should explain about the first
1204821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // field.
1205b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0));
1206676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose first field does not match, which is 1 less than 0",
1207b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(-1, -2)));
1208f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1209821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If the first field matches but the second doesn't, Pair() should
1210821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // explain about the second field.
1211676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose second field does not match, which is 2 less than 0",
1212b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(1, -2)));
1213f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1214821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If the first field doesn't match but the second does, Pair()
1215821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // should explain about the first field.
1216676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose first field does not match, which is 1 less than 0",
1217b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(-1, 2)));
1218f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1219821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan  // If both fields match, Pair() should explain about them both.
1220676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose both fields match, where the first field is a value "
1221676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0, and the second field is a value "
1222676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 2 more than 0",
1223b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, make_pair(1, 2)));
1224676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan
1225676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // If only the first match has an explanation, only this explanation should
1226676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // be printed.
1227b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0);
1228676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose both fields match, where the first field is a value "
1229676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0",
1230b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(explain_first, make_pair(1, 0)));
1231676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan
1232676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // If only the second match has an explanation, only this explanation should
1233676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  // be printed.
1234b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0));
1235676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose both fields match, where the second field is a value "
1236676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0",
1237b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(explain_second, make_pair(0, 1)));
1238f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1239f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1240f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, MatchesCorrectly) {
1241b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<int, std::string> p(25, "foo");
1242f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1243f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Both fields match.
1244f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(25, "foo"));
1245f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o")));
1246f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1247f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // 'first' doesnt' match, but 'second' matches.
1248f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(42, "foo")));
1249f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(Lt(25), "foo")));
1250f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1251f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // 'first' matches, but 'second' doesn't match.
1252f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(25, "bar")));
1253f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(25, Not("foo"))));
1254f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1255f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  // Neither field matches.
1256f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(13, "bar")));
1257f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a"))));
1258f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1259f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1260f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, SafelyCastsInnerMatchers) {
1261f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  Matcher<int> is_positive = Gt(0);
1262f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  Matcher<int> is_negative = Lt(0);
1263b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  pair<char, bool> p('a', true);
1264f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(is_positive, _));
1265f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(is_negative, _)));
1266f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Pair(_, is_positive));
1267f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(p, Not(Pair(_, is_negative)));
1268f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1269f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1270f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanTEST(PairTest, InsideContainsUsingMap) {
127195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  std::map<int, char> container;
1272b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(1, 'a'));
1273b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(2, 'b'));
1274b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  container.insert(make_pair(4, 'c'));
127595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  EXPECT_THAT(container, Contains(Pair(1, 'a')));
1276f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(container, Contains(Pair(1, _)));
127795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan  EXPECT_THAT(container, Contains(Pair(_, 'a')));
1278f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan  EXPECT_THAT(container, Not(Contains(Pair(3, _))));
1279f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}
1280f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan
1281e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s).
1282e35fdd936d133bf8a48de140a3c666897588a05shiqian
1283e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, MatchesStringWithGivenPrefix) {
1284e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = StartsWith(string(""));
1285e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("Hi"));
1286e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(""));
1287e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1288e35fdd936d133bf8a48de140a3c666897588a05shiqian
1289e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = StartsWith("Hi");
1290e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hi"));
1291e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hi Hi!"));
1292e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("High"));
1293e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("H"));
1294e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(" Hi"));
1295e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1296e35fdd936d133bf8a48de140a3c666897588a05shiqian
1297e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StartsWithTest, CanDescribeSelf) {
1298e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m = StartsWith("Hi");
1299e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("starts with \"Hi\"", Describe(m));
1300e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1301e35fdd936d133bf8a48de140a3c666897588a05shiqian
1302e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s).
1303e35fdd936d133bf8a48de140a3c666897588a05shiqian
1304e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, MatchesStringWithGivenSuffix) {
1305e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = EndsWith("");
1306e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("Hi"));
1307e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(""));
1308e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1309e35fdd936d133bf8a48de140a3c666897588a05shiqian
1310e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = EndsWith(string("Hi"));
1311e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Hi"));
1312e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Wow Hi Hi"));
1313e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("Super Hi"));
1314e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("i"));
1315e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("Hi "));
1316e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1317e35fdd936d133bf8a48de140a3c666897588a05shiqian
1318e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(EndsWithTest, CanDescribeSelf) {
1319e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m = EndsWith("Hi");
1320e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("ends with \"Hi\"", Describe(m));
1321e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1322e35fdd936d133bf8a48de140a3c666897588a05shiqian
1323e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests MatchesRegex().
1324e35fdd936d133bf8a48de140a3c666897588a05shiqian
1325e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) {
1326e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = MatchesRegex("a.*z");
1327e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("az"));
1328e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("abcz"));
1329e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1330e35fdd936d133bf8a48de140a3c666897588a05shiqian
1331e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z"));
1332e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("azbz"));
1333e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("az1"));
1334e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("1az"));
1335e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1336e35fdd936d133bf8a48de140a3c666897588a05shiqian
1337e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesRegexTest, CanDescribeSelf) {
1338e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m1 = MatchesRegex(string("Hi.*"));
1339e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1));
1340e35fdd936d133bf8a48de140a3c666897588a05shiqian
1341d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  Matcher<const char*> m2 = MatchesRegex(new RE("a.*"));
1342d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2));
1343e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1344e35fdd936d133bf8a48de140a3c666897588a05shiqian
1345e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ContainsRegex().
1346e35fdd936d133bf8a48de140a3c666897588a05shiqian
1347e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) {
1348e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m1 = ContainsRegex(string("a.*z"));
1349e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("az"));
1350e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches("0abcz1"));
1351e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1352e35fdd936d133bf8a48de140a3c666897588a05shiqian
1353e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z"));
1354e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("azbz"));
1355e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches("az1"));
1356e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches("1a"));
1357e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1358e35fdd936d133bf8a48de140a3c666897588a05shiqian
1359e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ContainsRegexTest, CanDescribeSelf) {
1360e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const std::string> m1 = ContainsRegex("Hi.*");
1361e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1));
1362e35fdd936d133bf8a48de140a3c666897588a05shiqian
1363d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  Matcher<const char*> m2 = ContainsRegex(new RE("a.*"));
1364d14aaed74b2a8a1222d60d8fa3afcfc93a21c321zhanyong.wan  EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2));
1365e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1366e35fdd936d133bf8a48de140a3c666897588a05shiqian
1367e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests for wide strings.
1368e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_STD_WSTRING
1369e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, MatchesEqual) {
1370e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello"));
1371e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1372e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1373e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1374e35fdd936d133bf8a48de140a3c666897588a05shiqian
1375e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m2 = StrEq(L"Hello");
1376e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hello"));
1377e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1378e35fdd936d133bf8a48de140a3c666897588a05shiqian
1379e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1380e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1381e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1382e35fdd936d133bf8a48de140a3c666897588a05shiqian
1383e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str(L"01204500800");
1384e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1385e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m4 = StrEq(str);
1386e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m4.Matches(str));
1387e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1388e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m5 = StrEq(str);
1389e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m5.Matches(str));
1390e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1391e35fdd936d133bf8a48de140a3c666897588a05shiqian
1392e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrEqTest, CanDescribeSelf) {
1393e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"\?\\\a\b\f\n\r\t\v");
1394e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"Hi-\'\\\"\\?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
1395e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m));
1396e35fdd936d133bf8a48de140a3c666897588a05shiqian
1397e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1398e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1399e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m2));
1400e35fdd936d133bf8a48de140a3c666897588a05shiqian
1401e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str(L"01204500800");
1402e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1403e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m4 = StrEq(str);
1404e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1405e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1406e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m5 = StrEq(str);
1407e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1408e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1409e35fdd936d133bf8a48de140a3c666897588a05shiqian
1410e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, MatchesUnequalString) {
1411e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hello");
1412e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L""));
1413e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1414e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1415e35fdd936d133bf8a48de140a3c666897588a05shiqian
1416e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello"));
1417e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1418e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1419e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1420e35fdd936d133bf8a48de140a3c666897588a05shiqian
1421e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrNeTest, CanDescribeSelf) {
1422e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hi");
1423b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
1424e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1425e35fdd936d133bf8a48de140a3c666897588a05shiqian
1426e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1427e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello"));
1428e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1429e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"hello"));
1430e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hi"));
1431e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1432e35fdd936d133bf8a48de140a3c666897588a05shiqian
1433e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello");
1434e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1435e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1436e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1437e35fdd936d133bf8a48de140a3c666897588a05shiqian
1438e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1439e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str1(L"oabocdooeoo");
1440e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::std::wstring str2(L"OABOCDOOEOO");
1441e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m0 = StrCaseEq(str1);
1442e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0')));
1443e35fdd936d133bf8a48de140a3c666897588a05shiqian
1444e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[3] = str2[3] = L'\0';
1445e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m1 = StrCaseEq(str1);
1446e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(str2));
1447e35fdd936d133bf8a48de140a3c666897588a05shiqian
1448e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1449e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1450e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m2 = StrCaseEq(str1);
1451e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[9] = str2[9] = L'\0';
1452e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(str2));
1453e35fdd936d133bf8a48de140a3c666897588a05shiqian
1454e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring&> m3 = StrCaseEq(str1);
1455e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(str2));
1456e35fdd936d133bf8a48de140a3c666897588a05shiqian
1457e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2 + L"x"));
1458e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2.append(1, L'\0');
1459e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2));
1460e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9)));
1461e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1462e35fdd936d133bf8a48de140a3c666897588a05shiqian
1463e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseEqTest, CanDescribeSelf) {
1464e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m = StrCaseEq(L"Hi");
1465e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1466e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1467e35fdd936d133bf8a48de140a3c666897588a05shiqian
1468e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1469e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1470e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hi"));
1471e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1472e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1473e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1474e35fdd936d133bf8a48de140a3c666897588a05shiqian
1475e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello"));
1476e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L""));
1477e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1478e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1479e35fdd936d133bf8a48de140a3c666897588a05shiqian
1480e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStrCaseNeTest, CanDescribeSelf) {
1481e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
1482b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
1483e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1484e35fdd936d133bf8a48de140a3c666897588a05shiqian
1485e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values.
1486e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForStringClasses) {
1487e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher< ::std::wstring> m1 = HasSubstr(L"foo");
1488e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food.")));
1489e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo")));
1490e35fdd936d133bf8a48de140a3c666897588a05shiqian
1491e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo");
1492e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food.")));
1493e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo")));
1494e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1495e35fdd936d133bf8a48de140a3c666897588a05shiqian
1496e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values.
1497e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, WorksForCStrings) {
1498e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1499e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1500e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1501e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1502e35fdd936d133bf8a48de140a3c666897588a05shiqian
1503e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1504e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"I love food."));
1505e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"tofo"));
1506e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(NULL));
1507e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1508e35fdd936d133bf8a48de140a3c666897588a05shiqian
1509e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly.
1510e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideHasSubstrTest, CanDescribeSelf) {
1511e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::std::wstring> m = HasSubstr(L"foo\n\"");
1512e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1513e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1514e35fdd936d133bf8a48de140a3c666897588a05shiqian
1515e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s).
1516e35fdd936d133bf8a48de140a3c666897588a05shiqian
1517e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) {
1518e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L""));
1519e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1520e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1521e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1522e35fdd936d133bf8a48de140a3c666897588a05shiqian
1523e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi");
1524e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1525e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1526e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"High"));
1527e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"H"));
1528e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L" Hi"));
1529e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1530e35fdd936d133bf8a48de140a3c666897588a05shiqian
1531e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideStartsWithTest, CanDescribeSelf) {
1532e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring> m = StartsWith(L"Hi");
1533e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1534e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1535e35fdd936d133bf8a48de140a3c666897588a05shiqian
1536e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s).
1537e35fdd936d133bf8a48de140a3c666897588a05shiqian
1538e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) {
1539e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = EndsWith(L"");
1540e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1541e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1542e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1543e35fdd936d133bf8a48de140a3c666897588a05shiqian
1544e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi"));
1545e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1546e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1547e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Super Hi"));
1548e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"i"));
1549e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi "));
1550e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1551e35fdd936d133bf8a48de140a3c666897588a05shiqian
1552e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(StdWideEndsWithTest, CanDescribeSelf) {
1553e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::std::wstring> m = EndsWith(L"Hi");
1554e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1555e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1556e35fdd936d133bf8a48de140a3c666897588a05shiqian
1557e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif  // GTEST_HAS_STD_WSTRING
1558e35fdd936d133bf8a48de140a3c666897588a05shiqian
1559e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_GLOBAL_WSTRING
1560e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, MatchesEqual) {
1561e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello"));
1562e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1563e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1564e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1565e35fdd936d133bf8a48de140a3c666897588a05shiqian
1566e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m2 = StrEq(L"Hello");
1567e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hello"));
1568e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1569e35fdd936d133bf8a48de140a3c666897588a05shiqian
1570e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D");
1571e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D"));
1572e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E"));
1573e35fdd936d133bf8a48de140a3c666897588a05shiqian
1574e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str(L"01204500800");
1575e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1576e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m4 = StrEq(str);
1577e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m4.Matches(str));
1578e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1579e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m5 = StrEq(str);
1580e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m5.Matches(str));
1581e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1582e35fdd936d133bf8a48de140a3c666897588a05shiqian
1583e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrEqTest, CanDescribeSelf) {
1584e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m = StrEq(L"Hi-\'\"\?\\\a\b\f\n\r\t\v");
1585e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"Hi-\'\\\"\\?\\\\\\a\\b\\f\\n\\r\\t\\v\"",
1586e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m));
1587e35fdd936d133bf8a48de140a3c666897588a05shiqian
1588e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D");
1589e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"",
1590e35fdd936d133bf8a48de140a3c666897588a05shiqian    Describe(m2));
1591e35fdd936d133bf8a48de140a3c666897588a05shiqian
1592e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str(L"01204500800");
1593e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[3] = L'\0';
1594e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m4 = StrEq(str);
1595e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4));
1596e35fdd936d133bf8a48de140a3c666897588a05shiqian  str[0] = str[6] = str[7] = str[9] = str[10] = L'\0';
1597e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m5 = StrEq(str);
1598e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5));
1599e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1600e35fdd936d133bf8a48de140a3c666897588a05shiqian
1601e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, MatchesUnequalString) {
1602e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hello");
1603e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L""));
1604e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1605e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1606e35fdd936d133bf8a48de140a3c666897588a05shiqian
1607e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello"));
1608e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1609e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1610e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1611e35fdd936d133bf8a48de140a3c666897588a05shiqian
1612e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrNeTest, CanDescribeSelf) {
1613e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrNe(L"Hi");
1614b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m));
1615e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1616e35fdd936d133bf8a48de140a3c666897588a05shiqian
1617e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) {
1618e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello"));
1619e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hello"));
1620e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"hello"));
1621e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hi"));
1622e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
1623e35fdd936d133bf8a48de140a3c666897588a05shiqian
1624e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello");
1625e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"hello"));
1626e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi"));
1627e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1628e35fdd936d133bf8a48de140a3c666897588a05shiqian
1629e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) {
1630e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str1(L"oabocdooeoo");
1631e35fdd936d133bf8a48de140a3c666897588a05shiqian  ::wstring str2(L"OABOCDOOEOO");
1632e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m0 = StrCaseEq(str1);
1633e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0')));
1634e35fdd936d133bf8a48de140a3c666897588a05shiqian
1635e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[3] = str2[3] = L'\0';
1636e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m1 = StrCaseEq(str1);
1637e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(str2));
1638e35fdd936d133bf8a48de140a3c666897588a05shiqian
1639e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[0] = str1[6] = str1[7] = str1[10] = L'\0';
1640e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2[0] = str2[6] = str2[7] = str2[10] = L'\0';
1641e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m2 = StrCaseEq(str1);
1642e35fdd936d133bf8a48de140a3c666897588a05shiqian  str1[9] = str2[9] = L'\0';
1643e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(str2));
1644e35fdd936d133bf8a48de140a3c666897588a05shiqian
1645e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring&> m3 = StrCaseEq(str1);
1646e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m3.Matches(str2));
1647e35fdd936d133bf8a48de140a3c666897588a05shiqian
1648e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2 + L"x"));
1649e35fdd936d133bf8a48de140a3c666897588a05shiqian  str2.append(1, L'\0');
1650e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(str2));
1651e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9)));
1652e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1653e35fdd936d133bf8a48de140a3c666897588a05shiqian
1654e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseEqTest, CanDescribeSelf) {
1655e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m = StrCaseEq(L"Hi");
1656e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m));
1657e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1658e35fdd936d133bf8a48de140a3c666897588a05shiqian
1659e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) {
1660e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hello");
1661e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(L"Hi"));
1662e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(NULL));
1663e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"Hello"));
1664e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(L"hello"));
1665e35fdd936d133bf8a48de140a3c666897588a05shiqian
1666e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello"));
1667e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L""));
1668e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hello"));
1669e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1670e35fdd936d133bf8a48de140a3c666897588a05shiqian
1671e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStrCaseNeTest, CanDescribeSelf) {
1672e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const wchar_t*> m = StrCaseNe(L"Hi");
1673b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m));
1674e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1675e35fdd936d133bf8a48de140a3c666897588a05shiqian
1676e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching wstring-typed values.
1677e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForStringClasses) {
1678e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher< ::wstring> m1 = HasSubstr(L"foo");
1679e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(::wstring(L"I love food.")));
1680e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(::wstring(L"tofo")));
1681e35fdd936d133bf8a48de140a3c666897588a05shiqian
1682e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::wstring&> m2 = HasSubstr(L"foo");
1683e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(::wstring(L"I love food.")));
1684e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(::wstring(L"tofo")));
1685e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1686e35fdd936d133bf8a48de140a3c666897588a05shiqian
1687e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr() works for matching C-wide-string-typed values.
1688e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, WorksForCStrings) {
1689e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<wchar_t*> m1 = HasSubstr(L"foo");
1690e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food.")));
1691e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo")));
1692e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1693e35fdd936d133bf8a48de140a3c666897588a05shiqian
1694e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m2 = HasSubstr(L"foo");
1695e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"I love food."));
1696e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"tofo"));
1697e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(NULL));
1698e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1699e35fdd936d133bf8a48de140a3c666897588a05shiqian
1700e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that HasSubstr(s) describes itself properly.
1701e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideHasSubstrTest, CanDescribeSelf) {
1702e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher< ::wstring> m = HasSubstr(L"foo\n\"");
1703e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m));
1704e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1705e35fdd936d133bf8a48de140a3c666897588a05shiqian
1706e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests StartsWith(s).
1707e35fdd936d133bf8a48de140a3c666897588a05shiqian
1708e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) {
1709e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L""));
1710e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1711e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1712e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1713e35fdd936d133bf8a48de140a3c666897588a05shiqian
1714e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::wstring&> m2 = StartsWith(L"Hi");
1715e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1716e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi Hi!"));
1717e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"High"));
1718e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"H"));
1719e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L" Hi"));
1720e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1721e35fdd936d133bf8a48de140a3c666897588a05shiqian
1722e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideStartsWithTest, CanDescribeSelf) {
1723e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring> m = StartsWith(L"Hi");
1724e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("starts with L\"Hi\"", Describe(m));
1725e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1726e35fdd936d133bf8a48de140a3c666897588a05shiqian
1727e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests EndsWith(s).
1728e35fdd936d133bf8a48de140a3c666897588a05shiqian
1729e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) {
1730e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const wchar_t*> m1 = EndsWith(L"");
1731e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L"Hi"));
1732e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m1.Matches(L""));
1733e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m1.Matches(NULL));
1734e35fdd936d133bf8a48de140a3c666897588a05shiqian
1735e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi"));
1736e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Hi"));
1737e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Wow Hi Hi"));
1738e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m2.Matches(L"Super Hi"));
1739e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"i"));
1740e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m2.Matches(L"Hi "));
1741e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1742e35fdd936d133bf8a48de140a3c666897588a05shiqian
1743e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(GlobalWideEndsWithTest, CanDescribeSelf) {
1744e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const ::wstring> m = EndsWith(L"Hi");
1745e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("ends with L\"Hi\"", Describe(m));
1746e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1747e35fdd936d133bf8a48de140a3c666897588a05shiqian
1748e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif  // GTEST_HAS_GLOBAL_WSTRING
1749e35fdd936d133bf8a48de140a3c666897588a05shiqian
1750e35fdd936d133bf8a48de140a3c666897588a05shiqian
1751e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef ::std::tr1::tuple<long, int> Tuple2;  // NOLINT
1752e35fdd936d133bf8a48de140a3c666897588a05shiqian
1753e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() matches a 2-tuple where the first field == the
1754e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1755e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, MatchesEqualArguments) {
1756e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Eq();
1757e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1758e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1759e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1760e35fdd936d133bf8a48de140a3c666897588a05shiqian
1761e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Eq() describes itself properly.
1762e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Eq2Test, CanDescribeSelf) {
1763e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Eq();
17642661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_EQ("are a pair (x, y) where x == y", Describe(m));
1765e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1766e35fdd936d133bf8a48de140a3c666897588a05shiqian
1767e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() matches a 2-tuple where the first field >= the
1768e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1769e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, MatchesGreaterThanOrEqualArguments) {
1770e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ge();
1771e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1772e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1773e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1774e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1775e35fdd936d133bf8a48de140a3c666897588a05shiqian
1776e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ge() describes itself properly.
1777e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ge2Test, CanDescribeSelf) {
1778e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ge();
17792661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_EQ("are a pair (x, y) where x >= y", Describe(m));
1780e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1781e35fdd936d133bf8a48de140a3c666897588a05shiqian
1782e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() matches a 2-tuple where the first field > the
1783e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1784e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, MatchesGreaterThanArguments) {
1785e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Gt();
1786e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1787e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1788e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 6)));
1789e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1790e35fdd936d133bf8a48de140a3c666897588a05shiqian
1791e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Gt() describes itself properly.
1792e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Gt2Test, CanDescribeSelf) {
1793e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Gt();
17942661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_EQ("are a pair (x, y) where x > y", Describe(m));
1795e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1796e35fdd936d133bf8a48de140a3c666897588a05shiqian
1797e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() matches a 2-tuple where the first field <= the
1798e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1799e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, MatchesLessThanOrEqualArguments) {
1800e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Le();
1801e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1802e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 5)));
1803e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1804e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1805e35fdd936d133bf8a48de140a3c666897588a05shiqian
1806e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Le() describes itself properly.
1807e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Le2Test, CanDescribeSelf) {
1808e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Le();
18092661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_EQ("are a pair (x, y) where x <= y", Describe(m));
1810e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1811e35fdd936d133bf8a48de140a3c666897588a05shiqian
1812e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() matches a 2-tuple where the first field < the
1813e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1814e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, MatchesLessThanArguments) {
1815e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Lt();
1816e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1817e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1818e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 4)));
1819e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1820e35fdd936d133bf8a48de140a3c666897588a05shiqian
1821e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Lt() describes itself properly.
1822e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Lt2Test, CanDescribeSelf) {
1823e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Lt();
18242661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_EQ("are a pair (x, y) where x < y", Describe(m));
1825e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1826e35fdd936d133bf8a48de140a3c666897588a05shiqian
1827e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() matches a 2-tuple where the first field != the
1828e35fdd936d133bf8a48de140a3c666897588a05shiqian// second field.
1829e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, MatchesUnequalArguments) {
1830e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ne();
1831e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 6)));
1832e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(Tuple2(5L, 4)));
1833e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(Tuple2(5L, 5)));
1834e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1835e35fdd936d133bf8a48de140a3c666897588a05shiqian
1836e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Ne() describes itself properly.
1837e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(Ne2Test, CanDescribeSelf) {
1838e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const Tuple2&> m = Ne();
18392661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_EQ("are a pair (x, y) where x != y", Describe(m));
1840e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1841e35fdd936d133bf8a48de140a3c666897588a05shiqian
1842e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) matches any value that doesn't match m.
1843e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, NegatesMatcher) {
1844e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
1845e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Not(Eq(2));
1846e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
1847e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
1848e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1849e35fdd936d133bf8a48de140a3c666897588a05shiqian
1850e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Not(m) describes itself properly.
1851e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(NotTest, CanDescribeSelf) {
1852e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Not(Eq(5));
1853b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't equal to 5", Describe(m));
1854e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1855e35fdd936d133bf8a48de140a3c666897588a05shiqian
185618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the Not matcher.
185718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) {
185818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // greater_than_5 is a monomorphic matcher.
185918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> greater_than_5 = Gt(5);
186018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
186118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m = Not(greater_than_5);
186218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = Not(greater_than_5);
186318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m3 = Not(m);
186418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
186518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
1866e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) matches any value that matches all of
1867e35fdd936d133bf8a48de140a3c666897588a05shiqian// the given matchers.
1868e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, MatchesWhenAllMatch) {
1869e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
1870e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Le(2), Ge(1));
1871e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
1872e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2));
1873e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
1874e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(3));
1875e35fdd936d133bf8a48de140a3c666897588a05shiqian
1876e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2));
1877e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
1878e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
1879e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1));
1880e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
1881e35fdd936d133bf8a48de140a3c666897588a05shiqian
1882e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
1883e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(4));
1884e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(3));
1885e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
1886e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1));
1887e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
1888e35fdd936d133bf8a48de140a3c666897588a05shiqian
1889e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
1890e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(0));
1891e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
1892e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(3));
1893e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1894e35fdd936d133bf8a48de140a3c666897588a05shiqian
1895e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AllOf(m1, ..., mn) describes itself properly.
1896e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AllOfTest, CanDescribeSelf) {
1897e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
1898e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Le(2), Ge(1));
1899b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m));
1900e35fdd936d133bf8a48de140a3c666897588a05shiqian
1901e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2));
1902b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is > 0) and "
1903b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 1) and "
1904b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't equal to 2))",
1905e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
1906e35fdd936d133bf8a48de140a3c666897588a05shiqian
1907e35fdd936d133bf8a48de140a3c666897588a05shiqian
1908e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
1909b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is > 0) and "
1910b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 1) and "
1911b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 2) and "
1912b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't equal to 3)))",
1913e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
1914e35fdd936d133bf8a48de140a3c666897588a05shiqian
1915e35fdd936d133bf8a48de140a3c666897588a05shiqian
1916e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
1917b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is >= 0) and "
1918b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is < 10) and "
1919b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 3) and "
1920b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 5) and "
1921b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't equal to 7))))",
1922b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Describe(m));
1923b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
1924b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1925b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// Tests that AllOf(m1, ..., mn) describes its negation properly.
1926b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AllOfTest, CanDescribeNegation) {
1927b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
1928b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Le(2), Ge(1));
1929b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't <= 2) or "
1930b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't >= 1)",
1931b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
1932b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1933b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Gt(0), Ne(1), Ne(2));
1934b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't > 0) or "
1935b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 1) or "
1936b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(is equal to 2))",
1937b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
1938b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1939b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1940b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3));
1941b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't > 0) or "
1942b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 1) or "
1943b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 2) or "
1944b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(is equal to 3)))",
1945b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
1946b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1947b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1948b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7));
1949b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't >= 0) or "
1950b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't < 10) or "
1951b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 3) or "
1952b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is equal to 5) or "
1953b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(is equal to 7))))",
1954b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
1955e35fdd936d133bf8a48de140a3c666897588a05shiqian}
1956e35fdd936d133bf8a48de140a3c666897588a05shiqian
195718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AllOf matcher.
195818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) {
195918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // greater_than_5 and less_than_10 are monomorphic matchers.
196018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> greater_than_5 = Gt(5);
196118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> less_than_10 = Lt(10);
196218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
196318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m = AllOf(greater_than_5, less_than_10);
196418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = AllOf(greater_than_5, less_than_10);
196518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m3 = AllOf(greater_than_5, m2);
196618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
196718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // Tests that BothOf works when composing itself.
196818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10);
196918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10);
197018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
197118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
1972b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AllOfTest, ExplainsResult) {
1973b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
1974b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1975b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  Both matchers need to explain.  The second
1976b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't give an explanation, so only the first matcher's
1977b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explanation is printed.
1978b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), Lt(30));
1979b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 15 more than 10", Explain(m, 25));
1980b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1981b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  Both matchers need to explain.
1982b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20));
1983b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20",
1984b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 30));
1985b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1986b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  All matchers need to explain.  The second
1987b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't given an explanation.
1988b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20));
1989b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20",
1990b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 25));
1991b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1992b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  All matchers need to explain.
1993b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
1994b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, "
1995b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and which is 10 more than 30",
1996b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 40));
1997b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
1998b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  The first matcher, which failed, needs to
1999b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2000b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20));
2001b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2002b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2003b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  The second matcher, which failed, needs to
2004b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.  Since it doesn't given an explanation, nothing is
2005b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // printed.
2006b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), Lt(30));
2007b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("", Explain(m, 40));
2008b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2009b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  The second matcher, which failed, needs to
2010b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2011b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AllOf(GreaterThan(10), GreaterThan(20));
2012b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 20", Explain(m, 15));
2013b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
2014b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2015e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) matches any value that matches at
2016e35fdd936d133bf8a48de140a3c666897588a05shiqian// least one of the given matchers.
2017e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, MatchesWhenAnyMatches) {
2018e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
2019e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(1), Ge(3));
2020e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2021e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(4));
2022e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
2023e35fdd936d133bf8a48de140a3c666897588a05shiqian
2024e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2));
2025e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(-1));
2026e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2027e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2));
2028e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
2029e35fdd936d133bf8a48de140a3c666897588a05shiqian
2030e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2031e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(-1));
2032e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(1));
2033e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2));
2034e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
2035e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(0));
2036e35fdd936d133bf8a48de140a3c666897588a05shiqian
2037e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2038e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(0));
2039e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(11));
2040e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(3));
2041e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(2));
2042e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2043e35fdd936d133bf8a48de140a3c666897588a05shiqian
2044e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that AnyOf(m1, ..., mn) describes itself properly.
2045e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(AnyOfTest, CanDescribeSelf) {
2046e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m;
2047e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(1), Ge(3));
2048b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is <= 1) or (is >= 3)",
2049e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2050e35fdd936d133bf8a48de140a3c666897588a05shiqian
2051e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2));
2052b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is < 0) or "
2053e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 1) or (is equal to 2))",
2054e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2055e35fdd936d133bf8a48de140a3c666897588a05shiqian
2056e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2057b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is < 0) or "
2058e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 1) or "
2059e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 2) or "
2060e35fdd936d133bf8a48de140a3c666897588a05shiqian            "(is equal to 3)))",
2061e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2062e35fdd936d133bf8a48de140a3c666897588a05shiqian
2063e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2064b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(is <= 0) or "
2065b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((is > 10) or "
2066e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 3) or "
2067e35fdd936d133bf8a48de140a3c666897588a05shiqian            "((is equal to 5) or "
2068e35fdd936d133bf8a48de140a3c666897588a05shiqian            "(is equal to 7))))",
2069e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2070e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2071e35fdd936d133bf8a48de140a3c666897588a05shiqian
2072b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// Tests that AnyOf(m1, ..., mn) describes its negation properly.
2073b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AnyOfTest, CanDescribeNegation) {
2074b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
2075b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Le(1), Ge(3));
2076b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't <= 1) and (isn't >= 3)",
2077b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2078b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2079b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Lt(0), Eq(1), Eq(2));
2080b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't < 0) and "
2081b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 1) and (isn't equal to 2))",
2082b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2083b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2084b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3));
2085b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't < 0) and "
2086b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 1) and "
2087b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 2) and "
2088b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't equal to 3)))",
2089b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2090b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2091b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(Le(0), Gt(10), 3, 5, 7);
2092b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("(isn't <= 0) and "
2093b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't > 10) and "
2094b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 3) and "
2095b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "((isn't equal to 5) and "
2096b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "(isn't equal to 7))))",
2097b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
2098b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
2099b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
210018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Tests that monomorphic matchers are safely cast by the AnyOf matcher.
210118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wanTEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) {
210218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // greater_than_5 and less_than_10 are monomorphic matchers.
210318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> greater_than_5 = Gt(5);
210418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int> less_than_10 = Lt(10);
210518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
210618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m = AnyOf(greater_than_5, less_than_10);
210718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10);
210818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m3 = AnyOf(greater_than_5, m2);
210918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
211018490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  // Tests that EitherOf works when composing itself.
211118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10);
211218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan  Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10);
211318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan}
211418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan
2115b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(AnyOfTest, ExplainsResult) {
2116b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  Matcher<int> m;
2117b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2118b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  Both matchers need to explain.  The second
2119b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't give an explanation, so only the first matcher's
2120b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explanation is printed.
2121b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), Lt(0));
2122b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10", Explain(m, 5));
2123b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2124b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  Both matchers need to explain.
2125b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), GreaterThan(20));
2126b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20",
2127b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 5));
2128b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2129b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  All matchers need to explain.  The second
2130b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // matcher doesn't given an explanation.
2131b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30));
2132b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30",
2133b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 5));
2134b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2135b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Failed match.  All matchers need to explain.
2136b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30));
2137b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, "
2138b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and which is 25 less than 30",
2139b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, 5));
2140b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2141b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  The first matcher, which succeeded, needs to
2142b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2143b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), GreaterThan(20));
2144b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 more than 10", Explain(m, 15));
2145b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2146b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  The second matcher, which succeeded, needs to
2147b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.  Since it doesn't given an explanation, nothing is
2148b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // printed.
2149b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(10), Lt(30));
2150b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("", Explain(m, 0));
2151b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2152b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // Successful match.  The second matcher, which succeeded, needs to
2153b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  // explain.
2154b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  m = AnyOf(GreaterThan(30), GreaterThan(20));
2155b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 5 more than 20", Explain(m, 25));
2156b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
2157b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
2158e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following predicate function and predicate functor are for
2159e35fdd936d133bf8a48de140a3c666897588a05shiqian// testing the Truly(predicate) matcher.
2160e35fdd936d133bf8a48de140a3c666897588a05shiqian
2161e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns non-zero if the input is positive.  Note that the return
2162e35fdd936d133bf8a48de140a3c666897588a05shiqian// type of this function is not bool.  It's OK as Truly() accepts any
2163e35fdd936d133bf8a48de140a3c666897588a05shiqian// unary function or functor whose return type can be implicitly
2164e35fdd936d133bf8a48de140a3c666897588a05shiqian// converted to bool.
2165e35fdd936d133bf8a48de140a3c666897588a05shiqianint IsPositive(double x) {
2166e35fdd936d133bf8a48de140a3c666897588a05shiqian  return x > 0 ? 1 : 0;
2167e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2168e35fdd936d133bf8a48de140a3c666897588a05shiqian
2169e35fdd936d133bf8a48de140a3c666897588a05shiqian// This functor returns true if the input is greater than the given
2170e35fdd936d133bf8a48de140a3c666897588a05shiqian// number.
2171e35fdd936d133bf8a48de140a3c666897588a05shiqianclass IsGreaterThan {
2172e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
2173e35fdd936d133bf8a48de140a3c666897588a05shiqian  explicit IsGreaterThan(int threshold) : threshold_(threshold) {}
2174e35fdd936d133bf8a48de140a3c666897588a05shiqian
2175e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool operator()(int n) const { return n > threshold_; }
217632de5f53763125925e078498250f7e73a88de9edzhanyong.wan
2177e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
217832de5f53763125925e078498250f7e73a88de9edzhanyong.wan  int threshold_;
2179e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2180e35fdd936d133bf8a48de140a3c666897588a05shiqian
2181e35fdd936d133bf8a48de140a3c666897588a05shiqian// For testing Truly().
2182e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int foo = 0;
2183e35fdd936d133bf8a48de140a3c666897588a05shiqian
2184e35fdd936d133bf8a48de140a3c666897588a05shiqian// This predicate returns true iff the argument references foo and has
2185e35fdd936d133bf8a48de140a3c666897588a05shiqian// a zero value.
2186e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ReferencesFooAndIsZero(const int& n) {
2187e35fdd936d133bf8a48de140a3c666897588a05shiqian  return (&n == &foo) && (n == 0);
2188e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2189e35fdd936d133bf8a48de140a3c666897588a05shiqian
2190e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) matches what satisfies the given
2191e35fdd936d133bf8a48de140a3c666897588a05shiqian// predicate.
2192e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, MatchesWhatSatisfiesThePredicate) {
2193e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = Truly(IsPositive);
2194e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(2.0));
2195e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(-1.5));
2196e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2197e35fdd936d133bf8a48de140a3c666897588a05shiqian
2198e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate_functor) works too.
2199e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanBeUsedWithFunctor) {
2200e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> m = Truly(IsGreaterThan(5));
2201e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(6));
2202e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(4));
2203e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2204e35fdd936d133bf8a48de140a3c666897588a05shiqian
2205e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) can describe itself properly.
2206e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, CanDescribeSelf) {
2207e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = Truly(IsPositive);
2208e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("satisfies the given predicate",
2209e35fdd936d133bf8a48de140a3c666897588a05shiqian            Describe(m));
2210e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2211e35fdd936d133bf8a48de140a3c666897588a05shiqian
2212e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Truly(predicate) works when the matcher takes its
2213e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument by reference.
2214e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(TrulyTest, WorksForByRefArguments) {
2215e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> m = Truly(ReferencesFooAndIsZero);
2216e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(foo));
2217e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 0;
2218e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(n));
2219e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2220e35fdd936d133bf8a48de140a3c666897588a05shiqian
2221e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) is a predicate satisfied by whatever that
2222e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches matcher m.
2223e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) {
2224e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(Matches(Ge(0))(1));
2225e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(Matches(Eq('a'))('b'));
2226e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2227e35fdd936d133bf8a48de140a3c666897588a05shiqian
2228e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Matches(m) works when the matcher takes its argument by
2229e35fdd936d133bf8a48de140a3c666897588a05shiqian// reference.
2230e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksOnByRefArguments) {
2231e35fdd936d133bf8a48de140a3c666897588a05shiqian  int m = 0, n = 0;
2232e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n));
2233e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(Matches(Ref(m))(n));
2234e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2235e35fdd936d133bf8a48de140a3c666897588a05shiqian
2236e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that a Matcher on non-reference type can be used in
2237e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches().
2238e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatchesTest, WorksWithMatcherOnNonRefType) {
2239e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> eq5 = Eq(5);
2240e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(Matches(eq5)(5));
2241e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(Matches(eq5)(2));
2242e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2243e35fdd936d133bf8a48de140a3c666897588a05shiqian
2244b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Tests Value(value, matcher).  Since Value() is a simple wrapper for
2245b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Matches(), which has been tested already, we don't spend a lot of
2246b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// effort on testing Value().
2247b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithPolymorphicMatcher) {
2248b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_TRUE(Value("hi", StartsWith("h")));
2249b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_FALSE(Value(5, Gt(10)));
2250b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
2251b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
2252b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ValueTest, WorksWithMonomorphicMatcher) {
2253b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const Matcher<int> is_zero = Eq(0);
2254b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_TRUE(Value(0, is_zero));
2255b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_FALSE(Value('a', is_zero));
2256b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
2257b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  int n = 0;
2258b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const Matcher<const int&> ref_n = Ref(n);
2259b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_TRUE(Value(n, ref_n));
2260b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_FALSE(Value(1, ref_n));
2261b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
2262b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
2263a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) {
226434b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener1;
2265a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1));
226634b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("% 2 == 0", listener1.str());
226734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
226834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener2;
2269a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2));
227034b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("", listener2.str());
227134b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan}
227234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
2273a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {
227434b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  const Matcher<int> is_even = PolymorphicIsEven();
227534b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener1;
2276a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1));
227734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("% 2 == 0", listener1.str());
227834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
227934b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  const Matcher<const double&> is_zero = Eq(0);
228034b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  StringMatchResultListener listener2;
2281a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2));
228234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan  EXPECT_EQ("", listener2.str());
228334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan}
228434b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan
2285a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanMATCHER_P(Really, inner_matcher, "") {
2286a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  return ExplainMatchResult(inner_matcher, arg, result_listener);
2287a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
2288a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
2289a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wanTEST(ExplainMatchResultTest, WorksInsideMATCHER) {
2290a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan  EXPECT_THAT(0, Really(Eq(0)));
2291a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan}
2292a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan
2293bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForTuple) {
2294bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt()));
2295bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt())));
2296bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}
2297bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2298bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksForNonTuple) {
2299bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT(42, AllArgs(Gt(0)));
2300bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_THAT('a', Not(AllArgs(Eq('b'))));
2301bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}
2302bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2303bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanclass AllArgsHelper {
2304bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan public:
230532de5f53763125925e078498250f7e73a88de9edzhanyong.wan  AllArgsHelper() {}
230632de5f53763125925e078498250f7e73a88de9edzhanyong.wan
2307bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  MOCK_METHOD2(Helper, int(char x, int y));
230832de5f53763125925e078498250f7e73a88de9edzhanyong.wan
230932de5f53763125925e078498250f7e73a88de9edzhanyong.wan private:
231032de5f53763125925e078498250f7e73a88de9edzhanyong.wan  GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper);
2311bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan};
2312bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2313bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wanTEST(AllArgsTest, WorksInWithClause) {
2314bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  AllArgsHelper helper;
2315bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  ON_CALL(helper, Helper(_, _))
2316bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .With(AllArgs(Lt()))
2317bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .WillByDefault(Return(1));
2318bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_CALL(helper, Helper(_, _));
2319bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_CALL(helper, Helper(_, _))
2320bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .With(AllArgs(Gt()))
2321bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan      .WillOnce(Return(2));
2322bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2323bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_EQ(1, helper.Helper('\1', 2));
2324bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan  EXPECT_EQ(2, helper.Helper('a', 1));
2325bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan}
2326bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan
2327e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2328e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches the matcher.
2329e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) {
2330e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT(5, Ge(2)) << "This should succeed.";
2331e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT("Foo", EndsWith("oo"));
2332e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too.";
2333e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_THAT("Hello", StartsWith("Hell"));
2334e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2335e35fdd936d133bf8a48de140a3c666897588a05shiqian
2336e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value
2337e35fdd936d133bf8a48de140a3c666897588a05shiqian// doesn't match the matcher.
2338e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) {
2339e35fdd936d133bf8a48de140a3c666897588a05shiqian  // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(),
2340e35fdd936d133bf8a48de140a3c666897588a05shiqian  // which cannot reference auto variables.
2341e35fdd936d133bf8a48de140a3c666897588a05shiqian  static int n;
2342e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 5;
23432b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
23442b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // VC++ prior to version 8.0 SP1 has a bug where it will not see any
23452b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // functions declared in the namespace scope from within nested classes.
23462b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all
23472b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // namespace-level functions invoked inside them need to be explicitly
23482b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  // resolved.
23492b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)),
2350e35fdd936d133bf8a48de140a3c666897588a05shiqian                       "Value of: n\n"
2351b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                       "Expected: is > 10\n"
23522b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan                       "  Actual: 5");
2353e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 0;
23542b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_NONFATAL_FAILURE(
23552b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan      EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))),
23562b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan      "Value of: n\n"
2357b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan      "Expected: (is <= 7) and (is >= 5)\n"
23582b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan      "  Actual: 0");
2359e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2360e35fdd936d133bf8a48de140a3c666897588a05shiqian
2361e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument
2362e35fdd936d133bf8a48de140a3c666897588a05shiqian// has a reference type.
2363e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForByRefArguments) {
2364e35fdd936d133bf8a48de140a3c666897588a05shiqian  // We use a static variable here as EXPECT_FATAL_FAILURE() cannot
2365e35fdd936d133bf8a48de140a3c666897588a05shiqian  // reference auto variables.
2366e35fdd936d133bf8a48de140a3c666897588a05shiqian  static int n;
2367e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = 0;
2368e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_THAT(n, AllOf(Le(7), Ref(n)));
23692b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
2370e35fdd936d133bf8a48de140a3c666897588a05shiqian                       "Value of: n\n"
2371e35fdd936d133bf8a48de140a3c666897588a05shiqian                       "Expected: does not reference the variable @");
2372e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Tests the "Actual" part.
23732b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))),
2374b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                       "Actual: 0, which is located @");
2375e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2376e35fdd936d133bf8a48de140a3c666897588a05shiqian
237795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#if !GTEST_OS_SYMBIAN
2378e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is
2379e35fdd936d133bf8a48de140a3c666897588a05shiqian// monomorphic.
238095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan
238195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's
238295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// Symbian compiler: it tries to compile
238395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// template<T, U> class MatcherCastImpl { ...
2384db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan//   virtual bool MatchAndExplain(T x, ...) const {
2385db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan//     return source_matcher_.MatchAndExplain(static_cast<U>(x), ...);
238695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// with U == string and T == const char*
238795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... )
238895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// the compiler silently crashes with no output.
238995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x)
239095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// the code compiles but the converted string is bogus.
2391e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) {
2392e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> starts_with_he = StartsWith("he");
2393e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT("hello", starts_with_he);
2394e35fdd936d133bf8a48de140a3c666897588a05shiqian
2395e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> ends_with_ok = EndsWith("ok");
2396e35fdd936d133bf8a48de140a3c666897588a05shiqian  ASSERT_THAT("book", ends_with_ok);
2397e35fdd936d133bf8a48de140a3c666897588a05shiqian
2398e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> is_greater_than_5 = Gt(5);
2399e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5),
2400e35fdd936d133bf8a48de140a3c666897588a05shiqian                          "Value of: 5\n"
2401b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                          "Expected: is > 5\n"
2402e35fdd936d133bf8a48de140a3c666897588a05shiqian                          "  Actual: 5");
2403e35fdd936d133bf8a48de140a3c666897588a05shiqian}
240495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan#endif  // !GTEST_OS_SYMBIAN
2405e35fdd936d133bf8a48de140a3c666897588a05shiqian
2406e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests floating-point matchers.
2407e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2408e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FloatingPointTest : public testing::Test {
2409e35fdd936d133bf8a48de140a3c666897588a05shiqian protected:
2410e35fdd936d133bf8a48de140a3c666897588a05shiqian  typedef typename testing::internal::FloatingPoint<RawType> Floating;
2411e35fdd936d133bf8a48de140a3c666897588a05shiqian  typedef typename Floating::Bits Bits;
2412e35fdd936d133bf8a48de140a3c666897588a05shiqian
2413e35fdd936d133bf8a48de140a3c666897588a05shiqian  virtual void SetUp() {
2414e35fdd936d133bf8a48de140a3c666897588a05shiqian    const size_t max_ulps = Floating::kMaxUlps;
2415e35fdd936d133bf8a48de140a3c666897588a05shiqian
2416e35fdd936d133bf8a48de140a3c666897588a05shiqian    // The bits that represent 0.0.
2417e35fdd936d133bf8a48de140a3c666897588a05shiqian    const Bits zero_bits = Floating(0).bits();
2418e35fdd936d133bf8a48de140a3c666897588a05shiqian
2419e35fdd936d133bf8a48de140a3c666897588a05shiqian    // Makes some numbers close to 0.0.
2420e35fdd936d133bf8a48de140a3c666897588a05shiqian    close_to_positive_zero_ = Floating::ReinterpretBits(zero_bits + max_ulps/2);
2421e35fdd936d133bf8a48de140a3c666897588a05shiqian    close_to_negative_zero_ = -Floating::ReinterpretBits(
2422e35fdd936d133bf8a48de140a3c666897588a05shiqian        zero_bits + max_ulps - max_ulps/2);
2423e35fdd936d133bf8a48de140a3c666897588a05shiqian    further_from_negative_zero_ = -Floating::ReinterpretBits(
2424e35fdd936d133bf8a48de140a3c666897588a05shiqian        zero_bits + max_ulps + 1 - max_ulps/2);
2425e35fdd936d133bf8a48de140a3c666897588a05shiqian
2426e35fdd936d133bf8a48de140a3c666897588a05shiqian    // The bits that represent 1.0.
2427e35fdd936d133bf8a48de140a3c666897588a05shiqian    const Bits one_bits = Floating(1).bits();
2428e35fdd936d133bf8a48de140a3c666897588a05shiqian
2429e35fdd936d133bf8a48de140a3c666897588a05shiqian    // Makes some numbers close to 1.0.
2430e35fdd936d133bf8a48de140a3c666897588a05shiqian    close_to_one_ = Floating::ReinterpretBits(one_bits + max_ulps);
2431e35fdd936d133bf8a48de140a3c666897588a05shiqian    further_from_one_ = Floating::ReinterpretBits(one_bits + max_ulps + 1);
2432e35fdd936d133bf8a48de140a3c666897588a05shiqian
2433e35fdd936d133bf8a48de140a3c666897588a05shiqian    // +infinity.
2434e35fdd936d133bf8a48de140a3c666897588a05shiqian    infinity_ = Floating::Infinity();
2435e35fdd936d133bf8a48de140a3c666897588a05shiqian
2436e35fdd936d133bf8a48de140a3c666897588a05shiqian    // The bits that represent +infinity.
2437e35fdd936d133bf8a48de140a3c666897588a05shiqian    const Bits infinity_bits = Floating(infinity_).bits();
2438e35fdd936d133bf8a48de140a3c666897588a05shiqian
2439e35fdd936d133bf8a48de140a3c666897588a05shiqian    // Makes some numbers close to infinity.
2440e35fdd936d133bf8a48de140a3c666897588a05shiqian    close_to_infinity_ = Floating::ReinterpretBits(infinity_bits - max_ulps);
2441e35fdd936d133bf8a48de140a3c666897588a05shiqian    further_from_infinity_ = Floating::ReinterpretBits(
2442e35fdd936d133bf8a48de140a3c666897588a05shiqian        infinity_bits - max_ulps - 1);
2443e35fdd936d133bf8a48de140a3c666897588a05shiqian
2444e35fdd936d133bf8a48de140a3c666897588a05shiqian    // Makes some NAN's.
2445e35fdd936d133bf8a48de140a3c666897588a05shiqian    nan1_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 1);
2446e35fdd936d133bf8a48de140a3c666897588a05shiqian    nan2_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 200);
2447e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
2448e35fdd936d133bf8a48de140a3c666897588a05shiqian
2449e35fdd936d133bf8a48de140a3c666897588a05shiqian  void TestSize() {
2450e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_EQ(sizeof(RawType), sizeof(Bits));
2451e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
2452e35fdd936d133bf8a48de140a3c666897588a05shiqian
2453e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A battery of tests for FloatingEqMatcher::Matches.
2454e35fdd936d133bf8a48de140a3c666897588a05shiqian  // matcher_maker is a pointer to a function which creates a FloatingEqMatcher.
2455e35fdd936d133bf8a48de140a3c666897588a05shiqian  void TestMatches(
2456e35fdd936d133bf8a48de140a3c666897588a05shiqian      testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) {
2457e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m1 = matcher_maker(0.0);
2458e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m1.Matches(-0.0));
2459e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m1.Matches(close_to_positive_zero_));
2460e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m1.Matches(close_to_negative_zero_));
2461e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m1.Matches(1.0));
2462e35fdd936d133bf8a48de140a3c666897588a05shiqian
2463e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_);
2464e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m2.Matches(further_from_negative_zero_));
2465e35fdd936d133bf8a48de140a3c666897588a05shiqian
2466e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m3 = matcher_maker(1.0);
2467e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m3.Matches(close_to_one_));
2468e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m3.Matches(further_from_one_));
2469e35fdd936d133bf8a48de140a3c666897588a05shiqian
2470e35fdd936d133bf8a48de140a3c666897588a05shiqian    // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above.
2471e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m3.Matches(0.0));
2472e35fdd936d133bf8a48de140a3c666897588a05shiqian
2473e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m4 = matcher_maker(-infinity_);
2474e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m4.Matches(-close_to_infinity_));
2475e35fdd936d133bf8a48de140a3c666897588a05shiqian
2476e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType> m5 = matcher_maker(infinity_);
2477e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m5.Matches(close_to_infinity_));
2478e35fdd936d133bf8a48de140a3c666897588a05shiqian
2479e35fdd936d133bf8a48de140a3c666897588a05shiqian    // This is interesting as the representations of infinity_ and nan1_
2480e35fdd936d133bf8a48de140a3c666897588a05shiqian    // are only 1 DLP apart.
2481e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m5.Matches(nan1_));
2482e35fdd936d133bf8a48de140a3c666897588a05shiqian
2483e35fdd936d133bf8a48de140a3c666897588a05shiqian    // matcher_maker can produce a Matcher<const RawType&>, which is needed in
2484e35fdd936d133bf8a48de140a3c666897588a05shiqian    // some cases.
2485e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<const RawType&> m6 = matcher_maker(0.0);
2486e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m6.Matches(-0.0));
2487e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m6.Matches(close_to_positive_zero_));
2488e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m6.Matches(1.0));
2489e35fdd936d133bf8a48de140a3c666897588a05shiqian
2490e35fdd936d133bf8a48de140a3c666897588a05shiqian    // matcher_maker can produce a Matcher<RawType&>, which is needed in some
2491e35fdd936d133bf8a48de140a3c666897588a05shiqian    // cases.
2492e35fdd936d133bf8a48de140a3c666897588a05shiqian    Matcher<RawType&> m7 = matcher_maker(0.0);
2493e35fdd936d133bf8a48de140a3c666897588a05shiqian    RawType x = 0.0;
2494e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_TRUE(m7.Matches(x));
2495e35fdd936d133bf8a48de140a3c666897588a05shiqian    x = 0.01f;
2496e35fdd936d133bf8a48de140a3c666897588a05shiqian    EXPECT_FALSE(m7.Matches(x));
2497e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
2498e35fdd936d133bf8a48de140a3c666897588a05shiqian
2499e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Pre-calculated numbers to be used by the tests.
2500e35fdd936d133bf8a48de140a3c666897588a05shiqian
2501e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType close_to_positive_zero_;
2502e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType close_to_negative_zero_;
2503e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType further_from_negative_zero_;
2504e35fdd936d133bf8a48de140a3c666897588a05shiqian
2505e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType close_to_one_;
2506e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType further_from_one_;
2507e35fdd936d133bf8a48de140a3c666897588a05shiqian
2508e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType infinity_;
2509e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType close_to_infinity_;
2510e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType further_from_infinity_;
2511e35fdd936d133bf8a48de140a3c666897588a05shiqian
2512e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType nan1_;
2513e35fdd936d133bf8a48de140a3c666897588a05shiqian  static RawType nan2_;
2514e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2515e35fdd936d133bf8a48de140a3c666897588a05shiqian
2516e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2517e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_positive_zero_;
2518e35fdd936d133bf8a48de140a3c666897588a05shiqian
2519e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2520e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_negative_zero_;
2521e35fdd936d133bf8a48de140a3c666897588a05shiqian
2522e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2523e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::further_from_negative_zero_;
2524e35fdd936d133bf8a48de140a3c666897588a05shiqian
2525e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2526e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_one_;
2527e35fdd936d133bf8a48de140a3c666897588a05shiqian
2528e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2529e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::further_from_one_;
2530e35fdd936d133bf8a48de140a3c666897588a05shiqian
2531e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2532e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::infinity_;
2533e35fdd936d133bf8a48de140a3c666897588a05shiqian
2534e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2535e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::close_to_infinity_;
2536e35fdd936d133bf8a48de140a3c666897588a05shiqian
2537e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2538e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::further_from_infinity_;
2539e35fdd936d133bf8a48de140a3c666897588a05shiqian
2540e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2541e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::nan1_;
2542e35fdd936d133bf8a48de140a3c666897588a05shiqian
2543e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename RawType>
2544e35fdd936d133bf8a48de140a3c666897588a05shiqianRawType FloatingPointTest<RawType>::nan2_;
2545e35fdd936d133bf8a48de140a3c666897588a05shiqian
2546e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing floats.
2547e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<float> FloatTest;
2548e35fdd936d133bf8a48de140a3c666897588a05shiqian
2549e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) {
2550e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&FloatEq);
2551e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2552e35fdd936d133bf8a48de140a3c666897588a05shiqian
2553e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) {
2554e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&NanSensitiveFloatEq);
2555e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2556e35fdd936d133bf8a48de140a3c666897588a05shiqian
2557e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCannotMatchNaN) {
2558e35fdd936d133bf8a48de140a3c666897588a05shiqian  // FloatEq never matches NaN.
2559e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m = FloatEq(nan1_);
2560e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan1_));
2561e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan2_));
2562e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
2563e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2564e35fdd936d133bf8a48de140a3c666897588a05shiqian
2565e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) {
2566e35fdd936d133bf8a48de140a3c666897588a05shiqian  // NanSensitiveFloatEq will match NaN.
2567e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m = NanSensitiveFloatEq(nan1_);
2568e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan1_));
2569e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan2_));
2570e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
2571e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2572e35fdd936d133bf8a48de140a3c666897588a05shiqian
2573e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, FloatEqCanDescribeSelf) {
2574e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m1 = FloatEq(2.0f);
2575e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
2576b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2577e35fdd936d133bf8a48de140a3c666897588a05shiqian
2578e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m2 = FloatEq(0.5f);
2579e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
2580b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2581e35fdd936d133bf8a48de140a3c666897588a05shiqian
2582e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m3 = FloatEq(nan1_);
2583e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("never matches", Describe(m3));
2584e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", DescribeNegation(m3));
2585e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2586e35fdd936d133bf8a48de140a3c666897588a05shiqian
2587e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) {
2588e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m1 = NanSensitiveFloatEq(2.0f);
2589e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
2590b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2591e35fdd936d133bf8a48de140a3c666897588a05shiqian
2592e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m2 = NanSensitiveFloatEq(0.5f);
2593e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
2594b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2595e35fdd936d133bf8a48de140a3c666897588a05shiqian
2596e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<float> m3 = NanSensitiveFloatEq(nan1_);
2597e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is NaN", Describe(m3));
2598b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2599e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2600e35fdd936d133bf8a48de140a3c666897588a05shiqian
2601e35fdd936d133bf8a48de140a3c666897588a05shiqian// Instantiate FloatingPointTest for testing doubles.
2602e35fdd936d133bf8a48de140a3c666897588a05shiqiantypedef FloatingPointTest<double> DoubleTest;
2603e35fdd936d133bf8a48de140a3c666897588a05shiqian
2604e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) {
2605e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&DoubleEq);
2606e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2607e35fdd936d133bf8a48de140a3c666897588a05shiqian
2608e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) {
2609e35fdd936d133bf8a48de140a3c666897588a05shiqian  TestMatches(&NanSensitiveDoubleEq);
2610e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2611e35fdd936d133bf8a48de140a3c666897588a05shiqian
2612e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCannotMatchNaN) {
2613e35fdd936d133bf8a48de140a3c666897588a05shiqian  // DoubleEq never matches NaN.
2614e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = DoubleEq(nan1_);
2615e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan1_));
2616e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(nan2_));
2617e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
2618e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2619e35fdd936d133bf8a48de140a3c666897588a05shiqian
2620e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) {
2621e35fdd936d133bf8a48de140a3c666897588a05shiqian  // NanSensitiveDoubleEq will match NaN.
2622e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m = NanSensitiveDoubleEq(nan1_);
2623e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan1_));
2624e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(nan2_));
2625e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(1.0));
2626e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2627e35fdd936d133bf8a48de140a3c666897588a05shiqian
2628e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, DoubleEqCanDescribeSelf) {
2629e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = DoubleEq(2.0);
2630e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
2631b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2632e35fdd936d133bf8a48de140a3c666897588a05shiqian
2633e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m2 = DoubleEq(0.5);
2634e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
2635b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2636e35fdd936d133bf8a48de140a3c666897588a05shiqian
2637e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m3 = DoubleEq(nan1_);
2638e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("never matches", Describe(m3));
2639e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is anything", DescribeNegation(m3));
2640e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2641e35fdd936d133bf8a48de140a3c666897588a05shiqian
2642e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) {
2643e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m1 = NanSensitiveDoubleEq(2.0);
2644e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 2", Describe(m1));
2645b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 2", DescribeNegation(m1));
2646e35fdd936d133bf8a48de140a3c666897588a05shiqian
2647e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m2 = NanSensitiveDoubleEq(0.5);
2648e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is approximately 0.5", Describe(m2));
2649b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2));
2650e35fdd936d133bf8a48de140a3c666897588a05shiqian
2651e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double> m3 = NanSensitiveDoubleEq(nan1_);
2652e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("is NaN", Describe(m3));
2653b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("isn't NaN", DescribeNegation(m3));
2654e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2655e35fdd936d133bf8a48de140a3c666897588a05shiqian
2656e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointer) {
2657e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int*> m = Pointee(Ge(0));
2658e35fdd936d133bf8a48de140a3c666897588a05shiqian
2659e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 1;
2660e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&n));
2661e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = -1;
2662e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&n));
2663e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
2664e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2665e35fdd936d133bf8a48de140a3c666897588a05shiqian
2666e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, RawPointerToConst) {
2667e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const double*> m = Pointee(Ge(0));
2668e35fdd936d133bf8a48de140a3c666897588a05shiqian
2669e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 1;
2670e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&x));
2671e35fdd936d133bf8a48de140a3c666897588a05shiqian  x = -1;
2672e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&x));
2673e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
2674e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2675e35fdd936d133bf8a48de140a3c666897588a05shiqian
2676e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToConstRawPointer) {
2677e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int* const &> m = Pointee(Ge(0));
2678e35fdd936d133bf8a48de140a3c666897588a05shiqian
2679e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 1;
2680e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&n));
2681e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = -1;
2682e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&n));
2683e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
2684e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2685e35fdd936d133bf8a48de140a3c666897588a05shiqian
2686e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, ReferenceToNonConstRawPointer) {
2687e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<double* &> m = Pointee(Ge(0));
2688e35fdd936d133bf8a48de140a3c666897588a05shiqian
2689e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 1.0;
2690e35fdd936d133bf8a48de140a3c666897588a05shiqian  double* p = &x;
2691e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(p));
2692e35fdd936d133bf8a48de140a3c666897588a05shiqian  x = -1;
2693e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(p));
2694e35fdd936d133bf8a48de140a3c666897588a05shiqian  p = NULL;
2695e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(p));
2696e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2697e35fdd936d133bf8a48de140a3c666897588a05shiqian
2698e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, NeverMatchesNull) {
2699e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const char*> m = Pointee(_);
2700e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
2701e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2702e35fdd936d133bf8a48de140a3c666897588a05shiqian
2703e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that we can write Pointee(value) instead of Pointee(Eq(value)).
2704e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, MatchesAgainstAValue) {
2705e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int*> m = Pointee(5);
2706e35fdd936d133bf8a48de140a3c666897588a05shiqian
2707e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 5;
2708e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&n));
2709e35fdd936d133bf8a48de140a3c666897588a05shiqian  n = -1;
2710e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&n));
2711e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
2712e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2713e35fdd936d133bf8a48de140a3c666897588a05shiqian
2714e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanDescribeSelf) {
2715e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int*> m = Pointee(Gt(3));
2716b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("points to a value that is > 3", Describe(m));
2717b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("does not point to a value that is > 3",
2718e35fdd936d133bf8a48de140a3c666897588a05shiqian            DescribeNegation(m));
2719e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2720e35fdd936d133bf8a48de140a3c666897588a05shiqian
2721e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PointeeTest, CanExplainMatchResult) {
2722e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const string*> m = Pointee(StartsWith("Hi"));
2723e35fdd936d133bf8a48de140a3c666897588a05shiqian
2724e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL)));
2725e35fdd936d133bf8a48de140a3c666897588a05shiqian
2726e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int*> m2 = Pointee(GreaterThan(1));
2727e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n = 3;
2728676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which points to 3, which is 2 more than 1",
2729676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            Explain(m2, &n));
2730676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan}
2731676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan
2732676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wanTEST(PointeeTest, AlwaysExplainsPointee) {
2733676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  const Matcher<int*> m = Pointee(0);
2734676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  int n = 42;
2735676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which points to 42", Explain(m, &n));
2736e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2737e35fdd936d133bf8a48de140a3c666897588a05shiqian
2738e35fdd936d133bf8a48de140a3c666897588a05shiqian// An uncopyable class.
2739e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Uncopyable {
2740e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
274132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit Uncopyable(int a_value) : value_(a_value) {}
2742e35fdd936d133bf8a48de140a3c666897588a05shiqian
2743e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value() const { return value_; }
2744e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
2745e35fdd936d133bf8a48de140a3c666897588a05shiqian  const int value_;
2746e35fdd936d133bf8a48de140a3c666897588a05shiqian  GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable);
2747e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2748e35fdd936d133bf8a48de140a3c666897588a05shiqian
2749e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns true iff x.value() is positive.
2750e35fdd936d133bf8a48de140a3c666897588a05shiqianbool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; }
2751e35fdd936d133bf8a48de140a3c666897588a05shiqian
2752e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined struct for testing Field().
2753e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct AStruct {
2754e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct() : x(0), y(1.0), z(5), p(NULL) {}
2755e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct(const AStruct& rhs)
2756e35fdd936d133bf8a48de140a3c666897588a05shiqian      : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {}
2757e35fdd936d133bf8a48de140a3c666897588a05shiqian
2758e35fdd936d133bf8a48de140a3c666897588a05shiqian  int x;           // A non-const field.
2759e35fdd936d133bf8a48de140a3c666897588a05shiqian  const double y;  // A const field.
2760e35fdd936d133bf8a48de140a3c666897588a05shiqian  Uncopyable z;    // An uncopyable field.
2761e35fdd936d133bf8a48de140a3c666897588a05shiqian  const char* p;   // A pointer field.
276232de5f53763125925e078498250f7e73a88de9edzhanyong.wan
276332de5f53763125925e078498250f7e73a88de9edzhanyong.wan private:
276432de5f53763125925e078498250f7e73a88de9edzhanyong.wan  GTEST_DISALLOW_ASSIGN_(AStruct);
2765e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2766e35fdd936d133bf8a48de140a3c666897588a05shiqian
2767e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived struct for testing Field().
2768e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct DerivedStruct : public AStruct {
2769e35fdd936d133bf8a48de140a3c666897588a05shiqian  char ch;
277032de5f53763125925e078498250f7e73a88de9edzhanyong.wan
277132de5f53763125925e078498250f7e73a88de9edzhanyong.wan private:
277232de5f53763125925e078498250f7e73a88de9edzhanyong.wan  GTEST_DISALLOW_ASSIGN_(DerivedStruct);
2773e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2774e35fdd936d133bf8a48de140a3c666897588a05shiqian
2775e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is non-const.
2776e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForNonConstField) {
2777e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::x, Ge(0));
2778e35fdd936d133bf8a48de140a3c666897588a05shiqian
2779e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2780e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2781e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
2782e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2783e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2784e35fdd936d133bf8a48de140a3c666897588a05shiqian
2785e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is const.
2786e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForConstField) {
2787e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2788e35fdd936d133bf8a48de140a3c666897588a05shiqian
2789e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0));
2790e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2791e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::y, Le(0.0));
2792e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2793e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2794e35fdd936d133bf8a48de140a3c666897588a05shiqian
2795e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is not copyable.
2796e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForUncopyableField) {
2797e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2798e35fdd936d133bf8a48de140a3c666897588a05shiqian
2799e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive));
2800e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2801e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::z, Not(Truly(ValueIsPositive)));
2802e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2803e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2804e35fdd936d133bf8a48de140a3c666897588a05shiqian
2805e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when field is a pointer.
2806e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForPointerField) {
2807e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Matching against NULL.
2808e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL));
2809e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2810e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2811e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.p = "hi";
2812e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2813e35fdd936d133bf8a48de140a3c666897588a05shiqian
2814e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Matching a pointer that is not NULL.
2815e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::p, StartsWith("hi"));
2816e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.p = "hill";
2817e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2818e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.p = "hole";
2819e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2820e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2821e35fdd936d133bf8a48de140a3c666897588a05shiqian
2822e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the object is passed by reference.
2823e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForByRefArgument) {
2824e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
2825e35fdd936d133bf8a48de140a3c666897588a05shiqian
2826e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2827e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2828e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
2829e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2830e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2831e35fdd936d133bf8a48de140a3c666897588a05shiqian
2832e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type
2833e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of Foo.
2834e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForArgumentOfSubType) {
2835e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Note that the matcher expects DerivedStruct but we say AStruct
2836e35fdd936d133bf8a48de140a3c666897588a05shiqian  // inside Field().
2837e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0));
2838e35fdd936d133bf8a48de140a3c666897588a05shiqian
2839e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedStruct d;
2840e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(d));
2841e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.x = -1;
2842e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(d));
2843e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2844e35fdd936d133bf8a48de140a3c666897588a05shiqian
2845e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, m) works when field's type and m's
2846e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument type are compatible but not the same.
2847e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, WorksForCompatibleMatcherType) {
2848e35fdd936d133bf8a48de140a3c666897588a05shiqian  // The field is an int, but the inner matcher expects a signed char.
2849e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x,
2850e35fdd936d133bf8a48de140a3c666897588a05shiqian                                    Matcher<signed char>(Ge(0)));
2851e35fdd936d133bf8a48de140a3c666897588a05shiqian
2852e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2853e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2854e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
2855e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2856e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2857e35fdd936d133bf8a48de140a3c666897588a05shiqian
2858e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself.
2859e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanDescribeSelf) {
2860e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
2861e35fdd936d133bf8a48de140a3c666897588a05shiqian
2862b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
2863b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
2864e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2865e35fdd936d133bf8a48de140a3c666897588a05shiqian
2866e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the match result.
2867e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldTest, CanExplainMatchResult) {
2868e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0));
2869e35fdd936d133bf8a48de140a3c666897588a05shiqian
2870e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2871e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = 1;
2872676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose given field is 1", Explain(m, a));
2873e35fdd936d133bf8a48de140a3c666897588a05shiqian
2874e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::x, GreaterThan(0));
2875676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose given field is 1, which is 1 more than 0", Explain(m, a));
2876e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2877e35fdd936d133bf8a48de140a3c666897588a05shiqian
2878e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to const.
2879e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToConst) {
2880e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
2881e35fdd936d133bf8a48de140a3c666897588a05shiqian
2882e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2883e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
2884e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
2885e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
2886e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2887e35fdd936d133bf8a48de140a3c666897588a05shiqian
2888e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() works when the argument is a pointer to non-const.
2889e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForPointerToNonConst) {
2890e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AStruct*> m = Field(&AStruct::x, Ge(0));
2891e35fdd936d133bf8a48de140a3c666897588a05shiqian
2892e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2893e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
2894e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = -1;
2895e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
2896e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2897e35fdd936d133bf8a48de140a3c666897588a05shiqian
28986953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// Tests that Field() works when the argument is a reference to a const pointer.
28996953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wanTEST(FieldForPointerTest, WorksForReferenceToConstPointer) {
29006953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0));
29016953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
29026953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  AStruct a;
29036953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_TRUE(m.Matches(&a));
29046953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  a.x = -1;
29056953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_FALSE(m.Matches(&a));
29066953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan}
29076953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
2908e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() does not match the NULL pointer.
2909e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, DoesNotMatchNull) {
2910e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, _);
2911e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
2912e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2913e35fdd936d133bf8a48de140a3c666897588a05shiqian
2914e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field(&Foo::field, ...) works when the argument's type
2915e35fdd936d133bf8a48de140a3c666897588a05shiqian// is a sub-type of const Foo*.
2916e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, WorksForArgumentOfSubType) {
2917e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Note that the matcher expects DerivedStruct but we say AStruct
2918e35fdd936d133bf8a48de140a3c666897588a05shiqian  // inside Field().
2919e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0));
2920e35fdd936d133bf8a48de140a3c666897588a05shiqian
2921e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedStruct d;
2922e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&d));
2923e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.x = -1;
2924e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&d));
2925e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2926e35fdd936d133bf8a48de140a3c666897588a05shiqian
2927e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can describe itself when used to match a pointer.
2928e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanDescribeSelf) {
2929e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
2930e35fdd936d133bf8a48de140a3c666897588a05shiqian
2931b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field is >= 0", Describe(m));
2932b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m));
2933e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2934e35fdd936d133bf8a48de140a3c666897588a05shiqian
2935e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Field() can explain the result of matching a pointer.
2936e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(FieldForPointerTest, CanExplainMatchResult) {
2937e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0));
2938e35fdd936d133bf8a48de140a3c666897588a05shiqian
2939e35fdd936d133bf8a48de140a3c666897588a05shiqian  AStruct a;
2940e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.x = 1;
2941e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL)));
2942676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which points to an object whose given field is 1", Explain(m, &a));
2943e35fdd936d133bf8a48de140a3c666897588a05shiqian
2944e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Field(&AStruct::x, GreaterThan(0));
2945676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which points to an object whose given field is 1, "
2946676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0", Explain(m, &a));
2947e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2948e35fdd936d133bf8a48de140a3c666897588a05shiqian
2949e35fdd936d133bf8a48de140a3c666897588a05shiqian// A user-defined class for testing Property().
2950e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AClass {
2951e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
2952e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass() : n_(0) {}
2953e35fdd936d133bf8a48de140a3c666897588a05shiqian
2954e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A getter that returns a non-reference.
2955e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n() const { return n_; }
2956e35fdd936d133bf8a48de140a3c666897588a05shiqian
2957e35fdd936d133bf8a48de140a3c666897588a05shiqian  void set_n(int new_n) { n_ = new_n; }
2958e35fdd936d133bf8a48de140a3c666897588a05shiqian
2959e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A getter that returns a reference to const.
2960e35fdd936d133bf8a48de140a3c666897588a05shiqian  const string& s() const { return s_; }
2961e35fdd936d133bf8a48de140a3c666897588a05shiqian
2962e35fdd936d133bf8a48de140a3c666897588a05shiqian  void set_s(const string& new_s) { s_ = new_s; }
2963e35fdd936d133bf8a48de140a3c666897588a05shiqian
2964e35fdd936d133bf8a48de140a3c666897588a05shiqian  // A getter that returns a reference to non-const.
2965e35fdd936d133bf8a48de140a3c666897588a05shiqian  double& x() const { return x_; }
2966e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
2967e35fdd936d133bf8a48de140a3c666897588a05shiqian  int n_;
2968e35fdd936d133bf8a48de140a3c666897588a05shiqian  string s_;
2969e35fdd936d133bf8a48de140a3c666897588a05shiqian
2970e35fdd936d133bf8a48de140a3c666897588a05shiqian  static double x_;
2971e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2972e35fdd936d133bf8a48de140a3c666897588a05shiqian
2973e35fdd936d133bf8a48de140a3c666897588a05shiqiandouble AClass::x_ = 0.0;
2974e35fdd936d133bf8a48de140a3c666897588a05shiqian
2975e35fdd936d133bf8a48de140a3c666897588a05shiqian// A derived class for testing Property().
2976e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DerivedClass : public AClass {
2977e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
2978e35fdd936d133bf8a48de140a3c666897588a05shiqian  int k_;
2979e35fdd936d133bf8a48de140a3c666897588a05shiqian};
2980e35fdd936d133bf8a48de140a3c666897588a05shiqian
2981e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property()
2982e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference.
2983e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForNonReferenceProperty) {
2984e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
2985e35fdd936d133bf8a48de140a3c666897588a05shiqian
2986e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
2987e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
2988e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
2989e35fdd936d133bf8a48de140a3c666897588a05shiqian
2990e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(-1);
2991e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
2992e35fdd936d133bf8a48de140a3c666897588a05shiqian}
2993e35fdd936d133bf8a48de140a3c666897588a05shiqian
2994e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property()
2995e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const.
2996e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToConstProperty) {
2997e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi"));
2998e35fdd936d133bf8a48de140a3c666897588a05shiqian
2999e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3000e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hill");
3001e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3002e35fdd936d133bf8a48de140a3c666897588a05shiqian
3003e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hole");
3004e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3005e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3006e35fdd936d133bf8a48de140a3c666897588a05shiqian
3007e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when property()
3008e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const.
3009e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForReferenceToNonConstProperty) {
3010e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 0.0;
3011e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3012e35fdd936d133bf8a48de140a3c666897588a05shiqian
3013e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::x, Ref(x));
3014e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3015e35fdd936d133bf8a48de140a3c666897588a05shiqian
3016e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Property(&AClass::x, Not(Ref(x)));
3017e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3018e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3019e35fdd936d133bf8a48de140a3c666897588a05shiqian
3020e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument is
3021e35fdd936d133bf8a48de140a3c666897588a05shiqian// passed by value.
3022e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForByValueArgument) {
3023e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AClass> m = Property(&AClass::s, StartsWith("hi"));
3024e35fdd936d133bf8a48de140a3c666897588a05shiqian
3025e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3026e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hill");
3027e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3028e35fdd936d133bf8a48de140a3c666897588a05shiqian
3029e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hole");
3030e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3031e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3032e35fdd936d133bf8a48de140a3c666897588a05shiqian
3033e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's
3034e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of Foo.
3035e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForArgumentOfSubType) {
3036e35fdd936d133bf8a48de140a3c666897588a05shiqian  // The matcher expects a DerivedClass, but inside the Property() we
3037e35fdd936d133bf8a48de140a3c666897588a05shiqian  // say AClass.
3038e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0));
3039e35fdd936d133bf8a48de140a3c666897588a05shiqian
3040e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedClass d;
3041e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(1);
3042e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(d));
3043e35fdd936d133bf8a48de140a3c666897588a05shiqian
3044e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(-1);
3045e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(d));
3046e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3047e35fdd936d133bf8a48de140a3c666897588a05shiqian
3048e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, m) works when property()'s type
3049e35fdd936d133bf8a48de140a3c666897588a05shiqian// and m's argument type are compatible but different.
3050e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, WorksForCompatibleMatcherType) {
3051e35fdd936d133bf8a48de140a3c666897588a05shiqian  // n() returns an int but the inner matcher expects a signed char.
3052e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n,
3053e35fdd936d133bf8a48de140a3c666897588a05shiqian                                      Matcher<signed char>(Ge(0)));
3054e35fdd936d133bf8a48de140a3c666897588a05shiqian
3055e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3056e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(a));
3057e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(-1);
3058e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(a));
3059e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3060e35fdd936d133bf8a48de140a3c666897588a05shiqian
3061e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself.
3062e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanDescribeSelf) {
3063e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3064e35fdd936d133bf8a48de140a3c666897588a05shiqian
3065b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3066b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property isn't >= 0",
3067b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
3068e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3069e35fdd936d133bf8a48de140a3c666897588a05shiqian
3070e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the match result.
3071e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyTest, CanExplainMatchResult) {
3072e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass&> m = Property(&AClass::n, Ge(0));
3073e35fdd936d133bf8a48de140a3c666897588a05shiqian
3074e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3075e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
3076676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose given property is 1", Explain(m, a));
3077e35fdd936d133bf8a48de140a3c666897588a05shiqian
3078e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Property(&AClass::n, GreaterThan(0));
3079676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("whose given property is 1, which is 1 more than 0", Explain(m, a));
3080e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3081e35fdd936d133bf8a48de140a3c666897588a05shiqian
3082e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to const.
3083e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToConst) {
3084e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3085e35fdd936d133bf8a48de140a3c666897588a05shiqian
3086e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3087e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
3088e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
3089e35fdd936d133bf8a48de140a3c666897588a05shiqian
3090e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(-1);
3091e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
3092e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3093e35fdd936d133bf8a48de140a3c666897588a05shiqian
3094e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() works when the argument is a pointer to non-const.
3095e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForPointerToNonConst) {
3096e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi"));
3097e35fdd936d133bf8a48de140a3c666897588a05shiqian
3098e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3099e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hill");
31006953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_TRUE(m.Matches(&a));
31016953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
31026953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  a.set_s("hole");
31036953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  EXPECT_FALSE(m.Matches(&a));
31046953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan}
31056953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
31066953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// Tests that Property() works when the argument is a reference to a
31076953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan// const pointer.
31086953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wanTEST(PropertyForPointerTest, WorksForReferenceToConstPointer) {
31096953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi"));
31106953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan
31116953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  AClass a;
31126953a725fc2151eff18078f8315d92811cd4d90ezhanyong.wan  a.set_s("hill");
3113e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&a));
3114e35fdd936d133bf8a48de140a3c666897588a05shiqian
3115e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_s("hole");
3116e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&a));
3117e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3118e35fdd936d133bf8a48de140a3c666897588a05shiqian
3119e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() does not match the NULL pointer.
3120e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) {
3121e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::x, _);
3122e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(NULL));
3123e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3124e35fdd936d133bf8a48de140a3c666897588a05shiqian
3125e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property(&Foo::property, ...) works when the argument's
3126e35fdd936d133bf8a48de140a3c666897588a05shiqian// type is a sub-type of const Foo*.
3127e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, WorksForArgumentOfSubType) {
3128e35fdd936d133bf8a48de140a3c666897588a05shiqian  // The matcher expects a DerivedClass, but inside the Property() we
3129e35fdd936d133bf8a48de140a3c666897588a05shiqian  // say AClass.
3130e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0));
3131e35fdd936d133bf8a48de140a3c666897588a05shiqian
3132e35fdd936d133bf8a48de140a3c666897588a05shiqian  DerivedClass d;
3133e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(1);
3134e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(&d));
3135e35fdd936d133bf8a48de140a3c666897588a05shiqian
3136e35fdd936d133bf8a48de140a3c666897588a05shiqian  d.set_n(-1);
3137e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(&d));
3138e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3139e35fdd936d133bf8a48de140a3c666897588a05shiqian
3140e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can describe itself when used to match a pointer.
3141e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanDescribeSelf) {
3142e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3143e35fdd936d133bf8a48de140a3c666897588a05shiqian
3144b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property is >= 0", Describe(m));
3145b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("is an object whose given property isn't >= 0",
3146b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            DescribeNegation(m));
3147e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3148e35fdd936d133bf8a48de140a3c666897588a05shiqian
3149e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that Property() can explain the result of matching a pointer.
3150e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(PropertyForPointerTest, CanExplainMatchResult) {
3151e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const AClass*> m = Property(&AClass::n, Ge(0));
3152e35fdd936d133bf8a48de140a3c666897588a05shiqian
3153e35fdd936d133bf8a48de140a3c666897588a05shiqian  AClass a;
3154e35fdd936d133bf8a48de140a3c666897588a05shiqian  a.set_n(1);
3155e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL)));
3156676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which points to an object whose given property is 1",
3157676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            Explain(m, &a));
3158e35fdd936d133bf8a48de140a3c666897588a05shiqian
3159e35fdd936d133bf8a48de140a3c666897588a05shiqian  m = Property(&AClass::n, GreaterThan(0));
3160676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which points to an object whose given property is 1, "
3161676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 1 more than 0", Explain(m, &a));
3162e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3163e35fdd936d133bf8a48de140a3c666897588a05shiqian
3164e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests ResultOf.
3165e35fdd936d133bf8a48de140a3c666897588a05shiqian
3166e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3167e35fdd936d133bf8a48de140a3c666897588a05shiqian// function pointer.
3168e35fdd936d133bf8a48de140a3c666897588a05shiqianstring IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; }
3169e35fdd936d133bf8a48de140a3c666897588a05shiqian
3170e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionPointers) {
3171e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo")));
3172e35fdd936d133bf8a48de140a3c666897588a05shiqian
3173e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(1));
3174e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(2));
3175e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3176e35fdd936d133bf8a48de140a3c666897588a05shiqian
3177e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can describe itself.
3178e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanDescribeItself) {
3179e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo"));
3180e35fdd936d133bf8a48de140a3c666897588a05shiqian
3181676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("is mapped by the given callable to a value that "
3182676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "is equal to \"foo\"", Describe(matcher));
3183676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("is mapped by the given callable to a value that "
3184b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "isn't equal to \"foo\"", DescribeNegation(matcher));
3185e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3186e35fdd936d133bf8a48de140a3c666897588a05shiqian
3187e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf() can explain the match result.
3188e35fdd936d133bf8a48de140a3c666897588a05shiqianint IntFunction(int input) { return input == 42 ? 80 : 90; }
3189e35fdd936d133bf8a48de140a3c666897588a05shiqian
3190e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, CanExplainMatchResult) {
3191e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntFunction, Ge(85));
3192676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is mapped by the given callable to 90",
3193676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            Explain(matcher, 36));
3194e35fdd936d133bf8a48de140a3c666897588a05shiqian
3195e35fdd936d133bf8a48de140a3c666897588a05shiqian  matcher = ResultOf(&IntFunction, GreaterThan(85));
3196676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is mapped by the given callable to 90, "
3197676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan            "which is 5 more than 85", Explain(matcher, 36));
3198e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3199e35fdd936d133bf8a48de140a3c666897588a05shiqian
3200e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3201e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a non-reference.
3202e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForNonReferenceResults) {
3203e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(&IntFunction, Eq(80));
3204e35fdd936d133bf8a48de140a3c666897588a05shiqian
3205e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(42));
3206e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(36));
3207e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3208e35fdd936d133bf8a48de140a3c666897588a05shiqian
3209e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3210e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to non-const.
3211e35fdd936d133bf8a48de140a3c666897588a05shiqiandouble& DoubleFunction(double& input) { return input; }
3212e35fdd936d133bf8a48de140a3c666897588a05shiqian
3213e35fdd936d133bf8a48de140a3c666897588a05shiqianUncopyable& RefUncopyableFunction(Uncopyable& obj) {
3214e35fdd936d133bf8a48de140a3c666897588a05shiqian  return obj;
3215e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3216e35fdd936d133bf8a48de140a3c666897588a05shiqian
3217e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToNonConstResults) {
3218e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x = 3.14;
3219e35fdd936d133bf8a48de140a3c666897588a05shiqian  double x2 = x;
3220e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x));
3221e35fdd936d133bf8a48de140a3c666897588a05shiqian
3222e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(x));
3223e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(x2));
3224e35fdd936d133bf8a48de140a3c666897588a05shiqian
3225e35fdd936d133bf8a48de140a3c666897588a05shiqian  // Test that ResultOf works with uncopyable objects
3226e35fdd936d133bf8a48de140a3c666897588a05shiqian  Uncopyable obj(0);
3227e35fdd936d133bf8a48de140a3c666897588a05shiqian  Uncopyable obj2(0);
3228e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<Uncopyable&> matcher2 =
3229e35fdd936d133bf8a48de140a3c666897588a05shiqian      ResultOf(&RefUncopyableFunction, Ref(obj));
3230e35fdd936d133bf8a48de140a3c666897588a05shiqian
3231e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher2.Matches(obj));
3232e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher2.Matches(obj2));
3233e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3234e35fdd936d133bf8a48de140a3c666897588a05shiqian
3235e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f(x)
3236e35fdd936d133bf8a48de140a3c666897588a05shiqian// returns a reference to const.
3237e35fdd936d133bf8a48de140a3c666897588a05shiqianconst string& StringFunction(const string& input) { return input; }
3238e35fdd936d133bf8a48de140a3c666897588a05shiqian
3239e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferenceToConstResults) {
3240e35fdd936d133bf8a48de140a3c666897588a05shiqian  string s = "foo";
3241e35fdd936d133bf8a48de140a3c666897588a05shiqian  string s2 = s;
3242e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s));
3243e35fdd936d133bf8a48de140a3c666897588a05shiqian
3244e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(s));
3245e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(s2));
3246e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3247e35fdd936d133bf8a48de140a3c666897588a05shiqian
3248e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, m) works when f(x) and m's
3249e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument types are compatible but different.
3250e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForCompatibleMatcherTypes) {
3251e35fdd936d133bf8a48de140a3c666897588a05shiqian  // IntFunction() returns int but the inner matcher expects a signed char.
3252e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85)));
3253e35fdd936d133bf8a48de140a3c666897588a05shiqian
3254e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(36));
3255e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(42));
3256e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3257e35fdd936d133bf8a48de140a3c666897588a05shiqian
3258e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that the program aborts when ResultOf is passed
3259e35fdd936d133bf8a48de140a3c666897588a05shiqian// a NULL function pointer.
3260e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) {
326104d6ed817e40f676225e0bf20ff1470d8f0c4a20zhanyong.wan  EXPECT_DEATH_IF_SUPPORTED(
3262e35fdd936d133bf8a48de140a3c666897588a05shiqian      ResultOf(static_cast<string(*)(int)>(NULL), Eq(string("foo"))),
3263e35fdd936d133bf8a48de140a3c666897588a05shiqian               "NULL function pointer is passed into ResultOf\\(\\)\\.");
3264e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3265e35fdd936d133bf8a48de140a3c666897588a05shiqian
3266e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3267e35fdd936d133bf8a48de140a3c666897588a05shiqian// function reference.
3268e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctionReferences) {
3269e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo"));
3270e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(1));
3271e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(2));
3272e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3273e35fdd936d133bf8a48de140a3c666897588a05shiqian
3274e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3275e35fdd936d133bf8a48de140a3c666897588a05shiqian// function object.
3276e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct Functor : public ::std::unary_function<int, string> {
3277e35fdd936d133bf8a48de140a3c666897588a05shiqian  result_type operator()(argument_type input) const {
3278e35fdd936d133bf8a48de140a3c666897588a05shiqian    return IntToStringFunction(input);
3279e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3280e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3281e35fdd936d133bf8a48de140a3c666897588a05shiqian
3282e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForFunctors) {
3283e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo")));
3284e35fdd936d133bf8a48de140a3c666897588a05shiqian
3285e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher.Matches(1));
3286e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher.Matches(2));
3287e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3288e35fdd936d133bf8a48de140a3c666897588a05shiqian
3289e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that ResultOf(f, ...) compiles and works as expected when f is a
3290e35fdd936d133bf8a48de140a3c666897588a05shiqian// functor with more then one operator() defined. ResultOf() must work
3291e35fdd936d133bf8a48de140a3c666897588a05shiqian// for each defined operator().
3292e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct PolymorphicFunctor {
3293e35fdd936d133bf8a48de140a3c666897588a05shiqian  typedef int result_type;
3294e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()(int n) { return n; }
3295e35fdd936d133bf8a48de140a3c666897588a05shiqian  int operator()(const char* s) { return static_cast<int>(strlen(s)); }
3296e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3297e35fdd936d133bf8a48de140a3c666897588a05shiqian
3298e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForPolymorphicFunctors) {
3299e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5));
3300e35fdd936d133bf8a48de140a3c666897588a05shiqian
3301e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher_int.Matches(10));
3302e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher_int.Matches(2));
3303e35fdd936d133bf8a48de140a3c666897588a05shiqian
3304e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5));
3305e35fdd936d133bf8a48de140a3c666897588a05shiqian
3306e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher_string.Matches("long string"));
3307e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher_string.Matches("shrt"));
3308e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3309e35fdd936d133bf8a48de140a3c666897588a05shiqian
3310e35fdd936d133bf8a48de140a3c666897588a05shiqianconst int* ReferencingFunction(const int& n) { return &n; }
3311e35fdd936d133bf8a48de140a3c666897588a05shiqian
3312e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct ReferencingFunctor {
3313e35fdd936d133bf8a48de140a3c666897588a05shiqian  typedef const int* result_type;
3314e35fdd936d133bf8a48de140a3c666897588a05shiqian  result_type operator()(const int& n) { return &n; }
3315e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3316e35fdd936d133bf8a48de140a3c666897588a05shiqian
3317e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ResultOfTest, WorksForReferencingCallables) {
3318e35fdd936d133bf8a48de140a3c666897588a05shiqian  const int n = 1;
3319e35fdd936d133bf8a48de140a3c666897588a05shiqian  const int n2 = 1;
3320e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n));
3321e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher2.Matches(n));
3322e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher2.Matches(n2));
3323e35fdd936d133bf8a48de140a3c666897588a05shiqian
3324e35fdd936d133bf8a48de140a3c666897588a05shiqian  Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n));
3325e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(matcher3.Matches(n));
3326e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(matcher3.Matches(n2));
3327e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3328e35fdd936d133bf8a48de140a3c666897588a05shiqian
3329e35fdd936d133bf8a48de140a3c666897588a05shiqianclass DivisibleByImpl {
3330e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
333132de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {}
3332e35fdd936d133bf8a48de140a3c666897588a05shiqian
3333db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  // For testing using ExplainMatchResultTo() with polymorphic matchers.
3334e35fdd936d133bf8a48de140a3c666897588a05shiqian  template <typename T>
3335db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan  bool MatchAndExplain(const T& n, MatchResultListener* listener) const {
3336b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan    *listener << "which is " << (n % divider_) << " modulo "
3337db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan              << divider_;
3338e35fdd936d133bf8a48de140a3c666897588a05shiqian    return (n % divider_) == 0;
3339e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3340e35fdd936d133bf8a48de140a3c666897588a05shiqian
3341e35fdd936d133bf8a48de140a3c666897588a05shiqian  void DescribeTo(::std::ostream* os) const {
3342e35fdd936d133bf8a48de140a3c666897588a05shiqian    *os << "is divisible by " << divider_;
3343e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3344e35fdd936d133bf8a48de140a3c666897588a05shiqian
3345e35fdd936d133bf8a48de140a3c666897588a05shiqian  void DescribeNegationTo(::std::ostream* os) const {
3346e35fdd936d133bf8a48de140a3c666897588a05shiqian    *os << "is not divisible by " << divider_;
3347e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3348e35fdd936d133bf8a48de140a3c666897588a05shiqian
334932de5f53763125925e078498250f7e73a88de9edzhanyong.wan  void set_divider(int a_divider) { divider_ = a_divider; }
3350e35fdd936d133bf8a48de140a3c666897588a05shiqian  int divider() const { return divider_; }
33512b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
3352e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
33532b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  int divider_;
3354e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3355e35fdd936d133bf8a48de140a3c666897588a05shiqian
3356e35fdd936d133bf8a48de140a3c666897588a05shiqianPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) {
3357e35fdd936d133bf8a48de140a3c666897588a05shiqian  return MakePolymorphicMatcher(DivisibleByImpl(n));
3358e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3359e35fdd936d133bf8a48de140a3c666897588a05shiqian
3360e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is
3361e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why.
3362e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_False) {
3363e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
3364b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 1 modulo 4", Explain(m, 5));
3365e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3366e35fdd936d133bf8a48de140a3c666897588a05shiqian
3367e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is
3368e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why.
3369e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_False_True) {
3370e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3));
3371b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 2 modulo 4", Explain(m, 6));
3372e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3373e35fdd936d133bf8a48de140a3c666897588a05shiqian
3374e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() fails, only the first failing matcher is
3375e35fdd936d133bf8a48de140a3c666897588a05shiqian// asked to explain why.
3376e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_False) {
3377e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3));
3378b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 2 modulo 3", Explain(m, 5));
3379e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3380e35fdd936d133bf8a48de140a3c666897588a05shiqian
3381e35fdd936d133bf8a48de140a3c666897588a05shiqian// Tests that when AllOf() succeeds, all matchers are asked to explain
3382e35fdd936d133bf8a48de140a3c666897588a05shiqian// why.
3383e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True) {
3384e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3));
3385b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6));
3386e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3387e35fdd936d133bf8a48de140a3c666897588a05shiqian
3388e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainMatchResultTest, AllOf_True_True_2) {
3389e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = AllOf(Ge(2), Le(3));
3390e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_EQ("", Explain(m, 2));
3391e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3392e35fdd936d133bf8a48de140a3c666897588a05shiqian
3393e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ExplainmatcherResultTest, MonomorphicMatcher) {
3394e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<int> m = GreaterThan(5);
3395676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan  EXPECT_EQ("which is 1 more than 5", Explain(m, 6));
3396e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3397e35fdd936d133bf8a48de140a3c666897588a05shiqian
3398e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following two tests verify that values without a public copy
3399e35fdd936d133bf8a48de140a3c666897588a05shiqian// ctor can be used as arguments to matchers like Eq(), Ge(), and etc
3400e35fdd936d133bf8a48de140a3c666897588a05shiqian// with the help of ByRef().
3401e35fdd936d133bf8a48de140a3c666897588a05shiqian
3402e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotCopyable {
3403e35fdd936d133bf8a48de140a3c666897588a05shiqian public:
340432de5f53763125925e078498250f7e73a88de9edzhanyong.wan  explicit NotCopyable(int a_value) : value_(a_value) {}
3405e35fdd936d133bf8a48de140a3c666897588a05shiqian
3406e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value() const { return value_; }
3407e35fdd936d133bf8a48de140a3c666897588a05shiqian
3408e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool operator==(const NotCopyable& rhs) const {
3409e35fdd936d133bf8a48de140a3c666897588a05shiqian    return value() == rhs.value();
3410e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3411e35fdd936d133bf8a48de140a3c666897588a05shiqian
3412e35fdd936d133bf8a48de140a3c666897588a05shiqian  bool operator>=(const NotCopyable& rhs) const {
3413e35fdd936d133bf8a48de140a3c666897588a05shiqian    return value() >= rhs.value();
3414e35fdd936d133bf8a48de140a3c666897588a05shiqian  }
3415e35fdd936d133bf8a48de140a3c666897588a05shiqian private:
3416e35fdd936d133bf8a48de140a3c666897588a05shiqian  int value_;
3417e35fdd936d133bf8a48de140a3c666897588a05shiqian
3418e35fdd936d133bf8a48de140a3c666897588a05shiqian  GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable);
3419e35fdd936d133bf8a48de140a3c666897588a05shiqian};
3420e35fdd936d133bf8a48de140a3c666897588a05shiqian
3421e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) {
3422e35fdd936d133bf8a48de140a3c666897588a05shiqian  const NotCopyable const_value1(1);
3423e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1));
3424e35fdd936d133bf8a48de140a3c666897588a05shiqian
3425e35fdd936d133bf8a48de140a3c666897588a05shiqian  const NotCopyable n1(1), n2(2);
3426e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(n1));
3427e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(n2));
3428e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3429e35fdd936d133bf8a48de140a3c666897588a05shiqian
3430e35fdd936d133bf8a48de140a3c666897588a05shiqianTEST(ByRefTest, AllowsNotCopyableValueInMatchers) {
3431e35fdd936d133bf8a48de140a3c666897588a05shiqian  NotCopyable value2(2);
3432e35fdd936d133bf8a48de140a3c666897588a05shiqian  const Matcher<NotCopyable&> m = Ge(ByRef(value2));
3433e35fdd936d133bf8a48de140a3c666897588a05shiqian
3434e35fdd936d133bf8a48de140a3c666897588a05shiqian  NotCopyable n1(1), n2(2);
3435e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_FALSE(m.Matches(n1));
3436e35fdd936d133bf8a48de140a3c666897588a05shiqian  EXPECT_TRUE(m.Matches(n2));
3437e35fdd936d133bf8a48de140a3c666897588a05shiqian}
3438e35fdd936d133bf8a48de140a3c666897588a05shiqian
34392b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#if GTEST_HAS_TYPED_TEST
34406a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests ContainerEq with different container types, and
34416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// different element types.
34426a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
34436a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename T>
3444b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanclass ContainerEqTest : public testing::Test {};
34456a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
34466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantypedef testing::Types<
34476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan    std::set<int>,
34486a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan    std::vector<size_t>,
34496a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan    std::multiset<size_t>,
34506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan    std::list<int> >
34516a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan    ContainerEqTestTypes;
34526a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
34536a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes);
34546a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
34556a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that the filled container is equal to itself.
34566a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, EqualsSelf) {
34576a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
34586a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
34596a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<TypeParam> m = ContainerEq(my_set);
34606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_TRUE(m.Matches(my_set));
34616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_EQ("", Explain(m, my_set));
34626a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
34636a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
34646a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that missing values are reported.
34656a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueMissing) {
34666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
34676a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {2, 1, 8, 5};
34686a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
34696a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 4);
34706a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<TypeParam> m = ContainerEq(my_set);
34716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
3472b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which doesn't have these expected elements: 3",
3473b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
34746a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
34756a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
34766a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported.
34776a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAdded) {
34786a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
34796a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 5, 8, 46};
34806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
34816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 6);
34826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<const TypeParam&> m = ContainerEq(my_set);
34836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
3484b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set));
34856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
34866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
34876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together.
34886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) {
34896a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
34906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 8, 46};
34916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
34926a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 5);
34936a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<TypeParam> m = ContainerEq(my_set);
34946a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
3495b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 46,\n"
3496b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and doesn't have these expected elements: 5",
3497b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
34986a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
34996a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35006a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests duplicated value -- expect no explanation.
35016a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTYPED_TEST(ContainerEqTest, DuplicateDifference) {
35026a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
35036a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 5, 8};
35046a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam my_set(vals, vals + 6);
35056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  TypeParam test_set(test_vals, test_vals + 5);
35066a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<const TypeParam&> m = ContainerEq(my_set);
35076a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  // Depending on the container, match may be true or false
35086a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  // But in any case there should be no explanation.
35096a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_EQ("", Explain(m, test_set));
35106a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
35112b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan#endif  // GTEST_HAS_TYPED_TEST
35126a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35136a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that mutliple missing values are reported.
35146a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble.
35156a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesMissing) {
35166a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
35176a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {2, 1, 5};
35186a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::vector<int> my_set(vals, vals + 6);
35196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::vector<int> test_set(test_vals, test_vals + 3);
35206a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<std::vector<int> > m = ContainerEq(my_set);
35216a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
3522b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which doesn't have these expected elements: 3, 8",
3523b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
35246a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
35256a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35266a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added values are reported.
35276a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Using just vector here, so order is predicatble.
35286a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAdded) {
35296a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
35306a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46};
35316a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::list<size_t> my_set(vals, vals + 6);
35326a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::list<size_t> test_set(test_vals, test_vals + 7);
35336a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<const std::list<size_t>&> m = ContainerEq(my_set);
35346a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
3535b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 92, 46",
3536b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            Explain(m, test_set));
35376a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
35386a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35396a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that added and missing values are reported together.
35406a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) {
35416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
35426a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 92, 46};
35436a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::list<size_t> my_set(vals, vals + 6);
35446a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::list<size_t> test_set(test_vals, test_vals + 5);
35456a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<const std::list<size_t> > m = ContainerEq(my_set);
35466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
3547b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: 92, 46,\n"
3548b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and doesn't have these expected elements: 5, 8",
35496a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan            Explain(m, test_set));
35506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
35516a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35526a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests to see that duplicate elements are detected,
35536a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// but (as above) not reported in the explanation.
35546a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) {
35556a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int vals[] = {1, 1, 2, 3, 5, 8};
35566a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  static const int test_vals[] = {1, 2, 3, 5, 8};
35576a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::vector<int> my_set(vals, vals + 6);
35586a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::vector<int> test_set(test_vals, test_vals + 5);
35596a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<std::vector<int> > m = ContainerEq(my_set);
35606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_TRUE(m.Matches(my_set));
35616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_set));
35626a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  // There is nothing to report when both sets contain all the same values.
35636a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_EQ("", Explain(m, test_set));
35646a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
35656a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Tests that ContainerEq works for non-trivial associative containers,
35676a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// like maps.
35686a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanTEST(ContainerEqExtraTest, WorksForMaps) {
35696a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::map<int, std::string> my_map;
35706a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  my_map[0] = "a";
35716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  my_map[1] = "b";
35726a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35736a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  std::map<int, std::string> test_map;
35746a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  test_map[0] = "aa";
35756a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  test_map[1] = "b";
35766a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
35776a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  const Matcher<const std::map<int, std::string>&> m = ContainerEq(my_map);
35786a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_TRUE(m.Matches(my_map));
35796a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan  EXPECT_FALSE(m.Matches(test_map));
35806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
3581b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n"
3582b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "and doesn't have these expected elements: (0, \"a\")",
35836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan            Explain(m, test_map));
35846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}
35856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan
3586b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArray) {
3587b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  int a1[] = { 1, 2, 3 };
3588b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  int a2[] = { 1, 2, 3 };
3589b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  int b[] = { 1, 2, 4 };
3590b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3591b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ContainerEq(a2));
3592b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, Not(ContainerEq(b)));
3593b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
3594b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3595b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) {
3596b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const char a1[][3] = { "hi", "lo" };
3597b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const char a2[][3] = { "hi", "lo" };
3598b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const char b[][3] = { "lo", "hi" };
3599b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3600b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  // Tests using ContainerEq() in the first dimension.
3601b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ContainerEq(a2));
3602b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, Not(ContainerEq(b)));
3603b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3604b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  // Tests using ContainerEq() in the second dimension.
3605b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1])));
3606b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1])));
3607b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
3608b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3609b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) {
3610b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const int a1[] = { 1, 2, 3 };
3611b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const int a2[] = { 1, 2, 3 };
3612b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const int b[] = { 1, 2, 3, 4 };
3613b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
36142661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  const int* const p1 = a1;
36152661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2));
36162661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b)));
3617b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3618b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const int c[] = { 1, 3, 2 };
36192661c6821a4d7964697e48747c4d739e1ac3a243zhanyong.wan  EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c)));
3620b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
3621b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3622b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanTEST(ContainerEqExtraTest, CopiesNativeArrayParameter) {
3623b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  std::string a1[][3] = {
3624b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan    { "hi", "hello", "ciao" },
3625b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan    { "bye", "see you", "ciao" }
3626b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  };
3627b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3628b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  std::string a2[][3] = {
3629b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan    { "hi", "hello", "ciao" },
3630b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan    { "bye", "see you", "ciao" }
3631b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  };
3632b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3633b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2);
3634b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, m);
3635b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
3636b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  a2[0][0] = "ha";
3637b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan  EXPECT_THAT(a1, m);
3638b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}
3639b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan
36404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests GetParamIndex().
36414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, WorksForEmptyParamList) {
36434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { NULL };
36444a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(kTupleInterpolation, GetParamIndex(params, "*"));
36454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(kInvalidInterpolation, GetParamIndex(params, "a"));
36464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
36474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, RecognizesStar) {
36494a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "a", "b", NULL };
36504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(kTupleInterpolation, GetParamIndex(params, "*"));
36514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
36524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, RecognizesKnownParam) {
36544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", NULL };
36554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(0, GetParamIndex(params, "foo"));
36564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(1, GetParamIndex(params, "bar"));
36574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
36584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(GetParamIndexTest, RejectsUnknownParam) {
36604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", NULL };
36614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(kInvalidInterpolation, GetParamIndex(params, "foobar"));
36624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
36634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36644a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests SkipPrefix().
36654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(SkipPrefixTest, SkipsWhenPrefixMatches) {
36674a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const str = "hello";
36684a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36694a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* p = str;
36704a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_TRUE(SkipPrefix("", &p));
36714a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(str, p);
36724a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36734a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  p = str;
36744a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_TRUE(SkipPrefix("hell", &p));
36754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(str + 4, p);
36764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
36774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36784a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) {
36794a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const str = "world";
36804a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36814a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* p = str;
36824a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_FALSE(SkipPrefix("W", &p));
36834a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(str, p);
36844a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36854a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  p = str;
36864a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_FALSE(SkipPrefix("world!", &p));
36874a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ(str, p);
36884a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
36894a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36904a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests FormatMatcherDescriptionSyntaxError().
36914a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionSyntaxErrorTest, FormatsCorrectly) {
36924a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const description = "hello%world";
36934a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("Syntax error at index 5 in matcher description \"hello%world\": ",
36944a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescriptionSyntaxError(description, description + 5));
36954a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
36964a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36974a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests ValidateMatcherDescription().
36984a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
36994a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsEmptyDescription) {
37004a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", NULL };
37014a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_THAT(ValidateMatcherDescription(params, ""),
37024a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan              ElementsAre());
37034a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37044a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37054a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest,
37064a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     AcceptsNonEmptyDescriptionWithNoInterpolation) {
37074a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", NULL };
37084a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_THAT(ValidateMatcherDescription(params, "a simple description"),
37094a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan              ElementsAre());
37104a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37114a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
3712821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// The MATCHER*() macros trigger warning C4100 (unreferenced formal
3713821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in
3714821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// the macro definition, as the warnings are generated when the macro
3715821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// is expanded and macro expansion cannot contain #pragma.  Therefore
3716821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// we suppress them here.
3717821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan#ifdef _MSC_VER
3718821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan#pragma warning(push)
3719821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan#pragma warning(disable:4100)
3720821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan#endif
3721821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
37224a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// We use MATCHER_P3() to define a matcher for testing
37234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// ValidateMatcherDescription(); otherwise we'll end up with much
37244a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// plumbing code.  This is not circular as
37254a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// ValidateMatcherDescription() doesn't affect whether the matcher
37264a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// matches a value or not.
37274a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanMATCHER_P3(EqInterpolation, start, end, index, "equals Interpolation%(*)s") {
37284a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  return arg.start_pos == start && arg.end_pos == end &&
37294a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan      arg.param_index == index;
37304a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37314a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
3732821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan#ifdef _MSC_VER
3733821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan#pragma warning(pop)
3734821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan#endif
3735821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan
37364a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsPercentInterpolation) {
37374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", NULL };
37384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "one %%";
37394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_THAT(ValidateMatcherDescription(params, desc),
37404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan              ElementsAre(EqInterpolation(desc + 4, desc + 6,
37414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                          kPercentInterpolation)));
37424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37444a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsTupleInterpolation) {
37454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", "baz", NULL };
37464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "%(*)s after";
37474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_THAT(ValidateMatcherDescription(params, desc),
37484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan              ElementsAre(EqInterpolation(desc, desc + 5,
37494a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                          kTupleInterpolation)));
37504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsParamInterpolation) {
37534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", "baz", NULL };
37544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "a %(bar)s.";
37554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_THAT(ValidateMatcherDescription(params, desc),
37564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan              ElementsAre(EqInterpolation(desc + 2, desc + 9, 1)));
37574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsMultiplenterpolations) {
37604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", "baz", NULL };
37614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "%(baz)s %(foo)s %(bar)s";
37624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_THAT(ValidateMatcherDescription(params, desc),
37634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan              ElementsAre(EqInterpolation(desc, desc + 7, 2),
37644a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                          EqInterpolation(desc + 8, desc + 15, 0),
37654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                          EqInterpolation(desc + 16, desc + 23, 1)));
37664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37674a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37684a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, AcceptsRepeatedParams) {
37694a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "foo", "bar", NULL };
37704a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "%(foo)s and %(foo)s";
37714a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_THAT(ValidateMatcherDescription(params, desc),
37724a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan              ElementsAre(EqInterpolation(desc, desc + 7, 0),
37734a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                          EqInterpolation(desc + 12, desc + 19, 0)));
37744a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, RejectsUnknownParam) {
37774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "a", "bar", NULL };
37784a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_NONFATAL_FAILURE({
37794a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    EXPECT_THAT(ValidateMatcherDescription(params, "%(foo)s"),
37804a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                ElementsAre());
37814a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  }, "Syntax error at index 2 in matcher description \"%(foo)s\": "
37824a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     "\"foo\" is an invalid parameter name.");
37834a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37844a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37854a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, RejectsUnfinishedParam) {
37864a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "a", "bar", NULL };
37874a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_NONFATAL_FAILURE({
37884a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    EXPECT_THAT(ValidateMatcherDescription(params, "%(foo)"),
37894a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                ElementsAre());
37904a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  }, "Syntax error at index 0 in matcher description \"%(foo)\": "
37914a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     "an interpolation must end with \")s\", but \"%(foo)\" does not.");
37924a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
37934a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_NONFATAL_FAILURE({
37944a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    EXPECT_THAT(ValidateMatcherDescription(params, "x%(a"),
37954a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                ElementsAre());
37964a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  }, "Syntax error at index 1 in matcher description \"x%(a\": "
37974a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     "an interpolation must end with \")s\", but \"%(a\" does not.");
37984a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
37994a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38004a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(ValidateMatcherDescriptionTest, RejectsSinglePercent) {
38014a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "a", NULL };
38024a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_NONFATAL_FAILURE({
38034a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    EXPECT_THAT(ValidateMatcherDescription(params, "a %."),
38044a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                ElementsAre());
38054a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  }, "Syntax error at index 2 in matcher description \"a %.\": "
38064a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     "use \"%%\" instead of \"%\" to print \"%\".");
38074a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38084a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38094a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38104a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests JoinAsTuple().
38114a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38124a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsEmptyTuple) {
38134a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("", JoinAsTuple(Strings()));
38144a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38154a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38164a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsOneTuple) {
38174a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* fields[] = { "1" };
38184a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1)));
38194a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38204a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38214a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTwoTuple) {
38224a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* fields[] = { "1", "a" };
38234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2)));
38244a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38254a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38264a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(JoinAsTupleTest, JoinsTenTuple) {
38274a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* fields[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
38284a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)",
38294a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            JoinAsTuple(Strings(fields, fields + 10)));
38304a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38314a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38324a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan// Tests FormatMatcherDescription().
38334a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38344a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) {
38354a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("is even",
38364a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("IsEven", "", Interpolations(),
38374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings()));
38384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "5" };
38404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("equals 5",
38414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Equals", "", Interpolations(),
38424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 1)));
38434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38444a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params2[] = { "5", "8" };
38454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("is in range (5, 8)",
38464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("IsInRange", "", Interpolations(),
38474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params2, params2 + 2)));
38484a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38494a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38504a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest, WorksForDescriptionWithNoInterpolation) {
38514a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("is positive",
38524a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Gt0", "is positive", Interpolations(),
38534a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings()));
38544a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38554a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "5", "6" };
38564a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("is negative",
38574a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Lt0", "is negative", Interpolations(),
38584a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 2)));
38594a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38604a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38614a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest,
38624a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     WorksWhenDescriptionStartsWithInterpolation) {
38634a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "5" };
38644a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "%(num)s times bigger";
38654a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const Interpolation interp[] = { Interpolation(desc, desc + 7, 0) };
38664a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("5 times bigger",
38674a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Foo", desc,
38684a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Interpolations(interp, interp + 1),
38694a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 1)));
38704a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38714a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38724a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest,
38734a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     WorksWhenDescriptionEndsWithInterpolation) {
38744a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "5", "6" };
38754a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "is bigger than %(y)s";
38764a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const Interpolation interp[] = { Interpolation(desc + 15, desc + 20, 1) };
38774a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("is bigger than 6",
38784a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Foo", desc,
38794a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Interpolations(interp, interp + 1),
38804a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 2)));
38814a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38824a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38834a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest,
38844a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     WorksWhenDescriptionStartsAndEndsWithInterpolation) {
38854a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "5", "6" };
38864a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "%(x)s <= arg <= %(y)s";
38874a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const Interpolation interp[] = {
38884a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    Interpolation(desc, desc + 5, 0),
38894a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    Interpolation(desc + 16, desc + 21, 1)
38904a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  };
38914a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("5 <= arg <= 6",
38924a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Foo", desc,
38934a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Interpolations(interp, interp + 2),
38944a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 2)));
38954a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
38964a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
38974a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest,
38984a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     WorksWhenDescriptionDoesNotStartOrEndWithInterpolation) {
38994a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "5.2" };
39004a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "has %(x)s cents";
39014a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const Interpolation interp[] = { Interpolation(desc + 4, desc + 9, 0) };
39024a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("has 5.2 cents",
39034a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Foo", desc,
39044a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Interpolations(interp, interp + 1),
39054a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 1)));
39064a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
39074a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
39084a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest,
39094a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     WorksWhenDescriptionContainsMultipleInterpolations) {
39104a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "5", "6" };
39114a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "in %(*)s or [%(x)s, %(y)s]";
39124a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const Interpolation interp[] = {
39134a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    Interpolation(desc + 3, desc + 8, kTupleInterpolation),
39144a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    Interpolation(desc + 13, desc + 18, 0),
39154a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    Interpolation(desc + 20, desc + 25, 1)
39164a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  };
39174a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("in (5, 6) or [5, 6]",
39184a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Foo", desc,
39194a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Interpolations(interp, interp + 3),
39204a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 2)));
39214a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
39224a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
39234a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest,
39244a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     WorksWhenDescriptionContainsRepeatedParams) {
39254a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "9" };
39264a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "in [-%(x)s, %(x)s]";
39274a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const Interpolation interp[] = {
39284a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    Interpolation(desc + 5, desc + 10, 0),
39294a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan    Interpolation(desc + 12, desc + 17, 0)
39304a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  };
39314a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("in [-9, 9]",
39324a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Foo", desc,
39334a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Interpolations(interp, interp + 2),
39344a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 1)));
39354a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
39364a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
39374a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wanTEST(FormatMatcherDescriptionTest,
39384a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan     WorksForDescriptionWithInvalidInterpolation) {
39394a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* params[] = { "9" };
39404a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const char* const desc = "> %(x)s %(x)";
39414a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  const Interpolation interp[] = { Interpolation(desc + 2, desc + 7, 0)  };
39424a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan  EXPECT_EQ("> 9 %(x)",
39434a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan            FormatMatcherDescription("Foo", desc,
39444a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Interpolations(interp, interp + 1),
39454a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan                                     Strings(params, params + 1)));
39464a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan}
39474a5330d3d6e582248dbcf602f70048dc72cc8182zhanyong.wan
39482b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::mutable_impl().
39492b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessMutableImpl) {
39502b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
39512b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  DivisibleByImpl& impl = m.mutable_impl();
39522b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_EQ(42, impl.divider());
39532b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
39542b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  impl.set_divider(0);
39552b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_EQ(0, m.mutable_impl().divider());
39562b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan}
39572b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
39582b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan// Tests PolymorphicMatcher::impl().
39592b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wanTEST(PolymorphicMatcherTest, CanAccessImpl) {
39602b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42));
39612b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  const DivisibleByImpl& impl = m.impl();
39622b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan  EXPECT_EQ(42, impl.divider());
39632b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan}
39642b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan
3965b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanTEST(MatcherTupleTest, ExplainsMatchFailure) {
3966b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  stringstream ss1;
3967b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)),
3968b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                             make_tuple('a', 10), &ss1);
3969b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("", ss1.str());  // Successful match.
3970b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
3971b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  stringstream ss2;
3972b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
3973b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                             make_tuple(2, 'b'), &ss2);
3974b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("  Expected arg #0: is > 5\n"
3975b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "           Actual: 2, which is 3 less than 5\n"
3976b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "  Expected arg #1: is equal to 'a' (97)\n"
3977b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "           Actual: 'b' (98)\n",
3978b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            ss2.str());  // Failed match where both arguments need explanation.
3979b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
3980b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  stringstream ss3;
3981b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))),
3982b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                             make_tuple(2, 'a'), &ss3);
3983b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan  EXPECT_EQ("  Expected arg #0: is > 5\n"
3984b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            "           Actual: 2, which is 3 less than 5\n",
3985b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan            ss3.str());  // Failed match where only one argument needs
3986b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan                         // explanation.
3987b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan}
3988b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan
398933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Tests Each().
399033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
399133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, ExplainsMatchResultCorrectly) {
399233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  set<int> a;  // empty
399333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
399433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  Matcher<set<int> > m = Each(2);
399533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("", Explain(m, a));
399633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
399733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  Matcher<const int(&)[1]> n = Each(1);
399833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
399933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  const int b[1] = { 1 };
400033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("", Explain(n, b));
400133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
400233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  n = Each(3);
400333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("whose element #0 doesn't match", Explain(n, b));
400433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
400533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  a.insert(1);
400633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  a.insert(2);
400733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  a.insert(3);
400833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  m = Each(GreaterThan(0));
400933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("", Explain(m, a));
401033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
401133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  m = Each(GreaterThan(10));
401233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10",
401333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan            Explain(m, a));
401433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
401533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
401633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, DescribesItselfCorrectly) {
401733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  Matcher<vector<int> > m = Each(1);
401833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("only contains elements that is equal to 1", Describe(m));
401933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
402033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  Matcher<vector<int> > m2 = Not(m);
402133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2));
402233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
402333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
402433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, MatchesVectorWhenAllElementsMatch) {
402533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  vector<int> some_vector;
402633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Each(1));
402733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  some_vector.push_back(3);
402833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Not(Each(1)));
402933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Each(3));
403033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  some_vector.push_back(1);
403133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  some_vector.push_back(2);
403233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Not(Each(3)));
403333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(some_vector, Each(Lt(3.5)));
403433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
403533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  vector<string> another_vector;
403633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("fee");
403733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_vector, Each(string("fee")));
403833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("fie");
403933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("foe");
404033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_vector.push_back("fum");
404133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_vector, Not(Each(string("fee"))));
404233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
404333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
404433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, MatchesMapWhenAllElementsMatch) {
404533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  map<const char*, int> my_map;
404633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  const char* bar = "a string";
404733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  my_map[bar] = 2;
404833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(my_map, Each(make_pair(bar, 2)));
404933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
405033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  map<string, int> another_map;
405133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
405233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["fee"] = 1;
405333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1)));
405433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["fie"] = 2;
405533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["foe"] = 3;
405633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  another_map["fum"] = 4;
405733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1))));
405833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1))));
405933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(another_map, Each(Pair(_, Gt(0))));
406033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
406133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
406233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, AcceptsMatcher) {
406333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  const int a[] = { 1, 2, 3 };
406433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(a, Each(Gt(0)));
406533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(a, Not(Each(Gt(1))));
406633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
406733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
406833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanTEST(EachTest, WorksForNativeArrayAsTuple) {
406933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  const int a[] = { 1, 2 };
407033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  const int* const pointer = a;
407133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0)));
407233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan  EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1))));
407333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}
407433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan
4075e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace gmock_matchers_test
4076e35fdd936d133bf8a48de140a3c666897588a05shiqian}  // namespace testing
4077