gmock-matchers.h revision e2e8ba401d198d1a8304c652e997505609b62696
1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Copyright 2007, Google Inc. 2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// All rights reserved. 3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Redistribution and use in source and binary forms, with or without 5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// modification, are permitted provided that the following conditions are 6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// met: 7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// * Redistributions of source code must retain the above copyright 9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// notice, this list of conditions and the following disclaimer. 10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// * Redistributions in binary form must reproduce the above 11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// copyright notice, this list of conditions and the following disclaimer 12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// in the documentation and/or other materials provided with the 13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// distribution. 14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// * Neither the name of Google Inc. nor the names of its 15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// contributors may be used to endorse or promote products derived from 16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// this software without specific prior written permission. 17155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 212f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 221f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// 30878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// Author: wan@google.com (Zhanyong Wan) 31878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 32eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande// Google Mock - a framework for writing C++ mock classes. 33eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande// 34090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande// This file implements some commonly used argument matchers. More 35eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande// matchers can be defined by the user implementing the 36eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande// MatcherInterface<T> interface if necessary. 37eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande 38eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 39eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 40eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande 41eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#include <algorithm> 42eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#include <limits> 43eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#include <ostream> // NOLINT 449086afccf6938a49eb9a2cd248917c1cb0943942vandwalle#include <sstream> 45bdac915b98217c63284b47a7925f0719c8e40844Wei Wang#include <string> 46bdac915b98217c63284b47a7925f0719c8e40844Wei Wang#include <vector> 47155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <gmock/internal/gmock-internal-utils.h> 49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <gmock/internal/gmock-port.h> 50155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <gtest/gtest.h> 51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 52155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandenamespace testing { 53dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 54155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// To implement a matcher Foo for type T, define: 55f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao// 1. a class FooMatcherImpl that implements the 56155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// MatcherInterface<T> interface, and 57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 2. a factory function that creates a Matcher<T> object from a 58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// FooMatcherImpl*. 59653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// 609846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// The two-level delegation design makes it possible to allow a user 61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// to write "v" instead of "Eq(v)" where a Matcher is expected, which 62653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// is impossible if we pass matchers by pointers. It also eases 63e487a4648dd41881e754f1224aaedead78a0777dSky Faber// ownership management as Matcher objects can now be copied like 6484d962ec8f487f824214744498bba505a6db0c59Randy Pan// plain values. 653ecf5a032e94b6538a56f94a5b33e50cbc464007Jaewan Kim 668be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// MatchResultListener is an abstract class. Its << operator can be 678be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// used by a matcher to explain why a value matches or doesn't match. 688be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// 698be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// TODO(wan@google.com): add method 708be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// bool InterestedInWhy(bool result) const; 718be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// to indicate whether the listener is interested in why the match 728be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// result is 'result'. 738be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kaleleclass MatchResultListener { 740025465e311fe9504cd79610523a1b8171995accRebecca Silberstein public: 756c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein // Creates a listener object with the given underlying ostream. The 763ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu // listener does not own the ostream. 773ecf5a032e94b6538a56f94a5b33e50cbc464007Jaewan Kim explicit MatchResultListener(::std::ostream* os) : stream_(os) {} 78c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski virtual ~MatchResultListener() = 0; // Makes this class abstract. 79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 80e660aa2b9c9ca3a5c7903c37571ca7b91feb4ccfFyodor Kupolov // Streams x to the underlying ostream; does nothing if the ostream 81c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski // is NULL. 82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename T> 83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener& operator<<(const T& x) { 8440abf54c81c5624641543d86e1d7ab21ebe30175Paul Stewart if (stream_ != NULL) 85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *stream_ << x; 863ecf5a032e94b6538a56f94a5b33e50cbc464007Jaewan Kim return *this; 8703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn } 88dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 89155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Returns the underlying ostream. 90c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski ::std::ostream* stream() { return stream_; } 91155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 92fd5470391e5342daa38d00b68ccbccfeacbe6d33Alexandra Gherghina // Returns true iff the listener is interested in an explanation of 93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // the match result. A matcher's MatchAndExplain() method can use 94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // this information to avoid generating the explanation when no one 95bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // intends to hear it. 96bdac915b98217c63284b47a7925f0719c8e40844Wei Wang bool IsInterested() const { return stream_ != NULL; } 97992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle 98155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ::std::ostream* const stream_; 10087ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein 101f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); 10298e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande}; 103090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande 1048be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kaleleinline MatchResultListener::~MatchResultListener() { 1058be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele} 106d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu 107f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// The implementation of a matcher. 108868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Raotemplate <typename T> 1098be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kaleleclass MatcherInterface { 110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual ~MatcherInterface() {} 1128be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele 113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Returns true iff the matcher matches x; also explains the match 114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // result to 'listener', in the form of a non-restrictive relative 115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // clause ("which ...", "whose ...", etc) that describes x. For 116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // example, the MatchAndExplain() method of the Pointee(...) matcher 1178be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele // should generate an explanation like "which points to ...". 118a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist // 11931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // You should override this method when defining a new matcher. 12031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // 12131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // It's the responsibility of the caller (Google Mock) to guarantee 12231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // that 'listener' is not NULL. This helps to simplify a matcher's 12331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // implementation when it doesn't care about the performance, as it 12431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // can talk to 'listener' without checking its validity first. 125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // However, in order to implement dummy listeners efficiently, 12631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // listener->stream() may be NULL. 12787ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; 128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 129003b695597a1f010724662fbf4ac76953a71e3b8Rebecca Silberstein // Describes this matcher to an ostream. The function should print 130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // a verb phrase that describes the property a value matching this 131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // matcher should have. The subject of the verb phrase is the value 132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // being matched. For example, the DescribeTo() method of the Gt(7) 133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // matcher prints "is greater than 7". 134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeTo(::std::ostream* os) const = 0; 135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Describes the negation of this matcher to an ostream. For 13779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande // example, if the description of this matcher is "is greater than 138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // 7", the negated description could be "is not greater than 7". 139f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle // You are not required to override this when implementing 14070b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle // MatcherInterface, but it is highly advised so that your matcher 141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // can produce good error messages. 14284ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart virtual void DescribeNegationTo(::std::ostream* os) const { 14384ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart *os << "not ("; 14484ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart DescribeTo(os); 14584ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart *os << ")"; 14684ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart } 147bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}; 148bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 149bdac915b98217c63284b47a7925f0719c8e40844Wei Wangnamespace internal { 150bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 151bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// A match result listener that ignores the explanation. 152bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass DummyMatchResultListener : public MatchResultListener { 153bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public: 154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DummyMatchResultListener() : MatchResultListener(NULL) {} 155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 1570091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); 158bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}; 159bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// A match result listener that forwards the explanation to a given 16103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// ostream. The difference between this and MatchResultListener is 162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// that the former is concrete. 163f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottclass StreamMatchResultListener : public MatchResultListener { 164bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public: 165d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang explicit StreamMatchResultListener(::std::ostream* os) 166bdac915b98217c63284b47a7925f0719c8e40844Wei Wang : MatchResultListener(os) {} 167ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle 168ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private: 169ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); 170cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPenna}; 171cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPenna 172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// A match result listener that stores the explanation in a string. 173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass StringMatchResultListener : public MatchResultListener { 174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StringMatchResultListener() : MatchResultListener(&ss_) {} 1761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne // Returns the explanation heard so far. 1782bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu internal::string str() const { return ss_.str(); } 1792bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu 1802bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu private: 181637a86ffb3a036a4f26a471378b57d8817f35c25Glen Kuhne ::std::stringstream ss_; 182ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius 183ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); 184ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius}; 185bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 186bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// An internal class for implementing Matcher<T>, which will derive 1876c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein// from it. We put functionalities common to all Matcher<T> 188bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// specializations here to avoid code duplication. 189f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raotemplate <typename T> 190bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass MatcherBase { 191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Returns true iff the matcher matches x; also explains the match 193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // result to 'listener'. 194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool MatchAndExplain(T x, MatchResultListener* listener) const { 195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return impl_->MatchAndExplain(x, listener); 196dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov } 197f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 198dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // Returns true iff this matcher matches x. 199868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao bool Matches(T x) const { 200868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao DummyMatchResultListener dummy; 20187ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein return MatchAndExplain(x, &dummy); 20287ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein } 20387ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein 20487ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein // Describes this matcher to an ostream. 205a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } 206a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 20787ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein // Describes the negation of this matcher to an ostream. 208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void DescribeNegationTo(::std::ostream* os) const { 2090c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein impl_->DescribeNegationTo(os); 2100c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein } 2110c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 2120c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein // Explains why x matches, or doesn't match, the matcher. 2130c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein void ExplainMatchResultTo(T x, ::std::ostream* os) const { 2140c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein StreamMatchResultListener listener(os); 2150c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein MatchAndExplain(x, &listener); 2160c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein } 2170c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 2180c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein protected: 2190c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein MatcherBase() {} 2200c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 2210c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein // Constructs a matcher from its implementation. 2220c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein explicit MatcherBase(const MatcherInterface<T>* impl) 2230c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein : impl_(impl) {} 2240c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual ~MatcherBase() {} 226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 227f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao private: 228155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar 229f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // interfaces. The former dynamically allocates a chunk of memory 230f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // to hold the reference count, while the latter tracks all 231155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // references using a circular linked list without allocating 232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // memory. It has been observed that linked_ptr performs better in 233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // typical scenarios. However, shared_ptr can out-perform 234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // linked_ptr when there are many more uses of the copy constructor 235f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // than the default constructor. 236155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // 237155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // If performance becomes a problem, we should see if using 238155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // shared_ptr helps. 239155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_; 240155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 242155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} // namespace internal 243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// A Matcher<T> is a copyable and IMMUTABLE (except by assignment) 245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// object that can check whether a value of type T matches. The 246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// implementation of Matcher<T> is just a linked_ptr to const 247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// MatcherInterface<T>, so copying is fairly cheap. Don't inherit 248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// from Matcher! 249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename T> 250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass Matcher : public internal::MatcherBase<T> { 251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Constructs a null matcher. Needed for storing Matcher objects in 253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // STL containers. 254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Matcher() {} 255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Constructs a matcher from its implementation. 257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit Matcher(const MatcherInterface<T>* impl) 258f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao : internal::MatcherBase<T>(impl) {} 259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Implicit constructor here allows people to write 261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes 2621316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang Matcher(T value); // NOLINT 263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 264155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2651316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang// The following two specializations allow the user to write str 2661316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang// instead of Eq(str) and "foo" instead of Eq("foo") when a string 2671316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang// matcher is expected. 2681316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangtemplate <> 2691316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangclass Matcher<const internal::string&> 270d03a9283285bb7adef6c687eb3a91fa4a8c4b502Vinit Deshpande : public internal::MatcherBase<const internal::string&> { 2711316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang public: 2721316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang Matcher() {} 27364c98f4afda6c7970c5d563580165a308d5e7c15Jason Monk 274155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit Matcher(const MatcherInterface<const internal::string&>* impl) 275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande : internal::MatcherBase<const internal::string&>(impl) {} 2761316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang 2771316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang // Allows the user to write str instead of Eq(str) sometimes, where 2781316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang // str is a string object. 2791316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang Matcher(const internal::string& s); // NOLINT 2801316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang 2811316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang // Allows the user to write "foo" instead of Eq("foo") sometimes. 2821316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang Matcher(const char* s); // NOLINT 2831316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang}; 2841316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang 2851316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangtemplate <> 2861316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangclass Matcher<internal::string> 2871316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang : public internal::MatcherBase<internal::string> { 2881316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang public: 2891316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang Matcher() {} 2901316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang 2911316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang explicit Matcher(const MatcherInterface<internal::string>* impl) 2921316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang : internal::MatcherBase<internal::string>(impl) {} 2931316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang 2941316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang // Allows the user to write str instead of Eq(str) sometimes, where 2951316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang // str is a string object. 296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Matcher(const internal::string& s); // NOLINT 297155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Allows the user to write "foo" instead of Eq("foo") sometimes. 2991316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang Matcher(const char* s); // NOLINT 3001316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang}; 301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The PolymorphicMatcher class template makes it easy to implement a 303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// polymorphic matcher (i.e. a matcher that can match values of more 304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// than one type, e.g. Eq(n) and NotNull()). 305bace539f9cdc4ffb521c8251dd1c56073e805cd4Bartosz Fabianowski// 306002ea67f42b0f69a8c9fa4719391f9476567b762Sky Faber// To define a polymorphic matcher, a user should provide an Impl 307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// class that has a DescribeTo() method and a DescribeNegationTo() 308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// method, and define a member function (or member function template) 309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// bool MatchAndExplain(const Value& value, 311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// MatchResultListener* listener) const; 312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// See the definition of NotNull() for a complete example. 314155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <class Impl> 315155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass PolymorphicMatcher { 316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} 318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Returns a mutable reference to the underlying matcher 320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // implementation object. 321c35d728a15e9270f5642ef79f5245c89d749285fSky Faber Impl& mutable_impl() { return impl_; } 322e1d14389cd77b0757ba3533b122cf00ad65e2099Paul Stewart 3238fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley // Returns an immutable reference to the underlying matcher 324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // implementation object. 325c35d728a15e9270f5642ef79f5245c89d749285fSky Faber const Impl& impl() const { return impl_; } 326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename T> 328155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande operator Matcher<T>() const { 329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return Matcher<T>(new MonomorphicImpl<T>(impl_)); 330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename T> 334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class MonomorphicImpl : public MatcherInterface<T> { 335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} 337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 338f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao virtual void DescribeTo(::std::ostream* os) const { 339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande impl_.DescribeTo(os); 340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 341f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 342f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao virtual void DescribeNegationTo(::std::ostream* os) const { 343da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein impl_.DescribeNegationTo(os); 344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return impl_.MatchAndExplain(x, listener); 348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 349f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const Impl impl_; 352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); 354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }; 355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Impl impl_; 357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher); 359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Creates a matcher from its implementation. This is easier to use 362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// than the Matcher<T> constructor as it doesn't require you to 363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// explicitly write the template argument, e.g. 364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// MakeMatcher(foo); 366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// vs 367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Matcher<const string&>(foo); 368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename T> 369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) { 370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return Matcher<T>(impl); 371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Creates a polymorphic matcher from its implementation. This is 374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// easier to use than the PolymorphicMatcher<Impl> constructor as it 375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// doesn't require you to explicitly write the template argument, e.g. 376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 3772a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein// MakePolymorphicMatcher(foo); 37861312e14a088a9487d4db64f08285162476e870fPaul Stewart// vs 379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// PolymorphicMatcher<TypeOfFoo>(foo); 380da918df16e03ee19be62343313d954027d3eb3abRebecca Silbersteintemplate <class Impl> 381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) { 382da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein return PolymorphicMatcher<Impl>(impl); 383bdac915b98217c63284b47a7925f0719c8e40844Wei Wang} 384fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein 385fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// In order to be safe and clear, casting between different matcher 386637a86ffb3a036a4f26a471378b57d8817f35c25Glen Kuhne// types is done explicitly via MatcherCast<T>(m), which takes a 387fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// matcher m and returns a Matcher<T>. It compiles only when T can be 3883871ff67f4a6970f1831fc8951392746c9e2bfa2Rebecca Silberstein// statically converted to the argument type of m. 389fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silbersteintemplate <typename T, typename M> 390fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca SilbersteinMatcher<T> MatcherCast(M m); 391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 392fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// Implements SafeMatcherCast(). 393fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// 394fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// We use an intermediate class to do the actual safe casting as Nokia's 395bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// Symbian compiler cannot decide between 396fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// template <T, M> ... (M) and 397cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPenna// template <T, U> ... (const Matcher<U>&) 398fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// for function templates but can for member function templates. 39961312e14a088a9487d4db64f08285162476e870fPaul Stewarttemplate <typename T> 400fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silbersteinclass SafeMatcherCastImpl { 401f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao public: 402f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // This overload handles polymorphic matchers only since monomorphic 403f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // matchers are handled by the next one. 404fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein template <typename M> 4053204fb9682242a7b5a749489076c66d448c42577Roshan Pius static inline Matcher<T> Cast(M polymorphic_matcher) { 406dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov return Matcher<T>(polymorphic_matcher); 407dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov } 408dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 409868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao // This overload handles monomorphic matchers. 410f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // 411f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // In general, if type T can be implicitly converted to type U, we can 412bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is 413bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // contravariant): just keep a copy of the original Matcher<U>, convert the 414bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // argument from type T to U, and then pass it to the underlying Matcher<U>. 415003b695597a1f010724662fbf4ac76953a71e3b8Rebecca Silberstein // The only exception is when U is a reference and T is not, as the 41687ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein // underlying Matcher<U> may be interested in the argument's address, which 41700ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein // is not preserved in the conversion from T to U. 4181c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde template <typename U> 4191c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde static inline Matcher<T> Cast(const Matcher<U>& matcher) { 4201c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde // Enforce that T can be implicitly converted to U. 421f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value), 422f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao T_must_be_implicitly_convertible_to_U); 423f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // Enforce that we are not converting a non-reference type T to a reference 424f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // type U. 425f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao GTEST_COMPILE_ASSERT_( 426f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao internal::is_reference<T>::value || !internal::is_reference<U>::value, 427f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao cannot_convert_non_referentce_arg_to_reference); 42836f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein // In case both T and U are arithmetic types, enforce that the 429f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // conversion is not lossy. 43036f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) RawT; 43136f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(U)) RawU; 43236f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; 43336f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; 4341c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde GTEST_COMPILE_ASSERT_( 43536f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein kTIsOther || kUIsOther || 4361c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde (internal::LosslessArithmeticConvertible<RawT, RawU>::value), 4371c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde conversion_of_arithmetic_types_must_be_lossless); 43836f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein return MatcherCast<T>(matcher); 43936f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein } 44036f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein}; 44136f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein 44236f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silbersteintemplate <typename T, typename M> 44336f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silbersteininline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) { 44436f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher); 4451c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde} 4461c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde 4471c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde// A<T>() returns a matcher that matches any value of type T. 448155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename T> 449155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeMatcher<T> A(); 450bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 451155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION 452155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// and MUST NOT BE USED IN USER CODE!!! 453155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandenamespace internal { 454155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 455155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// If the explanation is not empty, prints it to the ostream. 456155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline void PrintIfNotEmpty(const internal::string& explanation, 457155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande std::ostream* os) { 45898e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande if (explanation != "" && os != NULL) { 45998e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande *os << ", " << explanation; 460d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang } 46198e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande} 462155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 463155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Matches the value against the given matcher, prints the value and explains 464155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// the match result to the listener. Returns the match result. 465155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 'listener' must not be NULL. 46698e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande// Value cannot be passed by const reference, because some matchers take a 46798e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande// non-const argument. 46898e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpandetemplate <typename Value, typename T> 46998e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpandebool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher, 47098e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande MatchResultListener* listener) { 471a7bf9d90d68a4833cc3c64da98024167931c4b1epkanwar if (!listener->IsInterested()) { 472fdce524fd05844c996cf1c5c0c102a87fde8e32cVinit Deshpande // If the listener is not interested, we do not need to construct the 4733c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills // inner explanation. 47498e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande return matcher.Matches(value); 475d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang } 4763c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills 4773c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills StringMatchResultListener inner_listener; 4783c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills const bool match = matcher.MatchAndExplain(value, &inner_listener); 47998e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande 48098e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande UniversalPrint(value, listener->stream()); 48198e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande PrintIfNotEmpty(inner_listener.str(), listener->stream()); 48298e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande 48398e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande return match; 484878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein} 485878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 486878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// An internal helper class for doing compile-time loop on a tuple's 487878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// fields. 4881f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silbersteintemplate <size_t N> 489878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silbersteinclass TuplePrefix { 490878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public: 491878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true 492878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // iff the first N fields of matcher_tuple matches the first N 493878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // fields of value_tuple, respectively. 4942f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein template <typename MatcherTuple, typename ValueTuple> 4952f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein static bool Matches(const MatcherTuple& matcher_tuple, 4961f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein const ValueTuple& value_tuple) { 4971f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein using ::std::tr1::get; 4981f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) 499878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple)); 500878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } 501878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 502878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os) 503155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // describes failures in matching the first N fields of matchers 504155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // against the first N fields of values. If there is no failure, 505155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // nothing will be streamed to os. 506155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename MatcherTuple, typename ValueTuple> 507faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee static void ExplainMatchFailuresTo(const MatcherTuple& matchers, 50803b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn const ValueTuple& values, 509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ::std::ostream* os) { 510d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius using ::std::tr1::tuple_element; 511d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius using ::std::tr1::get; 512d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius 5131c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde // First, describes failures in the first N - 1 fields. 514155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os); 515155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Then describes the failure (if any) in the (N - 1)-th (0-based) 517dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // field. 518dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov typename tuple_element<N - 1, MatcherTuple>::type matcher = 519dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov get<N - 1>(matchers); 520dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov typedef typename tuple_element<N - 1, ValueTuple>::type Value; 521dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov Value value = get<N - 1>(values); 522dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov StringMatchResultListener listener; 523dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov if (!matcher.MatchAndExplain(value, &listener)) { 524155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // TODO(wan): include in the message the name of the parameter 525155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // as used in MOCK_METHOD*() when possible. 526bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski *os << " Expected arg #" << N - 1 << ": "; 527bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski get<N - 1>(matchers).DescribeTo(os); 528bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski *os << "\n Actual: "; 529bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski // We remove the reference in type Value to prevent the 5303bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius // universal printer from printing the address of value, which 5313bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius // isn't interesting to the user most of the time. The 5323bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius // matcher's MatchAndExplain() method handles the case when 5333bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius // the address is interesting. 5343bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius internal::UniversalPrint(value, os); 5353bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius PrintIfNotEmpty(listener.str(), os); 5363bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius *os << "\n"; 537bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski } 538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 539a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng}; 540a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The base case. 542a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zhengtemplate <> 543a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zhengclass TuplePrefix<0> { 544bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public: 545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename MatcherTuple, typename ValueTuple> 5468fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley static bool Matches(const MatcherTuple& /* matcher_tuple */, 547bdac915b98217c63284b47a7925f0719c8e40844Wei Wang const ValueTuple& /* value_tuple */) { 548155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 549bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 550f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 551bdac915b98217c63284b47a7925f0719c8e40844Wei Wang template <typename MatcherTuple, typename ValueTuple> 552bdac915b98217c63284b47a7925f0719c8e40844Wei Wang static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, 553bdac915b98217c63284b47a7925f0719c8e40844Wei Wang const ValueTuple& /* values */, 554bdac915b98217c63284b47a7925f0719c8e40844Wei Wang ::std::ostream* /* os */) {} 555bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}; 556bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 557bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// TupleMatches(matcher_tuple, value_tuple) returns true iff all 558bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// matchers in matcher_tuple match the corresponding fields in 559bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// value_tuple. It is a compiler error if matcher_tuple and 560bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// value_tuple have different number of fields or incompatible field 561bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// types. 562bdac915b98217c63284b47a7925f0719c8e40844Wei Wangtemplate <typename MatcherTuple, typename ValueTuple> 5631227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpandebool TupleMatches(const MatcherTuple& matcher_tuple, 5646c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein const ValueTuple& value_tuple) { 5656c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein using ::std::tr1::tuple_size; 5666c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein // Makes sure that matcher_tuple and value_tuple have the same 56703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn // number of fields. 56849dfc6768889a33eb67102b16faf21667af2a60dVinit Deshpande GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value == 56949dfc6768889a33eb67102b16faf21667af2a60dVinit Deshpande tuple_size<ValueTuple>::value, 570691fb51e7ac5e4d0b91a4719cd0ed10a8c212e50Vinit Deshpande matcher_and_value_have_different_numbers_of_fields); 571bdac915b98217c63284b47a7925f0719c8e40844Wei Wang return TuplePrefix<tuple_size<ValueTuple>::value>:: 572bdac915b98217c63284b47a7925f0719c8e40844Wei Wang Matches(matcher_tuple, value_tuple); 573bdac915b98217c63284b47a7925f0719c8e40844Wei Wang} 574bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 575bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// Describes failures in matching matchers against values. If there 57603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// is no failure, nothing will be streamed to os. 57703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborntemplate <typename MatcherTuple, typename ValueTuple> 57803b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackbornvoid ExplainMatchFailureTupleTo(const MatcherTuple& matchers, 57903b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn const ValueTuple& values, 580a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng ::std::ostream* os) { 581a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng using ::std::tr1::tuple_size; 582a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo( 583a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng matchers, values, os); 584a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng} 585a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 586a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng// The MatcherCastImpl class template is a helper for implementing 587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// MatcherCast(). We need this helper in order to partially 588155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// specialize the implementation of MatcherCast() (C++ allows 589155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// class/struct templates to be partially specialized, but not 590155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// function templates.). 591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// This general version is used when MatcherCast()'s argument is a 59348444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills// polymorphic matcher (i.e. something that can be converted to a 59448444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills// Matcher but is not one yet; for example, Eq(value)). 59548444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Willstemplate <typename T, typename M> 596ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalleclass MatcherCastImpl { 597ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle public: 598155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static Matcher<T> Cast(M polymorphic_matcher) { 599155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return Matcher<T>(polymorphic_matcher); 600bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 601bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}; 602bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 603bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// This more specialized version is used when MatcherCast()'s argument 604bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// is already a Matcher. This only compiles when type T can be 605bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// statically converted to type U. 606bdac915b98217c63284b47a7925f0719c8e40844Wei Wangtemplate <typename T, typename U> 607bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass MatcherCastImpl<T, Matcher<U> > { 608bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public: 609bdac915b98217c63284b47a7925f0719c8e40844Wei Wang static Matcher<T> Cast(const Matcher<U>& source_matcher) { 610bdac915b98217c63284b47a7925f0719c8e40844Wei Wang return Matcher<T>(new Impl(source_matcher)); 611bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 612bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 613bdac915b98217c63284b47a7925f0719c8e40844Wei Wang private: 614bdac915b98217c63284b47a7925f0719c8e40844Wei Wang class Impl : public MatcherInterface<T> { 615bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public: 616bdac915b98217c63284b47a7925f0719c8e40844Wei Wang explicit Impl(const Matcher<U>& source_matcher) 617bdac915b98217c63284b47a7925f0719c8e40844Wei Wang : source_matcher_(source_matcher) {} 618bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 619bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // We delegate the matching logic to the source matcher. 620bdac915b98217c63284b47a7925f0719c8e40844Wei Wang virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 621bdac915b98217c63284b47a7925f0719c8e40844Wei Wang return source_matcher_.MatchAndExplain(static_cast<U>(x), listener); 622bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 623bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 624bdac915b98217c63284b47a7925f0719c8e40844Wei Wang virtual void DescribeTo(::std::ostream* os) const { 625bdac915b98217c63284b47a7925f0719c8e40844Wei Wang source_matcher_.DescribeTo(os); 626bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 627bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 628bdac915b98217c63284b47a7925f0719c8e40844Wei Wang virtual void DescribeNegationTo(::std::ostream* os) const { 629bdac915b98217c63284b47a7925f0719c8e40844Wei Wang source_matcher_.DescribeNegationTo(os); 630bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 631bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 632bdac915b98217c63284b47a7925f0719c8e40844Wei Wang private: 633bdac915b98217c63284b47a7925f0719c8e40844Wei Wang const Matcher<U> source_matcher_; 634bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 635bdac915b98217c63284b47a7925f0719c8e40844Wei Wang GTEST_DISALLOW_ASSIGN_(Impl); 636bdac915b98217c63284b47a7925f0719c8e40844Wei Wang }; 637bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}; 638bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 6398fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// This even more specialized version is used for efficiently casting 640ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh// a matcher to its own type. 641f3f4029b3ac41da4cc6a1bc22bae47c750a47048Andres Moralestemplate <typename T> 642ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikhclass MatcherCastImpl<T, Matcher<T> > { 643ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh public: 644f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } 645ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh}; 6463f7ef65ab71619040032aee96b5599849881d6fdAndres Morales 6473f7ef65ab71619040032aee96b5599849881d6fdAndres Morales// Implements A<T>(). 6481227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpandetemplate <typename T> 6491227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpandeclass AnyMatcherImpl : public MatcherInterface<T> { 6501227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpande public: 65103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn virtual bool MatchAndExplain( 65203b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn T /* x */, MatchResultListener* /* listener */) const { return true; } 6531227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpande virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; } 65403b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn virtual void DescribeNegationTo(::std::ostream* os) const { 65503b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn // This is mostly for completeness' safe, as it's not very useful 65603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn // to write Not(A<bool>()). However we cannot completely rule out 65703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn // such a possibility, and it doesn't hurt to be prepared. 65803b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn *os << "never matches"; 65903b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn } 66003b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn}; 66103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn 66203b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// Implements _, a matcher that matches any value of any 66303b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// type. This is a polymorphic matcher, so we need a template type 66403b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// conversion operator to make it appearing as a Matcher<T> for any 66503b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// type T. 66603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackbornclass AnythingMatcher { 667bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public: 668bdac915b98217c63284b47a7925f0719c8e40844Wei Wang template <typename T> 66903b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn operator Matcher<T>() const { return A<T>(); } 67003b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn}; 67103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn 672cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// Implements a matcher that compares a given value with a 673cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// pre-supplied value using one of the ==, <=, <, etc, operators. The 674cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// two values being compared don't have to have the same type. 675cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// 676cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// The matcher defined here is polymorphic (for example, Eq(5) can be 677edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// used to match an int, a short, a double, etc). Therefore we use 678edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// a template type conversion operator in the implementation. 679edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// 680edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// We define this as a macro in order to eliminate duplicated source 681edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// code. 682155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 683155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The following template definition assumes that the Rhs parameter is 684a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande// a "bare" type (i.e. neither 'const T' nor 'T&'). 685155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \ 686155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande name, op, relation, negated_relation) \ 687155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename Rhs> class name##Matcher { \ 688155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: \ 68931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \ 6909086afccf6938a49eb9a2cd248917c1cb0943942vandwalle template <typename Lhs> \ 691155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande operator Matcher<Lhs>() const { \ 6929086afccf6938a49eb9a2cd248917c1cb0943942vandwalle return MakeMatcher(new Impl<Lhs>(rhs_)); \ 6939086afccf6938a49eb9a2cd248917c1cb0943942vandwalle } \ 6949086afccf6938a49eb9a2cd248917c1cb0943942vandwalle private: \ 695155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename Lhs> \ 696155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class Impl : public MatcherInterface<Lhs> { \ 6979878c61bbd81176561991be025af44efc67332feWenchao Tong public: \ 6989878c61bbd81176561991be025af44efc67332feWenchao Tong explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \ 6999878c61bbd81176561991be025af44efc67332feWenchao Tong virtual bool MatchAndExplain(\ 7009878c61bbd81176561991be025af44efc67332feWenchao Tong Lhs lhs, MatchResultListener* /* listener */) const { \ 7019878c61bbd81176561991be025af44efc67332feWenchao Tong return lhs op rhs_; \ 702155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } \ 703155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeTo(::std::ostream* os) const { \ 704a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande *os << relation " "; \ 705155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande UniversalPrint(rhs_, os); \ 706155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } \ 707155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeNegationTo(::std::ostream* os) const { \ 708155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << negated_relation " "; \ 709155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande UniversalPrint(rhs_, os); \ 710155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } \ 711155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: \ 712155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Rhs rhs_; \ 713155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(Impl); \ 714155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }; \ 715155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Rhs rhs_; \ 716155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(name##Matcher); \ 717155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 718155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 719155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v) 7202fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein// respectively. 7212fd9436184ea37a297f2abd5e884d30d0014b620Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to"); 7222fd9436184ea37a297f2abd5e884d30d0014b620Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >="); 7232fd9436184ea37a297f2abd5e884d30d0014b620Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >"); 724de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <="); 725de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <"); 726de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to"); 727de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silberstein 728de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silberstein#undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_ 729de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silberstein 730155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements the polymorphic IsNull() matcher, which matches any raw or smart 731155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// pointer that is NULL. 732155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass IsNullMatcher { 733155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 734155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename Pointer> 735155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool MatchAndExplain(const Pointer& p, 7368fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley MatchResultListener* /* listener */) const { 737dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov return GetRawPointer(p) == NULL; 738dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov } 739155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 740155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } 74105d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein void DescribeNegationTo(::std::ostream* os) const { 74205d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein *os << "isn't NULL"; 74305d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein } 74405d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein}; 74505d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein 74605d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein// Implements the polymorphic NotNull() matcher, which matches any raw or smart 74705d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein// pointer that is not NULL. 748de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silbersteinclass NotNullMatcher { 74905d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein public: 75005d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein template <typename Pointer> 75105d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein bool MatchAndExplain(const Pointer& p, 75205d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein MatchResultListener* /* listener */) const { 75305d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein return GetRawPointer(p) != NULL; 754155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 755155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 756155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } 757155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void DescribeNegationTo(::std::ostream* os) const { 758155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "is NULL"; 759155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 760155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 761155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 762155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Ref(variable) matches any argument that is a reference to 763155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 'variable'. This matcher is polymorphic as it can match any 764155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// super type of the type of 'variable'. 765155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 766155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The RefMatcher template class implements Ref(variable). It can 767155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// only be instantiated with a reference type. This prevents a user 768dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// from mistakenly using Ref(x) to match a non-reference function 769dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// argument. For example, the following will righteously cause a 770dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// compiler error: 771dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// 772dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// int n; 773dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// Matcher<int> m1 = Ref(n); // This won't compile. 77402938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov// Matcher<int&> m2 = Ref(n); // This will compile. 775dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovtemplate <typename T> 776dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovclass RefMatcher; 777dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 778dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovtemplate <typename T> 779dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovclass RefMatcher<T&> { 780dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // Google Mock is a generic framework and thus needs to support 78102938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov // mocking any function types, including those that take non-const 782dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // reference arguments. Therefore the template parameter T (and 783dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // Super below) can be instantiated to either a const type or a 784dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // non-const type. 785dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov public: 786dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // RefMatcher() takes a T& instead of const T&, as we want the 787dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov // compiler to catch using Ref(const_value) as a matcher for a 788155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // non-const reference. 789155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit RefMatcher(T& x) : object_(x) {} // NOLINT 790155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 791155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename Super> 792155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande operator Matcher<Super&>() const { 793155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // By passing object_ (type T&) to Impl(), which expects a Super&, 794155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // we make sure that Super is a super type of T. In particular, 795155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // this catches using Ref(const_value) as a matcher for a 796155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // non-const reference, as you cannot implicitly convert a const 797155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // reference to a non-const reference. 798155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return MakeMatcher(new Impl<Super>(object_)); 799155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8008fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 801155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 802155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename Super> 803f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao class Impl : public MatcherInterface<Super&> { 804155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 805155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit Impl(Super& x) : object_(x) {} // NOLINT 806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 807155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // MatchAndExplain() takes a Super& (as opposed to const Super&) 808155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // in order to match the interface MatcherInterface<Super&>. 809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual bool MatchAndExplain( 810155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Super& x, MatchResultListener* listener) const { 811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *listener << "which is located @" << static_cast<const void*>(&x); 812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return &x == &object_; 8138fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley } 814155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 815328fc5407927799843c11f2b767a8cf47b89f366Robert Greenwalt virtual void DescribeTo(::std::ostream* os) const { 8163871ff67f4a6970f1831fc8951392746c9e2bfa2Rebecca Silberstein *os << "references the variable "; 817f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao UniversalPrinter<Super&>::Print(object_, os); 818f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao } 819f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 820f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott virtual void DescribeNegationTo(::std::ostream* os) const { 82113cddb5337418359eb5f9bebd0504fbc5c47fc41Julia Reynolds *os << "does not reference the variable "; 82213cddb5337418359eb5f9bebd0504fbc5c47fc41Julia Reynolds UniversalPrinter<Super&>::Print(object_, os); 823155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 824d03a9283285bb7adef6c687eb3a91fa4a8c4b502Vinit Deshpande 8251f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein private: 8261f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein const Super& object_; 8271f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein 828155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(Impl); 829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }; 830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande T& object_; 832155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 833155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(RefMatcher); 834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 835155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 836155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Polymorphic helper functions for narrow and wide string matchers. 837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { 838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return String::CaseInsensitiveCStringEquals(lhs, rhs); 839155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 840155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8418fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wileyinline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, 842155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const wchar_t* rhs) { 843155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return String::CaseInsensitiveWideCStringEquals(lhs, rhs); 844f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao} 845155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 846155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// String comparison for narrow or wide strings that can have embedded NUL 847155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// characters. 848155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename StringType> 849c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silbersteinbool CaseInsensitiveStringEquals(const StringType& s1, 850c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein const StringType& s2) { 851c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein // Are the heads equal? 852c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { 853c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein return false; 854c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein } 855c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein 856c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein // Skip the equal heads. 857c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein const typename StringType::value_type nul = 0; 858c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein const size_t i1 = s1.find(nul), i2 = s2.find(nul); 859c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein 860c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein // Are we at the end of either s1 or s2? 861c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein if (i1 == StringType::npos || i2 == StringType::npos) { 862c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein return i1 == i2; 863c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein } 864c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein 865a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein // Are the tails equal? 866a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); 867a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein} 868a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 869a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// String matchers. 870003b695597a1f010724662fbf4ac76953a71e3b8Rebecca Silberstein 871a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// Implements equality-based string matchers like StrEq, StrCaseNe, and etc. 872a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteintemplate <typename StringType> 873a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteinclass StrEqualityMatcher { 874a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein public: 875a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein typedef typename StringType::const_pointer ConstCharPointer; 876a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 877a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein StrEqualityMatcher(const StringType& str, bool expect_eq, 878a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein bool case_sensitive) 879a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} 880a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 881a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein // When expect_eq_ is true, returns true iff s is equal to string_; 882a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein // otherwise returns true iff s is not equal to string_. 883a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein bool MatchAndExplain(ConstCharPointer s, 884a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein MatchResultListener* listener) const { 885a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein if (s == NULL) { 886a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein return !expect_eq_; 887a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 888a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein return MatchAndExplain(StringType(s), listener); 889a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 890a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 891a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein bool MatchAndExplain(const StringType& s, 892a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein MatchResultListener* /* listener */) const { 893a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein const bool eq = case_sensitive_ ? s == string_ : 894a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein CaseInsensitiveStringEquals(s, string_); 895a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein return expect_eq_ == eq; 896a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 897a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 898a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein void DescribeTo(::std::ostream* os) const { 899a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein DescribeToHelper(expect_eq_, os); 900a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 901a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 902a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein void DescribeNegationTo(::std::ostream* os) const { 903a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein DescribeToHelper(!expect_eq_, os); 904a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 905a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 906a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein private: 907a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { 908a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein *os << (expect_eq ? "is " : "isn't "); 909a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein *os << "equal to "; 910a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein if (!case_sensitive_) { 911a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein *os << "(ignoring case) "; 912a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 913a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein UniversalPrint(string_, os); 914a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 915a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 916a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein const StringType string_; 917a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein const bool expect_eq_; 918a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein const bool case_sensitive_; 919a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 920a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); 921a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein}; 922c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein 923c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein// Implements the polymorphic HasSubstr(substring) matcher, which 924c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein// can be used as a Matcher<T> as long as T can be converted to a 925edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// string. 926aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteintemplate <typename StringType> 927edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silbersteinclass HasSubstrMatcher { 928edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein public: 929edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein typedef typename StringType::const_pointer ConstCharPointer; 930edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 931edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein explicit HasSubstrMatcher(const StringType& substring) 932edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein : substring_(substring) {} 933edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 934edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein // These overloaded methods allow HasSubstr(substring) to be used as a 935edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein // Matcher<T> as long as T can be converted to string. Returns true 936edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein // iff s contains substring_ as a substring. 9371f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein bool MatchAndExplain(ConstCharPointer s, 9381f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein MatchResultListener* listener) const { 9391f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein return s != NULL && MatchAndExplain(StringType(s), listener); 9401f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein } 9411f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein 9421f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein bool MatchAndExplain(const StringType& s, 943a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein MatchResultListener* /* listener */) const { 9441f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein return s.find(substring_) != StringType::npos; 9451f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein } 946edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 947edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein // Describes what this matcher matches. 94887ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein void DescribeTo(::std::ostream* os) const { 94987ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein *os << "has substring "; 95087ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein UniversalPrint(substring_, os); 95187ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein } 952edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 953edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein void DescribeNegationTo(::std::ostream* os) const { 954edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein *os << "has no substring "; 955edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein UniversalPrint(substring_, os); 956edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein } 957edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 9581f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein private: 9591f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein const StringType substring_; 960edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 961edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); 962edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein}; 963edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 964edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// Implements the polymorphic StartsWith(substring) matcher, which 965edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// can be used as a Matcher<T> as long as T can be converted to a 966edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// string. 967edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silbersteintemplate <typename StringType> 968edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silbersteinclass StartsWithMatcher { 969edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein public: 970edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein typedef typename StringType::const_pointer ConstCharPointer; 971edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 972edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { 973edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein } 974edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 975edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein // These overloaded methods allow StartsWith(prefix) to be used as a 9761f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein // Matcher<T> as long as T can be converted to string. Returns true 9771f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein // iff s starts with prefix_. 9781f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein bool MatchAndExplain(ConstCharPointer s, 979edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein MatchResultListener* listener) const { 980edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein return s != NULL && MatchAndExplain(StringType(s), listener); 9811f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein } 9821f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein 9831f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein bool MatchAndExplain(const StringType& s, 9841f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein MatchResultListener* /* listener */) const { 9851f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein return s.length() >= prefix_.length() && 9861f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein s.substr(0, prefix_.length()) == prefix_; 9871f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein } 988edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 9891f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein void DescribeTo(::std::ostream* os) const { 9901f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein *os << "starts with "; 991edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein UniversalPrint(prefix_, os); 992edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein } 993edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 994edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein void DescribeNegationTo(::std::ostream* os) const { 995edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein *os << "doesn't start with "; 996edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein UniversalPrint(prefix_, os); 997edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein } 998edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 999edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein private: 1000edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein const StringType prefix_; 1001edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 1002edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); 1003edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein}; 1004edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein 1005878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// Implements the polymorphic EndsWith(substring) matcher, which 1006878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// can be used as a Matcher<T> as long as T can be converted to a 10072f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein// string. 10081f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silbersteintemplate <typename StringType> 1009878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silbersteinclass EndsWithMatcher { 1010878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public: 10112f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein typedef typename StringType::const_pointer ConstCharPointer; 10121f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein 1013878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} 1014878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1015878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // These overloaded methods allow EndsWith(suffix) to be used as a 1016878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // Matcher<T> as long as T can be converted to string. Returns true 1017878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // iff s ends with suffix_. 1018878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein bool MatchAndExplain(ConstCharPointer s, 1019878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein MatchResultListener* listener) const { 1020878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein return s != NULL && MatchAndExplain(StringType(s), listener); 1021878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } 1022878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1023878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein bool MatchAndExplain(const StringType& s, 1024878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein MatchResultListener* /* listener */) const { 1025878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein return s.length() >= suffix_.length() && 1026878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein s.substr(s.length() - suffix_.length()) == suffix_; 1027a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 1028a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1029a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein void DescribeTo(::std::ostream* os) const { 1030878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein *os << "ends with "; 1031878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein UniversalPrint(suffix_, os); 1032878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } 1033878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1034878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein void DescribeNegationTo(::std::ostream* os) const { 1035878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein *os << "doesn't end with "; 1036878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein UniversalPrint(suffix_, os); 1037a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 1038a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1039a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein private: 1040a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein const StringType suffix_; 1041a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1042a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); 1043a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein}; 1044a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1045a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// Implements polymorphic matchers MatchesRegex(regex) and 1046a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// ContainsRegex(regex), which can be used as a Matcher<T> as long as 1047a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// T can be converted to a string. 1048a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteinclass MatchesRegexMatcher { 1049878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public: 1050878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein MatchesRegexMatcher(const RE* regex, bool full_match) 1051878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein : regex_(regex), full_match_(full_match) {} 1052878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1053878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // These overloaded methods allow MatchesRegex(regex) to be used as 1054878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // a Matcher<T> as long as T can be converted to string. Returns 1055878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // true iff s matches regular expression regex. When full_match_ is 1056878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein // true, a full match is done; otherwise a partial match is done. 1057878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein bool MatchAndExplain(const char* s, 1058878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein MatchResultListener* listener) const { 1059878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein return s != NULL && MatchAndExplain(internal::string(s), listener); 1060878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } 1061878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1062878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein bool MatchAndExplain(const internal::string& s, 1063878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein MatchResultListener* /* listener */) const { 1064878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein return full_match_ ? RE::FullMatch(s, *regex_) : 1065878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein RE::PartialMatch(s, *regex_); 10661f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein } 1067878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1068878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein void DescribeTo(::std::ostream* os) const { 1069878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein *os << (full_match_ ? "matches" : "contains") 1070878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein << " regular expression "; 1071878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 1072878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } 1073878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1074878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein void DescribeNegationTo(::std::ostream* os) const { 1075878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein *os << "doesn't " << (full_match_ ? "match" : "contain") 1076878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein << " regular expression "; 1077878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein UniversalPrinter<internal::string>::Print(regex_->pattern(), os); 1078878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } 1079878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1080878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein private: 1081878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein const internal::linked_ptr<const RE> regex_; 1082878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein const bool full_match_; 1083878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 1084878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher); 1085878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein}; 10861f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein 1087878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// Implements a matcher that compares the two fields of a 2-tuple 1088878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// using one of the ==, <=, <, etc, operators. The two fields being 1089878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// compared don't have to have the same type. 1090878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// 1091878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// The matcher defined here is polymorphic (for example, Eq() can be 1092878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// used to match a tuple<int, short>, a tuple<const long&, double>, 1093878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// etc). Therefore we use a template type conversion operator in the 1094878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// implementation. 1095878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// 1096878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// We define this as a macro in order to eliminate duplicated source 1097878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// code. 1098878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein#define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op) \ 1099878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein class name##2Matcher { \ 1100878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public: \ 1101878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein template <typename T1, typename T2> \ 1102878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \ 1103878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein return MakeMatcher(new Impl<T1, T2>); \ 1104878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } \ 1105878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein private: \ 1106878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein template <typename T1, typename T2> \ 1107878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein class Impl : public MatcherInterface<const ::std::tr1::tuple<T1, T2>&> { \ 1108878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public: \ 1109878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein virtual bool MatchAndExplain( \ 1110878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein const ::std::tr1::tuple<T1, T2>& args, \ 1111878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein MatchResultListener* /* listener */) const { \ 1112878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \ 1113878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } \ 1114878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein virtual void DescribeTo(::std::ostream* os) const { \ 1115878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein *os << "are a pair (x, y) where x " #op " y"; \ 1116878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } \ 1117878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein virtual void DescribeNegationTo(::std::ostream* os) const { \ 1118878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein *os << "are a pair (x, y) where x " #op " y is false"; \ 1119878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } \ 1120878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein }; \ 1121878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein } 1122878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein 11230025465e311fe9504cd79610523a1b8171995accRebecca Silberstein// Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively. 11240025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==); 11250025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ge, >=); 11260025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Gt, >); 11270025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Le, <=); 11280025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Lt, <); 11290025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=); 1130aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1131aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein#undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_ 1132aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1133aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// Implements the Not(...) matcher for a particular argument type T. 11340f257d8ab5787450bdd24119ad809ffdfd29f98dRebecca Silberstein// We do not nest it inside the NotMatcher class template, as that 1135aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// will prevent different instantiations of NotMatcher from sharing 11360025465e311fe9504cd79610523a1b8171995accRebecca Silberstein// the same NotMatcherImpl<T> class. 1137aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteintemplate <typename T> 1138aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteinclass NotMatcherImpl : public MatcherInterface<T> { 1139aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein public: 1140aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein explicit NotMatcherImpl(const Matcher<T>& matcher) 1141aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein : matcher_(matcher) {} 1142aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1143aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 11440f257d8ab5787450bdd24119ad809ffdfd29f98dRebecca Silberstein return !matcher_.MatchAndExplain(x, listener); 11452fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein } 11462fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein 11472fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein virtual void DescribeTo(::std::ostream* os) const { 1148a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein matcher_.DescribeNegationTo(os); 11492fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein } 11502fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein 11510f257d8ab5787450bdd24119ad809ffdfd29f98dRebecca Silberstein virtual void DescribeNegationTo(::std::ostream* os) const { 11522fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein matcher_.DescribeTo(os); 11532fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein } 11542fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein 11552fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein private: 11562fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein const Matcher<T> matcher_; 11570025465e311fe9504cd79610523a1b8171995accRebecca Silberstein 11580025465e311fe9504cd79610523a1b8171995accRebecca Silberstein GTEST_DISALLOW_ASSIGN_(NotMatcherImpl); 11590025465e311fe9504cd79610523a1b8171995accRebecca Silberstein}; 11600025465e311fe9504cd79610523a1b8171995accRebecca Silberstein 11610025465e311fe9504cd79610523a1b8171995accRebecca Silberstein// Implements the Not(m) matcher, which matches a value that doesn't 1162a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein// match matcher m. 1163a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silbersteintemplate <typename InnerMatcher> 1164a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silbersteinclass NotMatcher { 1165a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein public: 1166a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {} 1167a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein 1168a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein // This template type conversion operator allows Not(m) to be used 1169a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein // to match any type m can match. 1170a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein template <typename T> 1171a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein operator Matcher<T>() const { 1172a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_))); 11732fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein } 1174a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1175a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein private: 1176a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein InnerMatcher matcher_; 1177a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1178a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein GTEST_DISALLOW_ASSIGN_(NotMatcher); 1179a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein}; 1180a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1181a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// Implements the AllOf(m1, m2) matcher for a particular argument type 1182a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// T. We do not nest it inside the BothOfMatcher class template, as 1183a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein// that will prevent different instantiations of BothOfMatcher from 1184a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// sharing the same BothOfMatcherImpl<T> class. 1185a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteintemplate <typename T> 1186a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteinclass BothOfMatcherImpl : public MatcherInterface<T> { 1187a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein public: 1188a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 1189a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein : matcher1_(matcher1), matcher2_(matcher2) {} 1190a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein 1191a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein virtual void DescribeTo(::std::ostream* os) const { 1192a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein *os << "("; 1193a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein matcher1_.DescribeTo(os); 1194a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein *os << ") and ("; 1195a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein matcher2_.DescribeTo(os); 1196a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein *os << ")"; 1197a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein } 1198a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein 1199a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein virtual void DescribeNegationTo(::std::ostream* os) const { 1200a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein *os << "("; 1201a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein matcher1_.DescribeNegationTo(os); 1202a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein *os << ") or ("; 1203a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein matcher2_.DescribeNegationTo(os); 1204a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein *os << ")"; 1205a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein } 1206a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein 12071f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1208a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein // If either matcher1_ or matcher2_ doesn't match x, we only need 1209b09edccf2056d1106da4b901e1e8b26841a02a61Rebecca Silberstein // to explain why one of them fails. 1210a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein StringMatchResultListener listener1; 1211a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein if (!matcher1_.MatchAndExplain(x, &listener1)) { 1212a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein *listener << listener1.str(); 1213aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein return false; 1214aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein } 1215aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1216aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein StringMatchResultListener listener2; 1217aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein if (!matcher2_.MatchAndExplain(x, &listener2)) { 1218aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein *listener << listener2.str(); 1219aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein return false; 1220aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein } 1221aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1222aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein // Otherwise we need to explain why *both* of them match. 12232fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein const internal::string s1 = listener1.str(); 12242fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein const internal::string s2 = listener2.str(); 12252fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein 1226a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein if (s1 == "") { 12272fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein *listener << s2; 1228a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein } else { 1229b09edccf2056d1106da4b901e1e8b26841a02a61Rebecca Silberstein *listener << s1; 1230a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein if (s2 != "") { 1231a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein *listener << ", and " << s2; 1232a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein } 1233a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein } 1234a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein return true; 1235a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein } 1236a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein 1237a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein private: 1238a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein const Matcher<T> matcher1_; 1239aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein const Matcher<T> matcher2_; 1240aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1241aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl); 12420c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein}; 12430c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 12440c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein// Used for implementing the AllOf(m_1, ..., m_n) matcher, which 1245878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// matches a value that matches all of the matchers m_1, ..., and m_n. 12460c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silbersteintemplate <typename Matcher1, typename Matcher2> 12470c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silbersteinclass BothOfMatcher { 1248878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public: 12490c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 12500c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein : matcher1_(matcher1), matcher2_(matcher2) {} 12510c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 12520c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein // This template type conversion operator allows a 12530c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein // BothOfMatcher<Matcher1, Matcher2> object to match any type that 12540c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein // both Matcher1 and Matcher2 can match. 1255a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein template <typename T> 12560c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein operator Matcher<T>() const { 12570c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_), 12580c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein SafeMatcherCast<T>(matcher2_))); 12590c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein } 12600c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 12610c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein private: 12620c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein Matcher1 matcher1_; 12630c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein Matcher2 matcher2_; 12640c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 12650c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein GTEST_DISALLOW_ASSIGN_(BothOfMatcher); 12660c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein}; 12670c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein 1268aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// Implements the AnyOf(m1, m2) matcher for a particular argument type 1269aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// T. We do not nest it inside the AnyOfMatcher class template, as 1270cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// that will prevent different instantiations of AnyOfMatcher from 1271cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// sharing the same EitherOfMatcherImpl<T> class. 1272aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteintemplate <typename T> 1273aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteinclass EitherOfMatcherImpl : public MatcherInterface<T> { 1274aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein public: 1275aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2) 1276aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein : matcher1_(matcher1), matcher2_(matcher2) {} 1277aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1278aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein virtual void DescribeTo(::std::ostream* os) const { 1279aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein *os << "("; 1280aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein matcher1_.DescribeTo(os); 1281aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein *os << ") or ("; 1282cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein matcher2_.DescribeTo(os); 1283cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein *os << ")"; 1284cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein } 1285cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein 1286cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein virtual void DescribeNegationTo(::std::ostream* os) const { 1287aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein *os << "("; 1288aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein matcher1_.DescribeNegationTo(os); 1289aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein *os << ") and ("; 1290aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein matcher2_.DescribeNegationTo(os); 1291aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein *os << ")"; 1292aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein } 1293aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein 1294aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { 1295cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein // If either matcher1_ or matcher2_ matches x, we just need to 1296cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein // explain why *one* of them matches. 1297aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein StringMatchResultListener listener1; 1298aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein if (matcher1_.MatchAndExplain(x, &listener1)) { 1299aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein *listener << listener1.str(); 1300aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein return true; 1301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 13035c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein StringMatchResultListener listener2; 13045c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein if (matcher2_.MatchAndExplain(x, &listener2)) { 1305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *listener << listener2.str(); 13068fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley return true; 1307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 13095c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein // Otherwise we need to explain why *both* of them fail. 13105c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein const internal::string s1 = listener1.str(); 13115c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein const internal::string s2 = listener2.str(); 13125c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein 13135c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein if (s1 == "") { 13145c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein *listener << s2; 13155c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein } else { 13165c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein *listener << s1; 1317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (s2 != "") { 1318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *listener << ", and " << s2; 1319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1321155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 1322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 13235c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein 1324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 13258fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley const Matcher<T> matcher1_; 1326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const Matcher<T> matcher2_; 1327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 13285c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl); 13295c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein}; 13305c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein 13315c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which 13325c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein// matches a value that matches at least one of the matchers m_1, ..., 13335c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein// and m_n. 13345c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silbersteintemplate <typename Matcher1, typename Matcher2> 13355c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silbersteinclass EitherOfMatcher { 1336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2) 1338d03a9283285bb7adef6c687eb3a91fa4a8c4b502Vinit Deshpande : matcher1_(matcher1), matcher2_(matcher2) {} 1339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // This template type conversion operator allows a 1341155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // EitherOfMatcher<Matcher1, Matcher2> object to match any type that 1342155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // both Matcher1 and Matcher2 can match. 1343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename T> 1344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande operator Matcher<T>() const { 1345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return Matcher<T>(new EitherOfMatcherImpl<T>( 13468fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_))); 1347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 13488fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 1349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 1350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Matcher1 matcher1_; 1351f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao Matcher2 matcher2_; 1352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(EitherOfMatcher); 1354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 1355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Used for implementing Truly(pred), which turns a predicate into a 1357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// matcher. 13588fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wileytemplate <typename Predicate> 1359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass TrulyMatcher { 1360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1361f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao explicit TrulyMatcher(Predicate pred) : predicate_(pred) {} 1362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // This method template allows Truly(pred) to be used as a matcher 1364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // for type T where T is the argument type of predicate 'pred'. The 1365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // argument is passed by reference as the predicate may be 1366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // interested in the address of the argument. 1367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename T> 13688fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley bool MatchAndExplain(T& x, // NOLINT 1369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener* /* listener */) const { 1370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#if GTEST_OS_WINDOWS 1371f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // MSVC warns about converting a value into bool (warning 4800). 1372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#pragma warning(push) // Saves the current warning state. 1373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#pragma warning(disable:4800) // Temporarily disables warning 4800. 1374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#endif // GTEST_OS_WINDOWS 1375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return predicate_(x); 1376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#if GTEST_OS_WINDOWS 1377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#pragma warning(pop) // Restores the warning state. 13788fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley#endif // GTEST_OS_WINDOWS 1379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1381f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao void DescribeTo(::std::ostream* os) const { 1382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "satisfies the given predicate"; 1383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void DescribeNegationTo(::std::ostream* os) const { 1386048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande *os << "doesn't satisfy the given predicate"; 1387a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } 13888fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 1389048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande private: 1390a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande Predicate predicate_; 1391f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 1392a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande GTEST_DISALLOW_ASSIGN_(TrulyMatcher); 1393048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande}; 1394a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 1395a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande// Used for implementing Matches(matcher), which turns a matcher into 1396048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande// a predicate. 1397a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandetemplate <typename M> 1398a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeclass MatcherAsPredicate { 1399a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande public: 1400c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {} 1401c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski 1402c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski // This template operator() allows Matches(m) to be used as a 1403f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // predicate on type T where m is a matcher on type T. 1404c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski // 1405c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski // The argument x is passed by reference instead of by value, as 1406c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski // some matcher may be interested in its address (e.g. as in 1407c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski // Matches(Ref(n))(x)). 1408a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande template <typename T> 140994a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski bool operator()(const T& x) const { 1410200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle // We let matcher_ commit to a particular type here instead of 14118fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley // when the MatcherAsPredicate object was constructed. This 1412048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande // allows us to write Matches(m) where m is a polymorphic matcher 1413200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle // (e.g. Eq(5)). 1414f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // 14151f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills // If we write Matcher<T>(matcher_).Matches(x) here, it won't 14161f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills // compile when matcher_ has type Matcher<const T&>; if we write 14171f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills // Matcher<const T&>(matcher_).Matches(x) here, it won't compile 1418200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle // when matcher_ has type Matcher<T>; if we just write 1419200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle // matcher_.Matches(x), it won't compile when matcher_ is 1420200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle // polymorphic, e.g. Eq(5). 1421048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande // 1422200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle // MatcherCast<const T&>() is necessary for making the code work 142394a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski // in all of the above situations. 142494a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski return MatcherCast<const T&>(matcher_).Matches(x); 142594a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski } 142694a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski 142794a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski private: 142894a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski M matcher_; 142994a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski 143094a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate); 143194a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski}; 143294a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski 143394a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski// For implementing ASSERT_THAT() and EXPECT_THAT(). The template 14349c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius// argument M must be a type that can be converted to a matcher. 14359c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Piustemplate <typename M> 14369c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Piusclass PredicateFormatterFromMatcher { 14379c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius public: 14389c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {} 14399c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius 14409c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius // This template () operator allows a PredicateFormatterFromMatcher 14419c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius // object to act as a predicate-formatter suitable for using with 14429c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius // Google Test's EXPECT_PRED_FORMAT1() macro. 14439c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius template <typename T> 1444a1514cb347fccf11566e5172ed71030c695d2abdRoshan Pius AssertionResult operator()(const char* value_text, const T& x) const { 144594a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski // We convert matcher_ to a Matcher<const T&> *now* instead of 144694a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski // when the PredicateFormatterFromMatcher object was constructed, 144794a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski // as matcher_ may be polymorphic (e.g. NotNull()) and we won't 1448d76cdd8e08476ad5025f07a5d77a8d8f920a0721Adam Lesinski // know which type to instantiate it to until we actually see the 1449d76cdd8e08476ad5025f07a5d77a8d8f920a0721Adam Lesinski // type of x here. 145070b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle // 145170b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle // We write MatcherCast<const T&>(matcher_) instead of 145270b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle // Matcher<const T&>(matcher_), as the latter won't compile when 145370b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle // matcher_ has type Matcher<T> (e.g. An<int>()). 145470b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle const Matcher<const T&> matcher = MatcherCast<const T&>(matcher_); 145570b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle StringMatchResultListener listener; 145670b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle if (MatchPrintAndExplain(x, matcher, &listener)) 14579c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius return AssertionSuccess(); 145870b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle 145970b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle ::std::stringstream ss; 146070b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle ss << "Value of: " << value_text << "\n" 1461f9946f5663f2d7a9a69cb8b7e82a4ef8b1825c48Mitchell Wills << "Expected: "; 146270b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle matcher.DescribeTo(&ss); 146384a11a3d54b7c6f043dcf7a874b7c0d45709677aPierre Vandwalle ss << "\n Actual: " << listener.str(); 1464200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle return AssertionFailure() << ss.str(); 1465bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 1466200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 1467a1514cb347fccf11566e5172ed71030c695d2abdRoshan Pius private: 1468200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle const M matcher_; 14691f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills 14701f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher); 14711f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills}; 14721f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills 14731f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills// A helper function for converting a matcher to a predicate-formatter 1474200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle// without the user needing to explicitly write the type. This is 1475200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle// used for implementing ASSERT_THAT() and EXPECT_THAT(). 1476200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalletemplate <typename M> 1477200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalleinline PredicateFormatterFromMatcher<M> 1478200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalleMakePredicateFormatterFromMatcher(const M& matcher) { 1479200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle return PredicateFormatterFromMatcher<M>(matcher); 1480200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle} 1481155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1482155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements the polymorphic floating point equality matcher, which 1483155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// matches two float values using ULP-based approximation. The 14848fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// template is meant to be instantiated with FloatType being either 1485f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao// float or double. 1486155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename FloatType> 1487f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass FloatingEqMatcher { 1488155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1489f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // Constructor for FloatingEqMatcher. 1490f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // The matcher's input will be compared with rhs. The matcher treats two 1491f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // NANs as equal if nan_eq_nan is true. Otherwise, under IEEE standards, 1492f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // equality comparisons between NANs will always return false. 1493f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) : 1494155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 1495155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1496155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Implements floating point equality matcher as a Matcher<T>. 1497f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao template <typename T> 1498155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class Impl : public MatcherInterface<T> { 1499155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1500155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Impl(FloatType rhs, bool nan_eq_nan) : 15019878c61bbd81176561991be025af44efc67332feWenchao Tong rhs_(rhs), nan_eq_nan_(nan_eq_nan) {} 15029878c61bbd81176561991be025af44efc67332feWenchao Tong 15039878c61bbd81176561991be025af44efc67332feWenchao Tong virtual bool MatchAndExplain(T value, 15048fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley MatchResultListener* /* listener */) const { 1505f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao const FloatingPoint<FloatType> lhs(value), rhs(rhs_); 15069878c61bbd81176561991be025af44efc67332feWenchao Tong 15079878c61bbd81176561991be025af44efc67332feWenchao Tong // Compares NaNs first, if nan_eq_nan_ is true. 1508f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao if (nan_eq_nan_ && lhs.is_nan()) { 15099878c61bbd81176561991be025af44efc67332feWenchao Tong return rhs.is_nan(); 1510f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao } 1511f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao 1512f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao return lhs.AlmostEquals(rhs); 1513f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao } 1514f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao 15159878c61bbd81176561991be025af44efc67332feWenchao Tong virtual void DescribeTo(::std::ostream* os) const { 15169878c61bbd81176561991be025af44efc67332feWenchao Tong // os->precision() returns the previously set precision, which we 15179878c61bbd81176561991be025af44efc67332feWenchao Tong // store to restore the ostream to its original configuration 1518f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // after outputting. 15199878c61bbd81176561991be025af44efc67332feWenchao Tong const ::std::streamsize old_precision = os->precision( 15209878c61bbd81176561991be025af44efc67332feWenchao Tong ::std::numeric_limits<FloatType>::digits10 + 2); 15219878c61bbd81176561991be025af44efc67332feWenchao Tong if (FloatingPoint<FloatType>(rhs_).is_nan()) { 15229af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu if (nan_eq_nan_) { 15239af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu *os << "is NaN"; 1524ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande } else { 1525ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande *os << "never matches"; 1526ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande } 15278fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley } else { 1528ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande *os << "is approximately " << rhs_; 1529ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande } 1530f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao os->precision(old_precision); 15319af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu } 15329af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu 15339af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu virtual void DescribeNegationTo(::std::ostream* os) const { 15349af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu // As before, get original precision. 1535ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande const ::std::streamsize old_precision = os->precision( 1536ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande ::std::numeric_limits<FloatType>::digits10 + 2); 1537ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande if (FloatingPoint<FloatType>(rhs_).is_nan()) { 1538ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande if (nan_eq_nan_) { 1539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "isn't NaN"; 1540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "is anything"; 1542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 15438fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley } else { 1544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "isn't approximately " << rhs_; 1545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1546f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // Restore original precision. 15478be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele os->precision(old_precision); 1548d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu } 1549d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu 1550d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu private: 1551d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu const FloatType rhs_; 1552d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu const bool nan_eq_nan_; 1553d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu 1554d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu GTEST_DISALLOW_ASSIGN_(Impl); 1555d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu }; 155631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist 1557d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu // The following 3 type conversion operators allow FloatEq(rhs) and 1558d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu // NanSensitiveFloatEq(rhs) to be used as a Matcher<float>, a 1559d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu // Matcher<const float&>, or a Matcher<float&>, but nothing else. 1560d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu // (While Google's C++ coding style doesn't allow arguments passed 1561d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu // by non-const reference, we may see them in code not conforming to 1562d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu // the style. Therefore Google Mock needs to support them.) 1563d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu operator Matcher<FloatType>() const { 1564d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu return MakeMatcher(new Impl<FloatType>(rhs_, nan_eq_nan_)); 1565d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu } 1566d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu 1567d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu operator Matcher<const FloatType&>() const { 1568d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu return MakeMatcher(new Impl<const FloatType&>(rhs_, nan_eq_nan_)); 1569d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu } 1570d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu 157131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist operator Matcher<FloatType&>() const { 1572d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_)); 1573992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 157431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist private: 1575992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle const FloatType rhs_; 1576992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle const bool nan_eq_nan_; 1577992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle 1578992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher); 1579992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle}; 1580992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle 1581992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle// Implements the Pointee(m) matcher for matching a pointer whose 1582155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// pointee matches matcher m. The pointer can be either raw or smart. 1583155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename InnerMatcher> 1584155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass PointeeMatcher { 1585155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1586155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {} 1587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1588155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // This type conversion operator template allows Pointee(m) to be 1589155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // used as a matcher for any pointer type whose pointee type is 1590155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // compatible with the inner matcher, where type Pointer can be 1591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // either a raw pointer or a smart pointer. 1592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // 1593155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // The reason we do this instead of relying on 159431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // MakePolymorphicMatcher() is that the latter is not flexible 159531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // enough for implementing the DescribeTo() method of Pointee(). 159631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist template <typename Pointer> 159731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist operator Matcher<Pointer>() const { 159831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist return MakeMatcher(new Impl<Pointer>(matcher_)); 159931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist } 160031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist 160131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist private: 160231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist // The monomorphic implementation that works for a particular pointer type. 160331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist template <typename Pointer> 160431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist class Impl : public MatcherInterface<Pointer> { 160531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist public: 160631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist typedef typename PointeeOf<GTEST_REMOVE_CONST_( // NOLINT 160731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee; 160831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist 1609155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit Impl(const InnerMatcher& matcher) 1610155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande : matcher_(MatcherCast<const Pointee&>(matcher)) {} 1611155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1612155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeTo(::std::ostream* os) const { 1613155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "points to a value that "; 16148fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley matcher_.DescribeTo(os); 1615155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1616155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1617f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao virtual void DescribeNegationTo(::std::ostream* os) const { 1618f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao *os << "does not point to a value that "; 1619155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande matcher_.DescribeTo(os); 1620155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1621155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1622155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual bool MatchAndExplain(Pointer pointer, 1623155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener* listener) const { 1624155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (GetRawPointer(pointer) == NULL) 1625155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 1626155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1627155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *listener << "which points to "; 1628155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return MatchPrintAndExplain(*pointer, matcher_, listener); 1629155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1630155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1631155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 1632155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const Matcher<const Pointee&> matcher_; 1633155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 16348fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley GTEST_DISALLOW_ASSIGN_(Impl); 1635155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }; 1636155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1637f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao const InnerMatcher matcher_; 1638f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 1639f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao GTEST_DISALLOW_ASSIGN_(PointeeMatcher); 1640f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao}; 1641f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 1642155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements the Field() matcher for matching a field (i.e. member 1643155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// variable) of an object. 1644155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename Class, typename FieldType> 1645155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass FieldMatcher { 1646155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1647155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande FieldMatcher(FieldType Class::*field, 1648155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const Matcher<const FieldType&>& matcher) 1649155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande : field_(field), matcher_(matcher) {} 1650155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1651155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void DescribeTo(::std::ostream* os) const { 1652155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "is an object whose given field "; 1653155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande matcher_.DescribeTo(os); 1654155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1655155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1656155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void DescribeNegationTo(::std::ostream* os) const { 16578fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley *os << "is an object whose given field "; 1658155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande matcher_.DescribeNegationTo(os); 1659155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1660f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 1661f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao template <typename T> 1662f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao bool MatchAndExplain(const T& value, MatchResultListener* listener) const { 1663155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return MatchAndExplainImpl( 1664155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typename ::testing::internal:: 1665155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 1666155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande value, listener); 1667155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1668155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1669155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 1670155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // The first argument of MatchAndExplainImpl() is needed to help 1671155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Symbian's C++ compiler choose which overload to use. Its type is 1672155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // true_type iff the Field() matcher is used to match a pointer. 1673155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 1674155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener* listener) const { 16758fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley *listener << "whose given field is "; 1676155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return MatchPrintAndExplain(obj.*field_, matcher_, listener); 1677155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1678f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 1679155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 1680155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener* listener) const { 1681155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (p == NULL) 1682155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 1683155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1684155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *listener << "which points to an object "; 1685155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Since *p has a field, it must be a class/struct/union type and 1686155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // thus cannot be a pointer. Therefore we pass false_type() as 1687155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // the first argument. 1688155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return MatchAndExplainImpl(false_type(), *p, listener); 1689155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1690155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 16918fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley const FieldType Class::*field_; 1692155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const Matcher<const FieldType&> matcher_; 1693155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1694155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(FieldMatcher); 1695155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 1696155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1697868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao// Implements the Property() matcher for matching a property 1698868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao// (i.e. return value of a getter method) of an object. 16991ecb0083490436303cdb89bc4c46b6743ea0afa8Sky Fabertemplate <typename Class, typename PropertyType> 17001ecb0083490436303cdb89bc4c46b6743ea0afa8Sky Faberclass PropertyMatcher { 1701d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein public: 1702d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein // The property may have a reference type, so 'const PropertyType&' 1703d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein // may cause double references and fail to compile. That's why we 1704d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein // need GTEST_REFERENCE_TO_CONST, which works regardless of 1705155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // PropertyType being a reference or not. 1706155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; 1707155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1708155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande PropertyMatcher(PropertyType (Class::*property)() const, 1709155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const Matcher<RefToConstProperty>& matcher) 17101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist : property_(property), matcher_(matcher) {} 1711d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu 17123ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu void DescribeTo(::std::ostream* os) const { 17133ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu *os << "is an object whose given property "; 17143ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu matcher_.DescribeTo(os); 17153ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu } 17163ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu 1717d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu void DescribeNegationTo(::std::ostream* os) const { 17184781e9e2904824ef1fbf8a0cf75e89fa957d6a92Peter Qiu *os << "is an object whose given property "; 1719f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao matcher_.DescribeNegationTo(os); 17209af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu } 17219af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu 17229af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu template <typename T> 17239af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu bool MatchAndExplain(const T&value, MatchResultListener* listener) const { 172407816a4745b8030911869ceb58fa735e47834fe4Peter Qiu return MatchAndExplainImpl( 172507816a4745b8030911869ceb58fa735e47834fe4Peter Qiu typename ::testing::internal:: 17263ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu is_pointer<GTEST_REMOVE_CONST_(T)>::type(), 17273ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu value, listener); 17283ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu } 17293ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu 17303ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu private: 17313ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu // The first argument of MatchAndExplainImpl() is needed to help 17323ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu // Symbian's C++ compiler choose which overload to use. Its type is 17333ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu // true_type iff the Property() matcher is used to match a pointer. 17343ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, 17353ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu MatchResultListener* listener) const { 17364781e9e2904824ef1fbf8a0cf75e89fa957d6a92Peter Qiu *listener << "whose given property is "; 1737f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // Cannot pass the return value (for example, int) to MatchPrintAndExplain, 17389af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu // which takes a non-const reference as argument. 17399af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu RefToConstProperty result = (obj.*property_)(); 17409af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu return MatchPrintAndExplain(result, matcher_, listener); 17419af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu } 1742dd97694345f47ba6a952c1162e7dcdd66fb72060Peter Qiu 17433ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, 17443ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu MatchResultListener* listener) const { 17453ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu if (p == NULL) 17463ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu return false; 17473ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu 1748d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu *listener << "which points to an object "; 1749d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu // Since *p has a property method, it must be a class/struct/union 1750d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu // type and thus cannot be a pointer. Therefore we pass 17513ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu // false_type() as the first argument. 17523ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu return MatchAndExplainImpl(false_type(), *p, listener); 17533ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu } 17544781e9e2904824ef1fbf8a0cf75e89fa957d6a92Peter Qiu 1755f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao PropertyType (Class::*property_)() const; 17569af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu const Matcher<RefToConstProperty> matcher_; 17579af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu 17589af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu GTEST_DISALLOW_ASSIGN_(PropertyMatcher); 17599af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu}; 1760dd97694345f47ba6a952c1162e7dcdd66fb72060Peter Qiu 17613ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu// Type traits specifying various features of different functors for ResultOf. 17623ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu// The default template specifies features for functor objects. 17633ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu// Functor classes have to typedef argument_type and result_type 17642e814680f4dd27a5f825afab189843582235cedcJan Nordqvist// to be compatible with ResultOf. 17652e814680f4dd27a5f825afab189843582235cedcJan Nordqvisttemplate <typename Functor> 17662e814680f4dd27a5f825afab189843582235cedcJan Nordqviststruct CallableTraits { 17672e814680f4dd27a5f825afab189843582235cedcJan Nordqvist typedef typename Functor::result_type ResultType; 17688fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley typedef Functor StorageType; 17692e814680f4dd27a5f825afab189843582235cedcJan Nordqvist 177083b8a3d25eb4991277d8ec3720bc1f3d821166b6Peter Qiu static void CheckIsValid(Functor /* functor */) {} 1771f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao template <typename T> 17729af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu static ResultType Invoke(Functor f, T arg) { return f(arg); } 17739af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu}; 17749af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu 17759af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu// Specialization for function pointers. 17762e814680f4dd27a5f825afab189843582235cedcJan Nordqvisttemplate <typename ArgType, typename ResType> 17772e814680f4dd27a5f825afab189843582235cedcJan Nordqviststruct CallableTraits<ResType(*)(ArgType)> { 17781d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist typedef ResType ResultType; 17792e814680f4dd27a5f825afab189843582235cedcJan Nordqvist typedef ResType(*StorageType)(ArgType); 17802e814680f4dd27a5f825afab189843582235cedcJan Nordqvist 17812e814680f4dd27a5f825afab189843582235cedcJan Nordqvist static void CheckIsValid(ResType(*f)(ArgType)) { 17822e814680f4dd27a5f825afab189843582235cedcJan Nordqvist GTEST_CHECK_(f != NULL) 17832e814680f4dd27a5f825afab189843582235cedcJan Nordqvist << "NULL function pointer is passed into ResultOf()."; 17848fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley } 17852e814680f4dd27a5f825afab189843582235cedcJan Nordqvist template <typename T> 1786f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao static ResType Invoke(ResType(*f)(ArgType), T arg) { 17872e814680f4dd27a5f825afab189843582235cedcJan Nordqvist return (*f)(arg); 17881d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist } 17891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist}; 17902e814680f4dd27a5f825afab189843582235cedcJan Nordqvist 17912e814680f4dd27a5f825afab189843582235cedcJan Nordqvist// Implements the ResultOf() matcher for matching a return value of a 17922e814680f4dd27a5f825afab189843582235cedcJan Nordqvist// unary function of an object. 17932e814680f4dd27a5f825afab189843582235cedcJan Nordqvisttemplate <typename Callable> 17942e814680f4dd27a5f825afab189843582235cedcJan Nordqvistclass ResultOfMatcher { 17958fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley public: 17962e814680f4dd27a5f825afab189843582235cedcJan Nordqvist typedef typename CallableTraits<Callable>::ResultType ResultType; 1797f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 17982e814680f4dd27a5f825afab189843582235cedcJan Nordqvist ResultOfMatcher(Callable callable, const Matcher<ResultType>& matcher) 17991d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist : callable_(callable), matcher_(matcher) { 18001d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist CallableTraits<Callable>::CheckIsValid(callable_); 1801fd5470391e5342daa38d00b68ccbccfeacbe6d33Alexandra Gherghina } 1802155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1803155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename T> 1804155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande operator Matcher<T>() const { 1805155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return Matcher<T>(new Impl<T>(callable_, matcher_)); 1806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 18078fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 1808155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 1809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename CallableTraits<Callable>::StorageType CallableStorageType; 1810f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 1811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename T> 1812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class Impl : public MatcherInterface<T> { 1813155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1814155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Impl(CallableStorageType callable, const Matcher<ResultType>& matcher) 1815155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande : callable_(callable), matcher_(matcher) {} 1816155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1817155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeTo(::std::ostream* os) const { 1818155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "is mapped by the given callable to a value that "; 1819155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande matcher_.DescribeTo(os); 1820155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1821155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1822155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeNegationTo(::std::ostream* os) const { 1823155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "is mapped by the given callable to a value that "; 1824155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande matcher_.DescribeNegationTo(os); 1825155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1826155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1827155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const { 18288fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley *listener << "which is mapped by the given callable to "; 1829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Cannot pass the return value (for example, int) to 1830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // MatchPrintAndExplain, which takes a non-const reference as argument. 1831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ResultType result = 18329c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt CallableTraits<Callable>::template Invoke<T>(callable_, obj); 1833f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao return MatchPrintAndExplain(result, matcher_, listener); 1834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1835586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang 1836586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang private: 1837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Functors often define operator() as non-const method even though 1838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // they are actualy stateless. But we need to use them even when 183980d14d67a956e6c69433470aaa73100898166efaxinhe // 'this' is a const pointer. It's the user's responsibility not to 184080d14d67a956e6c69433470aaa73100898166efaxinhe // use stateful callables with ResultOf(), which does't guarantee 184137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang // how many times the callable will be invoked. 184237b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang mutable CallableStorageType callable_; 184337b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang const Matcher<ResultType> matcher_; 184480d14d67a956e6c69433470aaa73100898166efaxinhe 18458fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley GTEST_DISALLOW_ASSIGN_(Impl); 184680d14d67a956e6c69433470aaa73100898166efaxinhe }; // class Impl 184780d14d67a956e6c69433470aaa73100898166efaxinhe 1848f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao const CallableStorageType callable_; 184937b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang const Matcher<ResultType> matcher_; 185080d14d67a956e6c69433470aaa73100898166efaxinhe 185180d14d67a956e6c69433470aaa73100898166efaxinhe GTEST_DISALLOW_ASSIGN_(ResultOfMatcher); 1852155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 18538fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 1854155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements an equality matcher for any STL-style container whose elements 1855155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// support ==. This matcher is like Eq(), but its failure explanations provide 1856f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// more detailed information that is useful when the container is used as a set. 1857155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The failure message reports elements that are in one of the operands but not 1858155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// the other. The failure messages do not report duplicate or out-of-order 1859155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// elements in the containers (which don't properly matter to sets, but can 1860155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// occur if the containers are vectors or lists, for example). 1861155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 1862155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Uses the container's const_iterator, value_type, operator ==, 1863155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// begin(), and end(). 1864155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename Container> 1865155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass ContainerEqMatcher { 1866155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 18678fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley typedef internal::StlContainerView<Container> View; 18688fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley typedef typename View::type StlContainer; 1869155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename View::const_reference StlContainerReference; 1870155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1871f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // We make a copy of rhs in case the elements in it are modified 1872155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // after this matcher is created. 1873155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) { 1874155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Makes sure the user doesn't instantiate this class template 18753b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti // with a const or reference type. 18763b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti testing::StaticAssertTypeEq<Container, 18773b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container))>(); 18783b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti } 1879155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 18803b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti void DescribeTo(::std::ostream* os) const { 18813b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti *os << "equals "; 18823b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti UniversalPrint(rhs_, os); 1883155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 18843b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti void DescribeNegationTo(::std::ostream* os) const { 1885155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "does not equal "; 18863b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti UniversalPrint(rhs_, os); 1887155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1888155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1889155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename LhsContainer> 1890155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool MatchAndExplain(const LhsContainer& lhs, 1891155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener* listener) const { 1892155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug 1893155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // that causes LhsContainer to be a const type sometimes. 1894155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)> 1895155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande LhsView; 18962af03130d7f85823223b8591dc52858d851b301dMitchell Wills typedef typename LhsView::type LhsStlContainer; 18972af03130d7f85823223b8591dc52858d851b301dMitchell Wills StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs); 18982af03130d7f85823223b8591dc52858d851b301dMitchell Wills if (lhs_stl_container == rhs_) 1899155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 1900155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1901155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ::std::ostream* const os = listener->stream(); 1902155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (os != NULL) { 1903155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Something is different. Check for extra values first. 1904155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool printed_header = false; 1905155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (typename LhsStlContainer::const_iterator it = 1906155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande lhs_stl_container.begin(); 1907155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande it != lhs_stl_container.end(); ++it) { 1908155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) == 1909155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande rhs_.end()) { 1910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (printed_header) { 1911155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << ", "; 1912155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1913155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "which has these unexpected elements: "; 1914155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande printed_header = true; 1915155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1916155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande UniversalPrint(*it, os); 1917155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1918155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1919155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1920155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Now check for missing values. 1921155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool printed_header2 = false; 1922155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (typename StlContainer::const_iterator it = rhs_.begin(); 1923155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande it != rhs_.end(); ++it) { 1924155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (internal::ArrayAwareFind( 1925155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande lhs_stl_container.begin(), lhs_stl_container.end(), *it) == 1926155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande lhs_stl_container.end()) { 1927155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (printed_header2) { 1928155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << ", "; 1929155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1930155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << (printed_header ? ",\nand" : "which") 1931155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande << " doesn't have these expected elements: "; 1932155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande printed_header2 = true; 1933155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1934155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande UniversalPrint(*it, os); 1935155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1936155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1937155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1938155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1939155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 1940155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1941155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1942155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 1943155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const StlContainer rhs_; 1944155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1945155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher); 1946155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 1947155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1948155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl. 1949155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename Container> 1950155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass QuantifierMatcherImpl : public MatcherInterface<Container> { 1951155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 1952155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container)) RawContainer; 1953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef StlContainerView<RawContainer> View; 1954155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename View::type StlContainer; 1955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename View::const_reference StlContainerReference; 1956155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename StlContainer::value_type Element; 1957155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1958155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename InnerMatcher> 1959155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit QuantifierMatcherImpl(InnerMatcher inner_matcher) 1960155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande : inner_matcher_( 1961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande testing::SafeMatcherCast<const Element&>(inner_matcher)) {} 1962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1963155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Checks whether: 1964155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // * All elements in the container match, if all_elements_should_match. 1965155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // * Any element in the container matches, if !all_elements_should_match. 1966155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bool MatchAndExplainImpl(bool all_elements_should_match, 1967155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Container container, 1968155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener* listener) const { 1969155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StlContainerReference stl_container = View::ConstReference(container); 1970155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande size_t i = 0; 1971155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (typename StlContainer::const_iterator it = stl_container.begin(); 1972155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande it != stl_container.end(); ++it, ++i) { 1973155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StringMatchResultListener inner_listener; 1974155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener); 1975155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1976155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (matches != all_elements_should_match) { 1977155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *listener << "whose element #" << i 1978155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande << (matches ? " matches" : " doesn't match"); 19798fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley PrintIfNotEmpty(inner_listener.str(), listener->stream()); 1980155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return !all_elements_should_match; 19818e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer } 19828e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer } 19838e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer return all_elements_should_match; 1984f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao } 1985155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1986155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande protected: 1987155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande const Matcher<const Element&> inner_matcher_; 1988155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1989155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl); 1990155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 1991155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 19928fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Implements Contains(element_matcher) for the given argument type Container. 1993155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Symmetric to EachMatcherImpl. 1994f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raotemplate <typename Container> 1995f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass ContainsMatcherImpl : public QuantifierMatcherImpl<Container> { 1996f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao public: 1997f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao template <typename InnerMatcher> 19988e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer explicit ContainsMatcherImpl(InnerMatcher inner_matcher) 19998e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer : QuantifierMatcherImpl<Container>(inner_matcher) {} 20008e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer 20018e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer // Describes what this matcher does. 2002155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeTo(::std::ostream* os) const { 2003155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "contains at least one element that "; 2004155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande this->inner_matcher_.DescribeTo(os); 2005155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2006155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2007155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeNegationTo(::std::ostream* os) const { 2008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "doesn't contain any element that "; 20098fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley this->inner_matcher_.DescribeTo(os); 2010155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2011155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2012155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual bool MatchAndExplain(Container container, 2013f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao MatchResultListener* listener) const { 2014155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return this->MatchAndExplainImpl(false, container, listener); 2015155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2016155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 20172ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle private: 20182ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl); 20192ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle}; 20208fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 20212ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle// Implements Each(element_matcher) for the given argument type Container. 20222ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle// Symmetric to ContainsMatcherImpl. 20232ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalletemplate <typename Container> 2024f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass EachMatcherImpl : public QuantifierMatcherImpl<Container> { 20252ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle public: 20262ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle template <typename InnerMatcher> 2027155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit EachMatcherImpl(InnerMatcher inner_matcher) 2028155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande : QuantifierMatcherImpl<Container>(inner_matcher) {} 2029155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2030155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Describes what this matcher does. 2031155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeTo(::std::ostream* os) const { 2032155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "only contains elements that "; 2033155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande this->inner_matcher_.DescribeTo(os); 2034155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2035155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2036155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeNegationTo(::std::ostream* os) const { 2037155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "contains some element that "; 2038155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande this->inner_matcher_.DescribeNegationTo(os); 2039155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2040155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2041155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual bool MatchAndExplain(Container container, 2042155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande MatchResultListener* listener) const { 2043155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return this->MatchAndExplainImpl(true, container, listener); 2044155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2045155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2046155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private: 2047155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(EachMatcherImpl); 2048090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande}; 2049090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande 2050090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande// Implements polymorphic Contains(element_matcher). 205103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborntemplate <typename M> 205203b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackbornclass ContainsMatcher { 2053155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 2054155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit ContainsMatcher(M m) : inner_matcher_(m) {} 2055155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2056155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename Container> 205702938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov operator Matcher<Container>() const { 2058dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_)); 2059dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov } 2060dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 2061dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov private: 2062dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov const M inner_matcher_; 2063dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 2064dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov GTEST_DISALLOW_ASSIGN_(ContainsMatcher); 2065dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov}; 2066dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 2067dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// Implements polymorphic Each(element_matcher). 2068dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovtemplate <typename M> 2069dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovclass EachMatcher { 2070dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov public: 2071dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov explicit EachMatcher(M m) : inner_matcher_(m) {} 2072dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 207302938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov template <typename Container> 207402938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov operator Matcher<Container>() const { 207502938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_)); 207602938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov } 207702938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov 207802938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov private: 207902938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov const M inner_matcher_; 2080dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 2081dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov GTEST_DISALLOW_ASSIGN_(EachMatcher); 2082dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov}; 2083dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 2084dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// Implements Key(inner_matcher) for the given argument pair type. 2085155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Key(inner_matcher) matches an std::pair whose 'first' field matches 2086155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 2087155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// std::map that contains at least one element whose key is >= 5. 2088155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename PairType> 2089155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass KeyMatcherImpl : public MatcherInterface<PairType> { 2090155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 2091155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(PairType)) RawPairType; 2092155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename RawPairType::first_type KeyType; 2093155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2094155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande template <typename InnerMatcher> 2095155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande explicit KeyMatcherImpl(InnerMatcher inner_matcher) 20966232408a5fc660b2d8642d56747e05c15c6255b8Rebecca Silberstein : inner_matcher_( 2097155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande testing::SafeMatcherCast<const KeyType&>(inner_matcher)) { 2098155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2099bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2100bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // Returns true iff 'key_value.first' (the key) matches the inner matcher. 2101bdac915b98217c63284b47a7925f0719c8e40844Wei Wang virtual bool MatchAndExplain(PairType key_value, 2102bdac915b98217c63284b47a7925f0719c8e40844Wei Wang MatchResultListener* listener) const { 2103bdac915b98217c63284b47a7925f0719c8e40844Wei Wang StringMatchResultListener inner_listener; 2104bdac915b98217c63284b47a7925f0719c8e40844Wei Wang const bool match = inner_matcher_.MatchAndExplain(key_value.first, 2105bdac915b98217c63284b47a7925f0719c8e40844Wei Wang &inner_listener); 2106bdac915b98217c63284b47a7925f0719c8e40844Wei Wang const internal::string explanation = inner_listener.str(); 2107bdac915b98217c63284b47a7925f0719c8e40844Wei Wang if (explanation != "") { 2108bdac915b98217c63284b47a7925f0719c8e40844Wei Wang *listener << "whose first field is a value " << explanation; 2109bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 2110bdac915b98217c63284b47a7925f0719c8e40844Wei Wang return match; 2111bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 2112bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2113bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // Describes what this matcher does. 2114bdac915b98217c63284b47a7925f0719c8e40844Wei Wang virtual void DescribeTo(::std::ostream* os) const { 2115bdac915b98217c63284b47a7925f0719c8e40844Wei Wang *os << "has a key that "; 2116bdac915b98217c63284b47a7925f0719c8e40844Wei Wang inner_matcher_.DescribeTo(os); 2117bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 2118bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2119bdac915b98217c63284b47a7925f0719c8e40844Wei Wang // Describes what the negation of this matcher does. 2120bdac915b98217c63284b47a7925f0719c8e40844Wei Wang virtual void DescribeNegationTo(::std::ostream* os) const { 2121bdac915b98217c63284b47a7925f0719c8e40844Wei Wang *os << "doesn't have a key that "; 2122bdac915b98217c63284b47a7925f0719c8e40844Wei Wang inner_matcher_.DescribeTo(os); 2123bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 2124bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2125bdac915b98217c63284b47a7925f0719c8e40844Wei Wang private: 2126bdac915b98217c63284b47a7925f0719c8e40844Wei Wang const Matcher<const KeyType&> inner_matcher_; 2127bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2128bdac915b98217c63284b47a7925f0719c8e40844Wei Wang GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl); 2129bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}; 2130bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2131bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// Implements polymorphic Key(matcher_for_key). 2132bdac915b98217c63284b47a7925f0719c8e40844Wei Wangtemplate <typename M> 2133bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass KeyMatcher { 2134bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public: 2135bdac915b98217c63284b47a7925f0719c8e40844Wei Wang explicit KeyMatcher(M m) : matcher_for_key_(m) {} 2136bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2137bdac915b98217c63284b47a7925f0719c8e40844Wei Wang template <typename PairType> 2138bdac915b98217c63284b47a7925f0719c8e40844Wei Wang operator Matcher<PairType>() const { 2139bdac915b98217c63284b47a7925f0719c8e40844Wei Wang return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_)); 2140bdac915b98217c63284b47a7925f0719c8e40844Wei Wang } 2141bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2142bdac915b98217c63284b47a7925f0719c8e40844Wei Wang private: 2143bdac915b98217c63284b47a7925f0719c8e40844Wei Wang const M matcher_for_key_; 2144bdac915b98217c63284b47a7925f0719c8e40844Wei Wang 2145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(KeyMatcher); 2146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 2147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements Pair(first_matcher, second_matcher) for the given argument pair 2149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// type with its two matchers. See Pair() function below. 2150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename PairType> 2151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass PairMatcherImpl : public MatcherInterface<PairType> { 2152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public: 2153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(PairType)) RawPairType; 2154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename RawPairType::first_type FirstType; 2155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename RawPairType::second_type SecondType; 215603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn 2157090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande template <typename FirstMatcher, typename SecondMatcher> 2158090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher) 2159090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande : first_matcher_( 2160090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande testing::SafeMatcherCast<const FirstType&>(first_matcher)), 2161090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande second_matcher_( 2162090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande testing::SafeMatcherCast<const SecondType&>(second_matcher)) { 2163090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande } 2164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Describes what this matcher does. 2166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande virtual void DescribeTo(::std::ostream* os) const { 2167faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee *os << "has a first field that "; 2168e487a4648dd41881e754f1224aaedead78a0777dSky Faber first_matcher_.DescribeTo(os); 2169e487a4648dd41881e754f1224aaedead78a0777dSky Faber *os << ", and has a second field that "; 2170faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee second_matcher_.DescribeTo(os); 2171faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee } 2172e487a4648dd41881e754f1224aaedead78a0777dSky Faber 2173e487a4648dd41881e754f1224aaedead78a0777dSky Faber // Describes what the negation of this matcher does. 2174faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee virtual void DescribeNegationTo(::std::ostream* os) const { 2175faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee *os << "has a first field that "; 2176faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee first_matcher_.DescribeNegationTo(os); 2177faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee *os << ", or has a second field that "; 2178faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee second_matcher_.DescribeNegationTo(os); 2179faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee } 2180faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee 2181faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second' 2182faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee // matches second_matcher. 2183faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee virtual bool MatchAndExplain(PairType a_pair, 2184faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee MatchResultListener* listener) const { 2185faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee if (!listener->IsInterested()) { 2186faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee // If the listener is not interested, we don't need to construct the 2187faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee // explanation. 2188faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee return first_matcher_.Matches(a_pair.first) && 2189faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee second_matcher_.Matches(a_pair.second); 2190faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee } 2191faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee StringMatchResultListener first_inner_listener; 2192e487a4648dd41881e754f1224aaedead78a0777dSky Faber if (!first_matcher_.MatchAndExplain(a_pair.first, 2193e487a4648dd41881e754f1224aaedead78a0777dSky Faber &first_inner_listener)) { 2194e487a4648dd41881e754f1224aaedead78a0777dSky Faber *listener << "whose first field does not match"; 2195faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee PrintIfNotEmpty(first_inner_listener.str(), listener->stream()); 2196e487a4648dd41881e754f1224aaedead78a0777dSky Faber return false; 2197e487a4648dd41881e754f1224aaedead78a0777dSky Faber } 2198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StringMatchResultListener second_inner_listener; 2199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!second_matcher_.MatchAndExplain(a_pair.second, 2200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande &second_inner_listener)) { 2201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *listener << "whose second field does not match"; 2202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande PrintIfNotEmpty(second_inner_listener.str(), listener->stream()); 2203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 2204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(), 2206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande listener); 2207031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne return true; 220811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne } 220911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne 221011638f348ba45f9f417928e79b81186cef76c561Glen Kuhne private: 2211031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne void ExplainSuccess(const internal::string& first_explanation, 2212675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti const internal::string& second_explanation, 2213675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti MatchResultListener* listener) const { 2214675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti *listener << "whose both fields match"; 2215675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti if (first_explanation != "") { 2216031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne *listener << ", where the first field is a value " << first_explanation; 2217031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne } 221884ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart if (second_explanation != "") { 221984ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart *listener << ", "; 222084ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart if (first_explanation != "") { 222184ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart *listener << "and "; 222284ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart } else { 222384ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart *listener << "where "; 222484ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart } 222584ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart *listener << "the second field is a value " << second_explanation; 222684ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart } 222784ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart } 222811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne 222911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne const Matcher<const FirstType&> first_matcher_; 223011638f348ba45f9f417928e79b81186cef76c561Glen Kuhne const Matcher<const SecondType&> second_matcher_; 2231031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne 2232031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne GTEST_DISALLOW_ASSIGN_(PairMatcherImpl); 223311638f348ba45f9f417928e79b81186cef76c561Glen Kuhne}; 223411638f348ba45f9f417928e79b81186cef76c561Glen Kuhne 223511638f348ba45f9f417928e79b81186cef76c561Glen Kuhne// Implements polymorphic Pair(first_matcher, second_matcher). 223611638f348ba45f9f417928e79b81186cef76c561Glen Kuhnetemplate <typename FirstMatcher, typename SecondMatcher> 2237cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPennaclass PairMatcher { 223811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne public: 223911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher) 224011638f348ba45f9f417928e79b81186cef76c561Glen Kuhne : first_matcher_(first_matcher), second_matcher_(second_matcher) {} 22412a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein 22422a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein template <typename PairType> 224361312e14a088a9487d4db64f08285162476e870fPaul Stewart operator Matcher<PairType> () const { 224411638f348ba45f9f417928e79b81186cef76c561Glen Kuhne return MakeMatcher( 224511638f348ba45f9f417928e79b81186cef76c561Glen Kuhne new PairMatcherImpl<PairType>( 22463c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne first_matcher_, second_matcher_)); 22473c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 22483c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne 224911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne private: 22503204fb9682242a7b5a749489076c66d448c42577Roshan Pius const FirstMatcher first_matcher_; 22513204fb9682242a7b5a749489076c66d448c42577Roshan Pius const SecondMatcher second_matcher_; 225211638f348ba45f9f417928e79b81186cef76c561Glen Kuhne 2253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande GTEST_DISALLOW_ASSIGN_(PairMatcher); 2254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}; 22558fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 2256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements ElementsAre() and ElementsAreArray(). 2257f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raotemplate <typename Container> 2258f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass ElementsAreMatcherImpl : public MatcherInterface<Container> { 2259f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao public: 22602a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container)) RawContainer; 2261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef internal::StlContainerView<RawContainer> View; 2262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename View::type StlContainer; 2263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande typedef typename View::const_reference StlContainerReference; 22642a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein typedef typename StlContainer::value_type Element; 2265155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2266155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Constructs the matcher from a sequence of element values or 22678fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley // element matchers. 22682a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein template <typename InputIter> 2269f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao ElementsAreMatcherImpl(InputIter first, size_t a_count) { 22702a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein matchers_.reserve(a_count); 2271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande InputIter it = first; 2272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (size_t i = 0; i != a_count; ++i, ++it) { 22738fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley matchers_.push_back(MatcherCast<const Element&>(*it)); 22742a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein } 2275f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao } 22762a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein 22772a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein // Describes what this matcher does. 22782a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein virtual void DescribeTo(::std::ostream* os) const { 2279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (count() == 0) { 22802a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein *os << "is empty"; 2281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (count() == 1) { 2282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "has 1 element that "; 22838fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley matchers_[0].DescribeTo(os); 2284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 2285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "has " << Elements(count()) << " where\n"; 2286f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao for (size_t i = 0; i != count(); ++i) { 228761312e14a088a9487d4db64f08285162476e870fPaul Stewart *os << "element #" << i << " "; 2288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande matchers_[i].DescribeTo(os); 2289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (i + 1 < count()) { 22908fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley *os << ",\n"; 2291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2293f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao } 229461312e14a088a9487d4db64f08285162476e870fPaul Stewart } 2295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Describes what the negation of this matcher does. 22978fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley virtual void DescribeNegationTo(::std::ostream* os) const { 2298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (count() == 0) { 2299155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "isn't empty"; 2300f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao return; 230161312e14a088a9487d4db64f08285162476e870fPaul Stewart } 2302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "doesn't have " << Elements(count()) << ", or\n"; 23048fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley for (size_t i = 0; i != count(); ++i) { 2305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *os << "element #" << i << " "; 2306155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande matchers_[i].DescribeNegationTo(os); 2307f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao if (i + 1 < count()) { 230861312e14a088a9487d4db64f08285162476e870fPaul Stewart *os << ", or\n"; 2309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 23109ae6b45c038fa74a9e7285ef4834551dd93da332Yuhao Zheng } 23118fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley } 2312ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle 2313ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle virtual bool MatchAndExplain(Container container, 2314f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao MatchResultListener* listener) const { 2315f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao StlContainerReference stl_container = View::ConstReference(container); 2316f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao const size_t actual_count = stl_container.size(); 231700ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein if (actual_count != count()) { 231800ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein // The element count doesn't match. If the container is empty, 231900ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein // there's no need to explain anything as Google Mock already 232000ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein // prints the empty container. Otherwise we just need to show 232100ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein // how many elements there actually are. 2322da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein if (actual_count != 0) { 2323ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle *listener << "which has " << Elements(actual_count); 23242a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein } 232561312e14a088a9487d4db64f08285162476e870fPaul Stewart return false; 232675727af748e2b53baf365139ecfa7bf87a449d04Rebecca Silberstein } 232700ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein 2328e33b3346b262507ef2361d50a89d16bef69d9a57Sohani Rao typename StlContainer::const_iterator it = stl_container.begin(); 2329ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle // explanations[i] is the explanation of the element at index i. 2330ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle std::vector<internal::string> explanations(count()); 23318fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley for (size_t i = 0; i != count(); ++it, ++i) { 2332ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle StringMatchResultListener s; 2333ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle if (matchers_[i].MatchAndExplain(*it, &s)) { 2334f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao explanations[i] = s.str(); 233500ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein } else { 233600ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein // The container has the right size but the i-th element 2337ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle // doesn't match its expectation. 2338c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle *listener << "whose element #" << i << " doesn't match"; 23398fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley PrintIfNotEmpty(s.str(), listener->stream()); 2340c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle return false; 2341c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 2342f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao } 2343f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 2344f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // Every element matches its expectation. We need to explain why 2345f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao // (the obvious ones can be skipped). 2346c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle bool reason_printed = false; 2347c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle for (size_t i = 0; i != count(); ++i) { 2348c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle const internal::string& s = explanations[i]; 23498fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley if (!s.empty()) { 2350c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (reason_printed) { 2351c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle *listener << ",\nand "; 2352f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao } 2353c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle *listener << "whose element #" << i << " matches, " << s; 2354c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle reason_printed = true; 2355c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 23568fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley } 2357c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 2358c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle return true; 2359f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao } 2360f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 2361f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao private: 2362c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle static Message Elements(size_t count) { 2363c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle return Message() << count << (count == 1 ? " element" : " elements"); 2364c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 23658fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 2366c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle size_t count() const { return matchers_.size(); } 2367c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle std::vector<Matcher<const Element&> > matchers_; 2368f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 2369c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl); 2370c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle}; 2371c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 23728fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Implements ElementsAre() of 0 arguments. 237343eba5ba17a9af5d9a050a4ba5e12e93c92f722dSamuel Tanclass ElementsAreMatcher0 { 2374a8647b8cb29de22765062714cb265247234c3d32xinhe public: 2375f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao ElementsAreMatcher0() {} 2376f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 2377f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao template <typename Container> 237843eba5ba17a9af5d9a050a4ba5e12e93c92f722dSamuel Tan operator Matcher<Container>() const { 2379e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container)) 2380e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle RawContainer; 23818fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley typedef typename internal::StlContainerView<RawContainer>::type::value_type 2382a8647b8cb29de22765062714cb265247234c3d32xinhe Element; 2383e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle 2384f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao const Matcher<const Element&>* const matchers = NULL; 2385a8647b8cb29de22765062714cb265247234c3d32xinhe return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 0)); 2386e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle } 2387b0b0cc202b7d7aaad7b3f69d73e9b58ea2968b05Pierre Vandwalle}; 2388c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 23898fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Implements ElementsAreArray(). 2390c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalletemplate <typename T> 2391c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalleclass ElementsAreArrayMatcher { 2392c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle public: 2393f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao ElementsAreArrayMatcher(const T* first, size_t count) : 2394c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle first_(first), count_(count) {} 2395c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 2396c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle template <typename Container> 2397c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle operator Matcher<Container>() const { 2398c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container)) 2399c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle RawContainer; 2400c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle typedef typename internal::StlContainerView<RawContainer>::type::value_type 2401b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott Element; 24028fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley 2403b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott return MakeMatcher(new ElementsAreMatcherImpl<Container>(first_, count_)); 2404b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott } 2405f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 2406f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott private: 2407f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott const T* const first_; 2408f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott const size_t count_; 2409b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott 2410f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher); 24111f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein}; 24121f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein 24131f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein// Constants denoting interpolations in a matcher description string. 2414f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottconst int kTupleInterpolation = -1; // "%(*)s" 2415f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottconst int kPercentInterpolation = -2; // "%%" 2416f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottconst int kInvalidInterpolation = -3; // "%" followed by invalid text 2417f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott 2418dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// Records the location and content of an interpolation. 2419dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovstruct Interpolation { 2420dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov Interpolation(const char* start, const char* end, int param) 2421dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov : start_pos(start), end_pos(end), param_index(param) {} 2422dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov 2423f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott // Points to the start of the interpolation (the '%' character). 2424f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao const char* start_pos; 2425f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // Points to the first character after the interpolation. 2426f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao const char* end_pos; 2427f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // 0-based index of the interpolated matcher parameter; 2428f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao // kTupleInterpolation for "%(*)s"; kPercentInterpolation for "%%". 2429f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao int param_index; 2430f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao}; 2431f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao 2432f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scotttypedef ::std::vector<Interpolation> Interpolations; 2433b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott 2434b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott// Parses a matcher description string and returns a vector of 2435b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott// interpolations that appear in the string; generates non-fatal 24368be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// failures iff 'description' is an invalid matcher description. 24374d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// 'param_names' is a NULL-terminated array of parameter names in the 243831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// order they appear in the MATCHER_P*() parameter list. 24394d381bc39f5263effdae73ec99065eb299b806caVinit DeshpandeInterpolations ValidateMatcherDescription( 24404d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande const char* param_names[], const char* description); 24414d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 24424d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// Returns the actual matcher description, given the matcher name, 244331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// user-supplied description template string, interpolations in the 244431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// string, and the printed values of the matcher parameters. 244531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqviststring FormatMatcherDescription( 244631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist const char* matcher_name, const char* description, 24474d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande const Interpolations& interp, const Strings& param_values); 244831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist 244931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist} // namespace internal 245031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist 24514d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// Implements MatcherCast(). 24524d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandetemplate <typename T, typename M> 24534d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeinline Matcher<T> MatcherCast(M matcher) { 245431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist return internal::MatcherCastImpl<T, M>::Cast(matcher); 24554d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande} 24564d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande 245731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// _ is a matcher that matches anything of any type. 24584d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// 24594d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// This definition is fine as: 24604d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// 246131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// 1. The C++ standard permits using the name _ in a namespace that 24624d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// is not the global namespace or ::std. 24634d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// 2. The AnythingMatcher class has no data member or constructor, 2464653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// so it's OK to create global variables of this type. 2465653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// 3. c-style has approved of using _ in this case. 2466653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhneconst internal::AnythingMatcher _ = {}; 2467653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// Creates a matcher that matches any value of the given type T. 2468653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhnetemplate <typename T> 2469653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhneinline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); } 2470653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne 2471653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// Creates a matcher that matches any value of the given type T. 2472653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhnetemplate <typename T> 24734aef3283bf78e233a11fa34af2c7c38362879625Jan Nordqvistinline Matcher<T> An() { return A<T>(); } 24744aef3283bf78e233a11fa34af2c7c38362879625Jan Nordqvist 24754d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// Creates a polymorphic matcher that matches anything equal to x. 24768fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Note: if the parameter of Eq() were declared as const T&, Eq("foo") 24779846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// wouldn't compile. 24789846078598c3468f8813dbfa58238a1846bd81efSanket Padawetemplate <typename T> 2479f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoinline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); } 24809846078598c3468f8813dbfa58238a1846bd81efSanket Padawe 24819846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// Constructs a Matcher<T> from a 'value' of type T. The constructed 24829846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// matcher matches any value that's equal to 'value'. 248331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvisttemplate <typename T> 248431891afce40b903ada9b24ec12e3648ae6aa27b2Jan NordqvistMatcher<T>::Matcher(T value) { *this = Eq(value); } 248531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist 248631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// Creates a monomorphic matcher that matches anything with type Lhs 248731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// and equal to rhs. A user may need to use this instead of Eq(...) 248831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// in order to resolve an overloading ambiguity. 248931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// 249031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x)) 249131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// or Matcher<T>(x), but more readable than the latter. 249231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// 24934d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// We could define similar monomorphic matchers for other comparison 2494cd0af1c9ddcac881f49c815fb9da45433eb50736Vinit Deshpande// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do 24952bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// it yet as those are used much less than Eq() in practice. A user 24962bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// can always write Matcher<T>(Lt(5)) to be explicit about the type, 24972bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// for example. 24982bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsutemplate <typename Lhs, typename Rhs> 24992bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsuinline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); } 25002bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu 25012bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// Creates a polymorphic matcher that matches anything >= x. 25022bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsutemplate <typename Rhs> 2503c065315c23f78ec462a56aec1aaa4e2a34549b8dFyodor Kupolovinline internal::GeMatcher<Rhs> Ge(Rhs x) { 2504466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan return internal::GeMatcher<Rhs>(x); 2505466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan} 2506466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan 2507466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan// Creates a polymorphic matcher that matches anything > x. 25088fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wileytemplate <typename Rhs> 2509466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Paninline internal::GtMatcher<Rhs> Gt(Rhs x) { 2510466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan return internal::GtMatcher<Rhs>(x); 2511f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao} 2512f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao 2513f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// Creates a polymorphic matcher that matches anything <= x. 2514466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pantemplate <typename Rhs> 2515466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Paninline internal::LeMatcher<Rhs> Le(Rhs x) { 2516ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius return internal::LeMatcher<Rhs>(x); 2517ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius} 2518ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius 25193031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a polymorphic matcher that matches anything < x. 2520ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piustemplate <typename Rhs> 2521ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline internal::LtMatcher<Rhs> Lt(Rhs x) { 2522ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius return internal::LtMatcher<Rhs>(x); 2523ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius} 2524f1a0272c0fb3f11bc338e97481d8cb73cfe74641Roshan Pius 2525f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// Creates a polymorphic matcher that matches anything != x. 2526ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piustemplate <typename Rhs> 2527ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline internal::NeMatcher<Rhs> Ne(Rhs x) { 2528ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius return internal::NeMatcher<Rhs>(x); 2529ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius} 2530ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius 25313204fb9682242a7b5a749489076c66d448c42577Roshan Pius// Creates a polymorphic matcher that matches any NULL pointer. 2532ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline PolymorphicMatcher<internal::IsNullMatcher > IsNull() { 2533ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius return MakePolymorphicMatcher(internal::IsNullMatcher()); 25343204fb9682242a7b5a749489076c66d448c42577Roshan Pius} 25353204fb9682242a7b5a749489076c66d448c42577Roshan Pius 25363204fb9682242a7b5a749489076c66d448c42577Roshan Pius// Creates a polymorphic matcher that matches any non-NULL pointer. 25373204fb9682242a7b5a749489076c66d448c42577Roshan Pius// This is convenient as Not(NULL) doesn't compile (the compiler 2538ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// thinks that that expression is comparing a pointer with an integer). 2539ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline PolymorphicMatcher<internal::NotNullMatcher > NotNull() { 2540ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius return MakePolymorphicMatcher(internal::NotNullMatcher()); 25413031903d4a68659350994571525fc86a47c02dd0Roshan Pius} 25423031903d4a68659350994571525fc86a47c02dd0Roshan Pius 25433031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a polymorphic matcher that matches any argument that 25443031903d4a68659350994571525fc86a47c02dd0Roshan Pius// references variable x. 25453031903d4a68659350994571525fc86a47c02dd0Roshan Piustemplate <typename T> 25463031903d4a68659350994571525fc86a47c02dd0Roshan Piusinline internal::RefMatcher<T&> Ref(T& x) { // NOLINT 25473031903d4a68659350994571525fc86a47c02dd0Roshan Pius return internal::RefMatcher<T&>(x); 25483031903d4a68659350994571525fc86a47c02dd0Roshan Pius} 25493031903d4a68659350994571525fc86a47c02dd0Roshan Pius 25503031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a matcher that matches any double argument approximately 25513031903d4a68659350994571525fc86a47c02dd0Roshan Pius// equal to rhs, where two NANs are considered unequal. 25523031903d4a68659350994571525fc86a47c02dd0Roshan Piusinline internal::FloatingEqMatcher<double> DoubleEq(double rhs) { 25533031903d4a68659350994571525fc86a47c02dd0Roshan Pius return internal::FloatingEqMatcher<double>(rhs, false); 25543031903d4a68659350994571525fc86a47c02dd0Roshan Pius} 25553031903d4a68659350994571525fc86a47c02dd0Roshan Pius 25563031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a matcher that matches any double argument approximately 25573031903d4a68659350994571525fc86a47c02dd0Roshan Pius// equal to rhs, including NaN values when rhs is NaN. 25583031903d4a68659350994571525fc86a47c02dd0Roshan Piusinline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) { 25593031903d4a68659350994571525fc86a47c02dd0Roshan Pius return internal::FloatingEqMatcher<double>(rhs, true); 25603031903d4a68659350994571525fc86a47c02dd0Roshan Pius} 25613031903d4a68659350994571525fc86a47c02dd0Roshan Pius 25623031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a matcher that matches any float argument approximately 2563ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// equal to rhs, where two NANs are considered unequal. 2564e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piusinline internal::FloatingEqMatcher<float> FloatEq(float rhs) { 2565ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius return internal::FloatingEqMatcher<float>(rhs, false); 2566ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius} 2567ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius 2568ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// Creates a matcher that matches any double argument approximately 2569f1a0272c0fb3f11bc338e97481d8cb73cfe74641Roshan Pius// equal to rhs, including NaN values when rhs is NaN. 2570f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoinline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) { 2571ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius return internal::FloatingEqMatcher<float>(rhs, true); 2572ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius} 2573ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius 2574ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// Creates a matcher that matches a pointer (raw or smart) that points 2575ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// to a value that matches inner_matcher. 25763204fb9682242a7b5a749489076c66d448c42577Roshan Piustemplate <typename InnerMatcher> 2577ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline internal::PointeeMatcher<InnerMatcher> Pointee( 2578ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius const InnerMatcher& inner_matcher) { 25793031903d4a68659350994571525fc86a47c02dd0Roshan Pius return internal::PointeeMatcher<InnerMatcher>(inner_matcher); 25803204fb9682242a7b5a749489076c66d448c42577Roshan Pius} 2581ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius 2582e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// Creates a matcher that matches an object whose given field matches 2583e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// 'matcher'. For example, 2584e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// Field(&Foo::number, Ge(5)) 2585e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// matches a Foo object x iff x.number >= 5. 2586e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piustemplate <typename Class, typename FieldType, typename FieldMatcher> 2587e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piusinline PolymorphicMatcher< 2588e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius internal::FieldMatcher<Class, FieldType> > Field( 2589e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius FieldType Class::*field, const FieldMatcher& matcher) { 2590e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius return MakePolymorphicMatcher( 2591f1a0272c0fb3f11bc338e97481d8cb73cfe74641Roshan Pius internal::FieldMatcher<Class, FieldType>( 2592f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao field, MatcherCast<const FieldType&>(matcher))); 2593e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius // The call to MatcherCast() is required for supporting inner 2594e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius // matchers of compatible types. For example, it allows 2595e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius // Field(&Foo::bar, m) 2596e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius // to compile where bar is an int32 and m is a matcher for int64. 2597e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius} 25983204fb9682242a7b5a749489076c66d448c42577Roshan Pius 2599e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// Creates a matcher that matches an object whose given property 2600e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// matches 'matcher'. For example, 2601e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// Property(&Foo::str, StartsWith("hi")) 26023031903d4a68659350994571525fc86a47c02dd0Roshan Pius// matches a Foo object x iff x.str() starts with "hi". 26033204fb9682242a7b5a749489076c66d448c42577Roshan Piustemplate <typename Class, typename PropertyType, typename PropertyMatcher> 2604e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piusinline PolymorphicMatcher< 2605155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande internal::PropertyMatcher<Class, PropertyType> > Property( 2606 PropertyType (Class::*property)() const, const PropertyMatcher& matcher) { 2607 return MakePolymorphicMatcher( 2608 internal::PropertyMatcher<Class, PropertyType>( 2609 property, 2610 MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); 2611 // The call to MatcherCast() is required for supporting inner 2612 // matchers of compatible types. For example, it allows 2613 // Property(&Foo::bar, m) 2614 // to compile where bar() returns an int32 and m is a matcher for int64. 2615} 2616 2617// Creates a matcher that matches an object iff the result of applying 2618// a callable to x matches 'matcher'. 2619// For example, 2620// ResultOf(f, StartsWith("hi")) 2621// matches a Foo object x iff f(x) starts with "hi". 2622// callable parameter can be a function, function pointer, or a functor. 2623// Callable has to satisfy the following conditions: 2624// * It is required to keep no state affecting the results of 2625// the calls on it and make no assumptions about how many calls 2626// will be made. Any state it keeps must be protected from the 2627// concurrent access. 2628// * If it is a function object, it has to define type result_type. 2629// We recommend deriving your functor classes from std::unary_function. 2630template <typename Callable, typename ResultOfMatcher> 2631internal::ResultOfMatcher<Callable> ResultOf( 2632 Callable callable, const ResultOfMatcher& matcher) { 2633 return internal::ResultOfMatcher<Callable>( 2634 callable, 2635 MatcherCast<typename internal::CallableTraits<Callable>::ResultType>( 2636 matcher)); 2637 // The call to MatcherCast() is required for supporting inner 2638 // matchers of compatible types. For example, it allows 2639 // ResultOf(Function, m) 2640 // to compile where Function() returns an int32 and m is a matcher for int64. 2641} 2642 2643// String matchers. 2644 2645// Matches a string equal to str. 2646inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2647 StrEq(const internal::string& str) { 2648 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2649 str, true, true)); 2650} 2651 2652// Matches a string not equal to str. 2653inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2654 StrNe(const internal::string& str) { 2655 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2656 str, false, true)); 2657} 2658 2659// Matches a string equal to str, ignoring case. 2660inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2661 StrCaseEq(const internal::string& str) { 2662 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2663 str, true, false)); 2664} 2665 2666// Matches a string not equal to str, ignoring case. 2667inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> > 2668 StrCaseNe(const internal::string& str) { 2669 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>( 2670 str, false, false)); 2671} 2672 2673// Creates a matcher that matches any string, std::string, or C string 2674// that contains the given substring. 2675inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::string> > 2676 HasSubstr(const internal::string& substring) { 2677 return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::string>( 2678 substring)); 2679} 2680 2681// Matches a string that starts with 'prefix' (case-sensitive). 2682inline PolymorphicMatcher<internal::StartsWithMatcher<internal::string> > 2683 StartsWith(const internal::string& prefix) { 2684 return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::string>( 2685 prefix)); 2686} 2687 2688// Matches a string that ends with 'suffix' (case-sensitive). 2689inline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> > 2690 EndsWith(const internal::string& suffix) { 2691 return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>( 2692 suffix)); 2693} 2694 2695// Matches a string that fully matches regular expression 'regex'. 2696// The matcher takes ownership of 'regex'. 2697inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 2698 const internal::RE* regex) { 2699 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); 2700} 2701inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex( 2702 const internal::string& regex) { 2703 return MatchesRegex(new internal::RE(regex)); 2704} 2705 2706// Matches a string that contains regular expression 'regex'. 2707// The matcher takes ownership of 'regex'. 2708inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 2709 const internal::RE* regex) { 2710 return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); 2711} 2712inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex( 2713 const internal::string& regex) { 2714 return ContainsRegex(new internal::RE(regex)); 2715} 2716 2717#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 2718// Wide string matchers. 2719 2720// Matches a string equal to str. 2721inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2722 StrEq(const internal::wstring& str) { 2723 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2724 str, true, true)); 2725} 2726 2727// Matches a string not equal to str. 2728inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2729 StrNe(const internal::wstring& str) { 2730 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2731 str, false, true)); 2732} 2733 2734// Matches a string equal to str, ignoring case. 2735inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2736 StrCaseEq(const internal::wstring& str) { 2737 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2738 str, true, false)); 2739} 2740 2741// Matches a string not equal to str, ignoring case. 2742inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> > 2743 StrCaseNe(const internal::wstring& str) { 2744 return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>( 2745 str, false, false)); 2746} 2747 2748// Creates a matcher that matches any wstring, std::wstring, or C wide string 2749// that contains the given substring. 2750inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> > 2751 HasSubstr(const internal::wstring& substring) { 2752 return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>( 2753 substring)); 2754} 2755 2756// Matches a string that starts with 'prefix' (case-sensitive). 2757inline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> > 2758 StartsWith(const internal::wstring& prefix) { 2759 return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>( 2760 prefix)); 2761} 2762 2763// Matches a string that ends with 'suffix' (case-sensitive). 2764inline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> > 2765 EndsWith(const internal::wstring& suffix) { 2766 return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>( 2767 suffix)); 2768} 2769 2770#endif // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING 2771 2772// Creates a polymorphic matcher that matches a 2-tuple where the 2773// first field == the second field. 2774inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); } 2775 2776// Creates a polymorphic matcher that matches a 2-tuple where the 2777// first field >= the second field. 2778inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); } 2779 2780// Creates a polymorphic matcher that matches a 2-tuple where the 2781// first field > the second field. 2782inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); } 2783 2784// Creates a polymorphic matcher that matches a 2-tuple where the 2785// first field <= the second field. 2786inline internal::Le2Matcher Le() { return internal::Le2Matcher(); } 2787 2788// Creates a polymorphic matcher that matches a 2-tuple where the 2789// first field < the second field. 2790inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); } 2791 2792// Creates a polymorphic matcher that matches a 2-tuple where the 2793// first field != the second field. 2794inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); } 2795 2796// Creates a matcher that matches any value of type T that m doesn't 2797// match. 2798template <typename InnerMatcher> 2799inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) { 2800 return internal::NotMatcher<InnerMatcher>(m); 2801} 2802 2803// Creates a matcher that matches any value that matches all of the 2804// given matchers. 2805// 2806// For now we only support up to 5 matchers. Support for more 2807// matchers can be added as needed, or the user can use nested 2808// AllOf()s. 2809template <typename Matcher1, typename Matcher2> 2810inline internal::BothOfMatcher<Matcher1, Matcher2> 2811AllOf(Matcher1 m1, Matcher2 m2) { 2812 return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2); 2813} 2814 2815template <typename Matcher1, typename Matcher2, typename Matcher3> 2816inline internal::BothOfMatcher<Matcher1, 2817 internal::BothOfMatcher<Matcher2, Matcher3> > 2818AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { 2819 return AllOf(m1, AllOf(m2, m3)); 2820} 2821 2822template <typename Matcher1, typename Matcher2, typename Matcher3, 2823 typename Matcher4> 2824inline internal::BothOfMatcher<Matcher1, 2825 internal::BothOfMatcher<Matcher2, 2826 internal::BothOfMatcher<Matcher3, Matcher4> > > 2827AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { 2828 return AllOf(m1, AllOf(m2, m3, m4)); 2829} 2830 2831template <typename Matcher1, typename Matcher2, typename Matcher3, 2832 typename Matcher4, typename Matcher5> 2833inline internal::BothOfMatcher<Matcher1, 2834 internal::BothOfMatcher<Matcher2, 2835 internal::BothOfMatcher<Matcher3, 2836 internal::BothOfMatcher<Matcher4, Matcher5> > > > 2837AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { 2838 return AllOf(m1, AllOf(m2, m3, m4, m5)); 2839} 2840 2841// Creates a matcher that matches any value that matches at least one 2842// of the given matchers. 2843// 2844// For now we only support up to 5 matchers. Support for more 2845// matchers can be added as needed, or the user can use nested 2846// AnyOf()s. 2847template <typename Matcher1, typename Matcher2> 2848inline internal::EitherOfMatcher<Matcher1, Matcher2> 2849AnyOf(Matcher1 m1, Matcher2 m2) { 2850 return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2); 2851} 2852 2853template <typename Matcher1, typename Matcher2, typename Matcher3> 2854inline internal::EitherOfMatcher<Matcher1, 2855 internal::EitherOfMatcher<Matcher2, Matcher3> > 2856AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { 2857 return AnyOf(m1, AnyOf(m2, m3)); 2858} 2859 2860template <typename Matcher1, typename Matcher2, typename Matcher3, 2861 typename Matcher4> 2862inline internal::EitherOfMatcher<Matcher1, 2863 internal::EitherOfMatcher<Matcher2, 2864 internal::EitherOfMatcher<Matcher3, Matcher4> > > 2865AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { 2866 return AnyOf(m1, AnyOf(m2, m3, m4)); 2867} 2868 2869template <typename Matcher1, typename Matcher2, typename Matcher3, 2870 typename Matcher4, typename Matcher5> 2871inline internal::EitherOfMatcher<Matcher1, 2872 internal::EitherOfMatcher<Matcher2, 2873 internal::EitherOfMatcher<Matcher3, 2874 internal::EitherOfMatcher<Matcher4, Matcher5> > > > 2875AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { 2876 return AnyOf(m1, AnyOf(m2, m3, m4, m5)); 2877} 2878 2879// Returns a matcher that matches anything that satisfies the given 2880// predicate. The predicate can be any unary function or functor 2881// whose return type can be implicitly converted to bool. 2882template <typename Predicate> 2883inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> > 2884Truly(Predicate pred) { 2885 return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred)); 2886} 2887 2888// Returns a matcher that matches an equal container. 2889// This matcher behaves like Eq(), but in the event of mismatch lists the 2890// values that are included in one container but not the other. (Duplicate 2891// values and order differences are not explained.) 2892template <typename Container> 2893inline PolymorphicMatcher<internal::ContainerEqMatcher< // NOLINT 2894 GTEST_REMOVE_CONST_(Container)> > 2895 ContainerEq(const Container& rhs) { 2896 // This following line is for working around a bug in MSVC 8.0, 2897 // which causes Container to be a const type sometimes. 2898 typedef GTEST_REMOVE_CONST_(Container) RawContainer; 2899 return MakePolymorphicMatcher( 2900 internal::ContainerEqMatcher<RawContainer>(rhs)); 2901} 2902 2903// Matches an STL-style container or a native array that contains at 2904// least one element matching the given value or matcher. 2905// 2906// Examples: 2907// ::std::set<int> page_ids; 2908// page_ids.insert(3); 2909// page_ids.insert(1); 2910// EXPECT_THAT(page_ids, Contains(1)); 2911// EXPECT_THAT(page_ids, Contains(Gt(2))); 2912// EXPECT_THAT(page_ids, Not(Contains(4))); 2913// 2914// ::std::map<int, size_t> page_lengths; 2915// page_lengths[1] = 100; 2916// EXPECT_THAT(page_lengths, 2917// Contains(::std::pair<const int, size_t>(1, 100))); 2918// 2919// const char* user_ids[] = { "joe", "mike", "tom" }; 2920// EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom")))); 2921template <typename M> 2922inline internal::ContainsMatcher<M> Contains(M matcher) { 2923 return internal::ContainsMatcher<M>(matcher); 2924} 2925 2926// Matches an STL-style container or a native array that contains only 2927// elements matching the given value or matcher. 2928// 2929// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only 2930// the messages are different. 2931// 2932// Examples: 2933// ::std::set<int> page_ids; 2934// // Each(m) matches an empty container, regardless of what m is. 2935// EXPECT_THAT(page_ids, Each(Eq(1))); 2936// EXPECT_THAT(page_ids, Each(Eq(77))); 2937// 2938// page_ids.insert(3); 2939// EXPECT_THAT(page_ids, Each(Gt(0))); 2940// EXPECT_THAT(page_ids, Not(Each(Gt(4)))); 2941// page_ids.insert(1); 2942// EXPECT_THAT(page_ids, Not(Each(Lt(2)))); 2943// 2944// ::std::map<int, size_t> page_lengths; 2945// page_lengths[1] = 100; 2946// page_lengths[2] = 200; 2947// page_lengths[3] = 300; 2948// EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100)))); 2949// EXPECT_THAT(page_lengths, Each(Key(Le(3)))); 2950// 2951// const char* user_ids[] = { "joe", "mike", "tom" }; 2952// EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom"))))); 2953template <typename M> 2954inline internal::EachMatcher<M> Each(M matcher) { 2955 return internal::EachMatcher<M>(matcher); 2956} 2957 2958// Key(inner_matcher) matches an std::pair whose 'first' field matches 2959// inner_matcher. For example, Contains(Key(Ge(5))) can be used to match an 2960// std::map that contains at least one element whose key is >= 5. 2961template <typename M> 2962inline internal::KeyMatcher<M> Key(M inner_matcher) { 2963 return internal::KeyMatcher<M>(inner_matcher); 2964} 2965 2966// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field 2967// matches first_matcher and whose 'second' field matches second_matcher. For 2968// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used 2969// to match a std::map<int, string> that contains exactly one element whose key 2970// is >= 5 and whose value equals "foo". 2971template <typename FirstMatcher, typename SecondMatcher> 2972inline internal::PairMatcher<FirstMatcher, SecondMatcher> 2973Pair(FirstMatcher first_matcher, SecondMatcher second_matcher) { 2974 return internal::PairMatcher<FirstMatcher, SecondMatcher>( 2975 first_matcher, second_matcher); 2976} 2977 2978// Returns a predicate that is satisfied by anything that matches the 2979// given matcher. 2980template <typename M> 2981inline internal::MatcherAsPredicate<M> Matches(M matcher) { 2982 return internal::MatcherAsPredicate<M>(matcher); 2983} 2984 2985// Returns true iff the value matches the matcher. 2986template <typename T, typename M> 2987inline bool Value(const T& value, M matcher) { 2988 return testing::Matches(matcher)(value); 2989} 2990 2991// Matches the value against the given matcher and explains the match 2992// result to listener. 2993template <typename T, typename M> 2994inline bool ExplainMatchResult( 2995 M matcher, const T& value, MatchResultListener* listener) { 2996 return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener); 2997} 2998 2999// AllArgs(m) is a synonym of m. This is useful in 3000// 3001// EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq())); 3002// 3003// which is easier to read than 3004// 3005// EXPECT_CALL(foo, Bar(_, _)).With(Eq()); 3006template <typename InnerMatcher> 3007inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; } 3008 3009// These macros allow using matchers to check values in Google Test 3010// tests. ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher) 3011// succeed iff the value matches the matcher. If the assertion fails, 3012// the value and the description of the matcher will be printed. 3013#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\ 3014 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 3015#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\ 3016 ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) 3017 3018} // namespace testing 3019 3020#endif // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ 3021