gmock-matchers.h revision 2eab17b76d350dac1b1c85879ec8e1135da615ce
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 11583f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // result to 'listener' if necessary (see the next paragraph), in 11683f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // the form of a non-restrictive relative clause ("which ...", 11783f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // "whose ...", etc) that describes x. For example, the 11883f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // MatchAndExplain() method of the Pointee(...) matcher should 11983f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // generate an explanation like "which points to ...". 12083f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // 12183f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // Implementations of MatchAndExplain() should add an explanation of 12283f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // the match result *if and only if* they can provide additional 12383f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // information that's not already present (or not obvious) in the 12483f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // print-out of x and the matcher's description. Whether the match 12583f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // succeeds is not a factor in deciding whether an explanation is 12683f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // needed, as sometimes the caller needs to print a failure message 12783f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // when the match succeeds (e.g. when the matcher is used inside 12883f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // Not()). 12983f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // 13083f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // For example, a "has at least 10 elements" matcher should explain 13183f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // what the actual element count is, regardless of the match result, 13283f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // as it is useful information to the reader; on the other hand, an 13383f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // "is empty" matcher probably only needs to explain what the actual 13483f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // size is when the match fails, as it's redundant to say that the 13583f6b08b5f730c2bfaa288a17d5f12ca98901a00zhanyong.wan // size is 0 when the value is already known to be empty. 136821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // 137db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // You should override this method when defining a new matcher. 138821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // 139821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // It's the responsibility of the caller (Google Mock) to guarantee 140821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // that 'listener' is not NULL. This helps to simplify a matcher's 141821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // implementation when it doesn't care about the performance, as it 142821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // can talk to 'listener' without checking its validity first. 143821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // However, in order to implement dummy listeners efficiently, 144821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // listener->stream() may be NULL. 145db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; 146e35fdd936d133bf8a48de140a3c666897588a05shiqian 147a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // Describes this matcher to an ostream. The function should print 148a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // a verb phrase that describes the property a value matching this 149a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // matcher should have. The subject of the verb phrase is the value 150a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // being matched. For example, the DescribeTo() method of the Gt(7) 151a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.wan // matcher prints "is greater than 7". 152e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const = 0; 153e35fdd936d133bf8a48de140a3c666897588a05shiqian 154e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes the negation of this matcher to an ostream. For 155e35fdd936d133bf8a48de140a3c666897588a05shiqian // example, if the description of this matcher is "is greater than 156e35fdd936d133bf8a48de140a3c666897588a05shiqian // 7", the negated description could be "is not greater than 7". 157e35fdd936d133bf8a48de140a3c666897588a05shiqian // You are not required to override this when implementing 158e35fdd936d133bf8a48de140a3c666897588a05shiqian // MatcherInterface, but it is highly advised so that your matcher 159e35fdd936d133bf8a48de140a3c666897588a05shiqian // can produce good error messages. 160e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 161e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "not ("; 162e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeTo(os); 163e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << ")"; 164e35fdd936d133bf8a48de140a3c666897588a05shiqian } 165e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 166e35fdd936d133bf8a48de140a3c666897588a05shiqian 167e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace internal { 168e35fdd936d133bf8a48de140a3c666897588a05shiqian 169821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// A match result listener that ignores the explanation. 170821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass DummyMatchResultListener : public MatchResultListener { 171821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 172821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan DummyMatchResultListener() : MatchResultListener(NULL) {} 173821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 174821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan private: 175821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); 176821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 177821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 178821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// A match result listener that forwards the explanation to a given 179821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// ostream. The difference between this and MatchResultListener is 180821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// that the former is concrete. 181821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass StreamMatchResultListener : public MatchResultListener { 182821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 183821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan explicit StreamMatchResultListener(::std::ostream* os) 184821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan : MatchResultListener(os) {} 185821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 186821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan private: 187821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); 188821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 189821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 190821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// A match result listener that stores the explanation in a string. 191821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wanclass StringMatchResultListener : public MatchResultListener { 192821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan public: 193821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener() : MatchResultListener(&ss_) {} 194821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 195821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns the explanation heard so far. 196821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan internal::string str() const { return ss_.str(); } 197821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 198821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan private: 199821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan ::std::stringstream ss_; 200821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 201821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); 202821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan}; 203821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 204e35fdd936d133bf8a48de140a3c666897588a05shiqian// An internal class for implementing Matcher<T>, which will derive 205e35fdd936d133bf8a48de140a3c666897588a05shiqian// from it. We put functionalities common to all Matcher<T> 206e35fdd936d133bf8a48de140a3c666897588a05shiqian// specializations here to avoid code duplication. 207e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 208e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherBase { 209e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 210821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns true iff the matcher matches x; also explains the match 211821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // result to 'listener'. 212821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan bool MatchAndExplain(T x, MatchResultListener* listener) const { 213821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return impl_->MatchAndExplain(x, listener); 214821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 215821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 216e35fdd936d133bf8a48de140a3c666897588a05shiqian // Returns true iff this matcher matches x. 217821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan bool Matches(T x) const { 218821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan DummyMatchResultListener dummy; 219821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return MatchAndExplain(x, &dummy); 220821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 221e35fdd936d133bf8a48de140a3c666897588a05shiqian 222e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes this matcher to an ostream. 223e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } 224e35fdd936d133bf8a48de140a3c666897588a05shiqian 225e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes the negation of this matcher to an ostream. 226e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 227e35fdd936d133bf8a48de140a3c666897588a05shiqian impl_->DescribeNegationTo(os); 228e35fdd936d133bf8a48de140a3c666897588a05shiqian } 229e35fdd936d133bf8a48de140a3c666897588a05shiqian 230e35fdd936d133bf8a48de140a3c666897588a05shiqian // Explains why x matches, or doesn't match, the matcher. 231e35fdd936d133bf8a48de140a3c666897588a05shiqian void ExplainMatchResultTo(T x, ::std::ostream* os) const { 232821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StreamMatchResultListener listener(os); 233821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchAndExplain(x, &listener); 234e35fdd936d133bf8a48de140a3c666897588a05shiqian } 23532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 236e35fdd936d133bf8a48de140a3c666897588a05shiqian protected: 237e35fdd936d133bf8a48de140a3c666897588a05shiqian MatcherBase() {} 238e35fdd936d133bf8a48de140a3c666897588a05shiqian 239e35fdd936d133bf8a48de140a3c666897588a05shiqian // Constructs a matcher from its implementation. 240e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit MatcherBase(const MatcherInterface<T>* impl) 241e35fdd936d133bf8a48de140a3c666897588a05shiqian : impl_(impl) {} 242e35fdd936d133bf8a48de140a3c666897588a05shiqian 243e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual ~MatcherBase() {} 24432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 245e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 246e35fdd936d133bf8a48de140a3c666897588a05shiqian // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar 247e35fdd936d133bf8a48de140a3c666897588a05shiqian // interfaces. The former dynamically allocates a chunk of memory 248e35fdd936d133bf8a48de140a3c666897588a05shiqian // to hold the reference count, while the latter tracks all 249e35fdd936d133bf8a48de140a3c666897588a05shiqian // references using a circular linked list without allocating 250e35fdd936d133bf8a48de140a3c666897588a05shiqian // memory. It has been observed that linked_ptr performs better in 251e35fdd936d133bf8a48de140a3c666897588a05shiqian // typical scenarios. However, shared_ptr can out-perform 252e35fdd936d133bf8a48de140a3c666897588a05shiqian // linked_ptr when there are many more uses of the copy constructor 253e35fdd936d133bf8a48de140a3c666897588a05shiqian // than the default constructor. 254e35fdd936d133bf8a48de140a3c666897588a05shiqian // 255e35fdd936d133bf8a48de140a3c666897588a05shiqian // If performance becomes a problem, we should see if using 256e35fdd936d133bf8a48de140a3c666897588a05shiqian // shared_ptr helps. 257e35fdd936d133bf8a48de140a3c666897588a05shiqian ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_; 258e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 259e35fdd936d133bf8a48de140a3c666897588a05shiqian 260e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace internal 261e35fdd936d133bf8a48de140a3c666897588a05shiqian 262e35fdd936d133bf8a48de140a3c666897588a05shiqian// A Matcher<T> is a copyable and IMMUTABLE (except by assignment) 263e35fdd936d133bf8a48de140a3c666897588a05shiqian// object that can check whether a value of type T matches. The 264e35fdd936d133bf8a48de140a3c666897588a05shiqian// implementation of Matcher<T> is just a linked_ptr to const 265e35fdd936d133bf8a48de140a3c666897588a05shiqian// MatcherInterface<T>, so copying is fairly cheap. Don't inherit 266e35fdd936d133bf8a48de140a3c666897588a05shiqian// from Matcher! 267e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 268e35fdd936d133bf8a48de140a3c666897588a05shiqianclass Matcher : public internal::MatcherBase<T> { 269e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 27088032d8e0f6d4bc63b97aeeab84fdc44aeab1c89vladlosev // Constructs a null matcher. Needed for storing Matcher objects in STL 27188032d8e0f6d4bc63b97aeeab84fdc44aeab1c89vladlosev // containers. A default-constructed matcher is not yet initialized. You 27288032d8e0f6d4bc63b97aeeab84fdc44aeab1c89vladlosev // cannot use it until a valid value has been assigned to it. 273e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher() {} 274e35fdd936d133bf8a48de140a3c666897588a05shiqian 275e35fdd936d133bf8a48de140a3c666897588a05shiqian // Constructs a matcher from its implementation. 276e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Matcher(const MatcherInterface<T>* impl) 277e35fdd936d133bf8a48de140a3c666897588a05shiqian : internal::MatcherBase<T>(impl) {} 278e35fdd936d133bf8a48de140a3c666897588a05shiqian 27918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Implicit constructor here allows people to write 280e35fdd936d133bf8a48de140a3c666897588a05shiqian // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes 281e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(T value); // NOLINT 282e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 283e35fdd936d133bf8a48de140a3c666897588a05shiqian 284e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following two specializations allow the user to write str 285e35fdd936d133bf8a48de140a3c666897588a05shiqian// instead of Eq(str) and "foo" instead of Eq("foo") when a string 286e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher is expected. 287e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <> 288587c1b37c2f0b6d430fb13ce09326db0135b557cvladlosevclass GTEST_API_ Matcher<const internal::string&> 289e35fdd936d133bf8a48de140a3c666897588a05shiqian : public internal::MatcherBase<const internal::string&> { 290e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 291e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher() {} 292e35fdd936d133bf8a48de140a3c666897588a05shiqian 293e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Matcher(const MatcherInterface<const internal::string&>* impl) 294e35fdd936d133bf8a48de140a3c666897588a05shiqian : internal::MatcherBase<const internal::string&>(impl) {} 295e35fdd936d133bf8a48de140a3c666897588a05shiqian 296e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write str instead of Eq(str) sometimes, where 297e35fdd936d133bf8a48de140a3c666897588a05shiqian // str is a string object. 298e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const internal::string& s); // NOLINT 299e35fdd936d133bf8a48de140a3c666897588a05shiqian 300e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write "foo" instead of Eq("foo") sometimes. 301e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const char* s); // NOLINT 302e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 303e35fdd936d133bf8a48de140a3c666897588a05shiqian 304e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <> 305587c1b37c2f0b6d430fb13ce09326db0135b557cvladlosevclass GTEST_API_ Matcher<internal::string> 306e35fdd936d133bf8a48de140a3c666897588a05shiqian : public internal::MatcherBase<internal::string> { 307e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 308e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher() {} 309e35fdd936d133bf8a48de140a3c666897588a05shiqian 310e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Matcher(const MatcherInterface<internal::string>* impl) 311e35fdd936d133bf8a48de140a3c666897588a05shiqian : internal::MatcherBase<internal::string>(impl) {} 312e35fdd936d133bf8a48de140a3c666897588a05shiqian 313e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write str instead of Eq(str) sometimes, where 314e35fdd936d133bf8a48de140a3c666897588a05shiqian // str is a string object. 315e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const internal::string& s); // NOLINT 316e35fdd936d133bf8a48de140a3c666897588a05shiqian 317e35fdd936d133bf8a48de140a3c666897588a05shiqian // Allows the user to write "foo" instead of Eq("foo") sometimes. 318e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher(const char* s); // NOLINT 319e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 320e35fdd936d133bf8a48de140a3c666897588a05shiqian 321e35fdd936d133bf8a48de140a3c666897588a05shiqian// The PolymorphicMatcher class template makes it easy to implement a 322e35fdd936d133bf8a48de140a3c666897588a05shiqian// polymorphic matcher (i.e. a matcher that can match values of more 323e35fdd936d133bf8a48de140a3c666897588a05shiqian// than one type, e.g. Eq(n) and NotNull()). 324e35fdd936d133bf8a48de140a3c666897588a05shiqian// 325db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// To define a polymorphic matcher, a user should provide an Impl 326db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// class that has a DescribeTo() method and a DescribeNegationTo() 327db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// method, and define a member function (or member function template) 328821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// 329db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// bool MatchAndExplain(const Value& value, 330db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan// MatchResultListener* listener) const; 331821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// 332821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan// See the definition of NotNull() for a complete example. 333e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <class Impl> 334e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PolymorphicMatcher { 335e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 33632de5f53763125925e078498250f7e73a88de9edzhanyong.wan explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} 337e35fdd936d133bf8a48de140a3c666897588a05shiqian 3382b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // Returns a mutable reference to the underlying matcher 3392b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // implementation object. 3402b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan Impl& mutable_impl() { return impl_; } 3412b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 3422b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // Returns an immutable reference to the underlying matcher 3432b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan // implementation object. 3442b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan const Impl& impl() const { return impl_; } 3452b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 346e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 347e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 348e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(new MonomorphicImpl<T>(impl_)); 349e35fdd936d133bf8a48de140a3c666897588a05shiqian } 35032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 351e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 352e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 353e35fdd936d133bf8a48de140a3c666897588a05shiqian class MonomorphicImpl : public MatcherInterface<T> { 354e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 355e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} 356e35fdd936d133bf8a48de140a3c666897588a05shiqian 357e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 358e35fdd936d133bf8a48de140a3c666897588a05shiqian impl_.DescribeTo(os); 359e35fdd936d133bf8a48de140a3c666897588a05shiqian } 360e35fdd936d133bf8a48de140a3c666897588a05shiqian 361e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 362e35fdd936d133bf8a48de140a3c666897588a05shiqian impl_.DescribeNegationTo(os); 363e35fdd936d133bf8a48de140a3c666897588a05shiqian } 364e35fdd936d133bf8a48de140a3c666897588a05shiqian 365821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 366db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return impl_.MatchAndExplain(x, listener); 367e35fdd936d133bf8a48de140a3c666897588a05shiqian } 3682b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan 369e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 370e35fdd936d133bf8a48de140a3c666897588a05shiqian const Impl impl_; 37132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 37232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); 373e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 374e35fdd936d133bf8a48de140a3c666897588a05shiqian 3752b43a9ecd16edc1ec55429967e0f2de1aaf8e8bbzhanyong.wan Impl impl_; 37632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 37732de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher); 378e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 379e35fdd936d133bf8a48de140a3c666897588a05shiqian 380e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher from its implementation. This is easier to use 381e35fdd936d133bf8a48de140a3c666897588a05shiqian// than the Matcher<T> constructor as it doesn't require you to 382e35fdd936d133bf8a48de140a3c666897588a05shiqian// explicitly write the template argument, e.g. 383e35fdd936d133bf8a48de140a3c666897588a05shiqian// 384e35fdd936d133bf8a48de140a3c666897588a05shiqian// MakeMatcher(foo); 385e35fdd936d133bf8a48de140a3c666897588a05shiqian// vs 386e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<const string&>(foo); 387e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 388e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) { 389e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(impl); 3902eab17b76d350dac1b1c85879ec8e1135da615cezhanyong.wan} 391e35fdd936d133bf8a48de140a3c666897588a05shiqian 392e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher from its implementation. This is 393e35fdd936d133bf8a48de140a3c666897588a05shiqian// easier to use than the PolymorphicMatcher<Impl> constructor as it 394e35fdd936d133bf8a48de140a3c666897588a05shiqian// doesn't require you to explicitly write the template argument, e.g. 395e35fdd936d133bf8a48de140a3c666897588a05shiqian// 396e35fdd936d133bf8a48de140a3c666897588a05shiqian// MakePolymorphicMatcher(foo); 397e35fdd936d133bf8a48de140a3c666897588a05shiqian// vs 398e35fdd936d133bf8a48de140a3c666897588a05shiqian// PolymorphicMatcher<TypeOfFoo>(foo); 399e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <class Impl> 400e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) { 401e35fdd936d133bf8a48de140a3c666897588a05shiqian return PolymorphicMatcher<Impl>(impl); 402e35fdd936d133bf8a48de140a3c666897588a05shiqian} 403e35fdd936d133bf8a48de140a3c666897588a05shiqian 40479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION 40579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// and MUST NOT BE USED IN USER CODE!!! 40679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmnamespace internal { 40779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 40879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// The MatcherCastImpl class template is a helper for implementing 40979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// MatcherCast(). We need this helper in order to partially 41079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// specialize the implementation of MatcherCast() (C++ allows 41179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// class/struct templates to be partially specialized, but not 41279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// function templates.). 41379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 41479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// This general version is used when MatcherCast()'s argument is a 41579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// polymorphic matcher (i.e. something that can be converted to a 41679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// Matcher but is not one yet; for example, Eq(value)) or a value (for 41779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// example, "hello"). 41879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmtemplate <typename T, typename M> 41979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmclass MatcherCastImpl { 42079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm public: 42179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm static Matcher<T> Cast(M polymorphic_matcher_or_value) { 42279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // M can be a polymorhic matcher, in which case we want to use 42379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // its conversion operator to create Matcher<T>. Or it can be a value 42479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // that should be passed to the Matcher<T>'s constructor. 42579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // 42679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a 42779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // polymorphic matcher because it'll be ambiguous if T has an implicit 42879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // constructor from M (this usually happens when T has an implicit 42979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // constructor from any type). 43079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // 43179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // It won't work to unconditionally implict_cast 43279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // polymorphic_matcher_or_value to Matcher<T> because it won't trigger 43379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // a user-defined conversion from M to T if one exists (assuming M is 43479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // a value). 43579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return CastImpl( 43679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm polymorphic_matcher_or_value, 43779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm BooleanConstant< 43879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm internal::ImplicitlyConvertible<M, Matcher<T> >::value>()); 43979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 44079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 44179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm private: 44279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm static Matcher<T> CastImpl(M value, BooleanConstant<false>) { 44379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic 44479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // matcher. It must be a value then. Use direct initialization to create 44579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // a matcher. 44679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return Matcher<T>(ImplicitCast_<T>(value)); 44779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 44879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 44979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm static Matcher<T> CastImpl(M polymorphic_matcher_or_value, 45079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm BooleanConstant<true>) { 45179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // M is implicitly convertible to Matcher<T>, which means that either 45279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // M is a polymorhpic matcher or Matcher<T> has an implicit constructor 45379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // from M. In both cases using the implicit conversion will produce a 45479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // matcher. 45579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // 45679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // Even if T has an implicit constructor from M, it won't be called because 45779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // creating Matcher<T> would require a chain of two user-defined conversions 45879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // (first to create T from M and then to create Matcher<T> from T). 45979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return polymorphic_matcher_or_value; 46079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 46179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}; 46279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 46379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// This more specialized version is used when MatcherCast()'s argument 46479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// is already a Matcher. This only compiles when type T can be 46579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// statically converted to type U. 46679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmtemplate <typename T, typename U> 46779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmclass MatcherCastImpl<T, Matcher<U> > { 46879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm public: 46979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm static Matcher<T> Cast(const Matcher<U>& source_matcher) { 47079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return Matcher<T>(new Impl(source_matcher)); 47179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 47279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 47379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm private: 47479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm class Impl : public MatcherInterface<T> { 47579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm public: 47679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm explicit Impl(const Matcher<U>& source_matcher) 47779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm : source_matcher_(source_matcher) {} 47879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 47979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // We delegate the matching logic to the source matcher. 48079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 48179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return source_matcher_.MatchAndExplain(static_cast<U>(x), listener); 48279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 48379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 48479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm virtual void DescribeTo(::std::ostream* os) const { 48579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm source_matcher_.DescribeTo(os); 48679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 48779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 48879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm virtual void DescribeNegationTo(::std::ostream* os) const { 48979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm source_matcher_.DescribeNegationTo(os); 49079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm } 49179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 49279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm private: 49379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm const Matcher<U> source_matcher_; 49479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 49579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm GTEST_DISALLOW_ASSIGN_(Impl); 49679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm }; 49779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}; 49879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 49979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// This even more specialized version is used for efficiently casting 50079a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm// a matcher to its own type. 50179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmtemplate <typename T> 50279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgmclass MatcherCastImpl<T, Matcher<T> > { 50379a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm public: 50479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } 50579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm}; 50679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 50779a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} // namespace internal 50879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 509e35fdd936d133bf8a48de140a3c666897588a05shiqian// In order to be safe and clear, casting between different matcher 510e35fdd936d133bf8a48de140a3c666897588a05shiqian// types is done explicitly via MatcherCast<T>(m), which takes a 511e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher m and returns a Matcher<T>. It compiles only when T can be 512e35fdd936d133bf8a48de140a3c666897588a05shiqian// statically converted to the argument type of m. 513e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T, typename M> 51479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgminline Matcher<T> MatcherCast(M matcher) { 51579a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return internal::MatcherCastImpl<T, M>::Cast(matcher); 51679a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm} 517e35fdd936d133bf8a48de140a3c666897588a05shiqian 51818490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// Implements SafeMatcherCast(). 51918490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan// 52095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// We use an intermediate class to do the actual safe casting as Nokia's 52195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// Symbian compiler cannot decide between 52295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// template <T, M> ... (M) and 52395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// template <T, U> ... (const Matcher<U>&) 52495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan// for function templates but can for member function templates. 52595b12332c345cee508a8e2b68e007280392506e0zhanyong.wantemplate <typename T> 52695b12332c345cee508a8e2b68e007280392506e0zhanyong.wanclass SafeMatcherCastImpl { 52795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan public: 52879a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // This overload handles polymorphic matchers and values only since 52979a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm // monomorphic matchers are handled by the next one. 53095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan template <typename M> 53179a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm static inline Matcher<T> Cast(M polymorphic_matcher_or_value) { 53279a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value); 53395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan } 53418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 53595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // This overload handles monomorphic matchers. 53695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // 53795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // In general, if type T can be implicitly converted to type U, we can 53895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is 53995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // contravariant): just keep a copy of the original Matcher<U>, convert the 54095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // argument from type T to U, and then pass it to the underlying Matcher<U>. 54195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // The only exception is when U is a reference and T is not, as the 54295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // underlying Matcher<U> may be interested in the argument's address, which 54395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // is not preserved in the conversion from T to U. 54495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan template <typename U> 54595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan static inline Matcher<T> Cast(const Matcher<U>& matcher) { 54695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // Enforce that T can be implicitly converted to U. 54702f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value), 54895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan T_must_be_implicitly_convertible_to_U); 54995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // Enforce that we are not converting a non-reference type T to a reference 55095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // type U. 55102f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_( 55295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan internal::is_reference<T>::value || !internal::is_reference<U>::value, 55395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan cannot_convert_non_referentce_arg_to_reference); 55495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // In case both T and U are arithmetic types, enforce that the 55595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan // conversion is not lossy. 556ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT; 557ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU; 55895b12332c345cee508a8e2b68e007280392506e0zhanyong.wan const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; 55995b12332c345cee508a8e2b68e007280392506e0zhanyong.wan const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; 56002f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_( 56195b12332c345cee508a8e2b68e007280392506e0zhanyong.wan kTIsOther || kUIsOther || 56295b12332c345cee508a8e2b68e007280392506e0zhanyong.wan (internal::LosslessArithmeticConvertible<RawT, RawU>::value), 56395b12332c345cee508a8e2b68e007280392506e0zhanyong.wan conversion_of_arithmetic_types_must_be_lossless); 56495b12332c345cee508a8e2b68e007280392506e0zhanyong.wan return MatcherCast<T>(matcher); 56595b12332c345cee508a8e2b68e007280392506e0zhanyong.wan } 56695b12332c345cee508a8e2b68e007280392506e0zhanyong.wan}; 56795b12332c345cee508a8e2b68e007280392506e0zhanyong.wan 56895b12332c345cee508a8e2b68e007280392506e0zhanyong.wantemplate <typename T, typename M> 56995b12332c345cee508a8e2b68e007280392506e0zhanyong.waninline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) { 57095b12332c345cee508a8e2b68e007280392506e0zhanyong.wan return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher); 57118490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan} 57218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan 573e35fdd936d133bf8a48de140a3c666897588a05shiqian// A<T>() returns a matcher that matches any value of type T. 574e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 575e35fdd936d133bf8a48de140a3c666897588a05shiqianMatcher<T> A(); 576e35fdd936d133bf8a48de140a3c666897588a05shiqian 577e35fdd936d133bf8a48de140a3c666897588a05shiqian// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION 578e35fdd936d133bf8a48de140a3c666897588a05shiqian// and MUST NOT BE USED IN USER CODE!!! 579e35fdd936d133bf8a48de140a3c666897588a05shiqiannamespace internal { 580e35fdd936d133bf8a48de140a3c666897588a05shiqian 581b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan// If the explanation is not empty, prints it to the ostream. 582b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.waninline void PrintIfNotEmpty(const internal::string& explanation, 583b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan std::ostream* os) { 584b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan if (explanation != "" && os != NULL) { 585b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ", " << explanation; 586676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 587676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan} 588676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 589736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// Returns true if the given type name is easy to read by a human. 590736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// This is used to decide whether printing the type of a value might 591736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan// be helpful. 592736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.waninline bool IsReadableTypeName(const string& type_name) { 593736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan // We consider a type name readable if it's short or doesn't contain 594736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan // a template or function type. 595736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan return (type_name.length() <= 20 || 596736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan type_name.find_first_of("<(") == string::npos); 597736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan} 598736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan 599676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// Matches the value against the given matcher, prints the value and explains 600676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// the match result to the listener. Returns the match result. 601676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// 'listener' must not be NULL. 602676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// Value cannot be passed by const reference, because some matchers take a 603676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan// non-const argument. 604676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wantemplate <typename Value, typename T> 605676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wanbool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher, 606676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan MatchResultListener* listener) { 607676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!listener->IsInterested()) { 608676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // If the listener is not interested, we do not need to construct the 609676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // inner explanation. 610676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return matcher.Matches(value); 611676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 612676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 613676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan StringMatchResultListener inner_listener; 614676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan const bool match = matcher.MatchAndExplain(value, &inner_listener); 615676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 616676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan UniversalPrint(value, listener->stream()); 617736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#if GTEST_HAS_RTTI 618736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan const string& type_name = GetTypeName<Value>(); 619736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan if (IsReadableTypeName(type_name)) 620736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan *listener->stream() << " (of type " << type_name << ")"; 621736baa8ac028f01a5c79ebecb6fc7043b47d3c4ezhanyong.wan#endif 622b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(inner_listener.str(), listener->stream()); 623676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 624676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return match; 625676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan} 626676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 627e35fdd936d133bf8a48de140a3c666897588a05shiqian// An internal helper class for doing compile-time loop on a tuple's 628e35fdd936d133bf8a48de140a3c666897588a05shiqian// fields. 629e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <size_t N> 630e35fdd936d133bf8a48de140a3c666897588a05shiqianclass TuplePrefix { 631e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 632e35fdd936d133bf8a48de140a3c666897588a05shiqian // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true 633e35fdd936d133bf8a48de140a3c666897588a05shiqian // iff the first N fields of matcher_tuple matches the first N 634e35fdd936d133bf8a48de140a3c666897588a05shiqian // fields of value_tuple, respectively. 635e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 636e35fdd936d133bf8a48de140a3c666897588a05shiqian static bool Matches(const MatcherTuple& matcher_tuple, 637e35fdd936d133bf8a48de140a3c666897588a05shiqian const ValueTuple& value_tuple) { 638e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::get; 639e35fdd936d133bf8a48de140a3c666897588a05shiqian return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) 640e35fdd936d133bf8a48de140a3c666897588a05shiqian && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple)); 641e35fdd936d133bf8a48de140a3c666897588a05shiqian } 642e35fdd936d133bf8a48de140a3c666897588a05shiqian 643b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os) 644e35fdd936d133bf8a48de140a3c666897588a05shiqian // describes failures in matching the first N fields of matchers 645e35fdd936d133bf8a48de140a3c666897588a05shiqian // against the first N fields of values. If there is no failure, 646e35fdd936d133bf8a48de140a3c666897588a05shiqian // nothing will be streamed to os. 647e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 648b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan static void ExplainMatchFailuresTo(const MatcherTuple& matchers, 649b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const ValueTuple& values, 650b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::ostream* os) { 651e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::tuple_element; 652e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::get; 653e35fdd936d133bf8a48de140a3c666897588a05shiqian 654e35fdd936d133bf8a48de140a3c666897588a05shiqian // First, describes failures in the first N - 1 fields. 655b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os); 656e35fdd936d133bf8a48de140a3c666897588a05shiqian 657e35fdd936d133bf8a48de140a3c666897588a05shiqian // Then describes the failure (if any) in the (N - 1)-th (0-based) 658e35fdd936d133bf8a48de140a3c666897588a05shiqian // field. 659e35fdd936d133bf8a48de140a3c666897588a05shiqian typename tuple_element<N - 1, MatcherTuple>::type matcher = 660e35fdd936d133bf8a48de140a3c666897588a05shiqian get<N - 1>(matchers); 661e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename tuple_element<N - 1, ValueTuple>::type Value; 662e35fdd936d133bf8a48de140a3c666897588a05shiqian Value value = get<N - 1>(values); 663821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener; 664821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!matcher.MatchAndExplain(value, &listener)) { 665e35fdd936d133bf8a48de140a3c666897588a05shiqian // TODO(wan): include in the message the name of the parameter 666e35fdd936d133bf8a48de140a3c666897588a05shiqian // as used in MOCK_METHOD*() when possible. 667e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << " Expected arg #" << N - 1 << ": "; 668e35fdd936d133bf8a48de140a3c666897588a05shiqian get<N - 1>(matchers).DescribeTo(os); 669e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "\n Actual: "; 670e35fdd936d133bf8a48de140a3c666897588a05shiqian // We remove the reference in type Value to prevent the 671e35fdd936d133bf8a48de140a3c666897588a05shiqian // universal printer from printing the address of value, which 672e35fdd936d133bf8a48de140a3c666897588a05shiqian // isn't interesting to the user most of the time. The 673db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // matcher's MatchAndExplain() method handles the case when 674e35fdd936d133bf8a48de140a3c666897588a05shiqian // the address is interesting. 675b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan internal::UniversalPrint(value, os); 676b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(listener.str(), os); 677e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "\n"; 678e35fdd936d133bf8a48de140a3c666897588a05shiqian } 679e35fdd936d133bf8a48de140a3c666897588a05shiqian } 680e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 681e35fdd936d133bf8a48de140a3c666897588a05shiqian 682e35fdd936d133bf8a48de140a3c666897588a05shiqian// The base case. 683e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <> 684e35fdd936d133bf8a48de140a3c666897588a05shiqianclass TuplePrefix<0> { 685e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 686e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 6873fbd2dd020819fcfd7cef2aa6a17fad73c41a0eezhanyong.wan static bool Matches(const MatcherTuple& /* matcher_tuple */, 6883fbd2dd020819fcfd7cef2aa6a17fad73c41a0eezhanyong.wan const ValueTuple& /* value_tuple */) { 689e35fdd936d133bf8a48de140a3c666897588a05shiqian return true; 690e35fdd936d133bf8a48de140a3c666897588a05shiqian } 691e35fdd936d133bf8a48de140a3c666897588a05shiqian 692e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename MatcherTuple, typename ValueTuple> 693b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, 694b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const ValueTuple& /* values */, 695b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::ostream* /* os */) {} 696e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 697e35fdd936d133bf8a48de140a3c666897588a05shiqian 698e35fdd936d133bf8a48de140a3c666897588a05shiqian// TupleMatches(matcher_tuple, value_tuple) returns true iff all 699e35fdd936d133bf8a48de140a3c666897588a05shiqian// matchers in matcher_tuple match the corresponding fields in 700e35fdd936d133bf8a48de140a3c666897588a05shiqian// value_tuple. It is a compiler error if matcher_tuple and 701e35fdd936d133bf8a48de140a3c666897588a05shiqian// value_tuple have different number of fields or incompatible field 702e35fdd936d133bf8a48de140a3c666897588a05shiqian// types. 703e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherTuple, typename ValueTuple> 704e35fdd936d133bf8a48de140a3c666897588a05shiqianbool TupleMatches(const MatcherTuple& matcher_tuple, 705e35fdd936d133bf8a48de140a3c666897588a05shiqian const ValueTuple& value_tuple) { 706e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::tuple_size; 707e35fdd936d133bf8a48de140a3c666897588a05shiqian // Makes sure that matcher_tuple and value_tuple have the same 708e35fdd936d133bf8a48de140a3c666897588a05shiqian // number of fields. 70902f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value == 710e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan tuple_size<ValueTuple>::value, 711e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan matcher_and_value_have_different_numbers_of_fields); 712e35fdd936d133bf8a48de140a3c666897588a05shiqian return TuplePrefix<tuple_size<ValueTuple>::value>:: 713e35fdd936d133bf8a48de140a3c666897588a05shiqian Matches(matcher_tuple, value_tuple); 714e35fdd936d133bf8a48de140a3c666897588a05shiqian} 715e35fdd936d133bf8a48de140a3c666897588a05shiqian 716e35fdd936d133bf8a48de140a3c666897588a05shiqian// Describes failures in matching matchers against values. If there 717e35fdd936d133bf8a48de140a3c666897588a05shiqian// is no failure, nothing will be streamed to os. 718e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename MatcherTuple, typename ValueTuple> 719b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanvoid ExplainMatchFailureTupleTo(const MatcherTuple& matchers, 720b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const ValueTuple& values, 721b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::ostream* os) { 722e35fdd936d133bf8a48de140a3c666897588a05shiqian using ::std::tr1::tuple_size; 723b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo( 724e35fdd936d133bf8a48de140a3c666897588a05shiqian matchers, values, os); 725e35fdd936d133bf8a48de140a3c666897588a05shiqian} 726e35fdd936d133bf8a48de140a3c666897588a05shiqian 727e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements A<T>(). 728e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 729e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AnyMatcherImpl : public MatcherInterface<T> { 730e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 731821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain( 732821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan T /* x */, MatchResultListener* /* listener */) const { return true; } 733e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } 734e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 735e35fdd936d133bf8a48de140a3c666897588a05shiqian // This is mostly for completeness' safe, as it's not very useful 736e35fdd936d133bf8a48de140a3c666897588a05shiqian // to write Not(A<bool>()). However we cannot completely rule out 737e35fdd936d133bf8a48de140a3c666897588a05shiqian // such a possibility, and it doesn't hurt to be prepared. 738e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "never matches"; 739e35fdd936d133bf8a48de140a3c666897588a05shiqian } 740e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 741e35fdd936d133bf8a48de140a3c666897588a05shiqian 742e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements _, a matcher that matches any value of any 743e35fdd936d133bf8a48de140a3c666897588a05shiqian// type. This is a polymorphic matcher, so we need a template type 744e35fdd936d133bf8a48de140a3c666897588a05shiqian// conversion operator to make it appearing as a Matcher<T> for any 745e35fdd936d133bf8a48de140a3c666897588a05shiqian// type T. 746e35fdd936d133bf8a48de140a3c666897588a05shiqianclass AnythingMatcher { 747e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 748e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 749e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { return A<T>(); } 750e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 751e35fdd936d133bf8a48de140a3c666897588a05shiqian 752e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements a matcher that compares a given value with a 753e35fdd936d133bf8a48de140a3c666897588a05shiqian// pre-supplied value using one of the ==, <=, <, etc, operators. The 754e35fdd936d133bf8a48de140a3c666897588a05shiqian// two values being compared don't have to have the same type. 755e35fdd936d133bf8a48de140a3c666897588a05shiqian// 756e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher defined here is polymorphic (for example, Eq(5) can be 757e35fdd936d133bf8a48de140a3c666897588a05shiqian// used to match an int, a short, a double, etc). Therefore we use 758e35fdd936d133bf8a48de140a3c666897588a05shiqian// a template type conversion operator in the implementation. 759e35fdd936d133bf8a48de140a3c666897588a05shiqian// 760e35fdd936d133bf8a48de140a3c666897588a05shiqian// We define this as a macro in order to eliminate duplicated source 761e35fdd936d133bf8a48de140a3c666897588a05shiqian// code. 762e35fdd936d133bf8a48de140a3c666897588a05shiqian// 763e35fdd936d133bf8a48de140a3c666897588a05shiqian// The following template definition assumes that the Rhs parameter is 764e35fdd936d133bf8a48de140a3c666897588a05shiqian// a "bare" type (i.e. neither 'const T' nor 'T&'). 765b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan#define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \ 766b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan name, op, relation, negated_relation) \ 767e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Rhs> class name##Matcher { \ 768e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 769e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \ 770e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Lhs> \ 771e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<Lhs>() const { \ 772e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<Lhs>(rhs_)); \ 773e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 774e35fdd936d133bf8a48de140a3c666897588a05shiqian private: \ 775e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Lhs> \ 776e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<Lhs> { \ 777e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 778e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \ 779821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(\ 780821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan Lhs lhs, MatchResultListener* /* listener */) const { \ 781821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return lhs op rhs_; \ 782821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } \ 783e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { \ 784b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << relation " "; \ 785e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); \ 786e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 787e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { \ 788b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << negated_relation " "; \ 789e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); \ 790e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 791e35fdd936d133bf8a48de140a3c666897588a05shiqian private: \ 792e35fdd936d133bf8a48de140a3c666897588a05shiqian Rhs rhs_; \ 79332de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); \ 794e35fdd936d133bf8a48de140a3c666897588a05shiqian }; \ 795e35fdd936d133bf8a48de140a3c666897588a05shiqian Rhs rhs_; \ 79632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(name##Matcher); \ 797e35fdd936d133bf8a48de140a3c666897588a05shiqian } 798e35fdd936d133bf8a48de140a3c666897588a05shiqian 799e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v) 800e35fdd936d133bf8a48de140a3c666897588a05shiqian// respectively. 801b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to"); 802b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >="); 803b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >"); 804b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <="); 805b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <"); 806b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wanGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to"); 807e35fdd936d133bf8a48de140a3c666897588a05shiqian 808e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan#undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_ 809e35fdd936d133bf8a48de140a3c666897588a05shiqian 81079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev// Implements the polymorphic IsNull() matcher, which matches any raw or smart 8112d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// pointer that is NULL. 8122d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wanclass IsNullMatcher { 8132d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan public: 81479b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev template <typename Pointer> 815db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const Pointer& p, 816db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 817db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return GetRawPointer(p) == NULL; 818db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 8192d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 8202d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } 8212d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan void DescribeNegationTo(::std::ostream* os) const { 822b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't NULL"; 8232d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan } 8242d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan}; 8252d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 82679b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev// Implements the polymorphic NotNull() matcher, which matches any raw or smart 827e35fdd936d133bf8a48de140a3c666897588a05shiqian// pointer that is not NULL. 828e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotNullMatcher { 829e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 83079b83505bcf73bf2903ebf2e2f82cb1e1f181816vladlosev template <typename Pointer> 831db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const Pointer& p, 832db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 833db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return GetRawPointer(p) != NULL; 834db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 835e35fdd936d133bf8a48de140a3c666897588a05shiqian 836b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } 837e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 838e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is NULL"; 839e35fdd936d133bf8a48de140a3c666897588a05shiqian } 840e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 841e35fdd936d133bf8a48de140a3c666897588a05shiqian 842e35fdd936d133bf8a48de140a3c666897588a05shiqian// Ref(variable) matches any argument that is a reference to 843e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'variable'. This matcher is polymorphic as it can match any 844e35fdd936d133bf8a48de140a3c666897588a05shiqian// super type of the type of 'variable'. 845e35fdd936d133bf8a48de140a3c666897588a05shiqian// 846e35fdd936d133bf8a48de140a3c666897588a05shiqian// The RefMatcher template class implements Ref(variable). It can 847e35fdd936d133bf8a48de140a3c666897588a05shiqian// only be instantiated with a reference type. This prevents a user 848e35fdd936d133bf8a48de140a3c666897588a05shiqian// from mistakenly using Ref(x) to match a non-reference function 849e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument. For example, the following will righteously cause a 850e35fdd936d133bf8a48de140a3c666897588a05shiqian// compiler error: 851e35fdd936d133bf8a48de140a3c666897588a05shiqian// 852e35fdd936d133bf8a48de140a3c666897588a05shiqian// int n; 853e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<int> m1 = Ref(n); // This won't compile. 854e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matcher<int&> m2 = Ref(n); // This will compile. 855e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 856e35fdd936d133bf8a48de140a3c666897588a05shiqianclass RefMatcher; 857e35fdd936d133bf8a48de140a3c666897588a05shiqian 858e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 859e35fdd936d133bf8a48de140a3c666897588a05shiqianclass RefMatcher<T&> { 860e35fdd936d133bf8a48de140a3c666897588a05shiqian // Google Mock is a generic framework and thus needs to support 861e35fdd936d133bf8a48de140a3c666897588a05shiqian // mocking any function types, including those that take non-const 862e35fdd936d133bf8a48de140a3c666897588a05shiqian // reference arguments. Therefore the template parameter T (and 863e35fdd936d133bf8a48de140a3c666897588a05shiqian // Super below) can be instantiated to either a const type or a 864e35fdd936d133bf8a48de140a3c666897588a05shiqian // non-const type. 865e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 866e35fdd936d133bf8a48de140a3c666897588a05shiqian // RefMatcher() takes a T& instead of const T&, as we want the 867e35fdd936d133bf8a48de140a3c666897588a05shiqian // compiler to catch using Ref(const_value) as a matcher for a 868e35fdd936d133bf8a48de140a3c666897588a05shiqian // non-const reference. 869e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit RefMatcher(T& x) : object_(x) {} // NOLINT 870e35fdd936d133bf8a48de140a3c666897588a05shiqian 871e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Super> 872e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<Super&>() const { 873e35fdd936d133bf8a48de140a3c666897588a05shiqian // By passing object_ (type T&) to Impl(), which expects a Super&, 874e35fdd936d133bf8a48de140a3c666897588a05shiqian // we make sure that Super is a super type of T. In particular, 875e35fdd936d133bf8a48de140a3c666897588a05shiqian // this catches using Ref(const_value) as a matcher for a 876e35fdd936d133bf8a48de140a3c666897588a05shiqian // non-const reference, as you cannot implicitly convert a const 877e35fdd936d133bf8a48de140a3c666897588a05shiqian // reference to a non-const reference. 878e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<Super>(object_)); 879e35fdd936d133bf8a48de140a3c666897588a05shiqian } 88032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 881e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 882e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Super> 883e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<Super&> { 884e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 885e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Impl(Super& x) : object_(x) {} // NOLINT 886e35fdd936d133bf8a48de140a3c666897588a05shiqian 887db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // MatchAndExplain() takes a Super& (as opposed to const Super&) 888db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // in order to match the interface MatcherInterface<Super&>. 889821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain( 890821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan Super& x, MatchResultListener* listener) const { 891b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "which is located @" << static_cast<const void*>(&x); 892821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return &x == &object_; 893821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 894e35fdd936d133bf8a48de140a3c666897588a05shiqian 895e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 896e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "references the variable "; 897e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<Super&>::Print(object_, os); 898e35fdd936d133bf8a48de140a3c666897588a05shiqian } 899e35fdd936d133bf8a48de140a3c666897588a05shiqian 900e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 901e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "does not reference the variable "; 902e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<Super&>::Print(object_, os); 903e35fdd936d133bf8a48de140a3c666897588a05shiqian } 904e35fdd936d133bf8a48de140a3c666897588a05shiqian 905e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 906e35fdd936d133bf8a48de140a3c666897588a05shiqian const Super& object_; 90732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 90832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 909e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 910e35fdd936d133bf8a48de140a3c666897588a05shiqian 911e35fdd936d133bf8a48de140a3c666897588a05shiqian T& object_; 91232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 91332de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(RefMatcher); 914e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 915e35fdd936d133bf8a48de140a3c666897588a05shiqian 916e35fdd936d133bf8a48de140a3c666897588a05shiqian// Polymorphic helper functions for narrow and wide string matchers. 917e35fdd936d133bf8a48de140a3c666897588a05shiqianinline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { 918e35fdd936d133bf8a48de140a3c666897588a05shiqian return String::CaseInsensitiveCStringEquals(lhs, rhs); 919e35fdd936d133bf8a48de140a3c666897588a05shiqian} 920e35fdd936d133bf8a48de140a3c666897588a05shiqian 921e35fdd936d133bf8a48de140a3c666897588a05shiqianinline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, 922e35fdd936d133bf8a48de140a3c666897588a05shiqian const wchar_t* rhs) { 923e35fdd936d133bf8a48de140a3c666897588a05shiqian return String::CaseInsensitiveWideCStringEquals(lhs, rhs); 924e35fdd936d133bf8a48de140a3c666897588a05shiqian} 925e35fdd936d133bf8a48de140a3c666897588a05shiqian 926e35fdd936d133bf8a48de140a3c666897588a05shiqian// String comparison for narrow or wide strings that can have embedded NUL 927e35fdd936d133bf8a48de140a3c666897588a05shiqian// characters. 928e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 929e35fdd936d133bf8a48de140a3c666897588a05shiqianbool CaseInsensitiveStringEquals(const StringType& s1, 930e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType& s2) { 931e35fdd936d133bf8a48de140a3c666897588a05shiqian // Are the heads equal? 932e35fdd936d133bf8a48de140a3c666897588a05shiqian if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { 933e35fdd936d133bf8a48de140a3c666897588a05shiqian return false; 934e35fdd936d133bf8a48de140a3c666897588a05shiqian } 935e35fdd936d133bf8a48de140a3c666897588a05shiqian 936e35fdd936d133bf8a48de140a3c666897588a05shiqian // Skip the equal heads. 937e35fdd936d133bf8a48de140a3c666897588a05shiqian const typename StringType::value_type nul = 0; 938e35fdd936d133bf8a48de140a3c666897588a05shiqian const size_t i1 = s1.find(nul), i2 = s2.find(nul); 939e35fdd936d133bf8a48de140a3c666897588a05shiqian 940e35fdd936d133bf8a48de140a3c666897588a05shiqian // Are we at the end of either s1 or s2? 941e35fdd936d133bf8a48de140a3c666897588a05shiqian if (i1 == StringType::npos || i2 == StringType::npos) { 942e35fdd936d133bf8a48de140a3c666897588a05shiqian return i1 == i2; 943e35fdd936d133bf8a48de140a3c666897588a05shiqian } 944e35fdd936d133bf8a48de140a3c666897588a05shiqian 945e35fdd936d133bf8a48de140a3c666897588a05shiqian // Are the tails equal? 946e35fdd936d133bf8a48de140a3c666897588a05shiqian return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); 947e35fdd936d133bf8a48de140a3c666897588a05shiqian} 948e35fdd936d133bf8a48de140a3c666897588a05shiqian 949e35fdd936d133bf8a48de140a3c666897588a05shiqian// String matchers. 950e35fdd936d133bf8a48de140a3c666897588a05shiqian 951e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements equality-based string matchers like StrEq, StrCaseNe, and etc. 952e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 953e35fdd936d133bf8a48de140a3c666897588a05shiqianclass StrEqualityMatcher { 954e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 955e35fdd936d133bf8a48de140a3c666897588a05shiqian StrEqualityMatcher(const StringType& str, bool expect_eq, 956e35fdd936d133bf8a48de140a3c666897588a05shiqian bool case_sensitive) 957e35fdd936d133bf8a48de140a3c666897588a05shiqian : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} 958e35fdd936d133bf8a48de140a3c666897588a05shiqian 95938513a8bb154f0b6d0a4088814fe92552696d465jgm // Accepts pointer types, particularly: 96038513a8bb154f0b6d0a4088814fe92552696d465jgm // const char* 96138513a8bb154f0b6d0a4088814fe92552696d465jgm // char* 96238513a8bb154f0b6d0a4088814fe92552696d465jgm // const wchar_t* 96338513a8bb154f0b6d0a4088814fe92552696d465jgm // wchar_t* 96438513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename CharType> 96538513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { 966e35fdd936d133bf8a48de140a3c666897588a05shiqian if (s == NULL) { 967e35fdd936d133bf8a48de140a3c666897588a05shiqian return !expect_eq_; 968e35fdd936d133bf8a48de140a3c666897588a05shiqian } 969db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplain(StringType(s), listener); 970e35fdd936d133bf8a48de140a3c666897588a05shiqian } 971e35fdd936d133bf8a48de140a3c666897588a05shiqian 97238513a8bb154f0b6d0a4088814fe92552696d465jgm // Matches anything that can convert to StringType. 97338513a8bb154f0b6d0a4088814fe92552696d465jgm // 97438513a8bb154f0b6d0a4088814fe92552696d465jgm // This is a template, not just a plain function with const StringType&, 97538513a8bb154f0b6d0a4088814fe92552696d465jgm // because StringPiece has some interfering non-explicit constructors. 97638513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename MatcheeStringType> 97738513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(const MatcheeStringType& s, 978db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 97938513a8bb154f0b6d0a4088814fe92552696d465jgm const StringType& s2(s); 98038513a8bb154f0b6d0a4088814fe92552696d465jgm const bool eq = case_sensitive_ ? s2 == string_ : 98138513a8bb154f0b6d0a4088814fe92552696d465jgm CaseInsensitiveStringEquals(s2, string_); 982e35fdd936d133bf8a48de140a3c666897588a05shiqian return expect_eq_ == eq; 983e35fdd936d133bf8a48de140a3c666897588a05shiqian } 984e35fdd936d133bf8a48de140a3c666897588a05shiqian 985e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 986e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeToHelper(expect_eq_, os); 987e35fdd936d133bf8a48de140a3c666897588a05shiqian } 988e35fdd936d133bf8a48de140a3c666897588a05shiqian 989e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 990e35fdd936d133bf8a48de140a3c666897588a05shiqian DescribeToHelper(!expect_eq_, os); 991e35fdd936d133bf8a48de140a3c666897588a05shiqian } 99232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 993e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 994e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { 995b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << (expect_eq ? "is " : "isn't "); 996e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "equal to "; 997e35fdd936d133bf8a48de140a3c666897588a05shiqian if (!case_sensitive_) { 998e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "(ignoring case) "; 999e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1000e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(string_, os); 1001e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1002e35fdd936d133bf8a48de140a3c666897588a05shiqian 1003e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType string_; 1004e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool expect_eq_; 1005e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool case_sensitive_; 100632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 100732de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); 1008e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1009e35fdd936d133bf8a48de140a3c666897588a05shiqian 1010e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic HasSubstr(substring) matcher, which 1011e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be used as a Matcher<T> as long as T can be converted to a 1012e35fdd936d133bf8a48de140a3c666897588a05shiqian// string. 1013e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 1014e35fdd936d133bf8a48de140a3c666897588a05shiqianclass HasSubstrMatcher { 1015e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1016e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit HasSubstrMatcher(const StringType& substring) 1017e35fdd936d133bf8a48de140a3c666897588a05shiqian : substring_(substring) {} 1018e35fdd936d133bf8a48de140a3c666897588a05shiqian 101938513a8bb154f0b6d0a4088814fe92552696d465jgm // Accepts pointer types, particularly: 102038513a8bb154f0b6d0a4088814fe92552696d465jgm // const char* 102138513a8bb154f0b6d0a4088814fe92552696d465jgm // char* 102238513a8bb154f0b6d0a4088814fe92552696d465jgm // const wchar_t* 102338513a8bb154f0b6d0a4088814fe92552696d465jgm // wchar_t* 102438513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename CharType> 102538513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { 1026db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(StringType(s), listener); 1027e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1028e35fdd936d133bf8a48de140a3c666897588a05shiqian 102938513a8bb154f0b6d0a4088814fe92552696d465jgm // Matches anything that can convert to StringType. 103038513a8bb154f0b6d0a4088814fe92552696d465jgm // 103138513a8bb154f0b6d0a4088814fe92552696d465jgm // This is a template, not just a plain function with const StringType&, 103238513a8bb154f0b6d0a4088814fe92552696d465jgm // because StringPiece has some interfering non-explicit constructors. 103338513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename MatcheeStringType> 103438513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(const MatcheeStringType& s, 1035db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 103638513a8bb154f0b6d0a4088814fe92552696d465jgm const StringType& s2(s); 103738513a8bb154f0b6d0a4088814fe92552696d465jgm return s2.find(substring_) != StringType::npos; 1038e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1039e35fdd936d133bf8a48de140a3c666897588a05shiqian 1040e35fdd936d133bf8a48de140a3c666897588a05shiqian // Describes what this matcher matches. 1041e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1042e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "has substring "; 1043e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(substring_, os); 1044e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1045e35fdd936d133bf8a48de140a3c666897588a05shiqian 1046e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1047e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "has no substring "; 1048e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(substring_, os); 1049e35fdd936d133bf8a48de140a3c666897588a05shiqian } 105032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1051e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1052e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType substring_; 105332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 105432de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); 1055e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1056e35fdd936d133bf8a48de140a3c666897588a05shiqian 1057e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic StartsWith(substring) matcher, which 1058e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be used as a Matcher<T> as long as T can be converted to a 1059e35fdd936d133bf8a48de140a3c666897588a05shiqian// string. 1060e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 1061e35fdd936d133bf8a48de140a3c666897588a05shiqianclass StartsWithMatcher { 1062e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1063e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { 1064e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1065e35fdd936d133bf8a48de140a3c666897588a05shiqian 106638513a8bb154f0b6d0a4088814fe92552696d465jgm // Accepts pointer types, particularly: 106738513a8bb154f0b6d0a4088814fe92552696d465jgm // const char* 106838513a8bb154f0b6d0a4088814fe92552696d465jgm // char* 106938513a8bb154f0b6d0a4088814fe92552696d465jgm // const wchar_t* 107038513a8bb154f0b6d0a4088814fe92552696d465jgm // wchar_t* 107138513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename CharType> 107238513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { 1073db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(StringType(s), listener); 1074e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1075e35fdd936d133bf8a48de140a3c666897588a05shiqian 107638513a8bb154f0b6d0a4088814fe92552696d465jgm // Matches anything that can convert to StringType. 107738513a8bb154f0b6d0a4088814fe92552696d465jgm // 107838513a8bb154f0b6d0a4088814fe92552696d465jgm // This is a template, not just a plain function with const StringType&, 107938513a8bb154f0b6d0a4088814fe92552696d465jgm // because StringPiece has some interfering non-explicit constructors. 108038513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename MatcheeStringType> 108138513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(const MatcheeStringType& s, 1082db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 108338513a8bb154f0b6d0a4088814fe92552696d465jgm const StringType& s2(s); 108438513a8bb154f0b6d0a4088814fe92552696d465jgm return s2.length() >= prefix_.length() && 108538513a8bb154f0b6d0a4088814fe92552696d465jgm s2.substr(0, prefix_.length()) == prefix_; 1086e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1087e35fdd936d133bf8a48de140a3c666897588a05shiqian 1088e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1089e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "starts with "; 1090e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(prefix_, os); 1091e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1092e35fdd936d133bf8a48de140a3c666897588a05shiqian 1093e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1094e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't start with "; 1095e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(prefix_, os); 1096e35fdd936d133bf8a48de140a3c666897588a05shiqian } 109732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1098e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1099e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType prefix_; 110032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 110132de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); 1102e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1103e35fdd936d133bf8a48de140a3c666897588a05shiqian 1104e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic EndsWith(substring) matcher, which 1105e35fdd936d133bf8a48de140a3c666897588a05shiqian// can be used as a Matcher<T> as long as T can be converted to a 1106e35fdd936d133bf8a48de140a3c666897588a05shiqian// string. 1107e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename StringType> 1108e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EndsWithMatcher { 1109e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1110e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} 1111e35fdd936d133bf8a48de140a3c666897588a05shiqian 111238513a8bb154f0b6d0a4088814fe92552696d465jgm // Accepts pointer types, particularly: 111338513a8bb154f0b6d0a4088814fe92552696d465jgm // const char* 111438513a8bb154f0b6d0a4088814fe92552696d465jgm // char* 111538513a8bb154f0b6d0a4088814fe92552696d465jgm // const wchar_t* 111638513a8bb154f0b6d0a4088814fe92552696d465jgm // wchar_t* 111738513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename CharType> 111838513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { 1119db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(StringType(s), listener); 1120e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1121e35fdd936d133bf8a48de140a3c666897588a05shiqian 112238513a8bb154f0b6d0a4088814fe92552696d465jgm // Matches anything that can convert to StringType. 112338513a8bb154f0b6d0a4088814fe92552696d465jgm // 112438513a8bb154f0b6d0a4088814fe92552696d465jgm // This is a template, not just a plain function with const StringType&, 112538513a8bb154f0b6d0a4088814fe92552696d465jgm // because StringPiece has some interfering non-explicit constructors. 112638513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename MatcheeStringType> 112738513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(const MatcheeStringType& s, 1128db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 112938513a8bb154f0b6d0a4088814fe92552696d465jgm const StringType& s2(s); 113038513a8bb154f0b6d0a4088814fe92552696d465jgm return s2.length() >= suffix_.length() && 113138513a8bb154f0b6d0a4088814fe92552696d465jgm s2.substr(s2.length() - suffix_.length()) == suffix_; 1132e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1133e35fdd936d133bf8a48de140a3c666897588a05shiqian 1134e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1135e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "ends with "; 1136e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(suffix_, os); 1137e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1138e35fdd936d133bf8a48de140a3c666897588a05shiqian 1139e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1140e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't end with "; 1141e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(suffix_, os); 1142e35fdd936d133bf8a48de140a3c666897588a05shiqian } 114332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1144e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1145e35fdd936d133bf8a48de140a3c666897588a05shiqian const StringType suffix_; 114632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 114732de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); 1148e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1149e35fdd936d133bf8a48de140a3c666897588a05shiqian 1150e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements polymorphic matchers MatchesRegex(regex) and 1151e35fdd936d133bf8a48de140a3c666897588a05shiqian// ContainsRegex(regex), which can be used as a Matcher<T> as long as 1152e35fdd936d133bf8a48de140a3c666897588a05shiqian// T can be converted to a string. 1153e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatchesRegexMatcher { 1154e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1155e35fdd936d133bf8a48de140a3c666897588a05shiqian MatchesRegexMatcher(const RE* regex, bool full_match) 1156e35fdd936d133bf8a48de140a3c666897588a05shiqian : regex_(regex), full_match_(full_match) {} 1157e35fdd936d133bf8a48de140a3c666897588a05shiqian 115838513a8bb154f0b6d0a4088814fe92552696d465jgm // Accepts pointer types, particularly: 115938513a8bb154f0b6d0a4088814fe92552696d465jgm // const char* 116038513a8bb154f0b6d0a4088814fe92552696d465jgm // char* 116138513a8bb154f0b6d0a4088814fe92552696d465jgm // const wchar_t* 116238513a8bb154f0b6d0a4088814fe92552696d465jgm // wchar_t* 116338513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename CharType> 116438513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { 1165db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return s != NULL && MatchAndExplain(internal::string(s), listener); 1166e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1167e35fdd936d133bf8a48de140a3c666897588a05shiqian 116838513a8bb154f0b6d0a4088814fe92552696d465jgm // Matches anything that can convert to internal::string. 116938513a8bb154f0b6d0a4088814fe92552696d465jgm // 117038513a8bb154f0b6d0a4088814fe92552696d465jgm // This is a template, not just a plain function with const internal::string&, 117138513a8bb154f0b6d0a4088814fe92552696d465jgm // because StringPiece has some interfering non-explicit constructors. 117238513a8bb154f0b6d0a4088814fe92552696d465jgm template <class MatcheeStringType> 117338513a8bb154f0b6d0a4088814fe92552696d465jgm bool MatchAndExplain(const MatcheeStringType& s, 1174db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 117538513a8bb154f0b6d0a4088814fe92552696d465jgm const internal::string& s2(s); 117638513a8bb154f0b6d0a4088814fe92552696d465jgm return full_match_ ? RE::FullMatch(s2, *regex_) : 117738513a8bb154f0b6d0a4088814fe92552696d465jgm RE::PartialMatch(s2, *regex_); 1178e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1179e35fdd936d133bf8a48de140a3c666897588a05shiqian 1180e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1181e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << (full_match_ ? "matches" : "contains") 1182e35fdd936d133bf8a48de140a3c666897588a05shiqian << " regular expression "; 1183e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 1184e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1185e35fdd936d133bf8a48de140a3c666897588a05shiqian 1186e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1187e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't " << (full_match_ ? "match" : "contain") 1188e35fdd936d133bf8a48de140a3c666897588a05shiqian << " regular expression "; 1189e35fdd936d133bf8a48de140a3c666897588a05shiqian UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 1190e35fdd936d133bf8a48de140a3c666897588a05shiqian } 119132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1192e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1193e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::linked_ptr<const RE> regex_; 1194e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool full_match_; 119532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 119632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); 1197e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1198e35fdd936d133bf8a48de140a3c666897588a05shiqian 1199e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements a matcher that compares the two fields of a 2-tuple 1200e35fdd936d133bf8a48de140a3c666897588a05shiqian// using one of the ==, <=, <, etc, operators. The two fields being 1201e35fdd936d133bf8a48de140a3c666897588a05shiqian// compared don't have to have the same type. 1202e35fdd936d133bf8a48de140a3c666897588a05shiqian// 1203e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher defined here is polymorphic (for example, Eq() can be 1204e35fdd936d133bf8a48de140a3c666897588a05shiqian// used to match a tuple<int, short>, a tuple<const long&, double>, 1205e35fdd936d133bf8a48de140a3c666897588a05shiqian// etc). Therefore we use a template type conversion operator in the 1206e35fdd936d133bf8a48de140a3c666897588a05shiqian// implementation. 1207e35fdd936d133bf8a48de140a3c666897588a05shiqian// 1208e35fdd936d133bf8a48de140a3c666897588a05shiqian// We define this as a macro in order to eliminate duplicated source 1209e35fdd936d133bf8a48de140a3c666897588a05shiqian// code. 1210ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan#define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op, relation) \ 1211e35fdd936d133bf8a48de140a3c666897588a05shiqian class name##2Matcher { \ 1212e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 1213e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T1, typename T2> \ 1214ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan operator Matcher< ::std::tr1::tuple<T1, T2> >() const { \ 1215ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return MakeMatcher(new Impl< ::std::tr1::tuple<T1, T2> >); \ 1216ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } \ 1217ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename T1, typename T2> \ 1218e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \ 1219ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return MakeMatcher(new Impl<const ::std::tr1::tuple<T1, T2>&>); \ 1220e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1221e35fdd936d133bf8a48de140a3c666897588a05shiqian private: \ 1222ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename Tuple> \ 1223ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan class Impl : public MatcherInterface<Tuple> { \ 1224e35fdd936d133bf8a48de140a3c666897588a05shiqian public: \ 1225821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain( \ 1226ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Tuple args, \ 1227821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* /* listener */) const { \ 1228e35fdd936d133bf8a48de140a3c666897588a05shiqian return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \ 1229e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1230e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { \ 1231ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "are " relation; \ 1232e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1233e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { \ 1234ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "aren't " relation; \ 1235e35fdd936d133bf8a48de140a3c666897588a05shiqian } \ 1236e35fdd936d133bf8a48de140a3c666897588a05shiqian }; \ 1237e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1238e35fdd936d133bf8a48de140a3c666897588a05shiqian 1239e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively. 1240ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==, "an equal pair"); 1241ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1242ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Ge, >=, "a pair where the first >= the second"); 1243ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1244ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Gt, >, "a pair where the first > the second"); 1245ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1246ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Le, <=, "a pair where the first <= the second"); 1247ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_( 1248ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Lt, <, "a pair where the first < the second"); 1249ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=, "an unequal pair"); 1250e35fdd936d133bf8a48de140a3c666897588a05shiqian 1251e0d051ea64dd5f32d5b6af9831747d1acb2a9c40zhanyong.wan#undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_ 1252e35fdd936d133bf8a48de140a3c666897588a05shiqian 1253c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Implements the Not(...) matcher for a particular argument type T. 1254c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// We do not nest it inside the NotMatcher class template, as that 1255c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// will prevent different instantiations of NotMatcher from sharing 1256c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// the same NotMatcherImpl<T> class. 1257c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wantemplate <typename T> 1258c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanclass NotMatcherImpl : public MatcherInterface<T> { 1259c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan public: 1260c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan explicit NotMatcherImpl(const Matcher<T>& matcher) 1261c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan : matcher_(matcher) {} 1262c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1263821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1264821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return !matcher_.MatchAndExplain(x, listener); 1265c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1266c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1267c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 1268c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher_.DescribeNegationTo(os); 1269c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1270c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1271c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 1272c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher_.DescribeTo(os); 1273c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1274c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1275c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan private: 1276c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher_; 127732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 127832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); 1279c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan}; 1280c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1281e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Not(m) matcher, which matches a value that doesn't 1282e35fdd936d133bf8a48de140a3c666897588a05shiqian// match matcher m. 1283e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 1284e35fdd936d133bf8a48de140a3c666897588a05shiqianclass NotMatcher { 1285e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1286e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {} 1287e35fdd936d133bf8a48de140a3c666897588a05shiqian 1288e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template type conversion operator allows Not(m) to be used 1289e35fdd936d133bf8a48de140a3c666897588a05shiqian // to match any type m can match. 1290e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1291e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 1292c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_))); 1293e35fdd936d133bf8a48de140a3c666897588a05shiqian } 129432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1295e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1296c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan InnerMatcher matcher_; 129732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 129832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(NotMatcher); 1299c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan}; 1300e35fdd936d133bf8a48de140a3c666897588a05shiqian 1301c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Implements the AllOf(m1, m2) matcher for a particular argument type 1302c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// T. We do not nest it inside the BothOfMatcher class template, as 1303c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// that will prevent different instantiations of BothOfMatcher from 1304c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// sharing the same BothOfMatcherImpl<T> class. 1305c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wantemplate <typename T> 1306c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanclass BothOfMatcherImpl : public MatcherInterface<T> { 1307c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan public: 1308c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 1309c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan : matcher1_(matcher1), matcher2_(matcher2) {} 1310e35fdd936d133bf8a48de140a3c666897588a05shiqian 1311c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 1312c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << "("; 1313c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher1_.DescribeTo(os); 1314c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ") and ("; 1315c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher2_.DescribeTo(os); 1316c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ")"; 1317c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1318e35fdd936d133bf8a48de140a3c666897588a05shiqian 1319c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 1320b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "("; 1321b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher1_.DescribeNegationTo(os); 1322b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ") or ("; 1323b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher2_.DescribeNegationTo(os); 1324b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ")"; 1325c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1326e35fdd936d133bf8a48de140a3c666897588a05shiqian 1327821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1328821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If either matcher1_ or matcher2_ doesn't match x, we only need 1329821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // to explain why one of them fails. 1330821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener1; 1331821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!matcher1_.MatchAndExplain(x, &listener1)) { 1332821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener1.str(); 1333821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1334821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1335c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1336821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener2; 1337821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!matcher2_.MatchAndExplain(x, &listener2)) { 1338821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener2.str(); 1339821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1340821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1341c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1342821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Otherwise we need to explain why *both* of them match. 1343821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s1 = listener1.str(); 1344821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s2 = listener2.str(); 1345821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1346821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s1 == "") { 1347821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s2; 1348c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } else { 1349821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s1; 1350821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s2 != "") { 1351b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << ", and " << s2; 1352c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1353c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1354821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 1355c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 135632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1357c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan private: 1358c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher1_; 1359c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher2_; 136032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 136132de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); 1362e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1363e35fdd936d133bf8a48de140a3c666897588a05shiqian 1364e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing the AllOf(m_1, ..., m_n) matcher, which 1365e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a value that matches all of the matchers m_1, ..., and m_n. 1366e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Matcher1, typename Matcher2> 1367e35fdd936d133bf8a48de140a3c666897588a05shiqianclass BothOfMatcher { 1368e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1369e35fdd936d133bf8a48de140a3c666897588a05shiqian BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 1370e35fdd936d133bf8a48de140a3c666897588a05shiqian : matcher1_(matcher1), matcher2_(matcher2) {} 1371e35fdd936d133bf8a48de140a3c666897588a05shiqian 1372e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template type conversion operator allows a 1373e35fdd936d133bf8a48de140a3c666897588a05shiqian // BothOfMatcher<Matcher1, Matcher2> object to match any type that 1374e35fdd936d133bf8a48de140a3c666897588a05shiqian // both Matcher1 and Matcher2 can match. 1375e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1376e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 1377c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_), 1378c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan SafeMatcherCast<T>(matcher2_))); 1379e35fdd936d133bf8a48de140a3c666897588a05shiqian } 138032de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1381e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1382c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Matcher1 matcher1_; 1383c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan Matcher2 matcher2_; 138432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 138532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(BothOfMatcher); 1386c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan}; 1387e35fdd936d133bf8a48de140a3c666897588a05shiqian 1388c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// Implements the AnyOf(m1, m2) matcher for a particular argument type 1389c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// T. We do not nest it inside the AnyOfMatcher class template, as 1390c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// that will prevent different instantiations of AnyOfMatcher from 1391c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan// sharing the same EitherOfMatcherImpl<T> class. 1392c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wantemplate <typename T> 1393c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wanclass EitherOfMatcherImpl : public MatcherInterface<T> { 1394c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan public: 1395c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 1396c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan : matcher1_(matcher1), matcher2_(matcher2) {} 1397e35fdd936d133bf8a48de140a3c666897588a05shiqian 1398c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 1399c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << "("; 1400c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher1_.DescribeTo(os); 1401c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ") or ("; 1402c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan matcher2_.DescribeTo(os); 1403c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan *os << ")"; 1404c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1405e35fdd936d133bf8a48de140a3c666897588a05shiqian 1406c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 1407b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "("; 1408b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher1_.DescribeNegationTo(os); 1409b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ") and ("; 1410b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher2_.DescribeNegationTo(os); 1411b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << ")"; 1412c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 1413c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1414821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1415821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // If either matcher1_ or matcher2_ matches x, we just need to 1416821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // explain why *one* of them matches. 1417821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener1; 1418821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (matcher1_.MatchAndExplain(x, &listener1)) { 1419821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener1.str(); 1420821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 1421821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1422c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1423821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener2; 1424821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (matcher2_.MatchAndExplain(x, &listener2)) { 1425821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << listener2.str(); 1426821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 1427821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 1428c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan 1429821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Otherwise we need to explain why *both* of them fail. 1430821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s1 = listener1.str(); 1431821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string s2 = listener2.str(); 1432821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1433821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s1 == "") { 1434821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s2; 1435821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } else { 1436821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan *listener << s1; 1437821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (s2 != "") { 1438b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << ", and " << s2; 1439e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1440e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1441821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1442c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan } 144332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1444c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan private: 1445c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher1_; 1446c6a412397bc98f120d5e79d4a64e3972854b5af3zhanyong.wan const Matcher<T> matcher2_; 144732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 144832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl); 1449e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1450e35fdd936d133bf8a48de140a3c666897588a05shiqian 1451e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which 1452e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a value that matches at least one of the matchers m_1, ..., 1453e35fdd936d133bf8a48de140a3c666897588a05shiqian// and m_n. 1454e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Matcher1, typename Matcher2> 1455e35fdd936d133bf8a48de140a3c666897588a05shiqianclass EitherOfMatcher { 1456e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1457e35fdd936d133bf8a48de140a3c666897588a05shiqian EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 1458e35fdd936d133bf8a48de140a3c666897588a05shiqian : matcher1_(matcher1), matcher2_(matcher2) {} 1459e35fdd936d133bf8a48de140a3c666897588a05shiqian 1460e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template type conversion operator allows a 1461e35fdd936d133bf8a48de140a3c666897588a05shiqian // EitherOfMatcher<Matcher1, Matcher2> object to match any type that 1462e35fdd936d133bf8a48de140a3c666897588a05shiqian // both Matcher1 and Matcher2 can match. 1463e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1464e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 146516cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan return Matcher<T>(new EitherOfMatcherImpl<T>( 146616cf473930c01cd7a1a51dff65f22c541fbad5b8zhanyong.wan SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_))); 1467e35fdd936d133bf8a48de140a3c666897588a05shiqian } 146832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1469e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1470e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher1 matcher1_; 1471e35fdd936d133bf8a48de140a3c666897588a05shiqian Matcher2 matcher2_; 147232de5f53763125925e078498250f7e73a88de9edzhanyong.wan 147332de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(EitherOfMatcher); 1474e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1475e35fdd936d133bf8a48de140a3c666897588a05shiqian 1476e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing Truly(pred), which turns a predicate into a 1477e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher. 1478e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Predicate> 1479e35fdd936d133bf8a48de140a3c666897588a05shiqianclass TrulyMatcher { 1480e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1481e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit TrulyMatcher(Predicate pred) : predicate_(pred) {} 1482e35fdd936d133bf8a48de140a3c666897588a05shiqian 1483e35fdd936d133bf8a48de140a3c666897588a05shiqian // This method template allows Truly(pred) to be used as a matcher 1484e35fdd936d133bf8a48de140a3c666897588a05shiqian // for type T where T is the argument type of predicate 'pred'. The 1485e35fdd936d133bf8a48de140a3c666897588a05shiqian // argument is passed by reference as the predicate may be 1486e35fdd936d133bf8a48de140a3c666897588a05shiqian // interested in the address of the argument. 1487e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1488db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(T& x, // NOLINT 1489db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* /* listener */) const { 14908d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan // Without the if-statement, MSVC sometimes warns about converting 14918d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan // a value to bool (warning 4800). 14928d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan // 14938d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan // We cannot write 'return !!predicate_(x);' as that doesn't work 14948d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan // when predicate_(x) returns a class convertible to bool but 14958d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan // having no operator!(). 14968d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan if (predicate_(x)) 14978d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan return true; 14988d3dc0cdd870ecc53d8a8ba30566b3cd70910863zhanyong.wan return false; 1499e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1500e35fdd936d133bf8a48de140a3c666897588a05shiqian 1501e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1502e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "satisfies the given predicate"; 1503e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1504e35fdd936d133bf8a48de140a3c666897588a05shiqian 1505e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1506e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "doesn't satisfy the given predicate"; 1507e35fdd936d133bf8a48de140a3c666897588a05shiqian } 150832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1509e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1510e35fdd936d133bf8a48de140a3c666897588a05shiqian Predicate predicate_; 151132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 151232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(TrulyMatcher); 1513e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1514e35fdd936d133bf8a48de140a3c666897588a05shiqian 1515e35fdd936d133bf8a48de140a3c666897588a05shiqian// Used for implementing Matches(matcher), which turns a matcher into 1516e35fdd936d133bf8a48de140a3c666897588a05shiqian// a predicate. 1517e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 1518e35fdd936d133bf8a48de140a3c666897588a05shiqianclass MatcherAsPredicate { 1519e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1520e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {} 1521e35fdd936d133bf8a48de140a3c666897588a05shiqian 1522e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template operator() allows Matches(m) to be used as a 1523e35fdd936d133bf8a48de140a3c666897588a05shiqian // predicate on type T where m is a matcher on type T. 1524e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1525e35fdd936d133bf8a48de140a3c666897588a05shiqian // The argument x is passed by reference instead of by value, as 1526e35fdd936d133bf8a48de140a3c666897588a05shiqian // some matcher may be interested in its address (e.g. as in 1527e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matches(Ref(n))(x)). 1528e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1529e35fdd936d133bf8a48de140a3c666897588a05shiqian bool operator()(const T& x) const { 1530e35fdd936d133bf8a48de140a3c666897588a05shiqian // We let matcher_ commit to a particular type here instead of 1531e35fdd936d133bf8a48de140a3c666897588a05shiqian // when the MatcherAsPredicate object was constructed. This 1532e35fdd936d133bf8a48de140a3c666897588a05shiqian // allows us to write Matches(m) where m is a polymorphic matcher 1533e35fdd936d133bf8a48de140a3c666897588a05shiqian // (e.g. Eq(5)). 1534e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1535e35fdd936d133bf8a48de140a3c666897588a05shiqian // If we write Matcher<T>(matcher_).Matches(x) here, it won't 1536e35fdd936d133bf8a48de140a3c666897588a05shiqian // compile when matcher_ has type Matcher<const T&>; if we write 1537e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<const T&>(matcher_).Matches(x) here, it won't compile 1538e35fdd936d133bf8a48de140a3c666897588a05shiqian // when matcher_ has type Matcher<T>; if we just write 1539e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_.Matches(x), it won't compile when matcher_ is 1540e35fdd936d133bf8a48de140a3c666897588a05shiqian // polymorphic, e.g. Eq(5). 1541e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1542e35fdd936d133bf8a48de140a3c666897588a05shiqian // MatcherCast<const T&>() is necessary for making the code work 1543e35fdd936d133bf8a48de140a3c666897588a05shiqian // in all of the above situations. 1544e35fdd936d133bf8a48de140a3c666897588a05shiqian return MatcherCast<const T&>(matcher_).Matches(x); 1545e35fdd936d133bf8a48de140a3c666897588a05shiqian } 154632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1547e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1548e35fdd936d133bf8a48de140a3c666897588a05shiqian M matcher_; 154932de5f53763125925e078498250f7e73a88de9edzhanyong.wan 155032de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate); 1551e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1552e35fdd936d133bf8a48de140a3c666897588a05shiqian 1553e35fdd936d133bf8a48de140a3c666897588a05shiqian// For implementing ASSERT_THAT() and EXPECT_THAT(). The template 1554e35fdd936d133bf8a48de140a3c666897588a05shiqian// argument M must be a type that can be converted to a matcher. 1555e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 1556e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PredicateFormatterFromMatcher { 1557e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1558e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {} 1559e35fdd936d133bf8a48de140a3c666897588a05shiqian 1560e35fdd936d133bf8a48de140a3c666897588a05shiqian // This template () operator allows a PredicateFormatterFromMatcher 1561e35fdd936d133bf8a48de140a3c666897588a05shiqian // object to act as a predicate-formatter suitable for using with 1562e35fdd936d133bf8a48de140a3c666897588a05shiqian // Google Test's EXPECT_PRED_FORMAT1() macro. 1563e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1564e35fdd936d133bf8a48de140a3c666897588a05shiqian AssertionResult operator()(const char* value_text, const T& x) const { 1565e35fdd936d133bf8a48de140a3c666897588a05shiqian // We convert matcher_ to a Matcher<const T&> *now* instead of 1566e35fdd936d133bf8a48de140a3c666897588a05shiqian // when the PredicateFormatterFromMatcher object was constructed, 1567e35fdd936d133bf8a48de140a3c666897588a05shiqian // as matcher_ may be polymorphic (e.g. NotNull()) and we won't 1568e35fdd936d133bf8a48de140a3c666897588a05shiqian // know which type to instantiate it to until we actually see the 1569e35fdd936d133bf8a48de140a3c666897588a05shiqian // type of x here. 1570e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1571e35fdd936d133bf8a48de140a3c666897588a05shiqian // We write MatcherCast<const T&>(matcher_) instead of 1572e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<const T&>(matcher_), as the latter won't compile when 1573e35fdd936d133bf8a48de140a3c666897588a05shiqian // matcher_ has type Matcher<T> (e.g. An<int>()). 1574e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const T&> matcher = MatcherCast<const T&>(matcher_); 1575821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener listener; 1576b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan if (MatchPrintAndExplain(x, matcher, &listener)) 1577e35fdd936d133bf8a48de140a3c666897588a05shiqian return AssertionSuccess(); 1578b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan 1579b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ::std::stringstream ss; 1580b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ss << "Value of: " << value_text << "\n" 1581b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan << "Expected: "; 1582b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan matcher.DescribeTo(&ss); 1583b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan ss << "\n Actual: " << listener.str(); 1584b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan return AssertionFailure() << ss.str(); 1585e35fdd936d133bf8a48de140a3c666897588a05shiqian } 158632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1587e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1588e35fdd936d133bf8a48de140a3c666897588a05shiqian const M matcher_; 158932de5f53763125925e078498250f7e73a88de9edzhanyong.wan 159032de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher); 1591e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1592e35fdd936d133bf8a48de140a3c666897588a05shiqian 1593e35fdd936d133bf8a48de140a3c666897588a05shiqian// A helper function for converting a matcher to a predicate-formatter 1594e35fdd936d133bf8a48de140a3c666897588a05shiqian// without the user needing to explicitly write the type. This is 1595e35fdd936d133bf8a48de140a3c666897588a05shiqian// used for implementing ASSERT_THAT() and EXPECT_THAT(). 1596e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 1597e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PredicateFormatterFromMatcher<M> 1598e35fdd936d133bf8a48de140a3c666897588a05shiqianMakePredicateFormatterFromMatcher(const M& matcher) { 1599e35fdd936d133bf8a48de140a3c666897588a05shiqian return PredicateFormatterFromMatcher<M>(matcher); 1600e35fdd936d133bf8a48de140a3c666897588a05shiqian} 1601e35fdd936d133bf8a48de140a3c666897588a05shiqian 1602e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the polymorphic floating point equality matcher, which 1603e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches two float values using ULP-based approximation. The 1604e35fdd936d133bf8a48de140a3c666897588a05shiqian// template is meant to be instantiated with FloatType being either 1605e35fdd936d133bf8a48de140a3c666897588a05shiqian// float or double. 1606e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename FloatType> 1607e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FloatingEqMatcher { 1608e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1609e35fdd936d133bf8a48de140a3c666897588a05shiqian // Constructor for FloatingEqMatcher. 1610e35fdd936d133bf8a48de140a3c666897588a05shiqian // The matcher's input will be compared with rhs. The matcher treats two 1611e35fdd936d133bf8a48de140a3c666897588a05shiqian // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards, 1612e35fdd936d133bf8a48de140a3c666897588a05shiqian // equality comparisons between NANs will always return false. 1613e35fdd936d133bf8a48de140a3c666897588a05shiqian FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) : 1614e35fdd936d133bf8a48de140a3c666897588a05shiqian rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 1615e35fdd936d133bf8a48de140a3c666897588a05shiqian 1616e35fdd936d133bf8a48de140a3c666897588a05shiqian // Implements floating point equality matcher as a Matcher<T>. 1617e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1618e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<T> { 1619e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1620e35fdd936d133bf8a48de140a3c666897588a05shiqian Impl(FloatType rhs, bool nan_eq_nan) : 1621e35fdd936d133bf8a48de140a3c666897588a05shiqian rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 1622e35fdd936d133bf8a48de140a3c666897588a05shiqian 1623821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T value, 1624821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* /* listener */) const { 1625e35fdd936d133bf8a48de140a3c666897588a05shiqian const FloatingPoint<FloatType> lhs(value), rhs(rhs_); 1626e35fdd936d133bf8a48de140a3c666897588a05shiqian 1627e35fdd936d133bf8a48de140a3c666897588a05shiqian // Compares NaNs first, if nan_eq_nan_ is true. 1628e35fdd936d133bf8a48de140a3c666897588a05shiqian if (nan_eq_nan_ && lhs.is_nan()) { 1629e35fdd936d133bf8a48de140a3c666897588a05shiqian return rhs.is_nan(); 1630e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1631e35fdd936d133bf8a48de140a3c666897588a05shiqian 1632e35fdd936d133bf8a48de140a3c666897588a05shiqian return lhs.AlmostEquals(rhs); 1633e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1634e35fdd936d133bf8a48de140a3c666897588a05shiqian 1635e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 1636e35fdd936d133bf8a48de140a3c666897588a05shiqian // os->precision() returns the previously set precision, which we 1637e35fdd936d133bf8a48de140a3c666897588a05shiqian // store to restore the ostream to its original configuration 1638e35fdd936d133bf8a48de140a3c666897588a05shiqian // after outputting. 1639e35fdd936d133bf8a48de140a3c666897588a05shiqian const ::std::streamsize old_precision = os->precision( 1640e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::numeric_limits<FloatType>::digits10 + 2); 1641e35fdd936d133bf8a48de140a3c666897588a05shiqian if (FloatingPoint<FloatType>(rhs_).is_nan()) { 1642e35fdd936d133bf8a48de140a3c666897588a05shiqian if (nan_eq_nan_) { 1643e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is NaN"; 1644e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1645e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "never matches"; 1646e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1647e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1648e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is approximately " << rhs_; 1649e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1650e35fdd936d133bf8a48de140a3c666897588a05shiqian os->precision(old_precision); 1651e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1652e35fdd936d133bf8a48de140a3c666897588a05shiqian 1653e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 1654e35fdd936d133bf8a48de140a3c666897588a05shiqian // As before, get original precision. 1655e35fdd936d133bf8a48de140a3c666897588a05shiqian const ::std::streamsize old_precision = os->precision( 1656e35fdd936d133bf8a48de140a3c666897588a05shiqian ::std::numeric_limits<FloatType>::digits10 + 2); 1657e35fdd936d133bf8a48de140a3c666897588a05shiqian if (FloatingPoint<FloatType>(rhs_).is_nan()) { 1658e35fdd936d133bf8a48de140a3c666897588a05shiqian if (nan_eq_nan_) { 1659b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't NaN"; 1660e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1661e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "is anything"; 1662e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1663e35fdd936d133bf8a48de140a3c666897588a05shiqian } else { 1664b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't approximately " << rhs_; 1665e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1666e35fdd936d133bf8a48de140a3c666897588a05shiqian // Restore original precision. 1667e35fdd936d133bf8a48de140a3c666897588a05shiqian os->precision(old_precision); 1668e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1669e35fdd936d133bf8a48de140a3c666897588a05shiqian 1670e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1671e35fdd936d133bf8a48de140a3c666897588a05shiqian const FloatType rhs_; 1672e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool nan_eq_nan_; 167332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 167432de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 1675e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 1676e35fdd936d133bf8a48de140a3c666897588a05shiqian 1677e35fdd936d133bf8a48de140a3c666897588a05shiqian // The following 3 type conversion operators allow FloatEq(rhs) and 1678e35fdd936d133bf8a48de140a3c666897588a05shiqian // NanSensitiveFloatEq(rhs) to be used as a Matcher<float>, a 1679e35fdd936d133bf8a48de140a3c666897588a05shiqian // Matcher<const float&>, or a Matcher<float&>, but nothing else. 1680e35fdd936d133bf8a48de140a3c666897588a05shiqian // (While Google's C++ coding style doesn't allow arguments passed 1681e35fdd936d133bf8a48de140a3c666897588a05shiqian // by non-const reference, we may see them in code not conforming to 1682e35fdd936d133bf8a48de140a3c666897588a05shiqian // the style. Therefore Google Mock needs to support them.) 1683e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<FloatType>() const { 1684e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<FloatType>(rhs_, nan_eq_nan_)); 1685e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1686e35fdd936d133bf8a48de140a3c666897588a05shiqian 1687e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<const FloatType&>() const { 1688e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<const FloatType&>(rhs_, nan_eq_nan_)); 1689e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1690e35fdd936d133bf8a48de140a3c666897588a05shiqian 1691e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<FloatType&>() const { 1692e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_)); 1693e35fdd936d133bf8a48de140a3c666897588a05shiqian } 169479a367eb217fcd47e2beaf8c0f87fe6d5926f739jgm 1695e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1696e35fdd936d133bf8a48de140a3c666897588a05shiqian const FloatType rhs_; 1697e35fdd936d133bf8a48de140a3c666897588a05shiqian const bool nan_eq_nan_; 169832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 169932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher); 1700e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1701e35fdd936d133bf8a48de140a3c666897588a05shiqian 1702e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Pointee(m) matcher for matching a pointer whose 1703e35fdd936d133bf8a48de140a3c666897588a05shiqian// pointee matches matcher m. The pointer can be either raw or smart. 1704e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 1705e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PointeeMatcher { 1706e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1707e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {} 1708e35fdd936d133bf8a48de140a3c666897588a05shiqian 1709e35fdd936d133bf8a48de140a3c666897588a05shiqian // This type conversion operator template allows Pointee(m) to be 1710e35fdd936d133bf8a48de140a3c666897588a05shiqian // used as a matcher for any pointer type whose pointee type is 1711e35fdd936d133bf8a48de140a3c666897588a05shiqian // compatible with the inner matcher, where type Pointer can be 1712e35fdd936d133bf8a48de140a3c666897588a05shiqian // either a raw pointer or a smart pointer. 1713e35fdd936d133bf8a48de140a3c666897588a05shiqian // 1714e35fdd936d133bf8a48de140a3c666897588a05shiqian // The reason we do this instead of relying on 1715e35fdd936d133bf8a48de140a3c666897588a05shiqian // MakePolymorphicMatcher() is that the latter is not flexible 1716e35fdd936d133bf8a48de140a3c666897588a05shiqian // enough for implementing the DescribeTo() method of Pointee(). 1717e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Pointer> 1718e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<Pointer>() const { 1719e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakeMatcher(new Impl<Pointer>(matcher_)); 1720e35fdd936d133bf8a48de140a3c666897588a05shiqian } 172132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1722e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1723e35fdd936d133bf8a48de140a3c666897588a05shiqian // The monomorphic implementation that works for a particular pointer type. 1724e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename Pointer> 1725e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<Pointer> { 1726e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 172702f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef typename PointeeOf<GTEST_REMOVE_CONST_( // NOLINT 172802f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee; 1729e35fdd936d133bf8a48de140a3c666897588a05shiqian 1730e35fdd936d133bf8a48de140a3c666897588a05shiqian explicit Impl(const InnerMatcher& matcher) 1731e35fdd936d133bf8a48de140a3c666897588a05shiqian : matcher_(MatcherCast<const Pointee&>(matcher)) {} 1732e35fdd936d133bf8a48de140a3c666897588a05shiqian 1733e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 1734e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "points to a value that "; 1735e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1736e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1737e35fdd936d133bf8a48de140a3c666897588a05shiqian 1738e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 1739e35fdd936d133bf8a48de140a3c666897588a05shiqian *os << "does not point to a value that "; 1740e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1741e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1742e35fdd936d133bf8a48de140a3c666897588a05shiqian 1743821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(Pointer pointer, 1744821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 1745e35fdd936d133bf8a48de140a3c666897588a05shiqian if (GetRawPointer(pointer) == NULL) 1746821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1747e35fdd936d133bf8a48de140a3c666897588a05shiqian 1748676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which points to "; 1749676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(*pointer, matcher_, listener); 1750e35fdd936d133bf8a48de140a3c666897588a05shiqian } 175132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1752e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1753e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const Pointee&> matcher_; 175432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 175532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 1756e35fdd936d133bf8a48de140a3c666897588a05shiqian }; 1757e35fdd936d133bf8a48de140a3c666897588a05shiqian 1758e35fdd936d133bf8a48de140a3c666897588a05shiqian const InnerMatcher matcher_; 175932de5f53763125925e078498250f7e73a88de9edzhanyong.wan 176032de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PointeeMatcher); 1761e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1762e35fdd936d133bf8a48de140a3c666897588a05shiqian 1763e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Field() matcher for matching a field (i.e. member 1764e35fdd936d133bf8a48de140a3c666897588a05shiqian// variable) of an object. 1765e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename FieldType> 1766e35fdd936d133bf8a48de140a3c666897588a05shiqianclass FieldMatcher { 1767e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1768e35fdd936d133bf8a48de140a3c666897588a05shiqian FieldMatcher(FieldType Class::*field, 1769e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const FieldType&>& matcher) 1770e35fdd936d133bf8a48de140a3c666897588a05shiqian : field_(field), matcher_(matcher) {} 1771e35fdd936d133bf8a48de140a3c666897588a05shiqian 1772e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1773676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given field "; 1774e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1775e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1776e35fdd936d133bf8a48de140a3c666897588a05shiqian 1777e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1778676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given field "; 1779e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeNegationTo(os); 1780e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1781e35fdd936d133bf8a48de140a3c666897588a05shiqian 1782db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan template <typename T> 1783db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const T& value, MatchResultListener* listener) const { 1784db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl( 1785db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan typename ::testing::internal:: 178602f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 1787db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan value, listener); 1788db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 1789db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan 1790db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan private: 1791db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // The first argument of MatchAndExplainImpl() is needed to help 179218490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Symbian's C++ compiler choose which overload to use. Its type is 179318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // true_type iff the Field() matcher is used to match a pointer. 1794db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 1795db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1796676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose given field is "; 1797676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(obj.*field_, matcher_, listener); 1798e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1799e35fdd936d133bf8a48de140a3c666897588a05shiqian 1800db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 1801db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1802821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (p == NULL) 1803821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1804821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1805676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which points to an object "; 1806821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Since *p has a field, it must be a class/struct/union type and 1807821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // thus cannot be a pointer. Therefore we pass false_type() as 1808821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // the first argument. 1809db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl(false_type(), *p, listener); 1810e35fdd936d133bf8a48de140a3c666897588a05shiqian } 181132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1812e35fdd936d133bf8a48de140a3c666897588a05shiqian const FieldType Class::*field_; 1813e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<const FieldType&> matcher_; 181432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 181532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(FieldMatcher); 1816e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1817e35fdd936d133bf8a48de140a3c666897588a05shiqian 1818e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the Property() matcher for matching a property 1819e35fdd936d133bf8a48de140a3c666897588a05shiqian// (i.e. return value of a getter method) of an object. 1820e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename PropertyType> 1821e35fdd936d133bf8a48de140a3c666897588a05shiqianclass PropertyMatcher { 1822e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1823e35fdd936d133bf8a48de140a3c666897588a05shiqian // The property may have a reference type, so 'const PropertyType&' 1824e35fdd936d133bf8a48de140a3c666897588a05shiqian // may cause double references and fail to compile. That's why we 182502f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan // need GTEST_REFERENCE_TO_CONST, which works regardless of 1826e35fdd936d133bf8a48de140a3c666897588a05shiqian // PropertyType being a reference or not. 182702f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; 1828e35fdd936d133bf8a48de140a3c666897588a05shiqian 1829e35fdd936d133bf8a48de140a3c666897588a05shiqian PropertyMatcher(PropertyType (Class::*property)() const, 1830e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<RefToConstProperty>& matcher) 1831e35fdd936d133bf8a48de140a3c666897588a05shiqian : property_(property), matcher_(matcher) {} 1832e35fdd936d133bf8a48de140a3c666897588a05shiqian 1833e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeTo(::std::ostream* os) const { 1834676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given property "; 1835e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1836e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1837e35fdd936d133bf8a48de140a3c666897588a05shiqian 1838e35fdd936d133bf8a48de140a3c666897588a05shiqian void DescribeNegationTo(::std::ostream* os) const { 1839676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is an object whose given property "; 1840e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeNegationTo(os); 1841e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1842e35fdd936d133bf8a48de140a3c666897588a05shiqian 1843db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan template <typename T> 1844db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplain(const T&value, MatchResultListener* listener) const { 1845db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl( 1846db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan typename ::testing::internal:: 184702f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 1848db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan value, listener); 1849db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan } 1850db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan 1851db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan private: 1852db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan // The first argument of MatchAndExplainImpl() is needed to help 185318490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // Symbian's C++ compiler choose which overload to use. Its type is 185418490653e80d484b4650d8799184fd1e021efc7bzhanyong.wan // true_type iff the Property() matcher is used to match a pointer. 1855db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 1856db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1857676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose given property is "; 1858676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // Cannot pass the return value (for example, int) to MatchPrintAndExplain, 1859676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // which takes a non-const reference as argument. 1860676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan RefToConstProperty result = (obj.*property_)(); 1861676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(result, matcher_, listener); 1862e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1863e35fdd936d133bf8a48de140a3c666897588a05shiqian 1864db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 1865db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan MatchResultListener* listener) const { 1866821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (p == NULL) 1867821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 1868821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 1869676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which points to an object "; 1870821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Since *p has a property method, it must be a class/struct/union 1871821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // type and thus cannot be a pointer. Therefore we pass 1872821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // false_type() as the first argument. 1873db22c227826b82e1ad05d6c47facfef73c99e057zhanyong.wan return MatchAndExplainImpl(false_type(), *p, listener); 1874e35fdd936d133bf8a48de140a3c666897588a05shiqian } 187532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1876e35fdd936d133bf8a48de140a3c666897588a05shiqian PropertyType (Class::*property_)() const; 1877e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<RefToConstProperty> matcher_; 187832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 187932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PropertyMatcher); 1880e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1881e35fdd936d133bf8a48de140a3c666897588a05shiqian 1882e35fdd936d133bf8a48de140a3c666897588a05shiqian// Type traits specifying various features of different functors for ResultOf. 1883e35fdd936d133bf8a48de140a3c666897588a05shiqian// The default template specifies features for functor objects. 1884e35fdd936d133bf8a48de140a3c666897588a05shiqian// Functor classes have to typedef argument_type and result_type 1885e35fdd936d133bf8a48de140a3c666897588a05shiqian// to be compatible with ResultOf. 1886e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Functor> 1887e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct CallableTraits { 1888e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename Functor::result_type ResultType; 1889e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef Functor StorageType; 1890e35fdd936d133bf8a48de140a3c666897588a05shiqian 189132de5f53763125925e078498250f7e73a88de9edzhanyong.wan static void CheckIsValid(Functor /* functor */) {} 1892e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1893e35fdd936d133bf8a48de140a3c666897588a05shiqian static ResultType Invoke(Functor f, T arg) { return f(arg); } 1894e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1895e35fdd936d133bf8a48de140a3c666897588a05shiqian 1896e35fdd936d133bf8a48de140a3c666897588a05shiqian// Specialization for function pointers. 1897e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename ArgType, typename ResType> 1898e35fdd936d133bf8a48de140a3c666897588a05shiqianstruct CallableTraits<ResType(*)(ArgType)> { 1899e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef ResType ResultType; 1900e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef ResType(*StorageType)(ArgType); 1901e35fdd936d133bf8a48de140a3c666897588a05shiqian 1902e35fdd936d133bf8a48de140a3c666897588a05shiqian static void CheckIsValid(ResType(*f)(ArgType)) { 1903f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan GTEST_CHECK_(f != NULL) 1904e35fdd936d133bf8a48de140a3c666897588a05shiqian << "NULL function pointer is passed into ResultOf()."; 1905e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1906e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1907e35fdd936d133bf8a48de140a3c666897588a05shiqian static ResType Invoke(ResType(*f)(ArgType), T arg) { 1908e35fdd936d133bf8a48de140a3c666897588a05shiqian return (*f)(arg); 1909e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1910e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1911e35fdd936d133bf8a48de140a3c666897588a05shiqian 1912e35fdd936d133bf8a48de140a3c666897588a05shiqian// Implements the ResultOf() matcher for matching a return value of a 1913e35fdd936d133bf8a48de140a3c666897588a05shiqian// unary function of an object. 1914e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Callable> 1915e35fdd936d133bf8a48de140a3c666897588a05shiqianclass ResultOfMatcher { 1916e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1917e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename CallableTraits<Callable>::ResultType ResultType; 1918e35fdd936d133bf8a48de140a3c666897588a05shiqian 1919e35fdd936d133bf8a48de140a3c666897588a05shiqian ResultOfMatcher(Callable callable, const Matcher<ResultType>& matcher) 1920e35fdd936d133bf8a48de140a3c666897588a05shiqian : callable_(callable), matcher_(matcher) { 1921e35fdd936d133bf8a48de140a3c666897588a05shiqian CallableTraits<Callable>::CheckIsValid(callable_); 1922e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1923e35fdd936d133bf8a48de140a3c666897588a05shiqian 1924e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1925e35fdd936d133bf8a48de140a3c666897588a05shiqian operator Matcher<T>() const { 1926e35fdd936d133bf8a48de140a3c666897588a05shiqian return Matcher<T>(new Impl<T>(callable_, matcher_)); 1927e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1928e35fdd936d133bf8a48de140a3c666897588a05shiqian 1929e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1930e35fdd936d133bf8a48de140a3c666897588a05shiqian typedef typename CallableTraits<Callable>::StorageType CallableStorageType; 1931e35fdd936d133bf8a48de140a3c666897588a05shiqian 1932e35fdd936d133bf8a48de140a3c666897588a05shiqian template <typename T> 1933e35fdd936d133bf8a48de140a3c666897588a05shiqian class Impl : public MatcherInterface<T> { 1934e35fdd936d133bf8a48de140a3c666897588a05shiqian public: 1935e35fdd936d133bf8a48de140a3c666897588a05shiqian Impl(CallableStorageType callable, const Matcher<ResultType>& matcher) 1936e35fdd936d133bf8a48de140a3c666897588a05shiqian : callable_(callable), matcher_(matcher) {} 1937e35fdd936d133bf8a48de140a3c666897588a05shiqian 1938e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeTo(::std::ostream* os) const { 1939676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is mapped by the given callable to a value that "; 1940e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeTo(os); 1941e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1942e35fdd936d133bf8a48de140a3c666897588a05shiqian 1943e35fdd936d133bf8a48de140a3c666897588a05shiqian virtual void DescribeNegationTo(::std::ostream* os) const { 1944676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *os << "is mapped by the given callable to a value that "; 1945e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher_.DescribeNegationTo(os); 1946e35fdd936d133bf8a48de140a3c666897588a05shiqian } 1947e35fdd936d133bf8a48de140a3c666897588a05shiqian 1948821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const { 1949676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "which is mapped by the given callable to "; 1950676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // Cannot pass the return value (for example, int) to 1951676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // MatchPrintAndExplain, which takes a non-const reference as argument. 1952676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan ResultType result = 1953676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan CallableTraits<Callable>::template Invoke<T>(callable_, obj); 1954676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return MatchPrintAndExplain(result, matcher_, listener); 1955e35fdd936d133bf8a48de140a3c666897588a05shiqian } 195632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 1957e35fdd936d133bf8a48de140a3c666897588a05shiqian private: 1958e35fdd936d133bf8a48de140a3c666897588a05shiqian // Functors often define operator() as non-const method even though 1959e35fdd936d133bf8a48de140a3c666897588a05shiqian // they are actualy stateless. But we need to use them even when 1960e35fdd936d133bf8a48de140a3c666897588a05shiqian // 'this' is a const pointer. It's the user's responsibility not to 1961e35fdd936d133bf8a48de140a3c666897588a05shiqian // use stateful callables with ResultOf(), which does't guarantee 1962e35fdd936d133bf8a48de140a3c666897588a05shiqian // how many times the callable will be invoked. 1963e35fdd936d133bf8a48de140a3c666897588a05shiqian mutable CallableStorageType callable_; 1964e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<ResultType> matcher_; 196532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 196632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 1967e35fdd936d133bf8a48de140a3c666897588a05shiqian }; // class Impl 1968e35fdd936d133bf8a48de140a3c666897588a05shiqian 1969e35fdd936d133bf8a48de140a3c666897588a05shiqian const CallableStorageType callable_; 1970e35fdd936d133bf8a48de140a3c666897588a05shiqian const Matcher<ResultType> matcher_; 197132de5f53763125925e078498250f7e73a88de9edzhanyong.wan 197232de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ResultOfMatcher); 1973e35fdd936d133bf8a48de140a3c666897588a05shiqian}; 1974e35fdd936d133bf8a48de140a3c666897588a05shiqian 1975a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan// Implements a matcher that checks the size of an STL-style container. 1976a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wantemplate <typename SizeMatcher> 1977a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanclass SizeIsMatcher { 1978a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan public: 1979a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan explicit SizeIsMatcher(const SizeMatcher& size_matcher) 1980a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan : size_matcher_(size_matcher) { 1981a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan } 1982a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 1983a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan template <typename Container> 1984a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan operator Matcher<Container>() const { 1985a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan return MakeMatcher(new Impl<Container>(size_matcher_)); 1986a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan } 1987a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 1988a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan template <typename Container> 1989a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan class Impl : public MatcherInterface<Container> { 1990a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan public: 1991a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan typedef internal::StlContainerView< 1992a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView; 1993a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan typedef typename ContainerView::type::size_type SizeType; 1994a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan explicit Impl(const SizeMatcher& size_matcher) 1995a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan : size_matcher_(MatcherCast<SizeType>(size_matcher)) {} 1996a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 1997a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 1998a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan *os << "size "; 1999a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan size_matcher_.DescribeTo(os); 2000a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan } 2001a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2002a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan *os << "size "; 2003a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan size_matcher_.DescribeNegationTo(os); 2004a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan } 2005a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 2006a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan virtual bool MatchAndExplain(Container container, 2007a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan MatchResultListener* listener) const { 2008a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan SizeType size = container.size(); 2009a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan StringMatchResultListener size_listener; 2010a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan const bool result = size_matcher_.MatchAndExplain(size, &size_listener); 2011a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan *listener 2012a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan << "whose size " << size << (result ? " matches" : " doesn't match"); 2013a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan PrintIfNotEmpty(size_listener.str(), listener->stream()); 2014a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan return result; 2015a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan } 2016a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 2017a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan private: 2018a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan const Matcher<SizeType> size_matcher_; 2019a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 2020a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan }; 2021a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 2022a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan private: 2023a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan const SizeMatcher size_matcher_; 2024a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan GTEST_DISALLOW_ASSIGN_(SizeIsMatcher); 2025a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan}; 2026a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 20276a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Implements an equality matcher for any STL-style container whose elements 20286a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// support ==. This matcher is like Eq(), but its failure explanations provide 20296a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// more detailed information that is useful when the container is used as a set. 20306a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// The failure message reports elements that are in one of the operands but not 20316a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// the other. The failure messages do not report duplicate or out-of-order 20326a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// elements in the containers (which don't properly matter to sets, but can 20336a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// occur if the containers are vectors or lists, for example). 20346a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// 20356a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Uses the container's const_iterator, value_type, operator ==, 20366a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// begin(), and end(). 20376a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename Container> 20386a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wanclass ContainerEqMatcher { 20396a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan public: 2040b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef internal::StlContainerView<Container> View; 2041b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::type StlContainer; 2042b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::const_reference StlContainerReference; 2043b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2044b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // We make a copy of rhs in case the elements in it are modified 2045b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // after this matcher is created. 2046b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) { 2047b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Makes sure the user doesn't instantiate this class template 2048b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // with a const or reference type. 2049ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan (void)testing::StaticAssertTypeEq<Container, 2050ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>(); 2051b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2052b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 20536a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan void DescribeTo(::std::ostream* os) const { 20546a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan *os << "equals "; 2055e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); 20566a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 20576a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan void DescribeNegationTo(::std::ostream* os) const { 20586a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan *os << "does not equal "; 2059e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(rhs_, os); 20606a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 20616a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 2062b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan template <typename LhsContainer> 2063e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan bool MatchAndExplain(const LhsContainer& lhs, 2064e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan MatchResultListener* listener) const { 206502f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug 2066b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // that causes LhsContainer to be a const type sometimes. 206702f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)> 2068b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan LhsView; 2069b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename LhsView::type LhsStlContainer; 2070b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 2071e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (lhs_stl_container == rhs_) 2072e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan return true; 2073b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2074e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan ::std::ostream* const os = listener->stream(); 2075e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (os != NULL) { 2076b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Something is different. Check for extra values first. 2077e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan bool printed_header = false; 2078e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan for (typename LhsStlContainer::const_iterator it = 2079e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan lhs_stl_container.begin(); 2080e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan it != lhs_stl_container.end(); ++it) { 2081e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == 2082e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan rhs_.end()) { 2083e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (printed_header) { 2084e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan *os << ", "; 2085e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } else { 2086b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "which has these unexpected elements: "; 2087e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan printed_header = true; 2088e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } 2089e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(*it, os); 20906a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 20916a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 20926a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 2093b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan // Now check for missing values. 2094e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan bool printed_header2 = false; 2095e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan for (typename StlContainer::const_iterator it = rhs_.begin(); 2096e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan it != rhs_.end(); ++it) { 2097e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (internal::ArrayAwareFind( 2098e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan lhs_stl_container.begin(), lhs_stl_container.end(), *it) == 2099e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan lhs_stl_container.end()) { 2100e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan if (printed_header2) { 2101e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan *os << ", "; 2102e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } else { 2103b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << (printed_header ? ",\nand" : "which") 2104b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan << " doesn't have these expected elements: "; 2105e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan printed_header2 = true; 2106e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan } 2107e2e8ba401d198d1a8304c652e997505609b62696vladlosev UniversalPrint(*it, os); 21086a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 21096a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 21106a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 2111e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan 2112e122e457a6e890faac399c1f86d87cc8d3177ac2zhanyong.wan return false; 21136a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan } 211432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 21156a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan private: 2116b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const StlContainer rhs_; 211732de5f53763125925e078498250f7e73a88de9edzhanyong.wan 211832de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher); 21196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan}; 21206a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 2121898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// A comparator functor that uses the < operator to compare two values. 2122898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanstruct LessComparator { 2123898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan template <typename T, typename U> 2124898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan bool operator()(const T& lhs, const U& rhs) const { return lhs < rhs; } 2125898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}; 2126898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2127898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// Implements WhenSortedBy(comparator, container_matcher). 2128898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wantemplate <typename Comparator, typename ContainerMatcher> 2129898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanclass WhenSortedByMatcher { 2130898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan public: 2131898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan WhenSortedByMatcher(const Comparator& comparator, 2132898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const ContainerMatcher& matcher) 2133898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan : comparator_(comparator), matcher_(matcher) {} 2134898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2135898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan template <typename LhsContainer> 2136898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan operator Matcher<LhsContainer>() const { 2137898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_)); 2138898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan } 2139898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2140898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan template <typename LhsContainer> 2141898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan class Impl : public MatcherInterface<LhsContainer> { 2142898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan public: 2143898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan typedef internal::StlContainerView< 2144898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView; 2145898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan typedef typename LhsView::type LhsStlContainer; 2146898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan typedef typename LhsView::const_reference LhsStlContainerReference; 2147898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan typedef typename LhsStlContainer::value_type LhsValue; 2148898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2149898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan Impl(const Comparator& comparator, const ContainerMatcher& matcher) 2150898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan : comparator_(comparator), matcher_(matcher) {} 2151898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2152898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2153898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan *os << "(when sorted) "; 2154898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan matcher_.DescribeTo(os); 2155898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan } 2156898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2157898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2158898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan *os << "(when sorted) "; 2159898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan matcher_.DescribeNegationTo(os); 2160898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan } 2161898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2162898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan virtual bool MatchAndExplain(LhsContainer lhs, 2163898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan MatchResultListener* listener) const { 2164898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 2165898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan std::vector<LhsValue> sorted_container(lhs_stl_container.begin(), 2166898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan lhs_stl_container.end()); 2167898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan std::sort(sorted_container.begin(), sorted_container.end(), comparator_); 2168898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2169898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan if (!listener->IsInterested()) { 2170898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan // If the listener is not interested, we do not need to 2171898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan // construct the inner explanation. 2172898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan return matcher_.Matches(sorted_container); 2173898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan } 2174898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2175898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan *listener << "which is "; 2176898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan UniversalPrint(sorted_container, listener->stream()); 2177898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan *listener << " when sorted"; 2178898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2179898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan StringMatchResultListener inner_listener; 2180898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const bool match = matcher_.MatchAndExplain(sorted_container, 2181898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan &inner_listener); 2182898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan PrintIfNotEmpty(inner_listener.str(), listener->stream()); 2183898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan return match; 2184898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan } 2185898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2186898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan private: 2187898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const Comparator comparator_; 2188898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const Matcher<const std::vector<LhsValue>&> matcher_; 2189898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2190898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl); 2191898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan }; 2192898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2193898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan private: 2194898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const Comparator comparator_; 2195898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const ContainerMatcher matcher_; 2196898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2197898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan GTEST_DISALLOW_ASSIGN_(WhenSortedByMatcher); 2198898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan}; 2199898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 2200ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// Implements Pointwise(tuple_matcher, rhs_container). tuple_matcher 2201ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// must be able to be safely cast to Matcher<tuple<const T1&, const 2202ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// T2&> >, where T1 and T2 are the types of elements in the LHS 2203ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// container and the RHS container respectively. 2204ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wantemplate <typename TupleMatcher, typename RhsContainer> 2205ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanclass PointwiseMatcher { 2206ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan public: 2207ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef internal::StlContainerView<RhsContainer> RhsView; 2208ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename RhsView::type RhsStlContainer; 2209ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename RhsStlContainer::value_type RhsValue; 2210ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2211ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // Like ContainerEq, we make a copy of rhs in case the elements in 2212ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // it are modified after this matcher is created. 2213ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs) 2214ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) { 2215ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // Makes sure the user doesn't instantiate this class template 2216ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // with a const or reference type. 2217ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan (void)testing::StaticAssertTypeEq<RhsContainer, 2218ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>(); 2219ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2220ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2221ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename LhsContainer> 2222ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan operator Matcher<LhsContainer>() const { 2223ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_)); 2224ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2225ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2226ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan template <typename LhsContainer> 2227ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan class Impl : public MatcherInterface<LhsContainer> { 2228ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan public: 2229ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef internal::StlContainerView< 2230ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView; 2231ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename LhsView::type LhsStlContainer; 2232ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename LhsView::const_reference LhsStlContainerReference; 2233ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef typename LhsStlContainer::value_type LhsValue; 2234ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // We pass the LHS value and the RHS value to the inner matcher by 2235ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // reference, as they may be expensive to copy. We must use tuple 2236ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // instead of pair here, as a pair cannot hold references (C++ 98, 2237ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // 20.2.2 [lib.pairs]). 2238ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef std::tr1::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg; 2239ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2240ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs) 2241ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher. 2242ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)), 2243ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan rhs_(rhs) {} 2244ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2245ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2246ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "contains " << rhs_.size() 2247ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan << " values, where each value and its corresponding value in "; 2248ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrinter<RhsStlContainer>::Print(rhs_, os); 2249ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << " "; 2250ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan mono_tuple_matcher_.DescribeTo(os); 2251ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2252ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2253ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << "doesn't contain exactly " << rhs_.size() 2254ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan << " values, or contains a value x at some index i" 2255ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan << " where x and the i-th value of "; 2256ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrint(rhs_, os); 2257ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *os << " "; 2258ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan mono_tuple_matcher_.DescribeNegationTo(os); 2259ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2260ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2261ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan virtual bool MatchAndExplain(LhsContainer lhs, 2262ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan MatchResultListener* listener) const { 2263ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 2264ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const size_t actual_size = lhs_stl_container.size(); 2265ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (actual_size != rhs_.size()) { 2266ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << "which contains " << actual_size << " values"; 2267ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return false; 2268ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2269ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2270ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typename LhsStlContainer::const_iterator left = lhs_stl_container.begin(); 2271ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typename RhsStlContainer::const_iterator right = rhs_.begin(); 2272ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan for (size_t i = 0; i != actual_size; ++i, ++left, ++right) { 2273ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const InnerMatcherArg value_pair(*left, *right); 2274ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2275ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (listener->IsInterested()) { 2276ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan StringMatchResultListener inner_listener; 2277ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (!mono_tuple_matcher_.MatchAndExplain( 2278ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan value_pair, &inner_listener)) { 2279ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << "where the value pair ("; 2280ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrint(*left, listener->stream()); 2281ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << ", "; 2282ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan UniversalPrint(*right, listener->stream()); 2283ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan *listener << ") at index #" << i << " don't match"; 2284ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan PrintIfNotEmpty(inner_listener.str(), listener->stream()); 2285ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return false; 2286ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2287ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } else { 2288ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan if (!mono_tuple_matcher_.Matches(value_pair)) 2289ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return false; 2290ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2291ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2292ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2293ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return true; 2294ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan } 2295ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2296ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan private: 2297ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const Matcher<InnerMatcherArg> mono_tuple_matcher_; 2298ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const RhsStlContainer rhs_; 2299ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2300ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_DISALLOW_ASSIGN_(Impl); 2301ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan }; 2302ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2303ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan private: 2304ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const TupleMatcher tuple_matcher_; 2305ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan const RhsStlContainer rhs_; 2306ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 2307ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_DISALLOW_ASSIGN_(PointwiseMatcher); 2308ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan}; 2309ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 231033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl. 2311b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename Container> 231233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass QuantifierMatcherImpl : public MatcherInterface<Container> { 2313b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan public: 2314ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 2315b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef StlContainerView<RawContainer> View; 2316b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::type StlContainer; 2317b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename View::const_reference StlContainerReference; 2318b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan typedef typename StlContainer::value_type Element; 2319b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2320b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan template <typename InnerMatcher> 232133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit QuantifierMatcherImpl(InnerMatcher inner_matcher) 2322b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan : inner_matcher_( 232333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan testing::SafeMatcherCast<const Element&>(inner_matcher)) {} 232433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 232533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // Checks whether: 232633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // * All elements in the container match, if all_elements_should_match. 232733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // * Any element in the container matches, if !all_elements_should_match. 232833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan bool MatchAndExplainImpl(bool all_elements_should_match, 232933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan Container container, 233033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan MatchResultListener* listener) const { 233133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan StlContainerReference stl_container = View::ConstReference(container); 233233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan size_t i = 0; 233333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan for (typename StlContainer::const_iterator it = stl_container.begin(); 233433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan it != stl_container.end(); ++it, ++i) { 233533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan StringMatchResultListener inner_listener; 233633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener); 233733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 233833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan if (matches != all_elements_should_match) { 233933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan *listener << "whose element #" << i 234033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan << (matches ? " matches" : " doesn't match"); 234133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan PrintIfNotEmpty(inner_listener.str(), listener->stream()); 234233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return !all_elements_should_match; 234333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 234433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 234533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return all_elements_should_match; 234633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 234733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 234833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan protected: 234933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const Matcher<const Element&> inner_matcher_; 235033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 235133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl); 235233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}; 235333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 235433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Implements Contains(element_matcher) for the given argument type Container. 235533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Symmetric to EachMatcherImpl. 235633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename Container> 235733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass ContainsMatcherImpl : public QuantifierMatcherImpl<Container> { 235833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan public: 235933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan template <typename InnerMatcher> 236033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit ContainsMatcherImpl(InnerMatcher inner_matcher) 236133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan : QuantifierMatcherImpl<Container>(inner_matcher) {} 2362b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2363b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // Describes what this matcher does. 2364b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2365b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan *os << "contains at least one element that "; 236633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeTo(os); 2367b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2368b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2369b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2370b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan *os << "doesn't contain any element that "; 237133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeTo(os); 2372b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2373b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2374821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(Container container, 2375821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 237633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return this->MatchAndExplainImpl(false, container, listener); 2377b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2378b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2379b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan private: 238032de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl); 2381b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}; 2382b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 238333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Implements Each(element_matcher) for the given argument type Container. 238433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Symmetric to ContainsMatcherImpl. 238533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename Container> 238633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass EachMatcherImpl : public QuantifierMatcherImpl<Container> { 238733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan public: 238833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan template <typename InnerMatcher> 238933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit EachMatcherImpl(InnerMatcher inner_matcher) 239033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan : QuantifierMatcherImpl<Container>(inner_matcher) {} 239133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 239233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan // Describes what this matcher does. 239333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 239433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan *os << "only contains elements that "; 239533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeTo(os); 239633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 239733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 239833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 239933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan *os << "contains some element that "; 240033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan this->inner_matcher_.DescribeNegationTo(os); 240133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 240233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 240333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan virtual bool MatchAndExplain(Container container, 240433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan MatchResultListener* listener) const { 240533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return this->MatchAndExplainImpl(true, container, listener); 240633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 240733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 240833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan private: 240933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan GTEST_DISALLOW_ASSIGN_(EachMatcherImpl); 241033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}; 241133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 2412b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Implements polymorphic Contains(element_matcher). 2413b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename M> 2414b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wanclass ContainsMatcher { 2415b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan public: 2416b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan explicit ContainsMatcher(M m) : inner_matcher_(m) {} 2417b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2418b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan template <typename Container> 2419b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan operator Matcher<Container>() const { 2420b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_)); 2421b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan } 2422b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 2423b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan private: 2424b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan const M inner_matcher_; 242532de5f53763125925e078498250f7e73a88de9edzhanyong.wan 242632de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ContainsMatcher); 2427b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan}; 2428b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 242933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Implements polymorphic Each(element_matcher). 243033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename M> 243133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wanclass EachMatcher { 243233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan public: 243333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan explicit EachMatcher(M m) : inner_matcher_(m) {} 243433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 243533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan template <typename Container> 243633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan operator Matcher<Container>() const { 243733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_)); 243833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan } 243933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 244033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan private: 244133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan const M inner_matcher_; 244233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 244333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan GTEST_DISALLOW_ASSIGN_(EachMatcher); 244433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan}; 244533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 2446b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Implements Key(inner_matcher) for the given argument pair type. 2447b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Key(inner_matcher) matches an std::pair whose 'first' field matches 2448b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 2449b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// std::map that contains at least one element whose key is >= 5. 2450b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wantemplate <typename PairType> 2451b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanclass KeyMatcherImpl : public MatcherInterface<PairType> { 2452b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan public: 2453ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType; 2454b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan typedef typename RawPairType::first_type KeyType; 2455b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2456b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan template <typename InnerMatcher> 2457b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan explicit KeyMatcherImpl(InnerMatcher inner_matcher) 2458b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan : inner_matcher_( 2459b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan testing::SafeMatcherCast<const KeyType&>(inner_matcher)) { 2460b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2461b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2462b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan // Returns true iff 'key_value.first' (the key) matches the inner matcher. 2463821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(PairType key_value, 2464821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 2465b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan StringMatchResultListener inner_listener; 2466b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const bool match = inner_matcher_.MatchAndExplain(key_value.first, 2467b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan &inner_listener); 2468b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan const internal::string explanation = inner_listener.str(); 2469b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan if (explanation != "") { 2470b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "whose first field is a value " << explanation; 2471b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan } 2472b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan return match; 2473b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2474b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2475b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan // Describes what this matcher does. 2476b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2477b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan *os << "has a key that "; 2478b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan inner_matcher_.DescribeTo(os); 2479b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2480b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2481b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan // Describes what the negation of this matcher does. 2482b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2483b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan *os << "doesn't have a key that "; 2484b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan inner_matcher_.DescribeTo(os); 2485b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2486b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2487b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan private: 2488b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan const Matcher<const KeyType&> inner_matcher_; 248932de5f53763125925e078498250f7e73a88de9edzhanyong.wan 249032de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl); 2491b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}; 2492b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2493b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Implements polymorphic Key(matcher_for_key). 2494b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wantemplate <typename M> 2495b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wanclass KeyMatcher { 2496b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan public: 2497b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan explicit KeyMatcher(M m) : matcher_for_key_(m) {} 2498b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2499b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan template <typename PairType> 2500b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan operator Matcher<PairType>() const { 2501b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_)); 2502b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan } 2503b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2504b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan private: 2505b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan const M matcher_for_key_; 250632de5f53763125925e078498250f7e73a88de9edzhanyong.wan 250732de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(KeyMatcher); 2508b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan}; 2509b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 2510f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// Implements Pair(first_matcher, second_matcher) for the given argument pair 2511f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// type with its two matchers. See Pair() function below. 2512f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wantemplate <typename PairType> 2513f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass PairMatcherImpl : public MatcherInterface<PairType> { 2514f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public: 2515ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType; 2516f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan typedef typename RawPairType::first_type FirstType; 2517f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan typedef typename RawPairType::second_type SecondType; 2518f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2519f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan template <typename FirstMatcher, typename SecondMatcher> 2520f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher) 2521f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan : first_matcher_( 2522f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan testing::SafeMatcherCast<const FirstType&>(first_matcher)), 2523f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan second_matcher_( 2524f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan testing::SafeMatcherCast<const SecondType&>(second_matcher)) { 2525f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2526f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2527f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Describes what this matcher does. 2528f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 2529f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "has a first field that "; 2530f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher_.DescribeTo(os); 2531f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << ", and has a second field that "; 2532f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan second_matcher_.DescribeTo(os); 2533f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2534f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2535f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan // Describes what the negation of this matcher does. 2536f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 2537f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << "has a first field that "; 2538f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher_.DescribeNegationTo(os); 2539f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan *os << ", or has a second field that "; 2540f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan second_matcher_.DescribeNegationTo(os); 2541f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2542f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2543821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second' 2544821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // matches second_matcher. 2545821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(PairType a_pair, 2546821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 2547676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!listener->IsInterested()) { 2548676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // If the listener is not interested, we don't need to construct the 2549676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan // explanation. 2550676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan return first_matcher_.Matches(a_pair.first) && 2551676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan second_matcher_.Matches(a_pair.second); 2552821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 2553676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan StringMatchResultListener first_inner_listener; 2554676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!first_matcher_.MatchAndExplain(a_pair.first, 2555676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan &first_inner_listener)) { 2556676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose first field does not match"; 2557b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(first_inner_listener.str(), listener->stream()); 2558821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2559f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2560676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan StringMatchResultListener second_inner_listener; 2561676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (!second_matcher_.MatchAndExplain(a_pair.second, 2562676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan &second_inner_listener)) { 2563676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose second field does not match"; 2564b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(second_inner_listener.str(), listener->stream()); 2565821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2566f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2567676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(), 2568676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan listener); 2569821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 2570f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2571f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2572f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private: 2573676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan void ExplainSuccess(const internal::string& first_explanation, 2574676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan const internal::string& second_explanation, 2575676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan MatchResultListener* listener) const { 2576676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "whose both fields match"; 2577676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (first_explanation != "") { 2578676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << ", where the first field is a value " << first_explanation; 2579676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2580676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (second_explanation != "") { 2581676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << ", "; 2582676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan if (first_explanation != "") { 2583676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "and "; 2584676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } else { 2585676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "where "; 2586676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2587676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan *listener << "the second field is a value " << second_explanation; 2588676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2589676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan } 2590676e8cc6092853c9dbf1eeab2402be0069d8fb7ezhanyong.wan 2591f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<const FirstType&> first_matcher_; 2592f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const Matcher<const SecondType&> second_matcher_; 259332de5f53763125925e078498250f7e73a88de9edzhanyong.wan 259432de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PairMatcherImpl); 2595f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}; 2596f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2597f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// Implements polymorphic Pair(first_matcher, second_matcher). 2598f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wantemplate <typename FirstMatcher, typename SecondMatcher> 2599f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanclass PairMatcher { 2600f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan public: 2601f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher) 2602f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan : first_matcher_(first_matcher), second_matcher_(second_matcher) {} 2603f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2604f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan template <typename PairType> 2605f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan operator Matcher<PairType> () const { 2606f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan return MakeMatcher( 2607f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan new PairMatcherImpl<PairType>( 2608f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher_, second_matcher_)); 2609f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan } 2610f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 2611f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan private: 2612f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const FirstMatcher first_matcher_; 2613f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan const SecondMatcher second_matcher_; 261432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 261532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(PairMatcher); 2616f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan}; 2617f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 26181afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan// Implements ElementsAre() and ElementsAreArray(). 26191afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wantemplate <typename Container> 26201afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wanclass ElementsAreMatcherImpl : public MatcherInterface<Container> { 26211afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan public: 2622ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 26231afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef internal::StlContainerView<RawContainer> View; 26241afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename View::type StlContainer; 26251afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename View::const_reference StlContainerReference; 26261afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename StlContainer::value_type Element; 26271afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 26281afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // Constructs the matcher from a sequence of element values or 26291afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // element matchers. 26301afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan template <typename InputIter> 263138513a8bb154f0b6d0a4088814fe92552696d465jgm ElementsAreMatcherImpl(InputIter first, InputIter last) { 263238513a8bb154f0b6d0a4088814fe92552696d465jgm while (first != last) { 263338513a8bb154f0b6d0a4088814fe92552696d465jgm matchers_.push_back(MatcherCast<const Element&>(*first++)); 26341afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26351afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26361afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 26371afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // Describes what this matcher does. 26381afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan virtual void DescribeTo(::std::ostream* os) const { 26391afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (count() == 0) { 26401afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << "is empty"; 26411afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } else if (count() == 1) { 26421afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << "has 1 element that "; 26431afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan matchers_[0].DescribeTo(os); 26441afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } else { 26451afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << "has " << Elements(count()) << " where\n"; 26461afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan for (size_t i = 0; i != count(); ++i) { 2647b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "element #" << i << " "; 26481afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan matchers_[i].DescribeTo(os); 26491afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (i + 1 < count()) { 26501afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << ",\n"; 26511afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26521afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26531afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26541afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26551afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 26561afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan // Describes what the negation of this matcher does. 26571afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan virtual void DescribeNegationTo(::std::ostream* os) const { 26581afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (count() == 0) { 2659b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "isn't empty"; 26601afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan return; 26611afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26621afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2663b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "doesn't have " << Elements(count()) << ", or\n"; 26641afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan for (size_t i = 0; i != count(); ++i) { 2665b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *os << "element #" << i << " "; 26661afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan matchers_[i].DescribeNegationTo(os); 26671afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan if (i + 1 < count()) { 26681afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan *os << ", or\n"; 26691afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26701afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26711afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 26721afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2673821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan virtual bool MatchAndExplain(Container container, 2674821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan MatchResultListener* listener) const { 26751afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan StlContainerReference stl_container = View::ConstReference(container); 2676821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const size_t actual_count = stl_container.size(); 2677821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (actual_count != count()) { 2678821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // The element count doesn't match. If the container is empty, 2679821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // there's no need to explain anything as Google Mock already 2680821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // prints the empty container. Otherwise we just need to show 2681821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // how many elements there actually are. 2682821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (actual_count != 0) { 2683b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "which has " << Elements(actual_count); 26841afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 2685821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2686821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 26871afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2688821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan typename StlContainer::const_iterator it = stl_container.begin(); 2689821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // explanations[i] is the explanation of the element at index i. 2690821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan std::vector<internal::string> explanations(count()); 2691821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan for (size_t i = 0; i != count(); ++it, ++i) { 2692821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan StringMatchResultListener s; 2693821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (matchers_[i].MatchAndExplain(*it, &s)) { 2694821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan explanations[i] = s.str(); 2695821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } else { 2696821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // The container has the right size but the i-th element 2697821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // doesn't match its expectation. 2698b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "whose element #" << i << " doesn't match"; 2699b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan PrintIfNotEmpty(s.str(), listener->stream()); 2700821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return false; 2701821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 2702821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan } 27031afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2704821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // Every element matches its expectation. We need to explain why 2705821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan // (the obvious ones can be skipped). 2706821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan bool reason_printed = false; 2707821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan for (size_t i = 0; i != count(); ++i) { 2708821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan const internal::string& s = explanations[i]; 2709821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (!s.empty()) { 2710821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan if (reason_printed) { 2711b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << ",\nand "; 27121afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 2713b1c7f93c52d7fbf484f34d01a65cfaec03786564zhanyong.wan *listener << "whose element #" << i << " matches, " << s; 2714821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan reason_printed = true; 27151afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 27161afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 2717821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan 2718821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return true; 27191afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 27201afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27211afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan private: 27221afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan static Message Elements(size_t count) { 27231afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan return Message() << count << (count == 1 ? " element" : " elements"); 27241afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 27251afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27261afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan size_t count() const { return matchers_.size(); } 27271afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan std::vector<Matcher<const Element&> > matchers_; 272832de5f53763125925e078498250f7e73a88de9edzhanyong.wan 272932de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl); 27301afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan}; 27311afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27321afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan// Implements ElementsAre() of 0 arguments. 27331afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wanclass ElementsAreMatcher0 { 27341afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan public: 27351afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan ElementsAreMatcher0() {} 27361afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27371afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan template <typename Container> 27381afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan operator Matcher<Container>() const { 2739ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer; 27401afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan typedef typename internal::StlContainerView<RawContainer>::type::value_type 27411afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan Element; 27421afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27431afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan const Matcher<const Element&>* const matchers = NULL; 274438513a8bb154f0b6d0a4088814fe92552696d465jgm return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 274538513a8bb154f0b6d0a4088814fe92552696d465jgm matchers)); 27461afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 27471afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan}; 27481afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27491afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan// Implements ElementsAreArray(). 27501afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wantemplate <typename T> 27511afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wanclass ElementsAreArrayMatcher { 27521afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan public: 275338513a8bb154f0b6d0a4088814fe92552696d465jgm template <typename Iter> 275438513a8bb154f0b6d0a4088814fe92552696d465jgm ElementsAreArrayMatcher(Iter first, Iter last) : matchers_(first, last) {} 27551afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27561afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan template <typename Container> 27571afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan operator Matcher<Container>() const { 275838513a8bb154f0b6d0a4088814fe92552696d465jgm return MakeMatcher(new ElementsAreMatcherImpl<Container>( 275938513a8bb154f0b6d0a4088814fe92552696d465jgm matchers_.begin(), matchers_.end())); 27601afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan } 27611afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 27621afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan private: 276338513a8bb154f0b6d0a4088814fe92552696d465jgm const std::vector<T> matchers_; 276432de5f53763125925e078498250f7e73a88de9edzhanyong.wan 276532de5f53763125925e078498250f7e73a88de9edzhanyong.wan GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher); 27661afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan}; 27671afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2768b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// Returns the description for a matcher defined using the MATCHER*() 2769b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// macro where the user-supplied description string is "", if 2770b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// 'negation' is false; otherwise returns the description of the 2771b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// negation of the matcher. 'param_values' contains a list of strings 2772b4140808f98ff09c43ca1ddaa8ff13bc47cd0089zhanyong.wan// that are the print-out of the matcher's parameters. 2773587c1b37c2f0b6d430fb13ce09326db0135b557cvladlosevGTEST_API_ string FormatMatcherDescription(bool negation, 2774587c1b37c2f0b6d430fb13ce09326db0135b557cvladlosev const char* matcher_name, 2775587c1b37c2f0b6d430fb13ce09326db0135b557cvladlosev const Strings& param_values); 27761afe1c7971e649ae8b85a39fc1ab6ac595e1dd58zhanyong.wan 2777e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace internal 2778e35fdd936d133bf8a48de140a3c666897588a05shiqian 2779e35fdd936d133bf8a48de140a3c666897588a05shiqian// _ is a matcher that matches anything of any type. 2780e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2781e35fdd936d133bf8a48de140a3c666897588a05shiqian// This definition is fine as: 2782e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2783e35fdd936d133bf8a48de140a3c666897588a05shiqian// 1. The C++ standard permits using the name _ in a namespace that 2784e35fdd936d133bf8a48de140a3c666897588a05shiqian// is not the global namespace or ::std. 2785e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2. The AnythingMatcher class has no data member or constructor, 2786e35fdd936d133bf8a48de140a3c666897588a05shiqian// so it's OK to create global variables of this type. 2787e35fdd936d133bf8a48de140a3c666897588a05shiqian// 3. c-style has approved of using _ in this case. 2788e35fdd936d133bf8a48de140a3c666897588a05shiqianconst internal::AnythingMatcher _ = {}; 2789e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any value of the given type T. 2790e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2791e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); } 2792e35fdd936d133bf8a48de140a3c666897588a05shiqian 2793e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any value of the given type T. 2794e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2795e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<T> An() { return A<T>(); } 2796e35fdd936d133bf8a48de140a3c666897588a05shiqian 2797e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything equal to x. 2798e35fdd936d133bf8a48de140a3c666897588a05shiqian// Note: if the parameter of Eq() were declared as const T&, Eq("foo") 2799e35fdd936d133bf8a48de140a3c666897588a05shiqian// wouldn't compile. 2800e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2801e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); } 2802e35fdd936d133bf8a48de140a3c666897588a05shiqian 2803e35fdd936d133bf8a48de140a3c666897588a05shiqian// Constructs a Matcher<T> from a 'value' of type T. The constructed 2804e35fdd936d133bf8a48de140a3c666897588a05shiqian// matcher matches any value that's equal to 'value'. 2805e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2806e35fdd936d133bf8a48de140a3c666897588a05shiqianMatcher<T>::Matcher(T value) { *this = Eq(value); } 2807e35fdd936d133bf8a48de140a3c666897588a05shiqian 2808e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a monomorphic matcher that matches anything with type Lhs 2809e35fdd936d133bf8a48de140a3c666897588a05shiqian// and equal to rhs. A user may need to use this instead of Eq(...) 2810e35fdd936d133bf8a48de140a3c666897588a05shiqian// in order to resolve an overloading ambiguity. 2811e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2812e35fdd936d133bf8a48de140a3c666897588a05shiqian// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x)) 2813e35fdd936d133bf8a48de140a3c666897588a05shiqian// or Matcher<T>(x), but more readable than the latter. 2814e35fdd936d133bf8a48de140a3c666897588a05shiqian// 2815e35fdd936d133bf8a48de140a3c666897588a05shiqian// We could define similar monomorphic matchers for other comparison 2816e35fdd936d133bf8a48de140a3c666897588a05shiqian// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do 2817e35fdd936d133bf8a48de140a3c666897588a05shiqian// it yet as those are used much less than Eq() in practice. A user 2818e35fdd936d133bf8a48de140a3c666897588a05shiqian// can always write Matcher<T>(Lt(5)) to be explicit about the type, 2819e35fdd936d133bf8a48de140a3c666897588a05shiqian// for example. 2820e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Lhs, typename Rhs> 2821e35fdd936d133bf8a48de140a3c666897588a05shiqianinline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); } 2822e35fdd936d133bf8a48de140a3c666897588a05shiqian 2823e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything >= x. 2824e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2825e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::GeMatcher<Rhs> Ge(Rhs x) { 2826e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::GeMatcher<Rhs>(x); 2827e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2828e35fdd936d133bf8a48de140a3c666897588a05shiqian 2829e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything > x. 2830e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2831e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::GtMatcher<Rhs> Gt(Rhs x) { 2832e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::GtMatcher<Rhs>(x); 2833e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2834e35fdd936d133bf8a48de140a3c666897588a05shiqian 2835e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything <= x. 2836e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2837e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::LeMatcher<Rhs> Le(Rhs x) { 2838e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::LeMatcher<Rhs>(x); 2839e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2840e35fdd936d133bf8a48de140a3c666897588a05shiqian 2841e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything < x. 2842e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2843e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::LtMatcher<Rhs> Lt(Rhs x) { 2844e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::LtMatcher<Rhs>(x); 2845e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2846e35fdd936d133bf8a48de140a3c666897588a05shiqian 2847e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches anything != x. 2848e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Rhs> 2849e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::NeMatcher<Rhs> Ne(Rhs x) { 2850e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::NeMatcher<Rhs>(x); 2851e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2852e35fdd936d133bf8a48de140a3c666897588a05shiqian 28532d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan// Creates a polymorphic matcher that matches any NULL pointer. 28542d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.waninline PolymorphicMatcher<internal::IsNullMatcher > IsNull() { 28552d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan return MakePolymorphicMatcher(internal::IsNullMatcher()); 28562d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan} 28572d970ee3bad530703ff24bc3a011390b45cdd293zhanyong.wan 2858e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches any non-NULL pointer. 2859e35fdd936d133bf8a48de140a3c666897588a05shiqian// This is convenient as Not(NULL) doesn't compile (the compiler 2860e35fdd936d133bf8a48de140a3c666897588a05shiqian// thinks that that expression is comparing a pointer with an integer). 2861e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::NotNullMatcher > NotNull() { 2862e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::NotNullMatcher()); 2863e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2864e35fdd936d133bf8a48de140a3c666897588a05shiqian 2865e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches any argument that 2866e35fdd936d133bf8a48de140a3c666897588a05shiqian// references variable x. 2867e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename T> 2868e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::RefMatcher<T&> Ref(T& x) { // NOLINT 2869e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::RefMatcher<T&>(x); 2870e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2871e35fdd936d133bf8a48de140a3c666897588a05shiqian 2872e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any double argument approximately 2873e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, where two NANs are considered unequal. 2874e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<double> DoubleEq(double rhs) { 2875e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<double>(rhs, false); 2876e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2877e35fdd936d133bf8a48de140a3c666897588a05shiqian 2878e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any double argument approximately 2879e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, including NaN values when rhs is NaN. 2880e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) { 2881e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<double>(rhs, true); 2882e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2883e35fdd936d133bf8a48de140a3c666897588a05shiqian 2884e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any float argument approximately 2885e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, where two NANs are considered unequal. 2886e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<float> FloatEq(float rhs) { 2887e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<float>(rhs, false); 2888e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2889e35fdd936d133bf8a48de140a3c666897588a05shiqian 2890e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any double argument approximately 2891e35fdd936d133bf8a48de140a3c666897588a05shiqian// equal to rhs, including NaN values when rhs is NaN. 2892e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) { 2893e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::FloatingEqMatcher<float>(rhs, true); 2894e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2895e35fdd936d133bf8a48de140a3c666897588a05shiqian 2896e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches a pointer (raw or smart) that points 2897e35fdd936d133bf8a48de140a3c666897588a05shiqian// to a value that matches inner_matcher. 2898e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 2899e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::PointeeMatcher<InnerMatcher> Pointee( 2900e35fdd936d133bf8a48de140a3c666897588a05shiqian const InnerMatcher& inner_matcher) { 2901e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::PointeeMatcher<InnerMatcher>(inner_matcher); 2902e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2903e35fdd936d133bf8a48de140a3c666897588a05shiqian 2904e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches an object whose given field matches 2905e35fdd936d133bf8a48de140a3c666897588a05shiqian// 'matcher'. For example, 2906e35fdd936d133bf8a48de140a3c666897588a05shiqian// Field(&Foo::number, Ge(5)) 2907e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a Foo object x iff x.number >= 5. 2908e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename FieldType, typename FieldMatcher> 2909e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher< 2910e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::FieldMatcher<Class, FieldType> > Field( 2911e35fdd936d133bf8a48de140a3c666897588a05shiqian FieldType Class::*field, const FieldMatcher& matcher) { 2912e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher( 2913e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::FieldMatcher<Class, FieldType>( 2914e35fdd936d133bf8a48de140a3c666897588a05shiqian field, MatcherCast<const FieldType&>(matcher))); 2915e35fdd936d133bf8a48de140a3c666897588a05shiqian // The call to MatcherCast() is required for supporting inner 2916e35fdd936d133bf8a48de140a3c666897588a05shiqian // matchers of compatible types. For example, it allows 2917e35fdd936d133bf8a48de140a3c666897588a05shiqian // Field(&Foo::bar, m) 2918e35fdd936d133bf8a48de140a3c666897588a05shiqian // to compile where bar is an int32 and m is a matcher for int64. 2919e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2920e35fdd936d133bf8a48de140a3c666897588a05shiqian 2921e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches an object whose given property 2922e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches 'matcher'. For example, 2923e35fdd936d133bf8a48de140a3c666897588a05shiqian// Property(&Foo::str, StartsWith("hi")) 2924e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a Foo object x iff x.str() starts with "hi". 2925e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Class, typename PropertyType, typename PropertyMatcher> 2926e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher< 2927e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::PropertyMatcher<Class, PropertyType> > Property( 2928e35fdd936d133bf8a48de140a3c666897588a05shiqian PropertyType (Class::*property)() const, const PropertyMatcher& matcher) { 2929e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher( 2930e35fdd936d133bf8a48de140a3c666897588a05shiqian internal::PropertyMatcher<Class, PropertyType>( 2931e35fdd936d133bf8a48de140a3c666897588a05shiqian property, 293202f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); 2933e35fdd936d133bf8a48de140a3c666897588a05shiqian // The call to MatcherCast() is required for supporting inner 2934e35fdd936d133bf8a48de140a3c666897588a05shiqian // matchers of compatible types. For example, it allows 2935e35fdd936d133bf8a48de140a3c666897588a05shiqian // Property(&Foo::bar, m) 2936e35fdd936d133bf8a48de140a3c666897588a05shiqian // to compile where bar() returns an int32 and m is a matcher for int64. 2937e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2938e35fdd936d133bf8a48de140a3c666897588a05shiqian 2939e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches an object iff the result of applying 2940e35fdd936d133bf8a48de140a3c666897588a05shiqian// a callable to x matches 'matcher'. 2941e35fdd936d133bf8a48de140a3c666897588a05shiqian// For example, 2942e35fdd936d133bf8a48de140a3c666897588a05shiqian// ResultOf(f, StartsWith("hi")) 2943e35fdd936d133bf8a48de140a3c666897588a05shiqian// matches a Foo object x iff f(x) starts with "hi". 2944e35fdd936d133bf8a48de140a3c666897588a05shiqian// callable parameter can be a function, function pointer, or a functor. 2945e35fdd936d133bf8a48de140a3c666897588a05shiqian// Callable has to satisfy the following conditions: 2946e35fdd936d133bf8a48de140a3c666897588a05shiqian// * It is required to keep no state affecting the results of 2947e35fdd936d133bf8a48de140a3c666897588a05shiqian// the calls on it and make no assumptions about how many calls 2948e35fdd936d133bf8a48de140a3c666897588a05shiqian// will be made. Any state it keeps must be protected from the 2949e35fdd936d133bf8a48de140a3c666897588a05shiqian// concurrent access. 2950e35fdd936d133bf8a48de140a3c666897588a05shiqian// * If it is a function object, it has to define type result_type. 2951e35fdd936d133bf8a48de140a3c666897588a05shiqian// We recommend deriving your functor classes from std::unary_function. 2952e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Callable, typename ResultOfMatcher> 2953e35fdd936d133bf8a48de140a3c666897588a05shiqianinternal::ResultOfMatcher<Callable> ResultOf( 2954e35fdd936d133bf8a48de140a3c666897588a05shiqian Callable callable, const ResultOfMatcher& matcher) { 2955e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::ResultOfMatcher<Callable>( 2956e35fdd936d133bf8a48de140a3c666897588a05shiqian callable, 2957e35fdd936d133bf8a48de140a3c666897588a05shiqian MatcherCast<typename internal::CallableTraits<Callable>::ResultType>( 2958e35fdd936d133bf8a48de140a3c666897588a05shiqian matcher)); 2959e35fdd936d133bf8a48de140a3c666897588a05shiqian // The call to MatcherCast() is required for supporting inner 2960e35fdd936d133bf8a48de140a3c666897588a05shiqian // matchers of compatible types. For example, it allows 2961e35fdd936d133bf8a48de140a3c666897588a05shiqian // ResultOf(Function, m) 2962e35fdd936d133bf8a48de140a3c666897588a05shiqian // to compile where Function() returns an int32 and m is a matcher for int64. 2963e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2964e35fdd936d133bf8a48de140a3c666897588a05shiqian 2965e35fdd936d133bf8a48de140a3c666897588a05shiqian// String matchers. 2966e35fdd936d133bf8a48de140a3c666897588a05shiqian 2967e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str. 2968e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2969e35fdd936d133bf8a48de140a3c666897588a05shiqian StrEq(const internal::string& str) { 2970e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2971e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, true)); 2972e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2973e35fdd936d133bf8a48de140a3c666897588a05shiqian 2974e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str. 2975e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2976e35fdd936d133bf8a48de140a3c666897588a05shiqian StrNe(const internal::string& str) { 2977e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2978e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, true)); 2979e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2980e35fdd936d133bf8a48de140a3c666897588a05shiqian 2981e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str, ignoring case. 2982e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2983e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseEq(const internal::string& str) { 2984e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2985e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, false)); 2986e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2987e35fdd936d133bf8a48de140a3c666897588a05shiqian 2988e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str, ignoring case. 2989e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2990e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseNe(const internal::string& str) { 2991e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2992e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, false)); 2993e35fdd936d133bf8a48de140a3c666897588a05shiqian} 2994e35fdd936d133bf8a48de140a3c666897588a05shiqian 2995e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any string, std::string, or C string 2996e35fdd936d133bf8a48de140a3c666897588a05shiqian// that contains the given substring. 2997e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::HasSubstrMatcher<internal::string> > 2998e35fdd936d133bf8a48de140a3c666897588a05shiqian HasSubstr(const internal::string& substring) { 2999e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::string>( 3000e35fdd936d133bf8a48de140a3c666897588a05shiqian substring)); 3001e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3002e35fdd936d133bf8a48de140a3c666897588a05shiqian 3003e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that starts with 'prefix' (case-sensitive). 3004e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StartsWithMatcher<internal::string> > 3005e35fdd936d133bf8a48de140a3c666897588a05shiqian StartsWith(const internal::string& prefix) { 3006e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::string>( 3007e35fdd936d133bf8a48de140a3c666897588a05shiqian prefix)); 3008e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3009e35fdd936d133bf8a48de140a3c666897588a05shiqian 3010e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that ends with 'suffix' (case-sensitive). 3011e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> > 3012e35fdd936d133bf8a48de140a3c666897588a05shiqian EndsWith(const internal::string& suffix) { 3013e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>( 3014e35fdd936d133bf8a48de140a3c666897588a05shiqian suffix)); 3015e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3016e35fdd936d133bf8a48de140a3c666897588a05shiqian 3017e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that fully matches regular expression 'regex'. 3018e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher takes ownership of 'regex'. 3019e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 3020e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::RE* regex) { 3021e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); 3022e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3023e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 3024e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::string& regex) { 3025e35fdd936d133bf8a48de140a3c666897588a05shiqian return MatchesRegex(new internal::RE(regex)); 3026e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3027e35fdd936d133bf8a48de140a3c666897588a05shiqian 3028e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that contains regular expression 'regex'. 3029e35fdd936d133bf8a48de140a3c666897588a05shiqian// The matcher takes ownership of 'regex'. 3030e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 3031e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::RE* regex) { 3032e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); 3033e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3034e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 3035e35fdd936d133bf8a48de140a3c666897588a05shiqian const internal::string& regex) { 3036e35fdd936d133bf8a48de140a3c666897588a05shiqian return ContainsRegex(new internal::RE(regex)); 3037e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3038e35fdd936d133bf8a48de140a3c666897588a05shiqian 3039e35fdd936d133bf8a48de140a3c666897588a05shiqian#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 3040e35fdd936d133bf8a48de140a3c666897588a05shiqian// Wide string matchers. 3041e35fdd936d133bf8a48de140a3c666897588a05shiqian 3042e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str. 3043e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 3044e35fdd936d133bf8a48de140a3c666897588a05shiqian StrEq(const internal::wstring& str) { 3045e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 3046e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, true)); 3047e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3048e35fdd936d133bf8a48de140a3c666897588a05shiqian 3049e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str. 3050e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 3051e35fdd936d133bf8a48de140a3c666897588a05shiqian StrNe(const internal::wstring& str) { 3052e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 3053e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, true)); 3054e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3055e35fdd936d133bf8a48de140a3c666897588a05shiqian 3056e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string equal to str, ignoring case. 3057e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 3058e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseEq(const internal::wstring& str) { 3059e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 3060e35fdd936d133bf8a48de140a3c666897588a05shiqian str, true, false)); 3061e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3062e35fdd936d133bf8a48de140a3c666897588a05shiqian 3063e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string not equal to str, ignoring case. 3064e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 3065e35fdd936d133bf8a48de140a3c666897588a05shiqian StrCaseNe(const internal::wstring& str) { 3066e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 3067e35fdd936d133bf8a48de140a3c666897588a05shiqian str, false, false)); 3068e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3069e35fdd936d133bf8a48de140a3c666897588a05shiqian 3070e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any wstring, std::wstring, or C wide string 3071e35fdd936d133bf8a48de140a3c666897588a05shiqian// that contains the given substring. 3072e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> > 3073e35fdd936d133bf8a48de140a3c666897588a05shiqian HasSubstr(const internal::wstring& substring) { 3074e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>( 3075e35fdd936d133bf8a48de140a3c666897588a05shiqian substring)); 3076e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3077e35fdd936d133bf8a48de140a3c666897588a05shiqian 3078e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that starts with 'prefix' (case-sensitive). 3079e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> > 3080e35fdd936d133bf8a48de140a3c666897588a05shiqian StartsWith(const internal::wstring& prefix) { 3081e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>( 3082e35fdd936d133bf8a48de140a3c666897588a05shiqian prefix)); 3083e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3084e35fdd936d133bf8a48de140a3c666897588a05shiqian 3085e35fdd936d133bf8a48de140a3c666897588a05shiqian// Matches a string that ends with 'suffix' (case-sensitive). 3086e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> > 3087e35fdd936d133bf8a48de140a3c666897588a05shiqian EndsWith(const internal::wstring& suffix) { 3088e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>( 3089e35fdd936d133bf8a48de140a3c666897588a05shiqian suffix)); 3090e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3091e35fdd936d133bf8a48de140a3c666897588a05shiqian 3092e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 3093e35fdd936d133bf8a48de140a3c666897588a05shiqian 3094e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 3095e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field == the second field. 3096e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); } 3097e35fdd936d133bf8a48de140a3c666897588a05shiqian 3098e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 3099e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field >= the second field. 3100e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); } 3101e35fdd936d133bf8a48de140a3c666897588a05shiqian 3102e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 3103e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field > the second field. 3104e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); } 3105e35fdd936d133bf8a48de140a3c666897588a05shiqian 3106e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 3107e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field <= the second field. 3108e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Le2Matcher Le() { return internal::Le2Matcher(); } 3109e35fdd936d133bf8a48de140a3c666897588a05shiqian 3110e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 3111e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field < the second field. 3112e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); } 3113e35fdd936d133bf8a48de140a3c666897588a05shiqian 3114e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a polymorphic matcher that matches a 2-tuple where the 3115e35fdd936d133bf8a48de140a3c666897588a05shiqian// first field != the second field. 3116e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); } 3117e35fdd936d133bf8a48de140a3c666897588a05shiqian 3118e35fdd936d133bf8a48de140a3c666897588a05shiqian// Creates a matcher that matches any value of type T that m doesn't 3119e35fdd936d133bf8a48de140a3c666897588a05shiqian// match. 3120e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename InnerMatcher> 3121e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) { 3122e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::NotMatcher<InnerMatcher>(m); 3123e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3124e35fdd936d133bf8a48de140a3c666897588a05shiqian 3125e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns a matcher that matches anything that satisfies the given 3126e35fdd936d133bf8a48de140a3c666897588a05shiqian// predicate. The predicate can be any unary function or functor 3127e35fdd936d133bf8a48de140a3c666897588a05shiqian// whose return type can be implicitly converted to bool. 3128e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename Predicate> 3129e35fdd936d133bf8a48de140a3c666897588a05shiqianinline PolymorphicMatcher<internal::TrulyMatcher<Predicate> > 3130e35fdd936d133bf8a48de140a3c666897588a05shiqianTruly(Predicate pred) { 3131e35fdd936d133bf8a48de140a3c666897588a05shiqian return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred)); 3132e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3133e35fdd936d133bf8a48de140a3c666897588a05shiqian 3134a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan// Returns a matcher that matches the container size. The container must 3135a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan// support both size() and size_type which all STL-like containers provide. 3136a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan// Note that the parameter 'size' can be a value of type size_type as well as 3137a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan// matcher. For instance: 3138a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan// EXPECT_THAT(container, SizeIs(2)); // Checks container has 2 elements. 3139a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan// EXPECT_THAT(container, SizeIs(Le(2)); // Checks container has at most 2. 3140a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wantemplate <typename SizeMatcher> 3141a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.waninline internal::SizeIsMatcher<SizeMatcher> 3142a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wanSizeIs(const SizeMatcher& size_matcher) { 3143a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan return internal::SizeIsMatcher<SizeMatcher>(size_matcher); 3144a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan} 3145a31d9ce2900275c5b9aff2459664a50381c7cbb0zhanyong.wan 31466a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// Returns a matcher that matches an equal container. 31476a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// This matcher behaves like Eq(), but in the event of mismatch lists the 31486a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// values that are included in one container but not the other. (Duplicate 31496a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan// values and order differences are not explained.) 31506a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wantemplate <typename Container> 3151821133180ccdb9eb062548d964929ba3b354eb84zhanyong.waninline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT 315202f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan GTEST_REMOVE_CONST_(Container)> > 31536a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan ContainerEq(const Container& rhs) { 3154b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // This following line is for working around a bug in MSVC 8.0, 3155b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan // which causes Container to be a const type sometimes. 315602f7106557fde1f1075dc53d65ef1f7a11851f93zhanyong.wan typedef GTEST_REMOVE_CONST_(Container) RawContainer; 3157821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan return MakePolymorphicMatcher( 3158821133180ccdb9eb062548d964929ba3b354eb84zhanyong.wan internal::ContainerEqMatcher<RawContainer>(rhs)); 3159b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 3160b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 3161898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// Returns a matcher that matches a container that, when sorted using 3162898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// the given comparator, matches container_matcher. 3163898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wantemplate <typename Comparator, typename ContainerMatcher> 3164898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.waninline internal::WhenSortedByMatcher<Comparator, ContainerMatcher> 3165898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanWhenSortedBy(const Comparator& comparator, 3166898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan const ContainerMatcher& container_matcher) { 3167898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>( 3168898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan comparator, container_matcher); 3169898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 3170898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 3171898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// Returns a matcher that matches a container that, when sorted using 3172898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan// the < operator, matches container_matcher. 3173898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wantemplate <typename ContainerMatcher> 3174898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.waninline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher> 3175898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wanWhenSorted(const ContainerMatcher& container_matcher) { 3176898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan return 3177898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>( 3178898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan internal::LessComparator(), container_matcher); 3179898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan} 3180898725cf47aacd45c385bb6c537c130ac8cd224czhanyong.wan 3181ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// Matches an STL-style container or a native array that contains the 3182ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// same number of elements as in rhs, where its i-th element and rhs's 3183ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// i-th element (as a pair) satisfy the given pair matcher, for all i. 3184ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// TupleMatcher must be able to be safely cast to Matcher<tuple<const 3185ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// T1&, const T2&> >, where T1 and T2 are the types of elements in the 3186ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan// LHS container and the RHS container respectively. 3187ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wantemplate <typename TupleMatcher, typename Container> 3188ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.waninline internal::PointwiseMatcher<TupleMatcher, 3189ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan GTEST_REMOVE_CONST_(Container)> 3190ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wanPointwise(const TupleMatcher& tuple_matcher, const Container& rhs) { 3191ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // This following line is for working around a bug in MSVC 8.0, 3192ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan // which causes Container to be a const type sometimes. 3193ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan typedef GTEST_REMOVE_CONST_(Container) RawContainer; 3194ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan return internal::PointwiseMatcher<TupleMatcher, RawContainer>( 3195ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan tuple_matcher, rhs); 3196ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan} 3197ab5b77c179009b787d71ff934eaf4a0db6c24814zhanyong.wan 3198b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Matches an STL-style container or a native array that contains at 3199b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// least one element matching the given value or matcher. 3200b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// 3201b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Examples: 3202b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// ::std::set<int> page_ids; 3203b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// page_ids.insert(3); 3204b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// page_ids.insert(1); 3205b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(page_ids, Contains(1)); 3206b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(page_ids, Contains(Gt(2))); 3207b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(page_ids, Not(Contains(4))); 3208b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// 3209b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// ::std::map<int, size_t> page_lengths; 3210b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// page_lengths[1] = 100; 32114019819dbb5369b1d638503523a04aaf7eb2a5adzhanyong.wan// EXPECT_THAT(page_lengths, 32124019819dbb5369b1d638503523a04aaf7eb2a5adzhanyong.wan// Contains(::std::pair<const int, size_t>(1, 100))); 3213b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// 3214b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// const char* user_ids[] = { "joe", "mike", "tom" }; 3215b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom")))); 3216b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename M> 3217b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.waninline internal::ContainsMatcher<M> Contains(M matcher) { 3218b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan return internal::ContainsMatcher<M>(matcher); 32196a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan} 32206a896b5ec607a54d86bbd2efdbc0248754b042e1zhanyong.wan 322133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Matches an STL-style container or a native array that contains only 322233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// elements matching the given value or matcher. 322333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 322433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only 322533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// the messages are different. 322633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 322733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// Examples: 322833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// ::std::set<int> page_ids; 322933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// // Each(m) matches an empty container, regardless of what m is. 323033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Each(Eq(1))); 323133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Each(Eq(77))); 323233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 323333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_ids.insert(3); 323433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Each(Gt(0))); 323533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Not(Each(Gt(4)))); 323633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_ids.insert(1); 323733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_ids, Not(Each(Lt(2)))); 323833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 323933605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// ::std::map<int, size_t> page_lengths; 324033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_lengths[1] = 100; 324133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_lengths[2] = 200; 324233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// page_lengths[3] = 300; 324333605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100)))); 324433605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(page_lengths, Each(Key(Le(3)))); 324533605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// 324633605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// const char* user_ids[] = { "joe", "mike", "tom" }; 324733605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan// EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom"))))); 324833605ba45417979cff7254c1196dfee65a7275b3zhanyong.wantemplate <typename M> 324933605ba45417979cff7254c1196dfee65a7275b3zhanyong.waninline internal::EachMatcher<M> Each(M matcher) { 325033605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan return internal::EachMatcher<M>(matcher); 325133605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan} 325233605ba45417979cff7254c1196dfee65a7275b3zhanyong.wan 3253b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// Key(inner_matcher) matches an std::pair whose 'first' field matches 3254b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 3255b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan// std::map that contains at least one element whose key is >= 5. 3256b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wantemplate <typename M> 3257b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.waninline internal::KeyMatcher<M> Key(M inner_matcher) { 3258b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan return internal::KeyMatcher<M>(inner_matcher); 3259b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan} 3260b5937dab6969ca4b1d8304cc8939ce16c1fb62e5zhanyong.wan 3261f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field 3262f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// matches first_matcher and whose 'second' field matches second_matcher. For 3263f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used 3264f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// to match a std::map<int, string> that contains exactly one element whose key 3265f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan// is >= 5 and whose value equals "foo". 3266f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wantemplate <typename FirstMatcher, typename SecondMatcher> 3267f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.waninline internal::PairMatcher<FirstMatcher, SecondMatcher> 3268f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wanPair(FirstMatcher first_matcher, SecondMatcher second_matcher) { 3269f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan return internal::PairMatcher<FirstMatcher, SecondMatcher>( 3270f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan first_matcher, second_matcher); 3271f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan} 3272f5e1ce5b9237edbc2e524ae9ebcb2452dc842937zhanyong.wan 3273e35fdd936d133bf8a48de140a3c666897588a05shiqian// Returns a predicate that is satisfied by anything that matches the 3274e35fdd936d133bf8a48de140a3c666897588a05shiqian// given matcher. 3275e35fdd936d133bf8a48de140a3c666897588a05shiqiantemplate <typename M> 3276e35fdd936d133bf8a48de140a3c666897588a05shiqianinline internal::MatcherAsPredicate<M> Matches(M matcher) { 3277e35fdd936d133bf8a48de140a3c666897588a05shiqian return internal::MatcherAsPredicate<M>(matcher); 3278e35fdd936d133bf8a48de140a3c666897588a05shiqian} 3279e35fdd936d133bf8a48de140a3c666897588a05shiqian 3280b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan// Returns true iff the value matches the matcher. 3281b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wantemplate <typename T, typename M> 3282b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.waninline bool Value(const T& value, M matcher) { 3283b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan return testing::Matches(matcher)(value); 3284b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan} 3285b82431625d1842d1498f3c0e6f1923ce81837c6ezhanyong.wan 328634b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan// Matches the value against the given matcher and explains the match 328734b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan// result to listener. 328834b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wantemplate <typename T, typename M> 3289a862f1de30ed1ef259bcec61c5939200b29c765czhanyong.waninline bool ExplainMatchResult( 329034b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan M matcher, const T& value, MatchResultListener* listener) { 329134b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener); 329234b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan} 329334b034c21ef4af7c0100194ed6f85910fc99debbzhanyong.wan 3294bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// AllArgs(m) is a synonym of m. This is useful in 3295bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// 3296bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq())); 3297bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// 3298bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// which is easier to read than 3299bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// 3300bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan// EXPECT_CALL(foo, Bar(_, _)).With(Eq()); 3301bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wantemplate <typename InnerMatcher> 3302bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.waninline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; } 3303bf55085d456e3ee55eb234c98c435e54d0a2d5aazhanyong.wan 3304e35fdd936d133bf8a48de140a3c666897588a05shiqian// These macros allow using matchers to check values in Google Test 3305e35fdd936d133bf8a48de140a3c666897588a05shiqian// tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher) 3306e35fdd936d133bf8a48de140a3c666897588a05shiqian// succeed iff the value matches the matcher. If the assertion fails, 3307e35fdd936d133bf8a48de140a3c666897588a05shiqian// the value and the description of the matcher will be printed. 3308e35fdd936d133bf8a48de140a3c666897588a05shiqian#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\ 3309e35fdd936d133bf8a48de140a3c666897588a05shiqian ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 3310e35fdd936d133bf8a48de140a3c666897588a05shiqian#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\ 3311e35fdd936d133bf8a48de140a3c666897588a05shiqian ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 3312e35fdd936d133bf8a48de140a3c666897588a05shiqian 3313e35fdd936d133bf8a48de140a3c666897588a05shiqian} // namespace testing 3314e35fdd936d133bf8a48de140a3c666897588a05shiqian 3315e35fdd936d133bf8a48de140a3c666897588a05shiqian#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 3316