gmock-matchers.h revision 736baa8ac028f01a5c79ebecb6fc7043b47d3c4e
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 implements some commonly used argument matchers. More 35e35fdd936d133bf8a48de140a3c666897588a05shiqian// matchers can be defined by the user implementing the 36e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T> interface if necessary. 37e35fdd936d133bf8a48de140a3c666897588a05shiqian 38e35fdd936d133bf8a48de140a3c666897588a05shiqian#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 39e35fdd936d133bf8a48de140a3c666897588a05shiqian#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 40e35fdd936d133bf8a48de140a3c666897588a05shiqian 416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan#include <algorithm> 4216cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan#include <limits> 43e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <ostream> // NOLINT 44e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <sstream> 45e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <string> 46ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan#include <utility> 47e35fdd936d133bf8a48de140a3c666897588a05shiqian#include <vector> 48e35fdd936d133bf8a48de140a3c666897588a05shiqian 4953e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/internal/gmock-internal-utils.h" 5053e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gmock/internal/gmock-port.h" 5153e08c44dd34857ba57581d7c5774d6c96a8d0e1zhanyong.wan#include "gtest/gtest.h" 52e35fdd936d133bf8a48de140a3c666897588a05shiqian 53e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace testing { 54e35fdd936d133bf8a48de140a3c666897588a05shiqian 55e35fdd936d133bf8a48de140a3c666897588a05shiqian// To implement a matcher Foo for type T, define: 56e35fdd936d133bf8a48de140a3c666897588a05shiqian// 1. a class FooMatcherImpl that implements the 57e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T> interface, and 58e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2. a factory function that creates a Matcher<T> object from a 59e35fdd936d133bf8a48de140a3c666897588a05shiqian// FooMatcherImpl*. 60e35fdd936d133bf8a48de140a3c666897588a05shiqian// 61e35fdd936d133bf8a48de140a3c666897588a05shiqian// The two-level delegation design makes it possible to allow a user 62e35fdd936d133bf8a48de140a3c666897588a05shiqian// to write "v" instead of "Eq(v)" where a Matcher is expected, which 63e35fdd936d133bf8a48de140a3c666897588a05shiqian// is impossible if we pass matchers by pointers. It also eases 64e35fdd936d133bf8a48de140a3c666897588a05shiqian// ownership management as Matcher objects can now be copied like 65e35fdd936d133bf8a48de140a3c666897588a05shiqian// plain values. 66e35fdd936d133bf8a48de140a3c666897588a05shiqian 67821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// MatchResultListener is an abstract class. Its << operator can be 68821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// used by a matcher to explain why a value matches or doesn't match. 69821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// 70821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// TODO(wan@google.com): add method 71821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// bool InterestedInWhy(bool result) const; 72821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// to indicate whether the listener is interested in why the match 73821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// result is 'result'. 74821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass MatchResultListener { 75821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 76821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Creates a listener object with the given underlying ostream. The 77821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // listener does not own the ostream. 78821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan explicit MatchResultListener(::std::ostream* os) : stream_(os) {} 79821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual ~MatchResultListener() = 0; // Makes this class abstract. 80821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 81821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Streams x to the underlying ostream; does nothing if the ostream 82821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // is NULL. 83821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan template <typename T> 84821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener& operator<<(const T& x) { 85821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (stream_ != NULL) 86821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *stream_ << x; 87821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return *this; 88821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 89821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 90821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns the underlying ostream. 91821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan ::std::ostream* stream() { return stream_; } 92821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 93a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // Returns true iff the listener is interested in an explanation of 94a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // the match result. A matcher's MatchAndExplain() method can use 95a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // this information to avoid generating the explanation when no one 96a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // intends to hear it. 97a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan bool IsInterested() const { return stream_ != NULL; } 98a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan 99821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan private: 100821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan ::std::ostream* const stream_; 101821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 102821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); 103821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 104821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 105821133180ccdb9eb062548d964929ba3b354eb84zhanyong.waninline MatchResultListener::~MatchResultListener() { 106821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan} 107821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 108e35fdd936d133bf8a48de140a3c666897588a05shiqian// The implementation of a matcher. 109e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 110e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherInterface { 111e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 112e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual ~MatcherInterface() {} 113e35fdd936d133bf8a48de140a3c666897588a05shiqian 114821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns true iff the matcher matches x; also explains the match 115a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // result to 'listener', in the form of a non-restrictive relative 116a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // clause ("which ...", "whose ...", etc) that describes x. For 117a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // example, the MatchAndExplain() method of the Pointee(...) matcher 118a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // should generate an explanation like "which points to ...". 119821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // 120db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // You should override this method when defining a new matcher. 121821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // 122821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // It's the responsibility of the caller (Google Mock) to guarantee 123821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // that 'listener' is not NULL. This helps to simplify a matcher's 124821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // implementation when it doesn't care about the performance, as it 125821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // can talk to 'listener' without checking its validity first. 126821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // However, in order to implement dummy listeners efficiently, 127821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // listener->stream() may be NULL. 128db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; 129e35fdd936d133bf8a48de140a3c666897588a05shiqian 130a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // Describes this matcher to an ostream. The function should print 131a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // a verb phrase that describes the property a value matching this 132a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // matcher should have. The subject of the verb phrase is the value 133a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // being matched. For example, the DescribeTo() method of the Gt(7) 134a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // matcher prints "is greater than 7". 135e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const = 0; 136e35fdd936d133bf8a48de140a3c666897588a05shiqian 137e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes the negation of this matcher to an ostream. For 138e35fdd936d133bf8a48de140a3c666897588a05shiqian // example, if the description of this matcher is "is greater than 139e35fdd936d133bf8a48de140a3c666897588a05shiqian // 7", the negated description could be "is not greater than 7". 140e35fdd936d133bf8a48de140a3c666897588a05shiqian // You are not required to override this when implementing 141e35fdd936d133bf8a48de140a3c666897588a05shiqian // MatcherInterface, but it is highly advised so that your matcher 142e35fdd936d133bf8a48de140a3c666897588a05shiqian // can produce good error messages. 143e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 144e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "not ("; 145e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeTo(os); 146e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << ")"; 147e35fdd936d133bf8a48de140a3c666897588a05shiqian } 148e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 149e35fdd936d133bf8a48de140a3c666897588a05shiqian 150e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace internal { 151e35fdd936d133bf8a48de140a3c666897588a05shiqian 152821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// A match result listener that ignores the explanation. 153821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass DummyMatchResultListener : public MatchResultListener { 154821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 155821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan DummyMatchResultListener() : MatchResultListener(NULL) {} 156821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 157821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan private: 158821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); 159821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 160821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 161821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// A match result listener that forwards the explanation to a given 162821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// ostream. The difference between this and MatchResultListener is 163821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// that the former is concrete. 164821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass StreamMatchResultListener : public MatchResultListener { 165821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 166821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan explicit StreamMatchResultListener(::std::ostream* os) 167821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan : MatchResultListener(os) {} 168821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 169821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan private: 170821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); 171821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 172821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 173821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// A match result listener that stores the explanation in a string. 174821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass StringMatchResultListener : public MatchResultListener { 175821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 176821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener() : MatchResultListener(&ss_) {} 177821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 178821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns the explanation heard so far. 179821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan internal::string str() const { return ss_.str(); } 180821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 181821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan private: 182821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan ::std::stringstream ss_; 183821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 184821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); 185821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 186821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 187e35fdd936d133bf8a48de140a3c666897588a05shiqian// An internal class for implementing Matcher<T>, which will derive 188e35fdd936d133bf8a48de140a3c666897588a05shiqian// from it. We put functionalities common to all Matcher<T> 189e35fdd936d133bf8a48de140a3c666897588a05shiqian// specializations here to avoid code duplication. 190e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 191e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherBase { 192e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 193821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns true iff the matcher matches x; also explains the match 194821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // result to 'listener'. 195821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan bool MatchAndExplain(T x, MatchResultListener* listener) const { 196821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return impl_->MatchAndExplain(x, listener); 197821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 198821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 199e35fdd936d133bf8a48de140a3c666897588a05shiqian // Returns true iff this matcher matches x. 200821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan bool Matches(T x) const { 201821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan DummyMatchResultListener dummy; 202821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return MatchAndExplain(x, &dummy); 203821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 204e35fdd936d133bf8a48de140a3c666897588a05shiqian 205e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes this matcher to an ostream. 206e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } 207e35fdd936d133bf8a48de140a3c666897588a05shiqian 208e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes the negation of this matcher to an ostream. 209e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 210e35fdd936d133bf8a48de140a3c666897588a05shiqian impl_->DescribeNegationTo(os); 211e35fdd936d133bf8a48de140a3c666897588a05shiqian } 212e35fdd936d133bf8a48de140a3c666897588a05shiqian 213e35fdd936d133bf8a48de140a3c666897588a05shiqian // Explains why x matches, or doesn't match, the matcher. 214e35fdd936d133bf8a48de140a3c666897588a05shiqian void ExplainMatchResultTo(T x, ::std::ostream* os) const { 215821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StreamMatchResultListener listener(os); 216821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchAndExplain(x, &listener); 217e35fdd936d133bf8a48de140a3c666897588a05shiqian } 21832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 219e35fdd936d133bf8a48de140a3c666897588a05shiqian protected: 220e35fdd936d133bf8a48de140a3c666897588a05shiqian MatcherBase() {} 221e35fdd936d133bf8a48de140a3c666897588a05shiqian 222e35fdd936d133bf8a48de140a3c666897588a05shiqian // Constructs a matcher from its implementation. 223e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit MatcherBase(const MatcherInterface<T>* impl) 224e35fdd936d133bf8a48de140a3c666897588a05shiqian : impl_(impl) {} 225e35fdd936d133bf8a48de140a3c666897588a05shiqian 226e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual ~MatcherBase() {} 22732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 228e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 229e35fdd936d133bf8a48de140a3c666897588a05shiqian // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar 230e35fdd936d133bf8a48de140a3c666897588a05shiqian // interfaces. The former dynamically allocates a chunk of memory 231e35fdd936d133bf8a48de140a3c666897588a05shiqian // to hold the reference count, while the latter tracks all 232e35fdd936d133bf8a48de140a3c666897588a05shiqian // references using a circular linked list without allocating 233e35fdd936d133bf8a48de140a3c666897588a05shiqian // memory. It has been observed that linked_ptr performs better in 234e35fdd936d133bf8a48de140a3c666897588a05shiqian // typical scenarios. However, shared_ptr can out-perform 235e35fdd936d133bf8a48de140a3c666897588a05shiqian // linked_ptr when there are many more uses of the copy constructor 236e35fdd936d133bf8a48de140a3c666897588a05shiqian // than the default constructor. 237e35fdd936d133bf8a48de140a3c666897588a05shiqian // 238e35fdd936d133bf8a48de140a3c666897588a05shiqian // If performance becomes a problem, we should see if using 239e35fdd936d133bf8a48de140a3c666897588a05shiqian // shared_ptr helps. 240e35fdd936d133bf8a48de140a3c666897588a05shiqian ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_; 241e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 242e35fdd936d133bf8a48de140a3c666897588a05shiqian 243e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace internal 244e35fdd936d133bf8a48de140a3c666897588a05shiqian 245e35fdd936d133bf8a48de140a3c666897588a05shiqian// A Matcher<T> is a copyable and IMMUTABLE (except by assignment) 246e35fdd936d133bf8a48de140a3c666897588a05shiqian// object that can check whether a value of type T matches. The 247e35fdd936d133bf8a48de140a3c666897588a05shiqian// implementation of Matcher<T> is just a linked_ptr to const 248e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T>, so copying is fairly cheap. Don't inherit 249e35fdd936d133bf8a48de140a3c666897588a05shiqian// from Matcher! 250e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 251e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Matcher : public internal::MatcherBase<T> { 252e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 253e35fdd936d133bf8a48de140a3c666897588a05shiqian // Constructs a null matcher. Needed for storing Matcher objects in 254e35fdd936d133bf8a48de140a3c666897588a05shiqian // STL containers. 255e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher() {} 256e35fdd936d133bf8a48de140a3c666897588a05shiqian 257e35fdd936d133bf8a48de140a3c666897588a05shiqian // Constructs a matcher from its implementation. 258e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Matcher(const MatcherInterface<T>* impl) 259e35fdd936d133bf8a48de140a3c666897588a05shiqian : internal::MatcherBase<T>(impl) {} 260e35fdd936d133bf8a48de140a3c666897588a05shiqian 26118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Implicit constructor here allows people to write 262e35fdd936d133bf8a48de140a3c666897588a05shiqian // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes 263e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(T value); // NOLINT 264e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 265e35fdd936d133bf8a48de140a3c666897588a05shiqian 266e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following two specializations allow the user to write str 267e35fdd936d133bf8a48de140a3c666897588a05shiqian// instead of Eq(str) and "foo" instead of Eq("foo") when a string 268e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher is expected. 269e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <> 270e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Matcher<const internal::string&> 271e35fdd936d133bf8a48de140a3c666897588a05shiqian : public internal::MatcherBase<const internal::string&> { 272e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 273e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher() {} 274e35fdd936d133bf8a48de140a3c666897588a05shiqian 275e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Matcher(const MatcherInterface<const internal::string&>* impl) 276e35fdd936d133bf8a48de140a3c666897588a05shiqian : internal::MatcherBase<const internal::string&>(impl) {} 277e35fdd936d133bf8a48de140a3c666897588a05shiqian 278e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write str instead of Eq(str) sometimes, where 279e35fdd936d133bf8a48de140a3c666897588a05shiqian // str is a string object. 280e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const internal::string& s); // NOLINT 281e35fdd936d133bf8a48de140a3c666897588a05shiqian 282e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write "foo" instead of Eq("foo") sometimes. 283e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const char* s); // NOLINT 284e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 285e35fdd936d133bf8a48de140a3c666897588a05shiqian 286e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <> 287e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Matcher<internal::string> 288e35fdd936d133bf8a48de140a3c666897588a05shiqian : public internal::MatcherBase<internal::string> { 289e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 290e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher() {} 291e35fdd936d133bf8a48de140a3c666897588a05shiqian 292e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Matcher(const MatcherInterface<internal::string>* impl) 293e35fdd936d133bf8a48de140a3c666897588a05shiqian : internal::MatcherBase<internal::string>(impl) {} 294e35fdd936d133bf8a48de140a3c666897588a05shiqian 295e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write str instead of Eq(str) sometimes, where 296e35fdd936d133bf8a48de140a3c666897588a05shiqian // str is a string object. 297e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const internal::string& s); // NOLINT 298e35fdd936d133bf8a48de140a3c666897588a05shiqian 299e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write "foo" instead of Eq("foo") sometimes. 300e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const char* s); // NOLINT 301e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 302e35fdd936d133bf8a48de140a3c666897588a05shiqian 303e35fdd936d133bf8a48de140a3c666897588a05shiqian// The PolymorphicMatcher class template makes it easy to implement a 304e35fdd936d133bf8a48de140a3c666897588a05shiqian// polymorphic matcher (i.e. a matcher that can match values of more 305e35fdd936d133bf8a48de140a3c666897588a05shiqian// than one type, e.g. Eq(n) and NotNull()). 306e35fdd936d133bf8a48de140a3c666897588a05shiqian// 307db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// To define a polymorphic matcher, a user should provide an Impl 308db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// class that has a DescribeTo() method and a DescribeNegationTo() 309db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// method, and define a member function (or member function template) 310821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// 311db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// bool MatchAndExplain(const Value& value, 312db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// MatchResultListener* listener) const; 313821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// 314821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// See the definition of NotNull() for a complete example. 315e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <class Impl> 316e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PolymorphicMatcher { 317e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 31832de5f53763125925e078498250f7e73a88de9edzhanyong.wan explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} 319e35fdd936d133bf8a48de140a3c666897588a05shiqian 3202b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // Returns a mutable reference to the underlying matcher 3212b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // implementation object. 3222b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan Impl& mutable_impl() { return impl_; } 3232b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 3242b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // Returns an immutable reference to the underlying matcher 3252b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // implementation object. 3262b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan const Impl& impl() const { return impl_; } 3272b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 328e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 329e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 330e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(new MonomorphicImpl<T>(impl_)); 331e35fdd936d133bf8a48de140a3c666897588a05shiqian } 33232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 333e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 334e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 335e35fdd936d133bf8a48de140a3c666897588a05shiqian class MonomorphicImpl : public MatcherInterface<T> { 336e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 337e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} 338e35fdd936d133bf8a48de140a3c666897588a05shiqian 339e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 340e35fdd936d133bf8a48de140a3c666897588a05shiqian impl_.DescribeTo(os); 341e35fdd936d133bf8a48de140a3c666897588a05shiqian } 342e35fdd936d133bf8a48de140a3c666897588a05shiqian 343e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 344e35fdd936d133bf8a48de140a3c666897588a05shiqian impl_.DescribeNegationTo(os); 345e35fdd936d133bf8a48de140a3c666897588a05shiqian } 346e35fdd936d133bf8a48de140a3c666897588a05shiqian 347821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 348db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return impl_.MatchAndExplain(x, listener); 349e35fdd936d133bf8a48de140a3c666897588a05shiqian } 3502b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 351e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 352e35fdd936d133bf8a48de140a3c666897588a05shiqian const Impl impl_; 35332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 35432de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); 355e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 356e35fdd936d133bf8a48de140a3c666897588a05shiqian 3572b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan Impl impl_; 35832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 35932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher); 360e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 361e35fdd936d133bf8a48de140a3c666897588a05shiqian 362e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher from its implementation. This is easier to use 363e35fdd936d133bf8a48de140a3c666897588a05shiqian// than the Matcher<T> constructor as it doesn't require you to 364e35fdd936d133bf8a48de140a3c666897588a05shiqian// explicitly write the template argument, e.g. 365e35fdd936d133bf8a48de140a3c666897588a05shiqian// 366e35fdd936d133bf8a48de140a3c666897588a05shiqian// MakeMatcher(foo); 367e35fdd936d133bf8a48de140a3c666897588a05shiqian// vs 368e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<const string&>(foo); 369e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 370e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) { 371e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(impl); 372e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 373e35fdd936d133bf8a48de140a3c666897588a05shiqian 374e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher from its implementation. This is 375e35fdd936d133bf8a48de140a3c666897588a05shiqian// easier to use than the PolymorphicMatcher<Impl> constructor as it 376e35fdd936d133bf8a48de140a3c666897588a05shiqian// doesn't require you to explicitly write the template argument, e.g. 377e35fdd936d133bf8a48de140a3c666897588a05shiqian// 378e35fdd936d133bf8a48de140a3c666897588a05shiqian// MakePolymorphicMatcher(foo); 379e35fdd936d133bf8a48de140a3c666897588a05shiqian// vs 380e35fdd936d133bf8a48de140a3c666897588a05shiqian// PolymorphicMatcher<TypeOfFoo>(foo); 381e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <class Impl> 382e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) { 383e35fdd936d133bf8a48de140a3c666897588a05shiqian return PolymorphicMatcher<Impl>(impl); 384e35fdd936d133bf8a48de140a3c666897588a05shiqian} 385e35fdd936d133bf8a48de140a3c666897588a05shiqian 386e35fdd936d133bf8a48de140a3c666897588a05shiqian// In order to be safe and clear, casting between different matcher 387e35fdd936d133bf8a48de140a3c666897588a05shiqian// types is done explicitly via MatcherCast<T>(m), which takes a 388e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher m and returns a Matcher<T>. It compiles only when T can be 389e35fdd936d133bf8a48de140a3c666897588a05shiqian// statically converted to the argument type of m. 390e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T, typename M> 391e35fdd936d133bf8a48de140a3c666897588a05shiqianMatcher<T> MatcherCast(M m); 392e35fdd936d133bf8a48de140a3c666897588a05shiqian 39318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Implements SafeMatcherCast(). 39418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// 39595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// We use an intermediate class to do the actual safe casting as Nokia's 39695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// Symbian compiler cannot decide between 39795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// template <T, M> ... (M) and 39895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// template <T, U> ... (const Matcher<U>&) 39995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// for function templates but can for member function templates. 40095b12332c345cee508a8e2b68e007280392506e0zhanyong.wantemplate <typename T> 40195b12332c345cee508a8e2b68e007280392506e0zhanyong.wanclass SafeMatcherCastImpl { 40295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan public: 40395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // This overload handles polymorphic matchers only since monomorphic 40495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // matchers are handled by the next one. 40595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan template <typename M> 40695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan static inline Matcher<T> Cast(M polymorphic_matcher) { 40795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan return Matcher<T>(polymorphic_matcher); 40895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan } 40918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 41095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // This overload handles monomorphic matchers. 41195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // 41295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // In general, if type T can be implicitly converted to type U, we can 41395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is 41495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // contravariant): just keep a copy of the original Matcher<U>, convert the 41595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // argument from type T to U, and then pass it to the underlying Matcher<U>. 41695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // The only exception is when U is a reference and T is not, as the 41795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // underlying Matcher<U> may be interested in the argument's address, which 41895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // is not preserved in the conversion from T to U. 41995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan template <typename U> 42095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan static inline Matcher<T> Cast(const Matcher<U>& matcher) { 42195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // Enforce that T can be implicitly converted to U. 42202f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value), 42395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan T_must_be_implicitly_convertible_to_U); 42495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // Enforce that we are not converting a non-reference type T to a reference 42595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // type U. 42602f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_( 42795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan internal::is_reference<T>::value || !internal::is_reference<U>::value, 42895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan cannot_convert_non_referentce_arg_to_reference); 42995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // In case both T and U are arithmetic types, enforce that the 43095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // conversion is not lossy. 431ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT; 432ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU; 43395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; 43495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; 43502f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_( 43695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan kTIsOther || kUIsOther || 43795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan (internal::LosslessArithmeticConvertible<RawT, RawU>::value), 43895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan conversion_of_arithmetic_types_must_be_lossless); 43995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan return MatcherCast<T>(matcher); 44095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan } 44195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan}; 44295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan 44395b12332c345cee508a8e2b68e007280392506e0zhanyong.wantemplate <typename T, typename M> 44495b12332c345cee508a8e2b68e007280392506e0zhanyong.waninline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) { 44595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher); 44618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 44718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 448e35fdd936d133bf8a48de140a3c666897588a05shiqian// A<T>() returns a matcher that matches any value of type T. 449e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 450e35fdd936d133bf8a48de140a3c666897588a05shiqianMatcher<T> A(); 451e35fdd936d133bf8a48de140a3c666897588a05shiqian 452e35fdd936d133bf8a48de140a3c666897588a05shiqian// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION 453e35fdd936d133bf8a48de140a3c666897588a05shiqian// and MUST NOT BE USED IN USER CODE!!! 454e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace internal { 455e35fdd936d133bf8a48de140a3c666897588a05shiqian 456b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// If the explanation is not empty, prints it to the ostream. 457b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.waninline void PrintIfNotEmpty(const internal::string& explanation, 458b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan std::ostream* os) { 459b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan if (explanation != "" && os != NULL) { 460b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ", " << explanation; 461676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 462676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan} 463676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 464736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// Returns true if the given type name is easy to read by a human. 465736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// This is used to decide whether printing the type of a value might 466736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// be helpful. 467736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.waninline bool IsReadableTypeName(const string& type_name) { 468736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan // We consider a type name readable if it's short or doesn't contain 469736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan // a template or function type. 470736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan return (type_name.length() <= 20 || 471736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan type_name.find_first_of("<(") == string::npos); 472736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan} 473736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 474676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// Matches the value against the given matcher, prints the value and explains 475676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// the match result to the listener. Returns the match result. 476676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// 'listener' must not be NULL. 477676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// Value cannot be passed by const reference, because some matchers take a 478676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// non-const argument. 479676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wantemplate <typename Value, typename T> 480676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wanbool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher, 481676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan MatchResultListener* listener) { 482676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!listener->IsInterested()) { 483676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // If the listener is not interested, we do not need to construct the 484676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // inner explanation. 485676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return matcher.Matches(value); 486676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 487676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 488676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan StringMatchResultListener inner_listener; 489676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan const bool match = matcher.MatchAndExplain(value, &inner_listener); 490676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 491676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan UniversalPrint(value, listener->stream()); 492736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#if GTEST_HAS_RTTI 493736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan const string& type_name = GetTypeName<Value>(); 494736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan if (IsReadableTypeName(type_name)) 495736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan *listener->stream() << " (of type " << type_name << ")"; 496736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#endif 497b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(inner_listener.str(), listener->stream()); 498676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 499676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return match; 500676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan} 501676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 502e35fdd936d133bf8a48de140a3c666897588a05shiqian// An internal helper class for doing compile-time loop on a tuple's 503e35fdd936d133bf8a48de140a3c666897588a05shiqian// fields. 504e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <size_t N> 505e35fdd936d133bf8a48de140a3c666897588a05shiqianclass TuplePrefix { 506e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 507e35fdd936d133bf8a48de140a3c666897588a05shiqian // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true 508e35fdd936d133bf8a48de140a3c666897588a05shiqian // iff the first N fields of matcher_tuple matches the first N 509e35fdd936d133bf8a48de140a3c666897588a05shiqian // fields of value_tuple, respectively. 510e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 511e35fdd936d133bf8a48de140a3c666897588a05shiqian static bool Matches(const MatcherTuple& matcher_tuple, 512e35fdd936d133bf8a48de140a3c666897588a05shiqian const ValueTuple& value_tuple) { 513e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::get; 514e35fdd936d133bf8a48de140a3c666897588a05shiqian return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) 515e35fdd936d133bf8a48de140a3c666897588a05shiqian && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple)); 516e35fdd936d133bf8a48de140a3c666897588a05shiqian } 517e35fdd936d133bf8a48de140a3c666897588a05shiqian 518b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os) 519e35fdd936d133bf8a48de140a3c666897588a05shiqian // describes failures in matching the first N fields of matchers 520e35fdd936d133bf8a48de140a3c666897588a05shiqian // against the first N fields of values. If there is no failure, 521e35fdd936d133bf8a48de140a3c666897588a05shiqian // nothing will be streamed to os. 522e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 523b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan static void ExplainMatchFailuresTo(const MatcherTuple& matchers, 524b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const ValueTuple& values, 525b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::ostream* os) { 526e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::tuple_element; 527e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::get; 528e35fdd936d133bf8a48de140a3c666897588a05shiqian 529e35fdd936d133bf8a48de140a3c666897588a05shiqian // First, describes failures in the first N - 1 fields. 530b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os); 531e35fdd936d133bf8a48de140a3c666897588a05shiqian 532e35fdd936d133bf8a48de140a3c666897588a05shiqian // Then describes the failure (if any) in the (N - 1)-th (0-based) 533e35fdd936d133bf8a48de140a3c666897588a05shiqian // field. 534e35fdd936d133bf8a48de140a3c666897588a05shiqian typename tuple_element<N - 1, MatcherTuple>::type matcher = 535e35fdd936d133bf8a48de140a3c666897588a05shiqian get<N - 1>(matchers); 536e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename tuple_element<N - 1, ValueTuple>::type Value; 537e35fdd936d133bf8a48de140a3c666897588a05shiqian Value value = get<N - 1>(values); 538821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener; 539821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!matcher.MatchAndExplain(value, &listener)) { 540e35fdd936d133bf8a48de140a3c666897588a05shiqian // TODO(wan): include in the message the name of the parameter 541e35fdd936d133bf8a48de140a3c666897588a05shiqian // as used in MOCK_METHOD*() when possible. 542e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << " Expected arg #" << N - 1 << ": "; 543e35fdd936d133bf8a48de140a3c666897588a05shiqian get<N - 1>(matchers).DescribeTo(os); 544e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "\n Actual: "; 545e35fdd936d133bf8a48de140a3c666897588a05shiqian // We remove the reference in type Value to prevent the 546e35fdd936d133bf8a48de140a3c666897588a05shiqian // universal printer from printing the address of value, which 547e35fdd936d133bf8a48de140a3c666897588a05shiqian // isn't interesting to the user most of the time. The 548db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // matcher's MatchAndExplain() method handles the case when 549e35fdd936d133bf8a48de140a3c666897588a05shiqian // the address is interesting. 550b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan internal::UniversalPrint(value, os); 551b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(listener.str(), os); 552e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "\n"; 553e35fdd936d133bf8a48de140a3c666897588a05shiqian } 554e35fdd936d133bf8a48de140a3c666897588a05shiqian } 555e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 556e35fdd936d133bf8a48de140a3c666897588a05shiqian 557e35fdd936d133bf8a48de140a3c666897588a05shiqian// The base case. 558e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <> 559e35fdd936d133bf8a48de140a3c666897588a05shiqianclass TuplePrefix<0> { 560e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 561e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 5623fbd2dd020819fcfd7cef2aa6a17fad73c41a0eezhanyong.wan static bool Matches(const MatcherTuple& /* matcher_tuple */, 5633fbd2dd020819fcfd7cef2aa6a17fad73c41a0eezhanyong.wan const ValueTuple& /* value_tuple */) { 564e35fdd936d133bf8a48de140a3c666897588a05shiqian return true; 565e35fdd936d133bf8a48de140a3c666897588a05shiqian } 566e35fdd936d133bf8a48de140a3c666897588a05shiqian 567e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 568b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, 569b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const ValueTuple& /* values */, 570b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::ostream* /* os */) {} 571e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 572e35fdd936d133bf8a48de140a3c666897588a05shiqian 573e35fdd936d133bf8a48de140a3c666897588a05shiqian// TupleMatches(matcher_tuple, value_tuple) returns true iff all 574e35fdd936d133bf8a48de140a3c666897588a05shiqian// matchers in matcher_tuple match the corresponding fields in 575e35fdd936d133bf8a48de140a3c666897588a05shiqian// value_tuple. It is a compiler error if matcher_tuple and 576e35fdd936d133bf8a48de140a3c666897588a05shiqian// value_tuple have different number of fields or incompatible field 577e35fdd936d133bf8a48de140a3c666897588a05shiqian// types. 578e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherTuple, typename ValueTuple> 579e35fdd936d133bf8a48de140a3c666897588a05shiqianbool TupleMatches(const MatcherTuple& matcher_tuple, 580e35fdd936d133bf8a48de140a3c666897588a05shiqian const ValueTuple& value_tuple) { 581e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::tuple_size; 582e35fdd936d133bf8a48de140a3c666897588a05shiqian // Makes sure that matcher_tuple and value_tuple have the same 583e35fdd936d133bf8a48de140a3c666897588a05shiqian // number of fields. 58402f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value == 585e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan tuple_size<ValueTuple>::value, 586e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan matcher_and_value_have_different_numbers_of_fields); 587e35fdd936d133bf8a48de140a3c666897588a05shiqian return TuplePrefix<tuple_size<ValueTuple>::value>:: 588e35fdd936d133bf8a48de140a3c666897588a05shiqian Matches(matcher_tuple, value_tuple); 589e35fdd936d133bf8a48de140a3c666897588a05shiqian} 590e35fdd936d133bf8a48de140a3c666897588a05shiqian 591e35fdd936d133bf8a48de140a3c666897588a05shiqian// Describes failures in matching matchers against values. If there 592e35fdd936d133bf8a48de140a3c666897588a05shiqian// is no failure, nothing will be streamed to os. 593e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherTuple, typename ValueTuple> 594b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanvoid ExplainMatchFailureTupleTo(const MatcherTuple& matchers, 595b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const ValueTuple& values, 596b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::ostream* os) { 597e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::tuple_size; 598b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo( 599e35fdd936d133bf8a48de140a3c666897588a05shiqian matchers, values, os); 600e35fdd936d133bf8a48de140a3c666897588a05shiqian} 601e35fdd936d133bf8a48de140a3c666897588a05shiqian 602e35fdd936d133bf8a48de140a3c666897588a05shiqian// The MatcherCastImpl class template is a helper for implementing 603e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherCast(). We need this helper in order to partially 604e35fdd936d133bf8a48de140a3c666897588a05shiqian// specialize the implementation of MatcherCast() (C++ allows 605e35fdd936d133bf8a48de140a3c666897588a05shiqian// class/struct templates to be partially specialized, but not 606e35fdd936d133bf8a48de140a3c666897588a05shiqian// function templates.). 607e35fdd936d133bf8a48de140a3c666897588a05shiqian 608e35fdd936d133bf8a48de140a3c666897588a05shiqian// This general version is used when MatcherCast()'s argument is a 609e35fdd936d133bf8a48de140a3c666897588a05shiqian// polymorphic matcher (i.e. something that can be converted to a 610e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher but is not one yet; for example, Eq(value)). 611e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T, typename M> 612e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherCastImpl { 613e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 614e35fdd936d133bf8a48de140a3c666897588a05shiqian static Matcher<T> Cast(M polymorphic_matcher) { 615e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(polymorphic_matcher); 616e35fdd936d133bf8a48de140a3c666897588a05shiqian } 617e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 618e35fdd936d133bf8a48de140a3c666897588a05shiqian 619e35fdd936d133bf8a48de140a3c666897588a05shiqian// This more specialized version is used when MatcherCast()'s argument 620e35fdd936d133bf8a48de140a3c666897588a05shiqian// is already a Matcher. This only compiles when type T can be 621e35fdd936d133bf8a48de140a3c666897588a05shiqian// statically converted to type U. 622e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T, typename U> 623e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherCastImpl<T, Matcher<U> > { 624e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 625e35fdd936d133bf8a48de140a3c666897588a05shiqian static Matcher<T> Cast(const Matcher<U>& source_matcher) { 626e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(new Impl(source_matcher)); 627e35fdd936d133bf8a48de140a3c666897588a05shiqian } 62832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 629e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 630e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<T> { 631e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 632e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Impl(const Matcher<U>& source_matcher) 633e35fdd936d133bf8a48de140a3c666897588a05shiqian : source_matcher_(source_matcher) {} 634e35fdd936d133bf8a48de140a3c666897588a05shiqian 635e35fdd936d133bf8a48de140a3c666897588a05shiqian // We delegate the matching logic to the source matcher. 636821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 637821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return source_matcher_.MatchAndExplain(static_cast<U>(x), listener); 638e35fdd936d133bf8a48de140a3c666897588a05shiqian } 639e35fdd936d133bf8a48de140a3c666897588a05shiqian 640e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 641e35fdd936d133bf8a48de140a3c666897588a05shiqian source_matcher_.DescribeTo(os); 642e35fdd936d133bf8a48de140a3c666897588a05shiqian } 643e35fdd936d133bf8a48de140a3c666897588a05shiqian 644e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 645e35fdd936d133bf8a48de140a3c666897588a05shiqian source_matcher_.DescribeNegationTo(os); 646e35fdd936d133bf8a48de140a3c666897588a05shiqian } 647e35fdd936d133bf8a48de140a3c666897588a05shiqian 648e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 649e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<U> source_matcher_; 65032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 65132de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 652e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 653e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 654e35fdd936d133bf8a48de140a3c666897588a05shiqian 655e35fdd936d133bf8a48de140a3c666897588a05shiqian// This even more specialized version is used for efficiently casting 656e35fdd936d133bf8a48de140a3c666897588a05shiqian// a matcher to its own type. 657e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 658e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherCastImpl<T, Matcher<T> > { 659e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 660e35fdd936d133bf8a48de140a3c666897588a05shiqian static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } 661e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 662e35fdd936d133bf8a48de140a3c666897588a05shiqian 663e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements A<T>(). 664e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 665e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AnyMatcherImpl : public MatcherInterface<T> { 666e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 667821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain( 668821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan T /* x */, MatchResultListener* /* listener */) const { return true; } 669e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } 670e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 671e35fdd936d133bf8a48de140a3c666897588a05shiqian // This is mostly for completeness' safe, as it's not very useful 672e35fdd936d133bf8a48de140a3c666897588a05shiqian // to write Not(A<bool>()). However we cannot completely rule out 673e35fdd936d133bf8a48de140a3c666897588a05shiqian // such a possibility, and it doesn't hurt to be prepared. 674e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "never matches"; 675e35fdd936d133bf8a48de140a3c666897588a05shiqian } 676e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 677e35fdd936d133bf8a48de140a3c666897588a05shiqian 678e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements _, a matcher that matches any value of any 679e35fdd936d133bf8a48de140a3c666897588a05shiqian// type. This is a polymorphic matcher, so we need a template type 680e35fdd936d133bf8a48de140a3c666897588a05shiqian// conversion operator to make it appearing as a Matcher<T> for any 681e35fdd936d133bf8a48de140a3c666897588a05shiqian// type T. 682e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AnythingMatcher { 683e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 684e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 685e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { return A<T>(); } 686e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 687e35fdd936d133bf8a48de140a3c666897588a05shiqian 688e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements a matcher that compares a given value with a 689e35fdd936d133bf8a48de140a3c666897588a05shiqian// pre-supplied value using one of the ==, <=, <, etc, operators. The 690e35fdd936d133bf8a48de140a3c666897588a05shiqian// two values being compared don't have to have the same type. 691e35fdd936d133bf8a48de140a3c666897588a05shiqian// 692e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher defined here is polymorphic (for example, Eq(5) can be 693e35fdd936d133bf8a48de140a3c666897588a05shiqian// used to match an int, a short, a double, etc). Therefore we use 694e35fdd936d133bf8a48de140a3c666897588a05shiqian// a template type conversion operator in the implementation. 695e35fdd936d133bf8a48de140a3c666897588a05shiqian// 696e35fdd936d133bf8a48de140a3c666897588a05shiqian// We define this as a macro in order to eliminate duplicated source 697e35fdd936d133bf8a48de140a3c666897588a05shiqian// code. 698e35fdd936d133bf8a48de140a3c666897588a05shiqian// 699e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following template definition assumes that the Rhs parameter is 700e35fdd936d133bf8a48de140a3c666897588a05shiqian// a "bare" type (i.e. neither 'const T' nor 'T&'). 701b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan#define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \ 702b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan name, op, relation, negated_relation) \ 703e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Rhs> class name##Matcher { \ 704e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 705e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \ 706e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Lhs> \ 707e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<Lhs>() const { \ 708e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<Lhs>(rhs_)); \ 709e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 710e35fdd936d133bf8a48de140a3c666897588a05shiqian private: \ 711e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Lhs> \ 712e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<Lhs> { \ 713e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 714e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \ 715821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(\ 716821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan Lhs lhs, MatchResultListener* /* listener */) const { \ 717821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return lhs op rhs_; \ 718821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } \ 719e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { \ 720b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << relation " "; \ 721e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); \ 722e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 723e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { \ 724b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << negated_relation " "; \ 725e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); \ 726e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 727e35fdd936d133bf8a48de140a3c666897588a05shiqian private: \ 728e35fdd936d133bf8a48de140a3c666897588a05shiqian Rhs rhs_; \ 72932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); \ 730e35fdd936d133bf8a48de140a3c666897588a05shiqian }; \ 731e35fdd936d133bf8a48de140a3c666897588a05shiqian Rhs rhs_; \ 73232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(name##Matcher); \ 733e35fdd936d133bf8a48de140a3c666897588a05shiqian } 734e35fdd936d133bf8a48de140a3c666897588a05shiqian 735e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v) 736e35fdd936d133bf8a48de140a3c666897588a05shiqian// respectively. 737b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to"); 738b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >="); 739b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >"); 740b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <="); 741b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <"); 742b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to"); 743e35fdd936d133bf8a48de140a3c666897588a05shiqian 744e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan#undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_ 745e35fdd936d133bf8a48de140a3c666897588a05shiqian 74679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev// Implements the polymorphic IsNull() matcher, which matches any raw or smart 7472d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// pointer that is NULL. 7482d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanclass IsNullMatcher { 7492d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan public: 75079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev template <typename Pointer> 751db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const Pointer& p, 752db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 753db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return GetRawPointer(p) == NULL; 754db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 7552d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 7562d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } 7572d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan void DescribeNegationTo(::std::ostream* os) const { 758b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't NULL"; 7592d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan } 7602d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan}; 7612d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 76279b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev// Implements the polymorphic NotNull() matcher, which matches any raw or smart 763e35fdd936d133bf8a48de140a3c666897588a05shiqian// pointer that is not NULL. 764e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotNullMatcher { 765e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 76679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev template <typename Pointer> 767db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const Pointer& p, 768db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 769db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return GetRawPointer(p) != NULL; 770db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 771e35fdd936d133bf8a48de140a3c666897588a05shiqian 772b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } 773e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 774e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is NULL"; 775e35fdd936d133bf8a48de140a3c666897588a05shiqian } 776e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 777e35fdd936d133bf8a48de140a3c666897588a05shiqian 778e35fdd936d133bf8a48de140a3c666897588a05shiqian// Ref(variable) matches any argument that is a reference to 779e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'variable'. This matcher is polymorphic as it can match any 780e35fdd936d133bf8a48de140a3c666897588a05shiqian// super type of the type of 'variable'. 781e35fdd936d133bf8a48de140a3c666897588a05shiqian// 782e35fdd936d133bf8a48de140a3c666897588a05shiqian// The RefMatcher template class implements Ref(variable). It can 783e35fdd936d133bf8a48de140a3c666897588a05shiqian// only be instantiated with a reference type. This prevents a user 784e35fdd936d133bf8a48de140a3c666897588a05shiqian// from mistakenly using Ref(x) to match a non-reference function 785e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument. For example, the following will righteously cause a 786e35fdd936d133bf8a48de140a3c666897588a05shiqian// compiler error: 787e35fdd936d133bf8a48de140a3c666897588a05shiqian// 788e35fdd936d133bf8a48de140a3c666897588a05shiqian// int n; 789e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<int> m1 = Ref(n); // This won't compile. 790e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<int&> m2 = Ref(n); // This will compile. 791e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 792e35fdd936d133bf8a48de140a3c666897588a05shiqianclass RefMatcher; 793e35fdd936d133bf8a48de140a3c666897588a05shiqian 794e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 795e35fdd936d133bf8a48de140a3c666897588a05shiqianclass RefMatcher<T&> { 796e35fdd936d133bf8a48de140a3c666897588a05shiqian // Google Mock is a generic framework and thus needs to support 797e35fdd936d133bf8a48de140a3c666897588a05shiqian // mocking any function types, including those that take non-const 798e35fdd936d133bf8a48de140a3c666897588a05shiqian // reference arguments. Therefore the template parameter T (and 799e35fdd936d133bf8a48de140a3c666897588a05shiqian // Super below) can be instantiated to either a const type or a 800e35fdd936d133bf8a48de140a3c666897588a05shiqian // non-const type. 801e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 802e35fdd936d133bf8a48de140a3c666897588a05shiqian // RefMatcher() takes a T& instead of const T&, as we want the 803e35fdd936d133bf8a48de140a3c666897588a05shiqian // compiler to catch using Ref(const_value) as a matcher for a 804e35fdd936d133bf8a48de140a3c666897588a05shiqian // non-const reference. 805e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit RefMatcher(T& x) : object_(x) {} // NOLINT 806e35fdd936d133bf8a48de140a3c666897588a05shiqian 807e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Super> 808e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<Super&>() const { 809e35fdd936d133bf8a48de140a3c666897588a05shiqian // By passing object_ (type T&) to Impl(), which expects a Super&, 810e35fdd936d133bf8a48de140a3c666897588a05shiqian // we make sure that Super is a super type of T. In particular, 811e35fdd936d133bf8a48de140a3c666897588a05shiqian // this catches using Ref(const_value) as a matcher for a 812e35fdd936d133bf8a48de140a3c666897588a05shiqian // non-const reference, as you cannot implicitly convert a const 813e35fdd936d133bf8a48de140a3c666897588a05shiqian // reference to a non-const reference. 814e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<Super>(object_)); 815e35fdd936d133bf8a48de140a3c666897588a05shiqian } 81632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 817e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 818e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Super> 819e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<Super&> { 820e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 821e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Impl(Super& x) : object_(x) {} // NOLINT 822e35fdd936d133bf8a48de140a3c666897588a05shiqian 823db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // MatchAndExplain() takes a Super& (as opposed to const Super&) 824db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // in order to match the interface MatcherInterface<Super&>. 825821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain( 826821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan Super& x, MatchResultListener* listener) const { 827b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "which is located @" << static_cast<const void*>(&x); 828821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return &x == &object_; 829821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 830e35fdd936d133bf8a48de140a3c666897588a05shiqian 831e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 832e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "references the variable "; 833e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<Super&>::Print(object_, os); 834e35fdd936d133bf8a48de140a3c666897588a05shiqian } 835e35fdd936d133bf8a48de140a3c666897588a05shiqian 836e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 837e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "does not reference the variable "; 838e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<Super&>::Print(object_, os); 839e35fdd936d133bf8a48de140a3c666897588a05shiqian } 840e35fdd936d133bf8a48de140a3c666897588a05shiqian 841e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 842e35fdd936d133bf8a48de140a3c666897588a05shiqian const Super& object_; 84332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 84432de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 845e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 846e35fdd936d133bf8a48de140a3c666897588a05shiqian 847e35fdd936d133bf8a48de140a3c666897588a05shiqian T& object_; 84832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 84932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(RefMatcher); 850e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 851e35fdd936d133bf8a48de140a3c666897588a05shiqian 852e35fdd936d133bf8a48de140a3c666897588a05shiqian// Polymorphic helper functions for narrow and wide string matchers. 853e35fdd936d133bf8a48de140a3c666897588a05shiqianinline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { 854e35fdd936d133bf8a48de140a3c666897588a05shiqian return String::CaseInsensitiveCStringEquals(lhs, rhs); 855e35fdd936d133bf8a48de140a3c666897588a05shiqian} 856e35fdd936d133bf8a48de140a3c666897588a05shiqian 857e35fdd936d133bf8a48de140a3c666897588a05shiqianinline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, 858e35fdd936d133bf8a48de140a3c666897588a05shiqian const wchar_t* rhs) { 859e35fdd936d133bf8a48de140a3c666897588a05shiqian return String::CaseInsensitiveWideCStringEquals(lhs, rhs); 860e35fdd936d133bf8a48de140a3c666897588a05shiqian} 861e35fdd936d133bf8a48de140a3c666897588a05shiqian 862e35fdd936d133bf8a48de140a3c666897588a05shiqian// String comparison for narrow or wide strings that can have embedded NUL 863e35fdd936d133bf8a48de140a3c666897588a05shiqian// characters. 864e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 865e35fdd936d133bf8a48de140a3c666897588a05shiqianbool CaseInsensitiveStringEquals(const StringType& s1, 866e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType& s2) { 867e35fdd936d133bf8a48de140a3c666897588a05shiqian // Are the heads equal? 868e35fdd936d133bf8a48de140a3c666897588a05shiqian if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { 869e35fdd936d133bf8a48de140a3c666897588a05shiqian return false; 870e35fdd936d133bf8a48de140a3c666897588a05shiqian } 871e35fdd936d133bf8a48de140a3c666897588a05shiqian 872e35fdd936d133bf8a48de140a3c666897588a05shiqian // Skip the equal heads. 873e35fdd936d133bf8a48de140a3c666897588a05shiqian const typename StringType::value_type nul = 0; 874e35fdd936d133bf8a48de140a3c666897588a05shiqian const size_t i1 = s1.find(nul), i2 = s2.find(nul); 875e35fdd936d133bf8a48de140a3c666897588a05shiqian 876e35fdd936d133bf8a48de140a3c666897588a05shiqian // Are we at the end of either s1 or s2? 877e35fdd936d133bf8a48de140a3c666897588a05shiqian if (i1 == StringType::npos || i2 == StringType::npos) { 878e35fdd936d133bf8a48de140a3c666897588a05shiqian return i1 == i2; 879e35fdd936d133bf8a48de140a3c666897588a05shiqian } 880e35fdd936d133bf8a48de140a3c666897588a05shiqian 881e35fdd936d133bf8a48de140a3c666897588a05shiqian // Are the tails equal? 882e35fdd936d133bf8a48de140a3c666897588a05shiqian return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); 883e35fdd936d133bf8a48de140a3c666897588a05shiqian} 884e35fdd936d133bf8a48de140a3c666897588a05shiqian 885e35fdd936d133bf8a48de140a3c666897588a05shiqian// String matchers. 886e35fdd936d133bf8a48de140a3c666897588a05shiqian 887e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements equality-based string matchers like StrEq, StrCaseNe, and etc. 888e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 889e35fdd936d133bf8a48de140a3c666897588a05shiqianclass StrEqualityMatcher { 890e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 891e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename StringType::const_pointer ConstCharPointer; 892e35fdd936d133bf8a48de140a3c666897588a05shiqian 893e35fdd936d133bf8a48de140a3c666897588a05shiqian StrEqualityMatcher(const StringType& str, bool expect_eq, 894e35fdd936d133bf8a48de140a3c666897588a05shiqian bool case_sensitive) 895e35fdd936d133bf8a48de140a3c666897588a05shiqian : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} 896e35fdd936d133bf8a48de140a3c666897588a05shiqian 897e35fdd936d133bf8a48de140a3c666897588a05shiqian // When expect_eq_ is true, returns true iff s is equal to string_; 898e35fdd936d133bf8a48de140a3c666897588a05shiqian // otherwise returns true iff s is not equal to string_. 899db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(ConstCharPointer s, 900db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 901e35fdd936d133bf8a48de140a3c666897588a05shiqian if (s == NULL) { 902e35fdd936d133bf8a48de140a3c666897588a05shiqian return !expect_eq_; 903e35fdd936d133bf8a48de140a3c666897588a05shiqian } 904db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplain(StringType(s), listener); 905e35fdd936d133bf8a48de140a3c666897588a05shiqian } 906e35fdd936d133bf8a48de140a3c666897588a05shiqian 907db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const StringType& s, 908db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 909e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool eq = case_sensitive_ ? s == string_ : 910e35fdd936d133bf8a48de140a3c666897588a05shiqian CaseInsensitiveStringEquals(s, string_); 911e35fdd936d133bf8a48de140a3c666897588a05shiqian return expect_eq_ == eq; 912e35fdd936d133bf8a48de140a3c666897588a05shiqian } 913e35fdd936d133bf8a48de140a3c666897588a05shiqian 914e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 915e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeToHelper(expect_eq_, os); 916e35fdd936d133bf8a48de140a3c666897588a05shiqian } 917e35fdd936d133bf8a48de140a3c666897588a05shiqian 918e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 919e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeToHelper(!expect_eq_, os); 920e35fdd936d133bf8a48de140a3c666897588a05shiqian } 92132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 922e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 923e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { 924b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << (expect_eq ? "is " : "isn't "); 925e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "equal to "; 926e35fdd936d133bf8a48de140a3c666897588a05shiqian if (!case_sensitive_) { 927e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "(ignoring case) "; 928e35fdd936d133bf8a48de140a3c666897588a05shiqian } 929e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(string_, os); 930e35fdd936d133bf8a48de140a3c666897588a05shiqian } 931e35fdd936d133bf8a48de140a3c666897588a05shiqian 932e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType string_; 933e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool expect_eq_; 934e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool case_sensitive_; 93532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 93632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); 937e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 938e35fdd936d133bf8a48de140a3c666897588a05shiqian 939e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic HasSubstr(substring) matcher, which 940e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be used as a Matcher<T> as long as T can be converted to a 941e35fdd936d133bf8a48de140a3c666897588a05shiqian// string. 942e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 943e35fdd936d133bf8a48de140a3c666897588a05shiqianclass HasSubstrMatcher { 944e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 945e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename StringType::const_pointer ConstCharPointer; 946e35fdd936d133bf8a48de140a3c666897588a05shiqian 947e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit HasSubstrMatcher(const StringType& substring) 948e35fdd936d133bf8a48de140a3c666897588a05shiqian : substring_(substring) {} 949e35fdd936d133bf8a48de140a3c666897588a05shiqian 950e35fdd936d133bf8a48de140a3c666897588a05shiqian // These overloaded methods allow HasSubstr(substring) to be used as a 951e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<T> as long as T can be converted to string. Returns true 952e35fdd936d133bf8a48de140a3c666897588a05shiqian // iff s contains substring_ as a substring. 953db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(ConstCharPointer s, 954db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 955db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(StringType(s), listener); 956e35fdd936d133bf8a48de140a3c666897588a05shiqian } 957e35fdd936d133bf8a48de140a3c666897588a05shiqian 958db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const StringType& s, 959db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 960e35fdd936d133bf8a48de140a3c666897588a05shiqian return s.find(substring_) != StringType::npos; 961e35fdd936d133bf8a48de140a3c666897588a05shiqian } 962e35fdd936d133bf8a48de140a3c666897588a05shiqian 963e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes what this matcher matches. 964e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 965e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "has substring "; 966e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(substring_, os); 967e35fdd936d133bf8a48de140a3c666897588a05shiqian } 968e35fdd936d133bf8a48de140a3c666897588a05shiqian 969e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 970e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "has no substring "; 971e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(substring_, os); 972e35fdd936d133bf8a48de140a3c666897588a05shiqian } 97332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 974e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 975e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType substring_; 97632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 97732de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); 978e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 979e35fdd936d133bf8a48de140a3c666897588a05shiqian 980e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic StartsWith(substring) matcher, which 981e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be used as a Matcher<T> as long as T can be converted to a 982e35fdd936d133bf8a48de140a3c666897588a05shiqian// string. 983e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 984e35fdd936d133bf8a48de140a3c666897588a05shiqianclass StartsWithMatcher { 985e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 986e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename StringType::const_pointer ConstCharPointer; 987e35fdd936d133bf8a48de140a3c666897588a05shiqian 988e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { 989e35fdd936d133bf8a48de140a3c666897588a05shiqian } 990e35fdd936d133bf8a48de140a3c666897588a05shiqian 991e35fdd936d133bf8a48de140a3c666897588a05shiqian // These overloaded methods allow StartsWith(prefix) to be used as a 992e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<T> as long as T can be converted to string. Returns true 993e35fdd936d133bf8a48de140a3c666897588a05shiqian // iff s starts with prefix_. 994db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(ConstCharPointer s, 995db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 996db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(StringType(s), listener); 997e35fdd936d133bf8a48de140a3c666897588a05shiqian } 998e35fdd936d133bf8a48de140a3c666897588a05shiqian 999db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const StringType& s, 1000db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 1001e35fdd936d133bf8a48de140a3c666897588a05shiqian return s.length() >= prefix_.length() && 1002e35fdd936d133bf8a48de140a3c666897588a05shiqian s.substr(0, prefix_.length()) == prefix_; 1003e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1004e35fdd936d133bf8a48de140a3c666897588a05shiqian 1005e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1006e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "starts with "; 1007e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(prefix_, os); 1008e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1009e35fdd936d133bf8a48de140a3c666897588a05shiqian 1010e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1011e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't start with "; 1012e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(prefix_, os); 1013e35fdd936d133bf8a48de140a3c666897588a05shiqian } 101432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1015e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1016e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType prefix_; 101732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 101832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); 1019e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1020e35fdd936d133bf8a48de140a3c666897588a05shiqian 1021e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic EndsWith(substring) matcher, which 1022e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be used as a Matcher<T> as long as T can be converted to a 1023e35fdd936d133bf8a48de140a3c666897588a05shiqian// string. 1024e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 1025e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EndsWithMatcher { 1026e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1027e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename StringType::const_pointer ConstCharPointer; 1028e35fdd936d133bf8a48de140a3c666897588a05shiqian 1029e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} 1030e35fdd936d133bf8a48de140a3c666897588a05shiqian 1031e35fdd936d133bf8a48de140a3c666897588a05shiqian // These overloaded methods allow EndsWith(suffix) to be used as a 1032e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<T> as long as T can be converted to string. Returns true 1033e35fdd936d133bf8a48de140a3c666897588a05shiqian // iff s ends with suffix_. 1034db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(ConstCharPointer s, 1035db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1036db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(StringType(s), listener); 1037e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1038e35fdd936d133bf8a48de140a3c666897588a05shiqian 1039db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const StringType& s, 1040db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 1041e35fdd936d133bf8a48de140a3c666897588a05shiqian return s.length() >= suffix_.length() && 1042e35fdd936d133bf8a48de140a3c666897588a05shiqian s.substr(s.length() - suffix_.length()) == suffix_; 1043e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1044e35fdd936d133bf8a48de140a3c666897588a05shiqian 1045e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1046e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "ends with "; 1047e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(suffix_, os); 1048e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1049e35fdd936d133bf8a48de140a3c666897588a05shiqian 1050e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1051e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't end with "; 1052e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(suffix_, os); 1053e35fdd936d133bf8a48de140a3c666897588a05shiqian } 105432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1055e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1056e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType suffix_; 105732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 105832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); 1059e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1060e35fdd936d133bf8a48de140a3c666897588a05shiqian 1061e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements polymorphic matchers MatchesRegex(regex) and 1062e35fdd936d133bf8a48de140a3c666897588a05shiqian// ContainsRegex(regex), which can be used as a Matcher<T> as long as 1063e35fdd936d133bf8a48de140a3c666897588a05shiqian// T can be converted to a string. 1064e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatchesRegexMatcher { 1065e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1066e35fdd936d133bf8a48de140a3c666897588a05shiqian MatchesRegexMatcher(const RE* regex, bool full_match) 1067e35fdd936d133bf8a48de140a3c666897588a05shiqian : regex_(regex), full_match_(full_match) {} 1068e35fdd936d133bf8a48de140a3c666897588a05shiqian 1069e35fdd936d133bf8a48de140a3c666897588a05shiqian // These overloaded methods allow MatchesRegex(regex) to be used as 1070e35fdd936d133bf8a48de140a3c666897588a05shiqian // a Matcher<T> as long as T can be converted to string. Returns 1071e35fdd936d133bf8a48de140a3c666897588a05shiqian // true iff s matches regular expression regex. When full_match_ is 1072e35fdd936d133bf8a48de140a3c666897588a05shiqian // true, a full match is done; otherwise a partial match is done. 1073db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const char* s, 1074db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1075db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(internal::string(s), listener); 1076e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1077e35fdd936d133bf8a48de140a3c666897588a05shiqian 1078db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const internal::string& s, 1079db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 1080e35fdd936d133bf8a48de140a3c666897588a05shiqian return full_match_ ? RE::FullMatch(s, *regex_) : 1081e35fdd936d133bf8a48de140a3c666897588a05shiqian RE::PartialMatch(s, *regex_); 1082e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1083e35fdd936d133bf8a48de140a3c666897588a05shiqian 1084e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1085e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << (full_match_ ? "matches" : "contains") 1086e35fdd936d133bf8a48de140a3c666897588a05shiqian << " regular expression "; 1087e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 1088e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1089e35fdd936d133bf8a48de140a3c666897588a05shiqian 1090e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1091e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't " << (full_match_ ? "match" : "contain") 1092e35fdd936d133bf8a48de140a3c666897588a05shiqian << " regular expression "; 1093e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 1094e35fdd936d133bf8a48de140a3c666897588a05shiqian } 109532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1096e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1097e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::linked_ptr<const RE> regex_; 1098e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool full_match_; 109932de5f53763125925e078498250f7e73a88de9edzhanyong.wan 110032de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); 1101e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1102e35fdd936d133bf8a48de140a3c666897588a05shiqian 1103e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements a matcher that compares the two fields of a 2-tuple 1104e35fdd936d133bf8a48de140a3c666897588a05shiqian// using one of the ==, <=, <, etc, operators. The two fields being 1105e35fdd936d133bf8a48de140a3c666897588a05shiqian// compared don't have to have the same type. 1106e35fdd936d133bf8a48de140a3c666897588a05shiqian// 1107e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher defined here is polymorphic (for example, Eq() can be 1108e35fdd936d133bf8a48de140a3c666897588a05shiqian// used to match a tuple<int, short>, a tuple<const long&, double>, 1109e35fdd936d133bf8a48de140a3c666897588a05shiqian// etc). Therefore we use a template type conversion operator in the 1110e35fdd936d133bf8a48de140a3c666897588a05shiqian// implementation. 1111e35fdd936d133bf8a48de140a3c666897588a05shiqian// 1112e35fdd936d133bf8a48de140a3c666897588a05shiqian// We define this as a macro in order to eliminate duplicated source 1113e35fdd936d133bf8a48de140a3c666897588a05shiqian// code. 1114ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan#define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op, relation) \ 1115e35fdd936d133bf8a48de140a3c666897588a05shiqian class name##2Matcher { \ 1116e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 1117e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T1, typename T2> \ 1118ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan operator Matcher< ::std::tr1::tuple<T1, T2> >() const { \ 1119ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return MakeMatcher(new Impl< ::std::tr1::tuple<T1, T2> >); \ 1120ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } \ 1121ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename T1, typename T2> \ 1122e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \ 1123ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return MakeMatcher(new Impl<const ::std::tr1::tuple<T1, T2>&>); \ 1124e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1125e35fdd936d133bf8a48de140a3c666897588a05shiqian private: \ 1126ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename Tuple> \ 1127ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan class Impl : public MatcherInterface<Tuple> { \ 1128e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 1129821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain( \ 1130ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Tuple args, \ 1131821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* /* listener */) const { \ 1132e35fdd936d133bf8a48de140a3c666897588a05shiqian return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \ 1133e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1134e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { \ 1135ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "are " relation; \ 1136e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1137e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { \ 1138ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "aren't " relation; \ 1139e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1140e35fdd936d133bf8a48de140a3c666897588a05shiqian }; \ 1141e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1142e35fdd936d133bf8a48de140a3c666897588a05shiqian 1143e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively. 1144ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==, "an equal pair"); 1145ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1146ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Ge, >=, "a pair where the first >= the second"); 1147ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1148ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Gt, >, "a pair where the first > the second"); 1149ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1150ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Le, <=, "a pair where the first <= the second"); 1151ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1152ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Lt, <, "a pair where the first < the second"); 1153ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=, "an unequal pair"); 1154e35fdd936d133bf8a48de140a3c666897588a05shiqian 1155e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan#undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_ 1156e35fdd936d133bf8a48de140a3c666897588a05shiqian 1157c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Implements the Not(...) matcher for a particular argument type T. 1158c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// We do not nest it inside the NotMatcher class template, as that 1159c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// will prevent different instantiations of NotMatcher from sharing 1160c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// the same NotMatcherImpl<T> class. 1161c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wantemplate <typename T> 1162c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanclass NotMatcherImpl : public MatcherInterface<T> { 1163c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan public: 1164c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan explicit NotMatcherImpl(const Matcher<T>& matcher) 1165c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan : matcher_(matcher) {} 1166c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1167821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1168821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return !matcher_.MatchAndExplain(x, listener); 1169c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1170c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1171c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 1172c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher_.DescribeNegationTo(os); 1173c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1174c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1175c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 1176c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher_.DescribeTo(os); 1177c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1178c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1179c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan private: 1180c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher_; 118132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 118232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); 1183c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan}; 1184c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1185e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Not(m) matcher, which matches a value that doesn't 1186e35fdd936d133bf8a48de140a3c666897588a05shiqian// match matcher m. 1187e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 1188e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotMatcher { 1189e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1190e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {} 1191e35fdd936d133bf8a48de140a3c666897588a05shiqian 1192e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template type conversion operator allows Not(m) to be used 1193e35fdd936d133bf8a48de140a3c666897588a05shiqian // to match any type m can match. 1194e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1195e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 1196c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_))); 1197e35fdd936d133bf8a48de140a3c666897588a05shiqian } 119832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1199e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1200c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan InnerMatcher matcher_; 120132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 120232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(NotMatcher); 1203c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan}; 1204e35fdd936d133bf8a48de140a3c666897588a05shiqian 1205c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Implements the AllOf(m1, m2) matcher for a particular argument type 1206c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// T. We do not nest it inside the BothOfMatcher class template, as 1207c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// that will prevent different instantiations of BothOfMatcher from 1208c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// sharing the same BothOfMatcherImpl<T> class. 1209c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wantemplate <typename T> 1210c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanclass BothOfMatcherImpl : public MatcherInterface<T> { 1211c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan public: 1212c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 1213c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan : matcher1_(matcher1), matcher2_(matcher2) {} 1214e35fdd936d133bf8a48de140a3c666897588a05shiqian 1215c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 1216c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << "("; 1217c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher1_.DescribeTo(os); 1218c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ") and ("; 1219c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher2_.DescribeTo(os); 1220c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ")"; 1221c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1222e35fdd936d133bf8a48de140a3c666897588a05shiqian 1223c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 1224b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "("; 1225b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher1_.DescribeNegationTo(os); 1226b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ") or ("; 1227b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher2_.DescribeNegationTo(os); 1228b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ")"; 1229c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1230e35fdd936d133bf8a48de140a3c666897588a05shiqian 1231821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1232821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If either matcher1_ or matcher2_ doesn't match x, we only need 1233821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // to explain why one of them fails. 1234821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener1; 1235821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!matcher1_.MatchAndExplain(x, &listener1)) { 1236821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener1.str(); 1237821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1238821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1239c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1240821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener2; 1241821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!matcher2_.MatchAndExplain(x, &listener2)) { 1242821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener2.str(); 1243821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1244821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1245c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1246821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Otherwise we need to explain why *both* of them match. 1247821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s1 = listener1.str(); 1248821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s2 = listener2.str(); 1249821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1250821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s1 == "") { 1251821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s2; 1252c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } else { 1253821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s1; 1254821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s2 != "") { 1255b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << ", and " << s2; 1256c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1257c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1258821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 1259c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 126032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1261c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan private: 1262c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher1_; 1263c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher2_; 126432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 126532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); 1266e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1267e35fdd936d133bf8a48de140a3c666897588a05shiqian 1268e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing the AllOf(m_1, ..., m_n) matcher, which 1269e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a value that matches all of the matchers m_1, ..., and m_n. 1270e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Matcher1, typename Matcher2> 1271e35fdd936d133bf8a48de140a3c666897588a05shiqianclass BothOfMatcher { 1272e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1273e35fdd936d133bf8a48de140a3c666897588a05shiqian BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 1274e35fdd936d133bf8a48de140a3c666897588a05shiqian : matcher1_(matcher1), matcher2_(matcher2) {} 1275e35fdd936d133bf8a48de140a3c666897588a05shiqian 1276e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template type conversion operator allows a 1277e35fdd936d133bf8a48de140a3c666897588a05shiqian // BothOfMatcher<Matcher1, Matcher2> object to match any type that 1278e35fdd936d133bf8a48de140a3c666897588a05shiqian // both Matcher1 and Matcher2 can match. 1279e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1280e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 1281c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_), 1282c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan SafeMatcherCast<T>(matcher2_))); 1283e35fdd936d133bf8a48de140a3c666897588a05shiqian } 128432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1285e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1286c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Matcher1 matcher1_; 1287c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Matcher2 matcher2_; 128832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 128932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(BothOfMatcher); 1290c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan}; 1291e35fdd936d133bf8a48de140a3c666897588a05shiqian 1292c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Implements the AnyOf(m1, m2) matcher for a particular argument type 1293c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// T. We do not nest it inside the AnyOfMatcher class template, as 1294c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// that will prevent different instantiations of AnyOfMatcher from 1295c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// sharing the same EitherOfMatcherImpl<T> class. 1296c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wantemplate <typename T> 1297c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanclass EitherOfMatcherImpl : public MatcherInterface<T> { 1298c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan public: 1299c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 1300c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan : matcher1_(matcher1), matcher2_(matcher2) {} 1301e35fdd936d133bf8a48de140a3c666897588a05shiqian 1302c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 1303c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << "("; 1304c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher1_.DescribeTo(os); 1305c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ") or ("; 1306c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher2_.DescribeTo(os); 1307c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ")"; 1308c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1309e35fdd936d133bf8a48de140a3c666897588a05shiqian 1310c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 1311b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "("; 1312b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher1_.DescribeNegationTo(os); 1313b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ") and ("; 1314b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher2_.DescribeNegationTo(os); 1315b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ")"; 1316c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1317c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1318821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1319821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If either matcher1_ or matcher2_ matches x, we just need to 1320821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // explain why *one* of them matches. 1321821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener1; 1322821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (matcher1_.MatchAndExplain(x, &listener1)) { 1323821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener1.str(); 1324821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 1325821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1326c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1327821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener2; 1328821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (matcher2_.MatchAndExplain(x, &listener2)) { 1329821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener2.str(); 1330821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 1331821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1332c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1333821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Otherwise we need to explain why *both* of them fail. 1334821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s1 = listener1.str(); 1335821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s2 = listener2.str(); 1336821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1337821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s1 == "") { 1338821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s2; 1339821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } else { 1340821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s1; 1341821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s2 != "") { 1342b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << ", and " << s2; 1343e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1344e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1345821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1346c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 134732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1348c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan private: 1349c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher1_; 1350c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher2_; 135132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 135232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl); 1353e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1354e35fdd936d133bf8a48de140a3c666897588a05shiqian 1355e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which 1356e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a value that matches at least one of the matchers m_1, ..., 1357e35fdd936d133bf8a48de140a3c666897588a05shiqian// and m_n. 1358e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Matcher1, typename Matcher2> 1359e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EitherOfMatcher { 1360e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1361e35fdd936d133bf8a48de140a3c666897588a05shiqian EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 1362e35fdd936d133bf8a48de140a3c666897588a05shiqian : matcher1_(matcher1), matcher2_(matcher2) {} 1363e35fdd936d133bf8a48de140a3c666897588a05shiqian 1364e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template type conversion operator allows a 1365e35fdd936d133bf8a48de140a3c666897588a05shiqian // EitherOfMatcher<Matcher1, Matcher2> object to match any type that 1366e35fdd936d133bf8a48de140a3c666897588a05shiqian // both Matcher1 and Matcher2 can match. 1367e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1368e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 136916cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan return Matcher<T>(new EitherOfMatcherImpl<T>( 137016cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_))); 1371e35fdd936d133bf8a48de140a3c666897588a05shiqian } 137232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1373e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1374e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher1 matcher1_; 1375e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher2 matcher2_; 137632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 137732de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(EitherOfMatcher); 1378e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1379e35fdd936d133bf8a48de140a3c666897588a05shiqian 1380e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing Truly(pred), which turns a predicate into a 1381e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher. 1382e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Predicate> 1383e35fdd936d133bf8a48de140a3c666897588a05shiqianclass TrulyMatcher { 1384e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1385e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit TrulyMatcher(Predicate pred) : predicate_(pred) {} 1386e35fdd936d133bf8a48de140a3c666897588a05shiqian 1387e35fdd936d133bf8a48de140a3c666897588a05shiqian // This method template allows Truly(pred) to be used as a matcher 1388e35fdd936d133bf8a48de140a3c666897588a05shiqian // for type T where T is the argument type of predicate 'pred'. The 1389e35fdd936d133bf8a48de140a3c666897588a05shiqian // argument is passed by reference as the predicate may be 1390e35fdd936d133bf8a48de140a3c666897588a05shiqian // interested in the address of the argument. 1391e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1392db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(T& x, // NOLINT 1393db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 1394652540a278e56528e576f9ea77515f386698a326zhanyong.wan#if GTEST_OS_WINDOWS 1395e35fdd936d133bf8a48de140a3c666897588a05shiqian // MSVC warns about converting a value into bool (warning 4800). 1396e35fdd936d133bf8a48de140a3c666897588a05shiqian#pragma warning(push) // Saves the current warning state. 1397e35fdd936d133bf8a48de140a3c666897588a05shiqian#pragma warning(disable:4800) // Temporarily disables warning 4800. 1398e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_OS_WINDOWS 1399e35fdd936d133bf8a48de140a3c666897588a05shiqian return predicate_(x); 1400652540a278e56528e576f9ea77515f386698a326zhanyong.wan#if GTEST_OS_WINDOWS 1401e35fdd936d133bf8a48de140a3c666897588a05shiqian#pragma warning(pop) // Restores the warning state. 1402e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_OS_WINDOWS 1403e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1404e35fdd936d133bf8a48de140a3c666897588a05shiqian 1405e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1406e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "satisfies the given predicate"; 1407e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1408e35fdd936d133bf8a48de140a3c666897588a05shiqian 1409e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1410e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't satisfy the given predicate"; 1411e35fdd936d133bf8a48de140a3c666897588a05shiqian } 141232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1413e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1414e35fdd936d133bf8a48de140a3c666897588a05shiqian Predicate predicate_; 141532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 141632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(TrulyMatcher); 1417e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1418e35fdd936d133bf8a48de140a3c666897588a05shiqian 1419e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing Matches(matcher), which turns a matcher into 1420e35fdd936d133bf8a48de140a3c666897588a05shiqian// a predicate. 1421e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 1422e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherAsPredicate { 1423e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1424e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {} 1425e35fdd936d133bf8a48de140a3c666897588a05shiqian 1426e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template operator() allows Matches(m) to be used as a 1427e35fdd936d133bf8a48de140a3c666897588a05shiqian // predicate on type T where m is a matcher on type T. 1428e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1429e35fdd936d133bf8a48de140a3c666897588a05shiqian // The argument x is passed by reference instead of by value, as 1430e35fdd936d133bf8a48de140a3c666897588a05shiqian // some matcher may be interested in its address (e.g. as in 1431e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matches(Ref(n))(x)). 1432e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1433e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator()(const T& x) const { 1434e35fdd936d133bf8a48de140a3c666897588a05shiqian // We let matcher_ commit to a particular type here instead of 1435e35fdd936d133bf8a48de140a3c666897588a05shiqian // when the MatcherAsPredicate object was constructed. This 1436e35fdd936d133bf8a48de140a3c666897588a05shiqian // allows us to write Matches(m) where m is a polymorphic matcher 1437e35fdd936d133bf8a48de140a3c666897588a05shiqian // (e.g. Eq(5)). 1438e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1439e35fdd936d133bf8a48de140a3c666897588a05shiqian // If we write Matcher<T>(matcher_).Matches(x) here, it won't 1440e35fdd936d133bf8a48de140a3c666897588a05shiqian // compile when matcher_ has type Matcher<const T&>; if we write 1441e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<const T&>(matcher_).Matches(x) here, it won't compile 1442e35fdd936d133bf8a48de140a3c666897588a05shiqian // when matcher_ has type Matcher<T>; if we just write 1443e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_.Matches(x), it won't compile when matcher_ is 1444e35fdd936d133bf8a48de140a3c666897588a05shiqian // polymorphic, e.g. Eq(5). 1445e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1446e35fdd936d133bf8a48de140a3c666897588a05shiqian // MatcherCast<const T&>() is necessary for making the code work 1447e35fdd936d133bf8a48de140a3c666897588a05shiqian // in all of the above situations. 1448e35fdd936d133bf8a48de140a3c666897588a05shiqian return MatcherCast<const T&>(matcher_).Matches(x); 1449e35fdd936d133bf8a48de140a3c666897588a05shiqian } 145032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1451e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1452e35fdd936d133bf8a48de140a3c666897588a05shiqian M matcher_; 145332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 145432de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate); 1455e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1456e35fdd936d133bf8a48de140a3c666897588a05shiqian 1457e35fdd936d133bf8a48de140a3c666897588a05shiqian// For implementing ASSERT_THAT() and EXPECT_THAT(). The template 1458e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument M must be a type that can be converted to a matcher. 1459e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 1460e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PredicateFormatterFromMatcher { 1461e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1462e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {} 1463e35fdd936d133bf8a48de140a3c666897588a05shiqian 1464e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template () operator allows a PredicateFormatterFromMatcher 1465e35fdd936d133bf8a48de140a3c666897588a05shiqian // object to act as a predicate-formatter suitable for using with 1466e35fdd936d133bf8a48de140a3c666897588a05shiqian // Google Test's EXPECT_PRED_FORMAT1() macro. 1467e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1468e35fdd936d133bf8a48de140a3c666897588a05shiqian AssertionResult operator()(const char* value_text, const T& x) const { 1469e35fdd936d133bf8a48de140a3c666897588a05shiqian // We convert matcher_ to a Matcher<const T&> *now* instead of 1470e35fdd936d133bf8a48de140a3c666897588a05shiqian // when the PredicateFormatterFromMatcher object was constructed, 1471e35fdd936d133bf8a48de140a3c666897588a05shiqian // as matcher_ may be polymorphic (e.g. NotNull()) and we won't 1472e35fdd936d133bf8a48de140a3c666897588a05shiqian // know which type to instantiate it to until we actually see the 1473e35fdd936d133bf8a48de140a3c666897588a05shiqian // type of x here. 1474e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1475e35fdd936d133bf8a48de140a3c666897588a05shiqian // We write MatcherCast<const T&>(matcher_) instead of 1476e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<const T&>(matcher_), as the latter won't compile when 1477e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_ has type Matcher<T> (e.g. An<int>()). 1478e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const T&> matcher = MatcherCast<const T&>(matcher_); 1479821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener; 1480b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan if (MatchPrintAndExplain(x, matcher, &listener)) 1481e35fdd936d133bf8a48de140a3c666897588a05shiqian return AssertionSuccess(); 1482b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 1483b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::stringstream ss; 1484b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ss << "Value of: " << value_text << "\n" 1485b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan << "Expected: "; 1486b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher.DescribeTo(&ss); 1487b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ss << "\n Actual: " << listener.str(); 1488b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan return AssertionFailure() << ss.str(); 1489e35fdd936d133bf8a48de140a3c666897588a05shiqian } 149032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1491e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1492e35fdd936d133bf8a48de140a3c666897588a05shiqian const M matcher_; 149332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 149432de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher); 1495e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1496e35fdd936d133bf8a48de140a3c666897588a05shiqian 1497e35fdd936d133bf8a48de140a3c666897588a05shiqian// A helper function for converting a matcher to a predicate-formatter 1498e35fdd936d133bf8a48de140a3c666897588a05shiqian// without the user needing to explicitly write the type. This is 1499e35fdd936d133bf8a48de140a3c666897588a05shiqian// used for implementing ASSERT_THAT() and EXPECT_THAT(). 1500e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 1501e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PredicateFormatterFromMatcher<M> 1502e35fdd936d133bf8a48de140a3c666897588a05shiqianMakePredicateFormatterFromMatcher(const M& matcher) { 1503e35fdd936d133bf8a48de140a3c666897588a05shiqian return PredicateFormatterFromMatcher<M>(matcher); 1504e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1505e35fdd936d133bf8a48de140a3c666897588a05shiqian 1506e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic floating point equality matcher, which 1507e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches two float values using ULP-based approximation. The 1508e35fdd936d133bf8a48de140a3c666897588a05shiqian// template is meant to be instantiated with FloatType being either 1509e35fdd936d133bf8a48de140a3c666897588a05shiqian// float or double. 1510e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename FloatType> 1511e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FloatingEqMatcher { 1512e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1513e35fdd936d133bf8a48de140a3c666897588a05shiqian // Constructor for FloatingEqMatcher. 1514e35fdd936d133bf8a48de140a3c666897588a05shiqian // The matcher's input will be compared with rhs. The matcher treats two 1515e35fdd936d133bf8a48de140a3c666897588a05shiqian // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards, 1516e35fdd936d133bf8a48de140a3c666897588a05shiqian // equality comparisons between NANs will always return false. 1517e35fdd936d133bf8a48de140a3c666897588a05shiqian FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) : 1518e35fdd936d133bf8a48de140a3c666897588a05shiqian rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 1519e35fdd936d133bf8a48de140a3c666897588a05shiqian 1520e35fdd936d133bf8a48de140a3c666897588a05shiqian // Implements floating point equality matcher as a Matcher<T>. 1521e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1522e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<T> { 1523e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1524e35fdd936d133bf8a48de140a3c666897588a05shiqian Impl(FloatType rhs, bool nan_eq_nan) : 1525e35fdd936d133bf8a48de140a3c666897588a05shiqian rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 1526e35fdd936d133bf8a48de140a3c666897588a05shiqian 1527821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T value, 1528821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* /* listener */) const { 1529e35fdd936d133bf8a48de140a3c666897588a05shiqian const FloatingPoint<FloatType> lhs(value), rhs(rhs_); 1530e35fdd936d133bf8a48de140a3c666897588a05shiqian 1531e35fdd936d133bf8a48de140a3c666897588a05shiqian // Compares NaNs first, if nan_eq_nan_ is true. 1532e35fdd936d133bf8a48de140a3c666897588a05shiqian if (nan_eq_nan_ && lhs.is_nan()) { 1533e35fdd936d133bf8a48de140a3c666897588a05shiqian return rhs.is_nan(); 1534e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1535e35fdd936d133bf8a48de140a3c666897588a05shiqian 1536e35fdd936d133bf8a48de140a3c666897588a05shiqian return lhs.AlmostEquals(rhs); 1537e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1538e35fdd936d133bf8a48de140a3c666897588a05shiqian 1539e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 1540e35fdd936d133bf8a48de140a3c666897588a05shiqian // os->precision() returns the previously set precision, which we 1541e35fdd936d133bf8a48de140a3c666897588a05shiqian // store to restore the ostream to its original configuration 1542e35fdd936d133bf8a48de140a3c666897588a05shiqian // after outputting. 1543e35fdd936d133bf8a48de140a3c666897588a05shiqian const ::std::streamsize old_precision = os->precision( 1544e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::numeric_limits<FloatType>::digits10 + 2); 1545e35fdd936d133bf8a48de140a3c666897588a05shiqian if (FloatingPoint<FloatType>(rhs_).is_nan()) { 1546e35fdd936d133bf8a48de140a3c666897588a05shiqian if (nan_eq_nan_) { 1547e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is NaN"; 1548e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1549e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "never matches"; 1550e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1551e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1552e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is approximately " << rhs_; 1553e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1554e35fdd936d133bf8a48de140a3c666897588a05shiqian os->precision(old_precision); 1555e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1556e35fdd936d133bf8a48de140a3c666897588a05shiqian 1557e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 1558e35fdd936d133bf8a48de140a3c666897588a05shiqian // As before, get original precision. 1559e35fdd936d133bf8a48de140a3c666897588a05shiqian const ::std::streamsize old_precision = os->precision( 1560e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::numeric_limits<FloatType>::digits10 + 2); 1561e35fdd936d133bf8a48de140a3c666897588a05shiqian if (FloatingPoint<FloatType>(rhs_).is_nan()) { 1562e35fdd936d133bf8a48de140a3c666897588a05shiqian if (nan_eq_nan_) { 1563b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't NaN"; 1564e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1565e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is anything"; 1566e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1567e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1568b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't approximately " << rhs_; 1569e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1570e35fdd936d133bf8a48de140a3c666897588a05shiqian // Restore original precision. 1571e35fdd936d133bf8a48de140a3c666897588a05shiqian os->precision(old_precision); 1572e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1573e35fdd936d133bf8a48de140a3c666897588a05shiqian 1574e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1575e35fdd936d133bf8a48de140a3c666897588a05shiqian const FloatType rhs_; 1576e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool nan_eq_nan_; 157732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 157832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 1579e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 1580e35fdd936d133bf8a48de140a3c666897588a05shiqian 1581e35fdd936d133bf8a48de140a3c666897588a05shiqian // The following 3 type conversion operators allow FloatEq(rhs) and 1582e35fdd936d133bf8a48de140a3c666897588a05shiqian // NanSensitiveFloatEq(rhs) to be used as a Matcher<float>, a 1583e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<const float&>, or a Matcher<float&>, but nothing else. 1584e35fdd936d133bf8a48de140a3c666897588a05shiqian // (While Google's C++ coding style doesn't allow arguments passed 1585e35fdd936d133bf8a48de140a3c666897588a05shiqian // by non-const reference, we may see them in code not conforming to 1586e35fdd936d133bf8a48de140a3c666897588a05shiqian // the style. Therefore Google Mock needs to support them.) 1587e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<FloatType>() const { 1588e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<FloatType>(rhs_, nan_eq_nan_)); 1589e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1590e35fdd936d133bf8a48de140a3c666897588a05shiqian 1591e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<const FloatType&>() const { 1592e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<const FloatType&>(rhs_, nan_eq_nan_)); 1593e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1594e35fdd936d133bf8a48de140a3c666897588a05shiqian 1595e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<FloatType&>() const { 1596e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_)); 1597e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1598e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1599e35fdd936d133bf8a48de140a3c666897588a05shiqian const FloatType rhs_; 1600e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool nan_eq_nan_; 160132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 160232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher); 1603e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1604e35fdd936d133bf8a48de140a3c666897588a05shiqian 1605e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Pointee(m) matcher for matching a pointer whose 1606e35fdd936d133bf8a48de140a3c666897588a05shiqian// pointee matches matcher m. The pointer can be either raw or smart. 1607e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 1608e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PointeeMatcher { 1609e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1610e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {} 1611e35fdd936d133bf8a48de140a3c666897588a05shiqian 1612e35fdd936d133bf8a48de140a3c666897588a05shiqian // This type conversion operator template allows Pointee(m) to be 1613e35fdd936d133bf8a48de140a3c666897588a05shiqian // used as a matcher for any pointer type whose pointee type is 1614e35fdd936d133bf8a48de140a3c666897588a05shiqian // compatible with the inner matcher, where type Pointer can be 1615e35fdd936d133bf8a48de140a3c666897588a05shiqian // either a raw pointer or a smart pointer. 1616e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1617e35fdd936d133bf8a48de140a3c666897588a05shiqian // The reason we do this instead of relying on 1618e35fdd936d133bf8a48de140a3c666897588a05shiqian // MakePolymorphicMatcher() is that the latter is not flexible 1619e35fdd936d133bf8a48de140a3c666897588a05shiqian // enough for implementing the DescribeTo() method of Pointee(). 1620e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Pointer> 1621e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<Pointer>() const { 1622e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<Pointer>(matcher_)); 1623e35fdd936d133bf8a48de140a3c666897588a05shiqian } 162432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1625e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1626e35fdd936d133bf8a48de140a3c666897588a05shiqian // The monomorphic implementation that works for a particular pointer type. 1627e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Pointer> 1628e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<Pointer> { 1629e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 163002f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef typename PointeeOf<GTEST_REMOVE_CONST_( // NOLINT 163102f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee; 1632e35fdd936d133bf8a48de140a3c666897588a05shiqian 1633e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Impl(const InnerMatcher& matcher) 1634e35fdd936d133bf8a48de140a3c666897588a05shiqian : matcher_(MatcherCast<const Pointee&>(matcher)) {} 1635e35fdd936d133bf8a48de140a3c666897588a05shiqian 1636e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 1637e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "points to a value that "; 1638e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1639e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1640e35fdd936d133bf8a48de140a3c666897588a05shiqian 1641e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 1642e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "does not point to a value that "; 1643e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1644e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1645e35fdd936d133bf8a48de140a3c666897588a05shiqian 1646821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(Pointer pointer, 1647821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 1648e35fdd936d133bf8a48de140a3c666897588a05shiqian if (GetRawPointer(pointer) == NULL) 1649821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1650e35fdd936d133bf8a48de140a3c666897588a05shiqian 1651676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which points to "; 1652676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(*pointer, matcher_, listener); 1653e35fdd936d133bf8a48de140a3c666897588a05shiqian } 165432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1655e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1656e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const Pointee&> matcher_; 165732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 165832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 1659e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 1660e35fdd936d133bf8a48de140a3c666897588a05shiqian 1661e35fdd936d133bf8a48de140a3c666897588a05shiqian const InnerMatcher matcher_; 166232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 166332de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PointeeMatcher); 1664e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1665e35fdd936d133bf8a48de140a3c666897588a05shiqian 1666e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Field() matcher for matching a field (i.e. member 1667e35fdd936d133bf8a48de140a3c666897588a05shiqian// variable) of an object. 1668e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename FieldType> 1669e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FieldMatcher { 1670e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1671e35fdd936d133bf8a48de140a3c666897588a05shiqian FieldMatcher(FieldType Class::*field, 1672e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const FieldType&>& matcher) 1673e35fdd936d133bf8a48de140a3c666897588a05shiqian : field_(field), matcher_(matcher) {} 1674e35fdd936d133bf8a48de140a3c666897588a05shiqian 1675e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1676676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given field "; 1677e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1678e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1679e35fdd936d133bf8a48de140a3c666897588a05shiqian 1680e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1681676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given field "; 1682e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeNegationTo(os); 1683e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1684e35fdd936d133bf8a48de140a3c666897588a05shiqian 1685db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan template <typename T> 1686db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const T& value, MatchResultListener* listener) const { 1687db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl( 1688db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan typename ::testing::internal:: 168902f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 1690db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan value, listener); 1691db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 1692db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan 1693db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan private: 1694db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // The first argument of MatchAndExplainImpl() is needed to help 169518490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Symbian's C++ compiler choose which overload to use. Its type is 169618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // true_type iff the Field() matcher is used to match a pointer. 1697db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 1698db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1699676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose given field is "; 1700676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(obj.*field_, matcher_, listener); 1701e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1702e35fdd936d133bf8a48de140a3c666897588a05shiqian 1703db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 1704db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1705821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (p == NULL) 1706821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1707821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1708676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which points to an object "; 1709821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Since *p has a field, it must be a class/struct/union type and 1710821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // thus cannot be a pointer. Therefore we pass false_type() as 1711821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // the first argument. 1712db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl(false_type(), *p, listener); 1713e35fdd936d133bf8a48de140a3c666897588a05shiqian } 171432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1715e35fdd936d133bf8a48de140a3c666897588a05shiqian const FieldType Class::*field_; 1716e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const FieldType&> matcher_; 171732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 171832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(FieldMatcher); 1719e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1720e35fdd936d133bf8a48de140a3c666897588a05shiqian 1721e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Property() matcher for matching a property 1722e35fdd936d133bf8a48de140a3c666897588a05shiqian// (i.e. return value of a getter method) of an object. 1723e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename PropertyType> 1724e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PropertyMatcher { 1725e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1726e35fdd936d133bf8a48de140a3c666897588a05shiqian // The property may have a reference type, so 'const PropertyType&' 1727e35fdd936d133bf8a48de140a3c666897588a05shiqian // may cause double references and fail to compile. That's why we 172802f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan // need GTEST_REFERENCE_TO_CONST, which works regardless of 1729e35fdd936d133bf8a48de140a3c666897588a05shiqian // PropertyType being a reference or not. 173002f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; 1731e35fdd936d133bf8a48de140a3c666897588a05shiqian 1732e35fdd936d133bf8a48de140a3c666897588a05shiqian PropertyMatcher(PropertyType (Class::*property)() const, 1733e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<RefToConstProperty>& matcher) 1734e35fdd936d133bf8a48de140a3c666897588a05shiqian : property_(property), matcher_(matcher) {} 1735e35fdd936d133bf8a48de140a3c666897588a05shiqian 1736e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1737676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given property "; 1738e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1739e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1740e35fdd936d133bf8a48de140a3c666897588a05shiqian 1741e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1742676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given property "; 1743e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeNegationTo(os); 1744e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1745e35fdd936d133bf8a48de140a3c666897588a05shiqian 1746db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan template <typename T> 1747db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const T&value, MatchResultListener* listener) const { 1748db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl( 1749db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan typename ::testing::internal:: 175002f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 1751db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan value, listener); 1752db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 1753db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan 1754db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan private: 1755db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // The first argument of MatchAndExplainImpl() is needed to help 175618490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Symbian's C++ compiler choose which overload to use. Its type is 175718490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // true_type iff the Property() matcher is used to match a pointer. 1758db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 1759db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1760676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose given property is "; 1761676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // Cannot pass the return value (for example, int) to MatchPrintAndExplain, 1762676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // which takes a non-const reference as argument. 1763676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan RefToConstProperty result = (obj.*property_)(); 1764676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(result, matcher_, listener); 1765e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1766e35fdd936d133bf8a48de140a3c666897588a05shiqian 1767db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 1768db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1769821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (p == NULL) 1770821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1771821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1772676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which points to an object "; 1773821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Since *p has a property method, it must be a class/struct/union 1774821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // type and thus cannot be a pointer. Therefore we pass 1775821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // false_type() as the first argument. 1776db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl(false_type(), *p, listener); 1777e35fdd936d133bf8a48de140a3c666897588a05shiqian } 177832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1779e35fdd936d133bf8a48de140a3c666897588a05shiqian PropertyType (Class::*property_)() const; 1780e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<RefToConstProperty> matcher_; 178132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 178232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PropertyMatcher); 1783e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1784e35fdd936d133bf8a48de140a3c666897588a05shiqian 1785e35fdd936d133bf8a48de140a3c666897588a05shiqian// Type traits specifying various features of different functors for ResultOf. 1786e35fdd936d133bf8a48de140a3c666897588a05shiqian// The default template specifies features for functor objects. 1787e35fdd936d133bf8a48de140a3c666897588a05shiqian// Functor classes have to typedef argument_type and result_type 1788e35fdd936d133bf8a48de140a3c666897588a05shiqian// to be compatible with ResultOf. 1789e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Functor> 1790e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct CallableTraits { 1791e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename Functor::result_type ResultType; 1792e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef Functor StorageType; 1793e35fdd936d133bf8a48de140a3c666897588a05shiqian 179432de5f53763125925e078498250f7e73a88de9edzhanyong.wan static void CheckIsValid(Functor /* functor */) {} 1795e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1796e35fdd936d133bf8a48de140a3c666897588a05shiqian static ResultType Invoke(Functor f, T arg) { return f(arg); } 1797e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1798e35fdd936d133bf8a48de140a3c666897588a05shiqian 1799e35fdd936d133bf8a48de140a3c666897588a05shiqian// Specialization for function pointers. 1800e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename ArgType, typename ResType> 1801e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct CallableTraits<ResType(*)(ArgType)> { 1802e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef ResType ResultType; 1803e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef ResType(*StorageType)(ArgType); 1804e35fdd936d133bf8a48de140a3c666897588a05shiqian 1805e35fdd936d133bf8a48de140a3c666897588a05shiqian static void CheckIsValid(ResType(*f)(ArgType)) { 1806f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan GTEST_CHECK_(f != NULL) 1807e35fdd936d133bf8a48de140a3c666897588a05shiqian << "NULL function pointer is passed into ResultOf()."; 1808e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1809e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1810e35fdd936d133bf8a48de140a3c666897588a05shiqian static ResType Invoke(ResType(*f)(ArgType), T arg) { 1811e35fdd936d133bf8a48de140a3c666897588a05shiqian return (*f)(arg); 1812e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1813e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1814e35fdd936d133bf8a48de140a3c666897588a05shiqian 1815e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the ResultOf() matcher for matching a return value of a 1816e35fdd936d133bf8a48de140a3c666897588a05shiqian// unary function of an object. 1817e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Callable> 1818e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ResultOfMatcher { 1819e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1820e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename CallableTraits<Callable>::ResultType ResultType; 1821e35fdd936d133bf8a48de140a3c666897588a05shiqian 1822e35fdd936d133bf8a48de140a3c666897588a05shiqian ResultOfMatcher(Callable callable, const Matcher<ResultType>& matcher) 1823e35fdd936d133bf8a48de140a3c666897588a05shiqian : callable_(callable), matcher_(matcher) { 1824e35fdd936d133bf8a48de140a3c666897588a05shiqian CallableTraits<Callable>::CheckIsValid(callable_); 1825e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1826e35fdd936d133bf8a48de140a3c666897588a05shiqian 1827e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1828e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 1829e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(new Impl<T>(callable_, matcher_)); 1830e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1831e35fdd936d133bf8a48de140a3c666897588a05shiqian 1832e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1833e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename CallableTraits<Callable>::StorageType CallableStorageType; 1834e35fdd936d133bf8a48de140a3c666897588a05shiqian 1835e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1836e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<T> { 1837e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1838e35fdd936d133bf8a48de140a3c666897588a05shiqian Impl(CallableStorageType callable, const Matcher<ResultType>& matcher) 1839e35fdd936d133bf8a48de140a3c666897588a05shiqian : callable_(callable), matcher_(matcher) {} 1840e35fdd936d133bf8a48de140a3c666897588a05shiqian 1841e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 1842676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is mapped by the given callable to a value that "; 1843e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1844e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1845e35fdd936d133bf8a48de140a3c666897588a05shiqian 1846e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 1847676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is mapped by the given callable to a value that "; 1848e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeNegationTo(os); 1849e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1850e35fdd936d133bf8a48de140a3c666897588a05shiqian 1851821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const { 1852676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which is mapped by the given callable to "; 1853676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // Cannot pass the return value (for example, int) to 1854676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // MatchPrintAndExplain, which takes a non-const reference as argument. 1855676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan ResultType result = 1856676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan CallableTraits<Callable>::template Invoke<T>(callable_, obj); 1857676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(result, matcher_, listener); 1858e35fdd936d133bf8a48de140a3c666897588a05shiqian } 185932de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1860e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1861e35fdd936d133bf8a48de140a3c666897588a05shiqian // Functors often define operator() as non-const method even though 1862e35fdd936d133bf8a48de140a3c666897588a05shiqian // they are actualy stateless. But we need to use them even when 1863e35fdd936d133bf8a48de140a3c666897588a05shiqian // 'this' is a const pointer. It's the user's responsibility not to 1864e35fdd936d133bf8a48de140a3c666897588a05shiqian // use stateful callables with ResultOf(), which does't guarantee 1865e35fdd936d133bf8a48de140a3c666897588a05shiqian // how many times the callable will be invoked. 1866e35fdd936d133bf8a48de140a3c666897588a05shiqian mutable CallableStorageType callable_; 1867e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<ResultType> matcher_; 186832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 186932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 1870e35fdd936d133bf8a48de140a3c666897588a05shiqian }; // class Impl 1871e35fdd936d133bf8a48de140a3c666897588a05shiqian 1872e35fdd936d133bf8a48de140a3c666897588a05shiqian const CallableStorageType callable_; 1873e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<ResultType> matcher_; 187432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 187532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ResultOfMatcher); 1876e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1877e35fdd936d133bf8a48de140a3c666897588a05shiqian 18786a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Implements an equality matcher for any STL-style container whose elements 18796a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// support ==. This matcher is like Eq(), but its failure explanations provide 18806a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// more detailed information that is useful when the container is used as a set. 18816a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// The failure message reports elements that are in one of the operands but not 18826a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// the other. The failure messages do not report duplicate or out-of-order 18836a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// elements in the containers (which don't properly matter to sets, but can 18846a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// occur if the containers are vectors or lists, for example). 18856a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// 18866a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Uses the container's const_iterator, value_type, operator ==, 18876a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// begin(), and end(). 18886a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename Container> 18896a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanclass ContainerEqMatcher { 18906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan public: 1891b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef internal::StlContainerView<Container> View; 1892b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::type StlContainer; 1893b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::const_reference StlContainerReference; 1894b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 1895b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // We make a copy of rhs in case the elements in it are modified 1896b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // after this matcher is created. 1897b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) { 1898b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Makes sure the user doesn't instantiate this class template 1899b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // with a const or reference type. 1900ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan (void)testing::StaticAssertTypeEq<Container, 1901ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>(); 1902b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 1903b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 19046a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan void DescribeTo(::std::ostream* os) const { 19056a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan *os << "equals "; 1906e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); 19076a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 19086a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan void DescribeNegationTo(::std::ostream* os) const { 19096a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan *os << "does not equal "; 1910e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); 19116a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 19126a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 1913b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan template <typename LhsContainer> 1914e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan bool MatchAndExplain(const LhsContainer& lhs, 1915e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan MatchResultListener* listener) const { 191602f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug 1917b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // that causes LhsContainer to be a const type sometimes. 191802f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)> 1919b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan LhsView; 1920b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename LhsView::type LhsStlContainer; 1921b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 1922e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (lhs_stl_container == rhs_) 1923e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan return true; 1924b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 1925e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan ::std::ostream* const os = listener->stream(); 1926e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (os != NULL) { 1927b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Something is different. Check for extra values first. 1928e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan bool printed_header = false; 1929e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan for (typename LhsStlContainer::const_iterator it = 1930e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan lhs_stl_container.begin(); 1931e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan it != lhs_stl_container.end(); ++it) { 1932e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == 1933e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan rhs_.end()) { 1934e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (printed_header) { 1935e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan *os << ", "; 1936e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } else { 1937b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "which has these unexpected elements: "; 1938e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan printed_header = true; 1939e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } 1940e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(*it, os); 19416a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 19426a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 19436a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 1944b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Now check for missing values. 1945e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan bool printed_header2 = false; 1946e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan for (typename StlContainer::const_iterator it = rhs_.begin(); 1947e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan it != rhs_.end(); ++it) { 1948e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (internal::ArrayAwareFind( 1949e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan lhs_stl_container.begin(), lhs_stl_container.end(), *it) == 1950e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan lhs_stl_container.end()) { 1951e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (printed_header2) { 1952e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan *os << ", "; 1953e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } else { 1954b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << (printed_header ? ",\nand" : "which") 1955b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan << " doesn't have these expected elements: "; 1956e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan printed_header2 = true; 1957e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } 1958e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(*it, os); 19596a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 19606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 19616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 1962e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan 1963e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan return false; 19646a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 196532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 19666a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan private: 1967b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const StlContainer rhs_; 196832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 196932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher); 19706a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}; 19716a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 1972ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher 1973ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// must be able to be safely cast to Matcher<tuple<const T1&, const 1974ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// T2&> >, where T1 and T2 are the types of elements in the LHS 1975ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// container and the RHS container respectively. 1976ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wantemplate <typename TupleMatcher, typename RhsContainer> 1977ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanclass PointwiseMatcher { 1978ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan public: 1979ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef internal::StlContainerView<RhsContainer> RhsView; 1980ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename RhsView::type RhsStlContainer; 1981ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename RhsStlContainer::value_type RhsValue; 1982ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 1983ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // Like ContainerEq, we make a copy of rhs in case the elements in 1984ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // it are modified after this matcher is created. 1985ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs) 1986ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) { 1987ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // Makes sure the user doesn't instantiate this class template 1988ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // with a const or reference type. 1989ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan (void)testing::StaticAssertTypeEq<RhsContainer, 1990ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>(); 1991ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 1992ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 1993ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename LhsContainer> 1994ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan operator Matcher<LhsContainer>() const { 1995ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_)); 1996ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 1997ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 1998ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename LhsContainer> 1999ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan class Impl : public MatcherInterface<LhsContainer> { 2000ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan public: 2001ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef internal::StlContainerView< 2002ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView; 2003ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename LhsView::type LhsStlContainer; 2004ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename LhsView::const_reference LhsStlContainerReference; 2005ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename LhsStlContainer::value_type LhsValue; 2006ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // We pass the LHS value and the RHS value to the inner matcher by 2007ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // reference, as they may be expensive to copy. We must use tuple 2008ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // instead of pair here, as a pair cannot hold references (C++ 98, 2009ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // 20.2.2 [lib.pairs]). 2010ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef std::tr1::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg; 2011ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2012ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs) 2013ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher. 2014ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)), 2015ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs_(rhs) {} 2016ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2017ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2018ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "contains " << rhs_.size() 2019ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan << " values, where each value and its corresponding value in "; 2020ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrinter<RhsStlContainer>::Print(rhs_, os); 2021ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << " "; 2022ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan mono_tuple_matcher_.DescribeTo(os); 2023ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2024ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2025ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "doesn't contain exactly " << rhs_.size() 2026ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan << " values, or contains a value x at some index i" 2027ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan << " where x and the i-th value of "; 2028ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrint(rhs_, os); 2029ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << " "; 2030ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan mono_tuple_matcher_.DescribeNegationTo(os); 2031ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2032ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2033ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual bool MatchAndExplain(LhsContainer lhs, 2034ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan MatchResultListener* listener) const { 2035ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 2036ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const size_t actual_size = lhs_stl_container.size(); 2037ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (actual_size != rhs_.size()) { 2038ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << "which contains " << actual_size << " values"; 2039ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return false; 2040ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2041ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2042ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typename LhsStlContainer::const_iterator left = lhs_stl_container.begin(); 2043ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typename RhsStlContainer::const_iterator right = rhs_.begin(); 2044ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan for (size_t i = 0; i != actual_size; ++i, ++left, ++right) { 2045ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const InnerMatcherArg value_pair(*left, *right); 2046ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2047ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (listener->IsInterested()) { 2048ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan StringMatchResultListener inner_listener; 2049ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (!mono_tuple_matcher_.MatchAndExplain( 2050ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan value_pair, &inner_listener)) { 2051ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << "where the value pair ("; 2052ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrint(*left, listener->stream()); 2053ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << ", "; 2054ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrint(*right, listener->stream()); 2055ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << ") at index #" << i << " don't match"; 2056ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan PrintIfNotEmpty(inner_listener.str(), listener->stream()); 2057ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return false; 2058ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2059ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } else { 2060ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (!mono_tuple_matcher_.Matches(value_pair)) 2061ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return false; 2062ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2063ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2064ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2065ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return true; 2066ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2067ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2068ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan private: 2069ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<InnerMatcherArg> mono_tuple_matcher_; 2070ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const RhsStlContainer rhs_; 2071ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2072ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 2073ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan }; 2074ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2075ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan private: 2076ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const TupleMatcher tuple_matcher_; 2077ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const RhsStlContainer rhs_; 2078ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2079ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_DISALLOW_ASSIGN_(PointwiseMatcher); 2080ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}; 2081ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 208233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl. 2083b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename Container> 208433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass QuantifierMatcherImpl : public MatcherInterface<Container> { 2085b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan public: 2086ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 2087b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef StlContainerView<RawContainer> View; 2088b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::type StlContainer; 2089b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::const_reference StlContainerReference; 2090b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename StlContainer::value_type Element; 2091b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2092b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan template <typename InnerMatcher> 209333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit QuantifierMatcherImpl(InnerMatcher inner_matcher) 2094b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan : inner_matcher_( 209533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan testing::SafeMatcherCast<const Element&>(inner_matcher)) {} 209633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 209733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // Checks whether: 209833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // * All elements in the container match, if all_elements_should_match. 209933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // * Any element in the container matches, if !all_elements_should_match. 210033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan bool MatchAndExplainImpl(bool all_elements_should_match, 210133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan Container container, 210233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan MatchResultListener* listener) const { 210333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan StlContainerReference stl_container = View::ConstReference(container); 210433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan size_t i = 0; 210533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan for (typename StlContainer::const_iterator it = stl_container.begin(); 210633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan it != stl_container.end(); ++it, ++i) { 210733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan StringMatchResultListener inner_listener; 210833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener); 210933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 211033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan if (matches != all_elements_should_match) { 211133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan *listener << "whose element #" << i 211233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan << (matches ? " matches" : " doesn't match"); 211333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan PrintIfNotEmpty(inner_listener.str(), listener->stream()); 211433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return !all_elements_should_match; 211533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 211633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 211733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return all_elements_should_match; 211833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 211933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 212033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan protected: 212133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const Matcher<const Element&> inner_matcher_; 212233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 212333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl); 212433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}; 212533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 212633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Implements Contains(element_matcher) for the given argument type Container. 212733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Symmetric to EachMatcherImpl. 212833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename Container> 212933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass ContainsMatcherImpl : public QuantifierMatcherImpl<Container> { 213033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan public: 213133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan template <typename InnerMatcher> 213233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit ContainsMatcherImpl(InnerMatcher inner_matcher) 213333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan : QuantifierMatcherImpl<Container>(inner_matcher) {} 2134b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2135b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Describes what this matcher does. 2136b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2137b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan *os << "contains at least one element that "; 213833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeTo(os); 2139b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2140b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2141b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2142b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan *os << "doesn't contain any element that "; 214333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeTo(os); 2144b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2145b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2146821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(Container container, 2147821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 214833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return this->MatchAndExplainImpl(false, container, listener); 2149b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2150b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2151b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan private: 215232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl); 2153b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}; 2154b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 215533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Implements Each(element_matcher) for the given argument type Container. 215633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Symmetric to ContainsMatcherImpl. 215733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename Container> 215833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass EachMatcherImpl : public QuantifierMatcherImpl<Container> { 215933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan public: 216033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan template <typename InnerMatcher> 216133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit EachMatcherImpl(InnerMatcher inner_matcher) 216233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan : QuantifierMatcherImpl<Container>(inner_matcher) {} 216333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 216433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // Describes what this matcher does. 216533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 216633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan *os << "only contains elements that "; 216733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeTo(os); 216833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 216933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 217033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 217133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan *os << "contains some element that "; 217233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeNegationTo(os); 217333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 217433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 217533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan virtual bool MatchAndExplain(Container container, 217633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan MatchResultListener* listener) const { 217733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return this->MatchAndExplainImpl(true, container, listener); 217833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 217933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 218033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan private: 218133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan GTEST_DISALLOW_ASSIGN_(EachMatcherImpl); 218233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}; 218333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 2184b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Implements polymorphic Contains(element_matcher). 2185b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename M> 2186b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanclass ContainsMatcher { 2187b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan public: 2188b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan explicit ContainsMatcher(M m) : inner_matcher_(m) {} 2189b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2190b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan template <typename Container> 2191b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan operator Matcher<Container>() const { 2192b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_)); 2193b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2194b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2195b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan private: 2196b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const M inner_matcher_; 219732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 219832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ContainsMatcher); 2199b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}; 2200b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 220133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Implements polymorphic Each(element_matcher). 220233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename M> 220333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass EachMatcher { 220433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan public: 220533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit EachMatcher(M m) : inner_matcher_(m) {} 220633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 220733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan template <typename Container> 220833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan operator Matcher<Container>() const { 220933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_)); 221033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 221133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 221233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan private: 221333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const M inner_matcher_; 221433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 221533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan GTEST_DISALLOW_ASSIGN_(EachMatcher); 221633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}; 221733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 2218b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Implements Key(inner_matcher) for the given argument pair type. 2219b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Key(inner_matcher) matches an std::pair whose 'first' field matches 2220b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 2221b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// std::map that contains at least one element whose key is >= 5. 2222b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wantemplate <typename PairType> 2223b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanclass KeyMatcherImpl : public MatcherInterface<PairType> { 2224b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan public: 2225ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType; 2226b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan typedef typename RawPairType::first_type KeyType; 2227b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2228b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan template <typename InnerMatcher> 2229b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan explicit KeyMatcherImpl(InnerMatcher inner_matcher) 2230b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan : inner_matcher_( 2231b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan testing::SafeMatcherCast<const KeyType&>(inner_matcher)) { 2232b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2233b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2234b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan // Returns true iff 'key_value.first' (the key) matches the inner matcher. 2235821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(PairType key_value, 2236821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 2237b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan StringMatchResultListener inner_listener; 2238b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const bool match = inner_matcher_.MatchAndExplain(key_value.first, 2239b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan &inner_listener); 2240b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const internal::string explanation = inner_listener.str(); 2241b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan if (explanation != "") { 2242b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "whose first field is a value " << explanation; 2243b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan } 2244b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan return match; 2245b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2246b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2247b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan // Describes what this matcher does. 2248b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2249b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan *os << "has a key that "; 2250b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan inner_matcher_.DescribeTo(os); 2251b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2252b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2253b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan // Describes what the negation of this matcher does. 2254b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2255b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan *os << "doesn't have a key that "; 2256b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan inner_matcher_.DescribeTo(os); 2257b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2258b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2259b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan private: 2260b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan const Matcher<const KeyType&> inner_matcher_; 226132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 226232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl); 2263b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}; 2264b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2265b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Implements polymorphic Key(matcher_for_key). 2266b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wantemplate <typename M> 2267b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanclass KeyMatcher { 2268b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan public: 2269b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan explicit KeyMatcher(M m) : matcher_for_key_(m) {} 2270b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2271b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan template <typename PairType> 2272b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan operator Matcher<PairType>() const { 2273b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_)); 2274b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2275b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2276b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan private: 2277b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan const M matcher_for_key_; 227832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 227932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(KeyMatcher); 2280b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}; 2281b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2282f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// Implements Pair(first_matcher, second_matcher) for the given argument pair 2283f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// type with its two matchers. See Pair() function below. 2284f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wantemplate <typename PairType> 2285f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass PairMatcherImpl : public MatcherInterface<PairType> { 2286f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public: 2287ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType; 2288f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan typedef typename RawPairType::first_type FirstType; 2289f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan typedef typename RawPairType::second_type SecondType; 2290f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2291f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan template <typename FirstMatcher, typename SecondMatcher> 2292f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher) 2293f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan : first_matcher_( 2294f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan testing::SafeMatcherCast<const FirstType&>(first_matcher)), 2295f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan second_matcher_( 2296f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan testing::SafeMatcherCast<const SecondType&>(second_matcher)) { 2297f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2298f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2299f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Describes what this matcher does. 2300f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2301f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "has a first field that "; 2302f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher_.DescribeTo(os); 2303f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << ", and has a second field that "; 2304f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan second_matcher_.DescribeTo(os); 2305f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2306f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2307f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Describes what the negation of this matcher does. 2308f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2309f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "has a first field that "; 2310f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher_.DescribeNegationTo(os); 2311f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << ", or has a second field that "; 2312f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan second_matcher_.DescribeNegationTo(os); 2313f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2314f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2315821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second' 2316821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // matches second_matcher. 2317821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(PairType a_pair, 2318821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 2319676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!listener->IsInterested()) { 2320676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // If the listener is not interested, we don't need to construct the 2321676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // explanation. 2322676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return first_matcher_.Matches(a_pair.first) && 2323676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan second_matcher_.Matches(a_pair.second); 2324821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 2325676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan StringMatchResultListener first_inner_listener; 2326676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!first_matcher_.MatchAndExplain(a_pair.first, 2327676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan &first_inner_listener)) { 2328676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose first field does not match"; 2329b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(first_inner_listener.str(), listener->stream()); 2330821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2331f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2332676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan StringMatchResultListener second_inner_listener; 2333676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!second_matcher_.MatchAndExplain(a_pair.second, 2334676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan &second_inner_listener)) { 2335676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose second field does not match"; 2336b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(second_inner_listener.str(), listener->stream()); 2337821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2338f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2339676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(), 2340676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan listener); 2341821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 2342f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2343f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2344f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private: 2345676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan void ExplainSuccess(const internal::string& first_explanation, 2346676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan const internal::string& second_explanation, 2347676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan MatchResultListener* listener) const { 2348676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose both fields match"; 2349676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (first_explanation != "") { 2350676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << ", where the first field is a value " << first_explanation; 2351676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2352676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (second_explanation != "") { 2353676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << ", "; 2354676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (first_explanation != "") { 2355676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "and "; 2356676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } else { 2357676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "where "; 2358676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2359676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "the second field is a value " << second_explanation; 2360676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2361676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2362676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 2363f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<const FirstType&> first_matcher_; 2364f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<const SecondType&> second_matcher_; 236532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 236632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PairMatcherImpl); 2367f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}; 2368f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2369f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// Implements polymorphic Pair(first_matcher, second_matcher). 2370f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wantemplate <typename FirstMatcher, typename SecondMatcher> 2371f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass PairMatcher { 2372f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public: 2373f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher) 2374f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan : first_matcher_(first_matcher), second_matcher_(second_matcher) {} 2375f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2376f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan template <typename PairType> 2377f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan operator Matcher<PairType> () const { 2378f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan return MakeMatcher( 2379f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan new PairMatcherImpl<PairType>( 2380f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher_, second_matcher_)); 2381f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2382f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2383f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private: 2384f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const FirstMatcher first_matcher_; 2385f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const SecondMatcher second_matcher_; 238632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 238732de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PairMatcher); 2388f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}; 2389f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 23901afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan// Implements ElementsAre() and ElementsAreArray(). 23911afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wantemplate <typename Container> 23921afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wanclass ElementsAreMatcherImpl : public MatcherInterface<Container> { 23931afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan public: 2394ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 23951afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef internal::StlContainerView<RawContainer> View; 23961afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename View::type StlContainer; 23971afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename View::const_reference StlContainerReference; 23981afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename StlContainer::value_type Element; 23991afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 24001afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // Constructs the matcher from a sequence of element values or 24011afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // element matchers. 24021afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan template <typename InputIter> 240332de5f53763125925e078498250f7e73a88de9edzhanyong.wan ElementsAreMatcherImpl(InputIter first, size_t a_count) { 240432de5f53763125925e078498250f7e73a88de9edzhanyong.wan matchers_.reserve(a_count); 24051afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan InputIter it = first; 240632de5f53763125925e078498250f7e73a88de9edzhanyong.wan for (size_t i = 0; i != a_count; ++i, ++it) { 24071afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan matchers_.push_back(MatcherCast<const Element&>(*it)); 24081afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24091afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24101afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 24111afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // Describes what this matcher does. 24121afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 24131afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (count() == 0) { 24141afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << "is empty"; 24151afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } else if (count() == 1) { 24161afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << "has 1 element that "; 24171afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan matchers_[0].DescribeTo(os); 24181afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } else { 24191afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << "has " << Elements(count()) << " where\n"; 24201afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan for (size_t i = 0; i != count(); ++i) { 2421b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "element #" << i << " "; 24221afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan matchers_[i].DescribeTo(os); 24231afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (i + 1 < count()) { 24241afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << ",\n"; 24251afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24261afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24271afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24281afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24291afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 24301afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // Describes what the negation of this matcher does. 24311afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 24321afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (count() == 0) { 2433b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't empty"; 24341afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan return; 24351afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24361afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2437b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "doesn't have " << Elements(count()) << ", or\n"; 24381afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan for (size_t i = 0; i != count(); ++i) { 2439b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "element #" << i << " "; 24401afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan matchers_[i].DescribeNegationTo(os); 24411afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (i + 1 < count()) { 24421afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << ", or\n"; 24431afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24441afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24451afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24461afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2447821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(Container container, 2448821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 24491afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan StlContainerReference stl_container = View::ConstReference(container); 2450821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const size_t actual_count = stl_container.size(); 2451821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (actual_count != count()) { 2452821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // The element count doesn't match. If the container is empty, 2453821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // there's no need to explain anything as Google Mock already 2454821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // prints the empty container. Otherwise we just need to show 2455821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // how many elements there actually are. 2456821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (actual_count != 0) { 2457b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "which has " << Elements(actual_count); 24581afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 2459821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2460821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 24611afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2462821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan typename StlContainer::const_iterator it = stl_container.begin(); 2463821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // explanations[i] is the explanation of the element at index i. 2464821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan std::vector<internal::string> explanations(count()); 2465821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan for (size_t i = 0; i != count(); ++it, ++i) { 2466821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener s; 2467821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (matchers_[i].MatchAndExplain(*it, &s)) { 2468821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan explanations[i] = s.str(); 2469821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } else { 2470821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // The container has the right size but the i-th element 2471821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // doesn't match its expectation. 2472b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "whose element #" << i << " doesn't match"; 2473b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(s.str(), listener->stream()); 2474821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2475821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 2476821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 24771afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2478821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Every element matches its expectation. We need to explain why 2479821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // (the obvious ones can be skipped). 2480821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan bool reason_printed = false; 2481821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan for (size_t i = 0; i != count(); ++i) { 2482821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string& s = explanations[i]; 2483821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!s.empty()) { 2484821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (reason_printed) { 2485b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << ",\nand "; 24861afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 2487b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "whose element #" << i << " matches, " << s; 2488821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan reason_printed = true; 24891afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24901afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 2491821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 2492821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 24931afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24941afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 24951afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan private: 24961afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan static Message Elements(size_t count) { 24971afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan return Message() << count << (count == 1 ? " element" : " elements"); 24981afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 24991afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25001afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan size_t count() const { return matchers_.size(); } 25011afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan std::vector<Matcher<const Element&> > matchers_; 250232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 250332de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl); 25041afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan}; 25051afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25061afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan// Implements ElementsAre() of 0 arguments. 25071afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wanclass ElementsAreMatcher0 { 25081afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan public: 25091afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan ElementsAreMatcher0() {} 25101afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25111afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan template <typename Container> 25121afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan operator Matcher<Container>() const { 2513ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 25141afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename internal::StlContainerView<RawContainer>::type::value_type 25151afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan Element; 25161afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25171afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan const Matcher<const Element&>* const matchers = NULL; 25181afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 0)); 25191afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 25201afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan}; 25211afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25221afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan// Implements ElementsAreArray(). 25231afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wantemplate <typename T> 25241afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wanclass ElementsAreArrayMatcher { 25251afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan public: 25261afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan ElementsAreArrayMatcher(const T* first, size_t count) : 25271afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan first_(first), count_(count) {} 25281afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25291afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan template <typename Container> 25301afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan operator Matcher<Container>() const { 2531ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 25321afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename internal::StlContainerView<RawContainer>::type::value_type 25331afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan Element; 25341afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25351afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan return MakeMatcher(new ElementsAreMatcherImpl<Container>(first_, count_)); 25361afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 25371afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 25381afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan private: 25391afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan const T* const first_; 25401afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan const size_t count_; 254132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 254232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher); 25431afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan}; 25441afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2545b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// Returns the description for a matcher defined using the MATCHER*() 2546b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// macro where the user-supplied description string is "", if 2547b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// 'negation' is false; otherwise returns the description of the 2548b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// negation of the matcher. 'param_values' contains a list of strings 2549b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// that are the print-out of the matcher's parameters. 2550b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wanstring FormatMatcherDescription(bool negation, const char* matcher_name, 2551b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan const Strings& param_values); 25521afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2553e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace internal 2554e35fdd936d133bf8a48de140a3c666897588a05shiqian 2555e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements MatcherCast(). 2556e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T, typename M> 2557e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<T> MatcherCast(M matcher) { 2558e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::MatcherCastImpl<T, M>::Cast(matcher); 2559e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2560e35fdd936d133bf8a48de140a3c666897588a05shiqian 2561e35fdd936d133bf8a48de140a3c666897588a05shiqian// _ is a matcher that matches anything of any type. 2562e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2563e35fdd936d133bf8a48de140a3c666897588a05shiqian// This definition is fine as: 2564e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2565e35fdd936d133bf8a48de140a3c666897588a05shiqian// 1. The C++ standard permits using the name _ in a namespace that 2566e35fdd936d133bf8a48de140a3c666897588a05shiqian// is not the global namespace or ::std. 2567e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2. The AnythingMatcher class has no data member or constructor, 2568e35fdd936d133bf8a48de140a3c666897588a05shiqian// so it's OK to create global variables of this type. 2569e35fdd936d133bf8a48de140a3c666897588a05shiqian// 3. c-style has approved of using _ in this case. 2570e35fdd936d133bf8a48de140a3c666897588a05shiqianconst internal::AnythingMatcher _ = {}; 2571e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any value of the given type T. 2572e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2573e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); } 2574e35fdd936d133bf8a48de140a3c666897588a05shiqian 2575e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any value of the given type T. 2576e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2577e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<T> An() { return A<T>(); } 2578e35fdd936d133bf8a48de140a3c666897588a05shiqian 2579e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything equal to x. 2580e35fdd936d133bf8a48de140a3c666897588a05shiqian// Note: if the parameter of Eq() were declared as const T&, Eq("foo") 2581e35fdd936d133bf8a48de140a3c666897588a05shiqian// wouldn't compile. 2582e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2583e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); } 2584e35fdd936d133bf8a48de140a3c666897588a05shiqian 2585e35fdd936d133bf8a48de140a3c666897588a05shiqian// Constructs a Matcher<T> from a 'value' of type T. The constructed 2586e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher matches any value that's equal to 'value'. 2587e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2588e35fdd936d133bf8a48de140a3c666897588a05shiqianMatcher<T>::Matcher(T value) { *this = Eq(value); } 2589e35fdd936d133bf8a48de140a3c666897588a05shiqian 2590e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a monomorphic matcher that matches anything with type Lhs 2591e35fdd936d133bf8a48de140a3c666897588a05shiqian// and equal to rhs. A user may need to use this instead of Eq(...) 2592e35fdd936d133bf8a48de140a3c666897588a05shiqian// in order to resolve an overloading ambiguity. 2593e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2594e35fdd936d133bf8a48de140a3c666897588a05shiqian// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x)) 2595e35fdd936d133bf8a48de140a3c666897588a05shiqian// or Matcher<T>(x), but more readable than the latter. 2596e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2597e35fdd936d133bf8a48de140a3c666897588a05shiqian// We could define similar monomorphic matchers for other comparison 2598e35fdd936d133bf8a48de140a3c666897588a05shiqian// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do 2599e35fdd936d133bf8a48de140a3c666897588a05shiqian// it yet as those are used much less than Eq() in practice. A user 2600e35fdd936d133bf8a48de140a3c666897588a05shiqian// can always write Matcher<T>(Lt(5)) to be explicit about the type, 2601e35fdd936d133bf8a48de140a3c666897588a05shiqian// for example. 2602e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Lhs, typename Rhs> 2603e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); } 2604e35fdd936d133bf8a48de140a3c666897588a05shiqian 2605e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything >= x. 2606e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2607e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::GeMatcher<Rhs> Ge(Rhs x) { 2608e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::GeMatcher<Rhs>(x); 2609e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2610e35fdd936d133bf8a48de140a3c666897588a05shiqian 2611e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything > x. 2612e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2613e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::GtMatcher<Rhs> Gt(Rhs x) { 2614e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::GtMatcher<Rhs>(x); 2615e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2616e35fdd936d133bf8a48de140a3c666897588a05shiqian 2617e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything <= x. 2618e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2619e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::LeMatcher<Rhs> Le(Rhs x) { 2620e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::LeMatcher<Rhs>(x); 2621e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2622e35fdd936d133bf8a48de140a3c666897588a05shiqian 2623e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything < x. 2624e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2625e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::LtMatcher<Rhs> Lt(Rhs x) { 2626e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::LtMatcher<Rhs>(x); 2627e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2628e35fdd936d133bf8a48de140a3c666897588a05shiqian 2629e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything != x. 2630e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2631e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::NeMatcher<Rhs> Ne(Rhs x) { 2632e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::NeMatcher<Rhs>(x); 2633e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2634e35fdd936d133bf8a48de140a3c666897588a05shiqian 26352d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Creates a polymorphic matcher that matches any NULL pointer. 26362d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.waninline PolymorphicMatcher<internal::IsNullMatcher > IsNull() { 26372d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan return MakePolymorphicMatcher(internal::IsNullMatcher()); 26382d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan} 26392d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 2640e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches any non-NULL pointer. 2641e35fdd936d133bf8a48de140a3c666897588a05shiqian// This is convenient as Not(NULL) doesn't compile (the compiler 2642e35fdd936d133bf8a48de140a3c666897588a05shiqian// thinks that that expression is comparing a pointer with an integer). 2643e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::NotNullMatcher > NotNull() { 2644e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::NotNullMatcher()); 2645e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2646e35fdd936d133bf8a48de140a3c666897588a05shiqian 2647e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches any argument that 2648e35fdd936d133bf8a48de140a3c666897588a05shiqian// references variable x. 2649e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2650e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::RefMatcher<T&> Ref(T& x) { // NOLINT 2651e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::RefMatcher<T&>(x); 2652e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2653e35fdd936d133bf8a48de140a3c666897588a05shiqian 2654e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any double argument approximately 2655e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, where two NANs are considered unequal. 2656e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<double> DoubleEq(double rhs) { 2657e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<double>(rhs, false); 2658e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2659e35fdd936d133bf8a48de140a3c666897588a05shiqian 2660e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any double argument approximately 2661e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, including NaN values when rhs is NaN. 2662e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) { 2663e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<double>(rhs, true); 2664e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2665e35fdd936d133bf8a48de140a3c666897588a05shiqian 2666e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any float argument approximately 2667e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, where two NANs are considered unequal. 2668e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<float> FloatEq(float rhs) { 2669e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<float>(rhs, false); 2670e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2671e35fdd936d133bf8a48de140a3c666897588a05shiqian 2672e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any double argument approximately 2673e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, including NaN values when rhs is NaN. 2674e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) { 2675e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<float>(rhs, true); 2676e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2677e35fdd936d133bf8a48de140a3c666897588a05shiqian 2678e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches a pointer (raw or smart) that points 2679e35fdd936d133bf8a48de140a3c666897588a05shiqian// to a value that matches inner_matcher. 2680e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 2681e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::PointeeMatcher<InnerMatcher> Pointee( 2682e35fdd936d133bf8a48de140a3c666897588a05shiqian const InnerMatcher& inner_matcher) { 2683e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::PointeeMatcher<InnerMatcher>(inner_matcher); 2684e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2685e35fdd936d133bf8a48de140a3c666897588a05shiqian 2686e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches an object whose given field matches 2687e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'matcher'. For example, 2688e35fdd936d133bf8a48de140a3c666897588a05shiqian// Field(&Foo::number, Ge(5)) 2689e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a Foo object x iff x.number >= 5. 2690e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename FieldType, typename FieldMatcher> 2691e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher< 2692e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::FieldMatcher<Class, FieldType> > Field( 2693e35fdd936d133bf8a48de140a3c666897588a05shiqian FieldType Class::*field, const FieldMatcher& matcher) { 2694e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher( 2695e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::FieldMatcher<Class, FieldType>( 2696e35fdd936d133bf8a48de140a3c666897588a05shiqian field, MatcherCast<const FieldType&>(matcher))); 2697e35fdd936d133bf8a48de140a3c666897588a05shiqian // The call to MatcherCast() is required for supporting inner 2698e35fdd936d133bf8a48de140a3c666897588a05shiqian // matchers of compatible types. For example, it allows 2699e35fdd936d133bf8a48de140a3c666897588a05shiqian // Field(&Foo::bar, m) 2700e35fdd936d133bf8a48de140a3c666897588a05shiqian // to compile where bar is an int32 and m is a matcher for int64. 2701e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2702e35fdd936d133bf8a48de140a3c666897588a05shiqian 2703e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches an object whose given property 2704e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches 'matcher'. For example, 2705e35fdd936d133bf8a48de140a3c666897588a05shiqian// Property(&Foo::str, StartsWith("hi")) 2706e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a Foo object x iff x.str() starts with "hi". 2707e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename PropertyType, typename PropertyMatcher> 2708e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher< 2709e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::PropertyMatcher<Class, PropertyType> > Property( 2710e35fdd936d133bf8a48de140a3c666897588a05shiqian PropertyType (Class::*property)() const, const PropertyMatcher& matcher) { 2711e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher( 2712e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::PropertyMatcher<Class, PropertyType>( 2713e35fdd936d133bf8a48de140a3c666897588a05shiqian property, 271402f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); 2715e35fdd936d133bf8a48de140a3c666897588a05shiqian // The call to MatcherCast() is required for supporting inner 2716e35fdd936d133bf8a48de140a3c666897588a05shiqian // matchers of compatible types. For example, it allows 2717e35fdd936d133bf8a48de140a3c666897588a05shiqian // Property(&Foo::bar, m) 2718e35fdd936d133bf8a48de140a3c666897588a05shiqian // to compile where bar() returns an int32 and m is a matcher for int64. 2719e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2720e35fdd936d133bf8a48de140a3c666897588a05shiqian 2721e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches an object iff the result of applying 2722e35fdd936d133bf8a48de140a3c666897588a05shiqian// a callable to x matches 'matcher'. 2723e35fdd936d133bf8a48de140a3c666897588a05shiqian// For example, 2724e35fdd936d133bf8a48de140a3c666897588a05shiqian// ResultOf(f, StartsWith("hi")) 2725e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a Foo object x iff f(x) starts with "hi". 2726e35fdd936d133bf8a48de140a3c666897588a05shiqian// callable parameter can be a function, function pointer, or a functor. 2727e35fdd936d133bf8a48de140a3c666897588a05shiqian// Callable has to satisfy the following conditions: 2728e35fdd936d133bf8a48de140a3c666897588a05shiqian// * It is required to keep no state affecting the results of 2729e35fdd936d133bf8a48de140a3c666897588a05shiqian// the calls on it and make no assumptions about how many calls 2730e35fdd936d133bf8a48de140a3c666897588a05shiqian// will be made. Any state it keeps must be protected from the 2731e35fdd936d133bf8a48de140a3c666897588a05shiqian// concurrent access. 2732e35fdd936d133bf8a48de140a3c666897588a05shiqian// * If it is a function object, it has to define type result_type. 2733e35fdd936d133bf8a48de140a3c666897588a05shiqian// We recommend deriving your functor classes from std::unary_function. 2734e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Callable, typename ResultOfMatcher> 2735e35fdd936d133bf8a48de140a3c666897588a05shiqianinternal::ResultOfMatcher<Callable> ResultOf( 2736e35fdd936d133bf8a48de140a3c666897588a05shiqian Callable callable, const ResultOfMatcher& matcher) { 2737e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::ResultOfMatcher<Callable>( 2738e35fdd936d133bf8a48de140a3c666897588a05shiqian callable, 2739e35fdd936d133bf8a48de140a3c666897588a05shiqian MatcherCast<typename internal::CallableTraits<Callable>::ResultType>( 2740e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher)); 2741e35fdd936d133bf8a48de140a3c666897588a05shiqian // The call to MatcherCast() is required for supporting inner 2742e35fdd936d133bf8a48de140a3c666897588a05shiqian // matchers of compatible types. For example, it allows 2743e35fdd936d133bf8a48de140a3c666897588a05shiqian // ResultOf(Function, m) 2744e35fdd936d133bf8a48de140a3c666897588a05shiqian // to compile where Function() returns an int32 and m is a matcher for int64. 2745e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2746e35fdd936d133bf8a48de140a3c666897588a05shiqian 2747e35fdd936d133bf8a48de140a3c666897588a05shiqian// String matchers. 2748e35fdd936d133bf8a48de140a3c666897588a05shiqian 2749e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str. 2750e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2751e35fdd936d133bf8a48de140a3c666897588a05shiqian StrEq(const internal::string& str) { 2752e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2753e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, true)); 2754e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2755e35fdd936d133bf8a48de140a3c666897588a05shiqian 2756e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str. 2757e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2758e35fdd936d133bf8a48de140a3c666897588a05shiqian StrNe(const internal::string& str) { 2759e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2760e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, true)); 2761e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2762e35fdd936d133bf8a48de140a3c666897588a05shiqian 2763e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str, ignoring case. 2764e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2765e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseEq(const internal::string& str) { 2766e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2767e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, false)); 2768e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2769e35fdd936d133bf8a48de140a3c666897588a05shiqian 2770e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str, ignoring case. 2771e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2772e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseNe(const internal::string& str) { 2773e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2774e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, false)); 2775e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2776e35fdd936d133bf8a48de140a3c666897588a05shiqian 2777e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any string, std::string, or C string 2778e35fdd936d133bf8a48de140a3c666897588a05shiqian// that contains the given substring. 2779e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::HasSubstrMatcher<internal::string> > 2780e35fdd936d133bf8a48de140a3c666897588a05shiqian HasSubstr(const internal::string& substring) { 2781e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::string>( 2782e35fdd936d133bf8a48de140a3c666897588a05shiqian substring)); 2783e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2784e35fdd936d133bf8a48de140a3c666897588a05shiqian 2785e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that starts with 'prefix' (case-sensitive). 2786e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StartsWithMatcher<internal::string> > 2787e35fdd936d133bf8a48de140a3c666897588a05shiqian StartsWith(const internal::string& prefix) { 2788e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::string>( 2789e35fdd936d133bf8a48de140a3c666897588a05shiqian prefix)); 2790e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2791e35fdd936d133bf8a48de140a3c666897588a05shiqian 2792e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that ends with 'suffix' (case-sensitive). 2793e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> > 2794e35fdd936d133bf8a48de140a3c666897588a05shiqian EndsWith(const internal::string& suffix) { 2795e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>( 2796e35fdd936d133bf8a48de140a3c666897588a05shiqian suffix)); 2797e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2798e35fdd936d133bf8a48de140a3c666897588a05shiqian 2799e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that fully matches regular expression 'regex'. 2800e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher takes ownership of 'regex'. 2801e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 2802e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::RE* regex) { 2803e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); 2804e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2805e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 2806e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::string& regex) { 2807e35fdd936d133bf8a48de140a3c666897588a05shiqian return MatchesRegex(new internal::RE(regex)); 2808e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2809e35fdd936d133bf8a48de140a3c666897588a05shiqian 2810e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that contains regular expression 'regex'. 2811e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher takes ownership of 'regex'. 2812e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 2813e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::RE* regex) { 2814e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); 2815e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2816e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 2817e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::string& regex) { 2818e35fdd936d133bf8a48de140a3c666897588a05shiqian return ContainsRegex(new internal::RE(regex)); 2819e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2820e35fdd936d133bf8a48de140a3c666897588a05shiqian 2821e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 2822e35fdd936d133bf8a48de140a3c666897588a05shiqian// Wide string matchers. 2823e35fdd936d133bf8a48de140a3c666897588a05shiqian 2824e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str. 2825e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2826e35fdd936d133bf8a48de140a3c666897588a05shiqian StrEq(const internal::wstring& str) { 2827e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2828e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, true)); 2829e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2830e35fdd936d133bf8a48de140a3c666897588a05shiqian 2831e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str. 2832e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2833e35fdd936d133bf8a48de140a3c666897588a05shiqian StrNe(const internal::wstring& str) { 2834e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2835e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, true)); 2836e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2837e35fdd936d133bf8a48de140a3c666897588a05shiqian 2838e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str, ignoring case. 2839e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2840e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseEq(const internal::wstring& str) { 2841e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2842e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, false)); 2843e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2844e35fdd936d133bf8a48de140a3c666897588a05shiqian 2845e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str, ignoring case. 2846e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2847e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseNe(const internal::wstring& str) { 2848e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2849e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, false)); 2850e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2851e35fdd936d133bf8a48de140a3c666897588a05shiqian 2852e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any wstring, std::wstring, or C wide string 2853e35fdd936d133bf8a48de140a3c666897588a05shiqian// that contains the given substring. 2854e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> > 2855e35fdd936d133bf8a48de140a3c666897588a05shiqian HasSubstr(const internal::wstring& substring) { 2856e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>( 2857e35fdd936d133bf8a48de140a3c666897588a05shiqian substring)); 2858e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2859e35fdd936d133bf8a48de140a3c666897588a05shiqian 2860e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that starts with 'prefix' (case-sensitive). 2861e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> > 2862e35fdd936d133bf8a48de140a3c666897588a05shiqian StartsWith(const internal::wstring& prefix) { 2863e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>( 2864e35fdd936d133bf8a48de140a3c666897588a05shiqian prefix)); 2865e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2866e35fdd936d133bf8a48de140a3c666897588a05shiqian 2867e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that ends with 'suffix' (case-sensitive). 2868e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> > 2869e35fdd936d133bf8a48de140a3c666897588a05shiqian EndsWith(const internal::wstring& suffix) { 2870e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>( 2871e35fdd936d133bf8a48de140a3c666897588a05shiqian suffix)); 2872e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2873e35fdd936d133bf8a48de140a3c666897588a05shiqian 2874e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 2875e35fdd936d133bf8a48de140a3c666897588a05shiqian 2876e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 2877e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field == the second field. 2878e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); } 2879e35fdd936d133bf8a48de140a3c666897588a05shiqian 2880e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 2881e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field >= the second field. 2882e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); } 2883e35fdd936d133bf8a48de140a3c666897588a05shiqian 2884e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 2885e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field > the second field. 2886e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); } 2887e35fdd936d133bf8a48de140a3c666897588a05shiqian 2888e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 2889e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field <= the second field. 2890e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Le2Matcher Le() { return internal::Le2Matcher(); } 2891e35fdd936d133bf8a48de140a3c666897588a05shiqian 2892e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 2893e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field < the second field. 2894e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); } 2895e35fdd936d133bf8a48de140a3c666897588a05shiqian 2896e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 2897e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field != the second field. 2898e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); } 2899e35fdd936d133bf8a48de140a3c666897588a05shiqian 2900e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any value of type T that m doesn't 2901e35fdd936d133bf8a48de140a3c666897588a05shiqian// match. 2902e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 2903e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) { 2904e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::NotMatcher<InnerMatcher>(m); 2905e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2906e35fdd936d133bf8a48de140a3c666897588a05shiqian 2907e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns a matcher that matches anything that satisfies the given 2908e35fdd936d133bf8a48de140a3c666897588a05shiqian// predicate. The predicate can be any unary function or functor 2909e35fdd936d133bf8a48de140a3c666897588a05shiqian// whose return type can be implicitly converted to bool. 2910e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Predicate> 2911e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::TrulyMatcher<Predicate> > 2912e35fdd936d133bf8a48de140a3c666897588a05shiqianTruly(Predicate pred) { 2913e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred)); 2914e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2915e35fdd936d133bf8a48de140a3c666897588a05shiqian 29166a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Returns a matcher that matches an equal container. 29176a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// This matcher behaves like Eq(), but in the event of mismatch lists the 29186a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// values that are included in one container but not the other. (Duplicate 29196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// values and order differences are not explained.) 29206a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename Container> 2921821133180ccdb9eb062548d964929ba3b354eb84zhanyong.waninline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT 292202f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_REMOVE_CONST_(Container)> > 29236a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan ContainerEq(const Container& rhs) { 2924b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // This following line is for working around a bug in MSVC 8.0, 2925b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // which causes Container to be a const type sometimes. 292602f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef GTEST_REMOVE_CONST_(Container) RawContainer; 2927821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return MakePolymorphicMatcher( 2928821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan internal::ContainerEqMatcher<RawContainer>(rhs)); 2929b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 2930b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2931ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// Matches an STL-style container or a native array that contains the 2932ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// same number of elements as in rhs, where its i-th element and rhs's 2933ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// i-th element (as a pair) satisfy the given pair matcher, for all i. 2934ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// TupleMatcher must be able to be safely cast to Matcher<tuple<const 2935ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// T1&, const T2&> >, where T1 and T2 are the types of elements in the 2936ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// LHS container and the RHS container respectively. 2937ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wantemplate <typename TupleMatcher, typename Container> 2938ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.waninline internal::PointwiseMatcher<TupleMatcher, 2939ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_CONST_(Container)> 2940ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanPointwise(const TupleMatcher& tuple_matcher, const Container& rhs) { 2941ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // This following line is for working around a bug in MSVC 8.0, 2942ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // which causes Container to be a const type sometimes. 2943ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_CONST_(Container) RawContainer; 2944ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return internal::PointwiseMatcher<TupleMatcher, RawContainer>( 2945ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan tuple_matcher, rhs); 2946ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 2947ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2948b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Matches an STL-style container or a native array that contains at 2949b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// least one element matching the given value or matcher. 2950b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// 2951b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Examples: 2952b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// ::std::set<int> page_ids; 2953b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// page_ids.insert(3); 2954b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// page_ids.insert(1); 2955b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(page_ids, Contains(1)); 2956b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(page_ids, Contains(Gt(2))); 2957b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(page_ids, Not(Contains(4))); 2958b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// 2959b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// ::std::map<int, size_t> page_lengths; 2960b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// page_lengths[1] = 100; 29614019819dbb5369b1d638503523a04aaf7eb2a5adzhanyong.wan// EXPECT_THAT(page_lengths, 29624019819dbb5369b1d638503523a04aaf7eb2a5adzhanyong.wan// Contains(::std::pair<const int, size_t>(1, 100))); 2963b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// 2964b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// const char* user_ids[] = { "joe", "mike", "tom" }; 2965b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom")))); 2966b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename M> 2967b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.waninline internal::ContainsMatcher<M> Contains(M matcher) { 2968b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan return internal::ContainsMatcher<M>(matcher); 29696a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 29706a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 297133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Matches an STL-style container or a native array that contains only 297233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// elements matching the given value or matcher. 297333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 297433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only 297533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// the messages are different. 297633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 297733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Examples: 297833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// ::std::set<int> page_ids; 297933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// // Each(m) matches an empty container, regardless of what m is. 298033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Each(Eq(1))); 298133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Each(Eq(77))); 298233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 298333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_ids.insert(3); 298433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Each(Gt(0))); 298533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Not(Each(Gt(4)))); 298633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_ids.insert(1); 298733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Not(Each(Lt(2)))); 298833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 298933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// ::std::map<int, size_t> page_lengths; 299033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_lengths[1] = 100; 299133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_lengths[2] = 200; 299233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_lengths[3] = 300; 299333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100)))); 299433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_lengths, Each(Key(Le(3)))); 299533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 299633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// const char* user_ids[] = { "joe", "mike", "tom" }; 299733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom"))))); 299833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename M> 299933605ba45417979cff7254c1196dfee65a7275b3zhanyong.waninline internal::EachMatcher<M> Each(M matcher) { 300033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return internal::EachMatcher<M>(matcher); 300133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 300233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 3003b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Key(inner_matcher) matches an std::pair whose 'first' field matches 3004b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 3005b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// std::map that contains at least one element whose key is >= 5. 3006b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wantemplate <typename M> 3007b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.waninline internal::KeyMatcher<M> Key(M inner_matcher) { 3008b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan return internal::KeyMatcher<M>(inner_matcher); 3009b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 3010b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 3011f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field 3012f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// matches first_matcher and whose 'second' field matches second_matcher. For 3013f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used 3014f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// to match a std::map<int, string> that contains exactly one element whose key 3015f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// is >= 5 and whose value equals "foo". 3016f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wantemplate <typename FirstMatcher, typename SecondMatcher> 3017f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.waninline internal::PairMatcher<FirstMatcher, SecondMatcher> 3018f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanPair(FirstMatcher first_matcher, SecondMatcher second_matcher) { 3019f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan return internal::PairMatcher<FirstMatcher, SecondMatcher>( 3020f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher, second_matcher); 3021f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 3022f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 3023e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns a predicate that is satisfied by anything that matches the 3024e35fdd936d133bf8a48de140a3c666897588a05shiqian// given matcher. 3025e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 3026e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::MatcherAsPredicate<M> Matches(M matcher) { 3027e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::MatcherAsPredicate<M>(matcher); 3028e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3029e35fdd936d133bf8a48de140a3c666897588a05shiqian 3030b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Returns true iff the value matches the matcher. 3031b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename T, typename M> 3032b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.waninline bool Value(const T& value, M matcher) { 3033b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan return testing::Matches(matcher)(value); 3034b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 3035b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 303634b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan// Matches the value against the given matcher and explains the match 303734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan// result to listener. 303834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wantemplate <typename T, typename M> 3039a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.waninline bool ExplainMatchResult( 304034b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan M matcher, const T& value, MatchResultListener* listener) { 304134b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener); 304234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan} 304334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan 3044bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// AllArgs(m) is a synonym of m. This is useful in 3045bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// 3046bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq())); 3047bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// 3048bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// which is easier to read than 3049bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// 3050bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// EXPECT_CALL(foo, Bar(_, _)).With(Eq()); 3051bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wantemplate <typename InnerMatcher> 3052bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.waninline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; } 3053bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 3054e35fdd936d133bf8a48de140a3c666897588a05shiqian// These macros allow using matchers to check values in Google Test 3055e35fdd936d133bf8a48de140a3c666897588a05shiqian// tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher) 3056e35fdd936d133bf8a48de140a3c666897588a05shiqian// succeed iff the value matches the matcher. If the assertion fails, 3057e35fdd936d133bf8a48de140a3c666897588a05shiqian// the value and the description of the matcher will be printed. 3058e35fdd936d133bf8a48de140a3c666897588a05shiqian#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\ 3059e35fdd936d133bf8a48de140a3c666897588a05shiqian ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 3060e35fdd936d133bf8a48de140a3c666897588a05shiqian#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\ 3061e35fdd936d133bf8a48de140a3c666897588a05shiqian ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 3062e35fdd936d133bf8a48de140a3c666897588a05shiqian 3063e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace testing 3064e35fdd936d133bf8a48de140a3c666897588a05shiqian 3065e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 3066