1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2007, Google Inc. 2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved. 3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without 5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are 6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met: 7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions of source code must retain the above copyright 9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer. 10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions in binary form must reproduce the above 11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer 12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the 13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution. 14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Neither the name of Google Inc. nor the names of its 15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from 16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission. 17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: wan@google.com (Zhanyong Wan) 31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Mock - a framework for writing C++ mock classes. 33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file tests some commonly used argument matchers. 35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock-matchers.h" 37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string.h> 39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <functional> 4046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include <iostream> 41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <list> 42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <map> 43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <set> 44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <sstream> 45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string> 4646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include <utility> 47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <vector> 4846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock.h" 4946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h" 5046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest-spi.h" 51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing { 53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal { 5546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ string JoinAsTuple(const Strings& fields); 56dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace internal 57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace gmock_matchers_test { 59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 6046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::greater; 6146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::less; 6246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::list; 6346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::make_pair; 6446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::map; 6546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::multimap; 6646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::multiset; 6746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::ostream; 6846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::pair; 6946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::set; 70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing std::stringstream; 7146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::tr1::get; 72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing std::tr1::make_tuple; 7346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::tr1::tuple; 7446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing std::vector; 75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::A; 76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::AllArgs; 77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::AllOf; 78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::An; 79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::AnyOf; 80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::ByRef; 8146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::ContainsRegex; 82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::DoubleEq; 83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::EndsWith; 84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Eq; 8546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::ExplainMatchResult; 86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Field; 87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::FloatEq; 88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Ge; 89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Gt; 90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::HasSubstr; 9146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::IsNull; 9246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::Key; 93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Le; 94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Lt; 95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::MakeMatcher; 96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::MakePolymorphicMatcher; 9746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::MatchResultListener; 98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Matcher; 99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::MatcherCast; 100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::MatcherInterface; 101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Matches; 10246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::MatchesRegex; 103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::NanSensitiveDoubleEq; 104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::NanSensitiveFloatEq; 105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Ne; 106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Not; 107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::NotNull; 10846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::Pair; 109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Pointee; 11046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::Pointwise; 111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::PolymorphicMatcher; 112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Property; 113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Ref; 114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::ResultOf; 115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::StartsWith; 116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::StrCaseEq; 117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::StrCaseNe; 118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::StrEq; 119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::StrNe; 120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Truly; 121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::TypedEq; 122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Value; 12346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::WhenSorted; 12446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::WhenSortedBy; 125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::_; 12646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::DummyMatchResultListener; 12746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::ExplainMatchFailureTupleTo; 128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::FloatingEqMatcher; 12946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::FormatMatcherDescription; 13046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::IsReadableTypeName; 131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::JoinAsTuple; 13246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::RE; 13346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::StreamMatchResultListener; 134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::String; 13546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::StringMatchResultListener; 136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::Strings; 13746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::linked_ptr; 13846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::scoped_ptr; 139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::string; 140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 14146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// For testing ExplainMatchResultTo(). 14246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass GreaterThanMatcher : public MatcherInterface<int> { 14346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 14446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} 14546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 14646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan virtual void DescribeTo(ostream* os) const { 14746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *os << "is > " << rhs_; 14846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 14946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 15046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan virtual bool MatchAndExplain(int lhs, 15146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan MatchResultListener* listener) const { 15246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int diff = lhs - rhs_; 15346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (diff > 0) { 15446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "which is " << diff << " more than " << rhs_; 15546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } else if (diff == 0) { 15646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "which is the same as " << rhs_; 15746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } else { 15846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "which is " << -diff << " less than " << rhs_; 15946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 16046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 16146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return lhs > rhs_; 16246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 16446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 16546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int rhs_; 16646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 16846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanMatcher<int> GreaterThan(int n) { 16946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return MakeMatcher(new GreaterThanMatcher(n)); 17046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 17146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 17246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstring OfType(const string& type_name) { 17346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_RTTI 17446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return " (of type " + type_name + ")"; 17546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#else 17646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return ""; 17746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif 17846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns the description of the given matcher. 181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstring Describe(const Matcher<T>& m) { 183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter stringstream ss; 184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m.DescribeTo(&ss); 185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return ss.str(); 186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns the description of the negation of the given matcher. 189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstring DescribeNegation(const Matcher<T>& m) { 191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter stringstream ss; 192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m.DescribeNegationTo(&ss); 193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return ss.str(); 194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns the reason why x matches, or doesn't match, m. 197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename MatcherType, typename Value> 198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstring Explain(const MatcherType& m, const Value& x) { 19946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener; 20046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ExplainMatchResult(m, x, &listener); 20146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return listener.str(); 20246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 20346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 20446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatchResultListenerTest, StreamingWorks) { 20546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener; 20646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan listener << "hi" << 5; 20746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("hi5", listener.str()); 20846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 20946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Streaming shouldn't crash when the underlying ostream is NULL. 21046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DummyMatchResultListener dummy; 21146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan dummy << "hi" << 5; 21246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 21346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 21446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatchResultListenerTest, CanAccessUnderlyingStream) { 21546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(DummyMatchResultListener().stream() == NULL); 21646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL); 21746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 21846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream()); 21946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 22046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 22146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatchResultListenerTest, IsInterestedWorks) { 22246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(StringMatchResultListener().IsInterested()); 22346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested()); 22446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 22546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(DummyMatchResultListener().IsInterested()); 22646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested()); 227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Makes sure that the MatcherInterface<T> interface doesn't 230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// change. 231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass EvenMatcherImpl : public MatcherInterface<int> { 232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 23346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan virtual bool MatchAndExplain(int x, 23446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan MatchResultListener* /* listener */) const { 23546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return x % 2 == 0; 23646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 23846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan virtual void DescribeTo(ostream* os) const { 239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter *os << "is an even number"; 240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // We deliberately don't define DescribeNegationTo() and 243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // ExplainMatchResultTo() here, to make sure the definition of these 244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // two methods is optional. 245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 24746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Makes sure that the MatcherInterface API doesn't change. 24846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) { 249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EvenMatcherImpl m; 250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 25246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests implementing a monomorphic matcher using MatchAndExplain(). 25346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 25446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass NewEvenMatcherImpl : public MatcherInterface<int> { 25546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 25646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan virtual bool MatchAndExplain(int x, MatchResultListener* listener) const { 25746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const bool match = x % 2 == 0; 25846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Verifies that we can stream to a listener directly. 25946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "value % " << 2; 26046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (listener->stream() != NULL) { 26146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Verifies that we can stream to a listener's underlying stream 26246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // too. 26346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener->stream() << " == " << (x % 2); 26446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 26546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return match; 26646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 26746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 26846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan virtual void DescribeTo(ostream* os) const { 26946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *os << "is an even number"; 27046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 27146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 27246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 27346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) { 27446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl); 27546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(2)); 27646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(3)); 27746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("value % 2 == 0", Explain(m, 2)); 27846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("value % 2 == 1", Explain(m, 3)); 27946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 28046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests default-constructing a matcher. 282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherTest, CanBeDefaultConstructed) { 283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m; 284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*. 287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherTest, CanBeConstructedFromMatcherInterface) { 288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const MatcherInterface<int>* impl = new EvenMatcherImpl; 289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m(impl); 290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(4)); 291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(5)); 292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that value can be used in place of Eq(value). 295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) { 296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = 5; 297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(5)); 298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(6)); 299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that NULL can be used in place of Eq(NULL). 302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) { 303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int*> m1 = NULL; 304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(NULL)); 305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 0; 306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(&n)); 307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that matchers are copyable. 310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherTest, IsCopyable) { 311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests the copy constructor. 312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<bool> m1 = Eq(false); 313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(false)); 314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(true)); 315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests the assignment operator. 317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m1 = Eq(true); 318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(true)); 319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(false)); 320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Matcher<T>::DescribeTo() calls 323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// MatcherInterface<T>::DescribeTo(). 324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherTest, CanDescribeItself) { 325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is an even number", 326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(Matcher<int>(new EvenMatcherImpl))); 327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 32946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests Matcher<T>::MatchAndExplain(). 33046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatcherTest, MatchAndExplain) { 33146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> m = GreaterThan(0); 33246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener1; 33346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.MatchAndExplain(42, &listener1)); 33446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 42 more than 0", listener1.str()); 33546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 33646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener2; 33746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.MatchAndExplain(-9, &listener2)); 33846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 9 less than 0", listener2.str()); 33946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 34046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a C-string literal can be implicitly converted to a 342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Matcher<string> or Matcher<const string&>. 343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m1 = "hi"; 345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("hi")); 346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches("hello")); 347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m2 = "hi"; 349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("hi")); 350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("hello")); 351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a string object can be implicitly converted to a 354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Matcher<string> or Matcher<const string&>. 355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) { 356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m1 = string("hi"); 357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("hi")); 358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches("hello")); 359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m2 = string("hi"); 361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("hi")); 362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("hello")); 363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MakeMatcher() constructs a Matcher<T> from a 366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// MatcherInterface* without requiring the user to explicitly 367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// write the type. 368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { 369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const MatcherInterface<int>* dummy_impl = NULL; 370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = MakeMatcher(dummy_impl); 371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 37346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that MakePolymorphicMatcher() can construct a polymorphic 37446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// matcher from its implementation using the old API. 37546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanconst int g_bar = 1; 376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ReferencesBarOrIsZeroImpl { 377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter template <typename T> 37946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan bool MatchAndExplain(const T& x, 38046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan MatchResultListener* /* listener */) const { 381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const void* p = &x; 38246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return p == &g_bar || x == 0; 383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 38546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeTo(ostream* os) const { *os << "g_bar or zero"; } 386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 38746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeNegationTo(ostream* os) const { 38846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *os << "doesn't reference g_bar and is not zero"; 389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This function verifies that MakePolymorphicMatcher() returns a 393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// PolymorphicMatcher<T> where T is the argument's type. 394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() { 395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); 396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 39846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) { 399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Using a polymorphic matcher to match a reference type. 400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m1 = ReferencesBarOrIsZero(); 401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(0)); 402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Verifies that the identity of a by-reference argument is preserved. 40346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m1.Matches(g_bar)); 404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(1)); 40546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("g_bar or zero", Describe(m1)); 406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Using a polymorphic matcher to match a value type. 408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m2 = ReferencesBarOrIsZero(); 409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(0.0)); 410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(0.1)); 41146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("g_bar or zero", Describe(m2)); 41246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 41346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 41446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests implementing a polymorphic matcher using MatchAndExplain(). 41546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 41646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass PolymorphicIsEvenImpl { 41746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 41846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeTo(ostream* os) const { *os << "is even"; } 41946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 42046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeNegationTo(ostream* os) const { 42146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *os << "is odd"; 42246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 42346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 42446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan template <typename T> 42546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan bool MatchAndExplain(const T& x, MatchResultListener* listener) const { 42646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Verifies that we can stream to the listener directly. 42746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "% " << 2; 42846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (listener->stream() != NULL) { 42946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Verifies that we can stream to the listener's underlying stream 43046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // too. 43146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener->stream() << " == " << (x % 2); 43246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 43346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return (x % 2) == 0; 43446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 43546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 43646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 43746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanPolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() { 43846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return MakePolymorphicMatcher(PolymorphicIsEvenImpl()); 43946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 44046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 44146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) { 44246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Using PolymorphicIsEven() as a Matcher<int>. 44346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<int> m1 = PolymorphicIsEven(); 44446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m1.Matches(42)); 44546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m1.Matches(43)); 44646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is even", Describe(m1)); 44746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 44846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<int> not_m1 = Not(m1); 44946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is odd", Describe(not_m1)); 45046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 45146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("% 2 == 0", Explain(m1, 42)); 45246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 45346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Using PolymorphicIsEven() as a Matcher<char>. 45446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<char> m2 = PolymorphicIsEven(); 45546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m2.Matches('\x42')); 45646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m2.Matches('\x43')); 45746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is even", Describe(m2)); 45846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 45946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<char> not_m2 = Not(m2); 46046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is odd", Describe(not_m2)); 46146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 46246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("% 2 == 0", Explain(m2, '\x42')); 463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher. 466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherCastTest, FromPolymorphicMatcher) { 467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = MatcherCast<int>(Eq(5)); 468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(5)); 469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(6)); 470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For testing casting matchers between compatible types. 473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass IntValue { 474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // An int can be statically (although not implicitly) cast to a 476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // IntValue. 47746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit IntValue(int a_value) : value_(a_value) {} 478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int value() const { return value_; } 480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int value_; 482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For testing casting matchers between compatible types. 485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterbool IsPositiveIntValue(const IntValue& foo) { 486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return foo.value() > 0; 487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T 490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// can be statically converted to U. 491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherCastTest, FromCompatibleType) { 492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m1 = Eq(2.0); 493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m2 = MatcherCast<int>(m1); 494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(2)); 495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(3)); 496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<IntValue> m3 = Truly(IsPositiveIntValue); 498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m4 = MatcherCast<int>(m3); 499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // In the following, the arguments 1 and 0 are statically converted 500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // to IntValue objects, and then tested by the IsPositiveIntValue() 501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // predicate. 502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m4.Matches(1)); 503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m4.Matches(0)); 504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>. 507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherCastTest, FromConstReferenceToNonReference) { 508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m1 = Eq(0); 509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m2 = MatcherCast<int>(m1); 510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(0)); 511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(1)); 512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>. 515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherCastTest, FromReferenceToNonReference) { 516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m1 = Eq(0); 517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m2 = MatcherCast<int>(m1); 518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(0)); 519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(1)); 520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherCastTest, FromNonReferenceToConstReference) { 524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Eq(0); 525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m2 = MatcherCast<const int&>(m1); 526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(0)); 527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(1)); 528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>. 531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherCastTest, FromNonReferenceToReference) { 532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Eq(0); 533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = MatcherCast<int&>(m1); 534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 0; 535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(n)); 536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = 1; 537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(n)); 538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<T>(m) works when m is a Matcher<T>. 541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherCastTest, FromSameType) { 542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Eq(0); 543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m2 = MatcherCast<int>(m1); 544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(0)); 545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(1)); 546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 54846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Implicitly convertible form any type. 54946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct ConvertibleFromAny { 55046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ConvertibleFromAny(int a_value) : value(a_value) {} 55146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan template <typename T> 55246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ConvertibleFromAny(const T& a_value) : value(-1) { 55346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ADD_FAILURE() << "Conversion constructor called"; 55446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 55546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int value; 55646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 55746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 55846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanbool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) { 55946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return a.value == b.value; 56046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 56146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 56246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanostream& operator<<(ostream& os, const ConvertibleFromAny& a) { 56346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return os << a.value; 56446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 56546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 56646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatcherCastTest, ConversionConstructorIsUsed) { 56746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1); 56846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 56946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 57046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 57146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 57246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatcherCastTest, FromConvertibleFromAny) { 57346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<ConvertibleFromAny> m = 57446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 57546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 57646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 57746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 57846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Base {}; 580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Derived : public Base {}; 581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher. 583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SafeMatcherCastTest, FromPolymorphicMatcher) { 584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<char> m2 = SafeMatcherCast<char>(Eq(32)); 585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(' ')); 586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches('\n')); 587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where 590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// T and U are arithmetic types and T can be losslessly converted to 591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// U. 592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) { 593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m1 = DoubleEq(1.0); 594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m2 = SafeMatcherCast<float>(m1); 595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(1.0f)); 596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(2.0f)); 597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a')); 599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m3.Matches('a')); 600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches('b')); 601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U 604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// are pointers or references to a derived and a base class, correspondingly. 605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SafeMatcherCastTest, FromBaseClass) { 606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Derived d, d2; 607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<Base*> m1 = Eq(&d); 608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1); 609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(&d)); 610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(&d2)); 611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<Base&> m3 = Ref(d); 613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3); 614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m4.Matches(d)); 615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m4.Matches(d2)); 616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>. 619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SafeMatcherCastTest, FromConstReferenceToReference) { 620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 0; 621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m1 = Ref(n); 622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n1 = 0; 624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(n)); 625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(n1)); 626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) { 630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Eq(0); 631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1); 632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(0)); 633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(1)); 634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>. 637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SafeMatcherCastTest, FromNonReferenceToReference) { 638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Eq(0); 639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 0; 641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(n)); 642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = 1; 643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(n)); 644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>. 647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SafeMatcherCastTest, FromSameType) { 648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Eq(0); 649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m2 = SafeMatcherCast<int>(m1); 650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(0)); 651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(1)); 652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 65446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(SafeMatcherCastTest, ConversionConstructorIsUsed) { 65546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1); 65646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 65746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 65846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 65946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 66046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(SafeMatcherCastTest, FromConvertibleFromAny) { 66146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<ConvertibleFromAny> m = 66246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 66346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 66446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 66546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 66646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that A<T>() matches any value of type T. 668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ATest, MatchesAnyValue) { 669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests a matcher for a value type. 670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m1 = A<double>(); 671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(91.43)); 672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(-15.32)); 673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests a matcher for a reference type. 675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a = 2; 676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int b = -6; 677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = A<int&>(); 678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(a)); 679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(b)); 680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that A<T>() describes itself properly. 683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ATest, CanDescribeSelf) { 684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is anything", Describe(A<bool>())); 685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that An<T>() matches any value of type T. 688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AnTest, MatchesAnyValue) { 689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests a matcher for a value type. 690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = An<int>(); 691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(9143)); 692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(-1532)); 693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests a matcher for a reference type. 695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a = 2; 696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int b = -6; 697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = An<int&>(); 698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(a)); 699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(b)); 700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that An<T>() describes itself properly. 703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AnTest, CanDescribeSelf) { 704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is anything", Describe(An<int>())); 705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that _ can be used as a matcher for any type and matches any 708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// value of that type. 709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnderscoreTest, MatchesAnyValue) { 710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Uses _ as a matcher for a value type. 711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = _; 712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(123)); 713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(-242)); 714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Uses _ as a matcher for a reference type. 716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool a = false; 717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const bool b = true; 718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const bool&> m2 = _; 719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(a)); 720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(b)); 721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that _ describes itself properly. 724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnderscoreTest, CanDescribeSelf) { 725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = _; 726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is anything", Describe(m)); 727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Eq(x) matches any value equal to x. 730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(EqTest, MatchesEqualValue) { 731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 2 C-strings with same content but different addresses. 732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char a1[] = "hi"; 733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char a2[] = "hi"; 734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m1 = Eq(a1); 736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(a1)); 737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(a2)); 738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Eq(v) describes itself properly. 741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Unprintable { 743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Unprintable() : c_('a') {} 745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 74646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan bool operator==(const Unprintable& /* rhs */) { return true; } 747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter char c_; 749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(EqTest, CanDescribeSelf) { 752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<Unprintable> m = Eq(Unprintable()); 753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to 1-byte object <61>", Describe(m)); 754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Eq(v) can be used to match any type that supports 757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// comparing with type T, where T is v's type. 758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(EqTest, IsPolymorphic) { 759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Eq(1); 760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(1)); 761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(2)); 762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<char> m2 = Eq(1); 764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches('\1')); 765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches('a')); 766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that TypedEq<T>(v) matches values of type T that's equal to v. 769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypedEqTest, ChecksEqualityForGivenType) { 770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<char> m1 = TypedEq<char>('a'); 771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches('a')); 772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches('b')); 773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m2 = TypedEq<int>(6); 775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(6)); 776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(7)); 777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that TypedEq(v) describes itself properly. 780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypedEqTest, CanDescribeSelf) { 781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2))); 782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that TypedEq<T>(v) has type Matcher<T>. 785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T 787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is a "bare" type (i.e. not in the form of const U or U&). If v's 788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// type is not T, the compiler will generate a message about 789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "undefined referece". 790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct Type { 79246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static bool IsTypeOf(const T& /* v */) { return true; } 793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter template <typename T2> 795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static void IsTypeOf(T2 v); 796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TypedEqTest, HasSpecifiedType) { 799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Verfies that the type of TypedEq<T>(v) is Matcher<T>. 800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5)); 801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5)); 802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ge(v) matches anything >= v. 805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GeTest, ImplementsGreaterThanOrEqual) { 806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Ge(0); 807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(1)); 808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(0)); 809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(-1)); 810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ge(v) describes itself properly. 813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GeTest, CanDescribeSelf) { 814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = Ge(5); 81546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is >= 5", Describe(m)); 816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Gt(v) matches anything > v. 819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GtTest, ImplementsGreaterThan) { 820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m1 = Gt(0); 821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(1.0)); 822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(0.0)); 823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(-1.0)); 824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Gt(v) describes itself properly. 827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GtTest, CanDescribeSelf) { 828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = Gt(5); 82946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is > 5", Describe(m)); 830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Le(v) matches anything <= v. 833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LeTest, ImplementsLessThanOrEqual) { 834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<char> m1 = Le('b'); 835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches('a')); 836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches('b')); 837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches('c')); 838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Le(v) describes itself properly. 841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LeTest, CanDescribeSelf) { 842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = Le(5); 84346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is <= 5", Describe(m)); 844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Lt(v) matches anything < v. 847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LtTest, ImplementsLessThan) { 848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m1 = Lt("Hello"); 849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("Abc")); 850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches("Hello")); 851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches("Hello, world!")); 852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Lt(v) describes itself properly. 855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(LtTest, CanDescribeSelf) { 856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = Lt(5); 85746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is < 5", Describe(m)); 858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ne(v) matches anything != v. 861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NeTest, ImplementsNotEqual) { 862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m1 = Ne(0); 863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(1)); 864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(-1)); 865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(0)); 866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ne(v) describes itself properly. 869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NeTest, CanDescribeSelf) { 870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = Ne(5); 87146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to 5", Describe(m)); 87246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 87346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 87446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that IsNull() matches any NULL pointer of any type. 87546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsNullTest, MatchesNullPointer) { 87646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int*> m1 = IsNull(); 87746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int* p1 = NULL; 87846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int n = 0; 87946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m1.Matches(p1)); 88046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m1.Matches(&n)); 88146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 88246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const char*> m2 = IsNull(); 88346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* p2 = NULL; 88446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m2.Matches(p2)); 88546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m2.Matches("hi")); 88646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 88746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if !GTEST_OS_SYMBIAN 88846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Nokia's Symbian compiler generates: 88946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // gmock-matchers.h: ambiguous access to overloaded function 89046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)' 89146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing:: 89246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // MatcherInterface<void *> *)' 89346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // gmock-matchers.h: (point of instantiation: 'testing:: 89446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()') 89546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // gmock-matchers.h: (instantiating: 'testing::PolymorphicMatc 89646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<void*> m3 = IsNull(); 89746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void* p3 = NULL; 89846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m3.Matches(p3)); 89946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef))); 90046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif 90146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 90246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 90346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsNullTest, LinkedPtr) { 90446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<linked_ptr<int> > m = IsNull(); 90546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<int> null_p; 90646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<int> non_null_p(new int); 90746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 90846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(null_p)); 90946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(non_null_p)); 91046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 91146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 91246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsNullTest, ReferenceToConstLinkedPtr) { 91346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const linked_ptr<double>&> m = IsNull(); 91446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<double> null_p; 91546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<double> non_null_p(new double); 91646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 91746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(null_p)); 91846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(non_null_p)); 91946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 92046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 92146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsNullTest, ReferenceToConstScopedPtr) { 92246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const scoped_ptr<double>&> m = IsNull(); 92346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const scoped_ptr<double> null_p; 92446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const scoped_ptr<double> non_null_p(new double); 92546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 92646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(null_p)); 92746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(non_null_p)); 92846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 92946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 93046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that IsNull() describes itself properly. 93146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsNullTest, CanDescribeSelf) { 93246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int*> m = IsNull(); 93346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is NULL", Describe(m)); 93446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't NULL", DescribeNegation(m)); 935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that NotNull() matches any non-NULL pointer of any type. 938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NotNullTest, MatchesNonNullPointer) { 939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int*> m1 = NotNull(); 940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int* p1 = NULL; 941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 0; 942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(p1)); 943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(&n)); 944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m2 = NotNull(); 946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* p2 = NULL; 947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(p2)); 948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("hi")); 949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 95146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(NotNullTest, LinkedPtr) { 95246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<linked_ptr<int> > m = NotNull(); 95346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<int> null_p; 95446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<int> non_null_p(new int); 95546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 95646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(null_p)); 95746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(non_null_p)); 95846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 95946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 96046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(NotNullTest, ReferenceToConstLinkedPtr) { 96146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const linked_ptr<double>&> m = NotNull(); 96246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<double> null_p; 96346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const linked_ptr<double> non_null_p(new double); 96446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 96546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(null_p)); 96646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(non_null_p)); 96746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 96846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 96946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(NotNullTest, ReferenceToConstScopedPtr) { 97046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const scoped_ptr<double>&> m = NotNull(); 97146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const scoped_ptr<double> null_p; 97246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const scoped_ptr<double> non_null_p(new double); 97346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 97446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(null_p)); 97546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(non_null_p)); 97646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 97746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that NotNull() describes itself properly. 979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NotNullTest, CanDescribeSelf) { 980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int*> m = NotNull(); 98146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't NULL", Describe(m)); 982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ref(variable) matches an argument that references 985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 'variable'. 986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RefTest, MatchesSameVariable) { 987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a = 0; 988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int b = 0; 989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m = Ref(a); 990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(b)); 992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ref(variable) describes itself properly. 995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RefTest, CanDescribeSelf) { 996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 5; 997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m = Ref(n); 998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter stringstream ss; 999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ss << "references the variable @" << &n << " 5"; 1000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(string(ss.str()), Describe(m)); 1001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Test that Ref(non_const_varialbe) can be used as a matcher for a 1004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// const reference. 1005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RefTest, CanBeUsedAsMatcherForConstReference) { 1006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a = 0; 1007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int b = 0; 1008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m = Ref(a); 1009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 1010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(b)); 1011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be 1014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// used wherever Ref(base) can be used (Ref(derived) is a sub-type 1015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of Ref(base), but not vice versa. 1016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(RefTest, IsCovariant) { 1018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Base base, base2; 1019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Derived derived; 1020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Base&> m1 = Ref(base); 1021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(base)); 1022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(base2)); 1023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(derived)); 1024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m1 = Ref(derived); 1026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(derived)); 1027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(base)); 1028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(base2)); 1029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 103146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(RefTest, ExplainsResult) { 103246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int n = 0; 103346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n), 103446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StartsWith("which is located @")); 103546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 103646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int m = 0; 103746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m), 103846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StartsWith("which is located @")); 103946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 104046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 1041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests string comparison matchers. 1042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrEqTest, MatchesEqualString) { 1044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m = StrEq(string("Hello")); 1045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches("Hello")); 1046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches("hello")); 1047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 1048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m2 = StrEq("Hello"); 1050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("Hello")); 1051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("Hi")); 1052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrEqTest, CanDescribeSelf) { 105546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3"); 105646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"", 1057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 1058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter string str("01204500800"); 1060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[3] = '\0'; 1061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m2 = StrEq(str); 1062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2)); 1063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[0] = str[6] = str[7] = str[9] = str[10] = '\0'; 1064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m3 = StrEq(str); 1065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3)); 1066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrNeTest, MatchesUnequalString) { 1069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m = StrNe("Hello"); 1070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches("")); 1071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(NULL)); 1072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches("Hello")); 1073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m2 = StrNe(string("Hello")); 1075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("hello")); 1076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("Hello")); 1077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrNeTest, CanDescribeSelf) { 1080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m = StrNe("Hi"); 108146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to \"Hi\"", Describe(m)); 1082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) { 1085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m = StrCaseEq(string("Hello")); 1086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches("Hello")); 1087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches("hello")); 1088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches("Hi")); 1089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 1090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m2 = StrCaseEq("Hello"); 1092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("hello")); 1093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("Hi")); 1094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter string str1("oabocdooeoo"); 1098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter string str2("OABOCDOOEOO"); 1099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m0 = StrCaseEq(str1); 1100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m0.Matches(str2 + string(1, '\0'))); 1101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[3] = str2[3] = '\0'; 1103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m1 = StrCaseEq(str1); 1104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(str2)); 1105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[0] = str1[6] = str1[7] = str1[10] = '\0'; 1107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str2[0] = str2[6] = str2[7] = str2[10] = '\0'; 1108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m2 = StrCaseEq(str1); 1109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[9] = str2[9] = '\0'; 1110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(str2)); 1111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> m3 = StrCaseEq(str1); 1113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m3.Matches(str2)); 1114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(str2 + "x")); 1116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str2.append(1, '\0'); 1117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(str2)); 1118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(string(str2, 0, 9))); 1119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrCaseEqTest, CanDescribeSelf) { 1122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m = StrCaseEq("Hi"); 1123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m)); 1124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m = StrCaseNe("Hello"); 1128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches("Hi")); 1129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(NULL)); 1130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches("Hello")); 1131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches("hello")); 1132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m2 = StrCaseNe(string("Hello")); 1134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("")); 1135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("Hello")); 1136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StrCaseNeTest, CanDescribeSelf) { 1139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> m = StrCaseNe("Hi"); 114046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m)); 1141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr() works for matching string-typed values. 1144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(HasSubstrTest, WorksForStringClasses) { 1145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<string> m1 = HasSubstr("foo"); 1146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(string("I love food."))); 1147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(string("tofo"))); 1148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const std::string&> m2 = HasSubstr("foo"); 1150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(std::string("I love food."))); 1151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(std::string("tofo"))); 1152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr() works for matching C-string-typed values. 1155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(HasSubstrTest, WorksForCStrings) { 1156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<char*> m1 = HasSubstr("foo"); 1157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food."))); 1158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo"))); 1159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const char*> m2 = HasSubstr("foo"); 1162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("I love food.")); 1163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("tofo")); 1164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(NULL)); 1165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr(s) describes itself properly. 1168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(HasSubstrTest, CanDescribeSelf) { 1169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<string> m = HasSubstr("foo\n\""); 1170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m)); 1171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 117346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(KeyTest, CanDescribeSelf) { 117446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const pair<std::string, int>&> m = Key("foo"); 117546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m)); 117646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m)); 117746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 117846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 117946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(KeyTest, ExplainsResult) { 118046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<pair<int, bool> > m = Key(GreaterThan(10)); 118146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose first field is a value which is 5 less than 10", 118246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, make_pair(5, true))); 118346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose first field is a value which is 5 more than 10", 118446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, make_pair(15, true))); 118546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 118646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 118746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(KeyTest, MatchesCorrectly) { 118846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan pair<int, std::string> p(25, "foo"); 118946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Key(25)); 119046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Key(42))); 119146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Key(Ge(20))); 119246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Key(Lt(25)))); 119346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 119446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 119546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(KeyTest, SafelyCastsInnerMatcher) { 119646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> is_positive = Gt(0); 119746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> is_negative = Lt(0); 119846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan pair<char, bool> p('a', true); 119946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Key(is_positive)); 120046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Key(is_negative))); 120146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 120246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 120346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(KeyTest, InsideContainsUsingMap) { 120446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan map<int, char> container; 120546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(1, 'a')); 120646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(2, 'b')); 120746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(4, 'c')); 120846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Contains(Key(1))); 120946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Not(Contains(Key(3)))); 121046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 121146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 121246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(KeyTest, InsideContainsUsingMultimap) { 121346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan multimap<int, char> container; 121446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(1, 'a')); 121546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(2, 'b')); 121646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(4, 'c')); 121746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 121846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Not(Contains(Key(25)))); 121946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(25, 'd')); 122046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Contains(Key(25))); 122146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(25, 'e')); 122246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Contains(Key(25))); 122346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 122446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Contains(Key(1))); 122546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Not(Contains(Key(3)))); 122646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 122746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 122846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PairTest, Typing) { 122946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Test verifies the following type conversions can be compiled. 123046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42); 123146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const pair<const char*, int> > m2 = Pair("foo", 42); 123246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<pair<const char*, int> > m3 = Pair("foo", 42); 123346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 123446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<pair<int, const std::string> > m4 = Pair(25, "42"); 123546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<pair<const std::string, int> > m5 = Pair("25", 42); 123646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 123746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 123846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PairTest, CanDescribeSelf) { 123946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42); 124046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("has a first field that is equal to \"foo\"" 124146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ", and has a second field that is equal to 42", 124246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Describe(m1)); 124346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("has a first field that isn't equal to \"foo\"" 124446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ", or has a second field that isn't equal to 42", 124546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m1)); 124646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Double and triple negation (1 or 2 times not and description of negation). 124746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42)); 124846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("has a first field that isn't equal to 13" 124946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ", and has a second field that is equal to 42", 125046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m2)); 125146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 125246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 125346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PairTest, CanExplainMatchResultTo) { 125446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // If neither field matches, Pair() should explain about the first 125546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // field. 125646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0)); 125746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose first field does not match, which is 1 less than 0", 125846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, make_pair(-1, -2))); 125946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 126046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // If the first field matches but the second doesn't, Pair() should 126146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explain about the second field. 126246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose second field does not match, which is 2 less than 0", 126346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, make_pair(1, -2))); 126446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 126546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // If the first field doesn't match but the second does, Pair() 126646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // should explain about the first field. 126746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose first field does not match, which is 1 less than 0", 126846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, make_pair(-1, 2))); 126946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 127046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // If both fields match, Pair() should explain about them both. 127146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose both fields match, where the first field is a value " 127246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "which is 1 more than 0, and the second field is a value " 127346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "which is 2 more than 0", 127446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, make_pair(1, 2))); 127546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 127646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // If only the first match has an explanation, only this explanation should 127746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // be printed. 127846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0); 127946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose both fields match, where the first field is a value " 128046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "which is 1 more than 0", 128146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(explain_first, make_pair(1, 0))); 128246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 128346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // If only the second match has an explanation, only this explanation should 128446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // be printed. 128546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0)); 128646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose both fields match, where the second field is a value " 128746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "which is 1 more than 0", 128846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(explain_second, make_pair(0, 1))); 128946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 129046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 129146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PairTest, MatchesCorrectly) { 129246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan pair<int, std::string> p(25, "foo"); 129346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 129446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Both fields match. 129546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Pair(25, "foo")); 129646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o"))); 129746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 129846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // 'first' doesnt' match, but 'second' matches. 129946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(42, "foo"))); 130046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(Lt(25), "foo"))); 130146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 130246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // 'first' matches, but 'second' doesn't match. 130346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(25, "bar"))); 130446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(25, Not("foo")))); 130546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 130646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Neither field matches. 130746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(13, "bar"))); 130846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a")))); 130946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 131046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 131146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PairTest, SafelyCastsInnerMatchers) { 131246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> is_positive = Gt(0); 131346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> is_negative = Lt(0); 131446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan pair<char, bool> p('a', true); 131546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Pair(is_positive, _)); 131646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(is_negative, _))); 131746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Pair(_, is_positive)); 131846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(p, Not(Pair(_, is_negative))); 131946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 132046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 132146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PairTest, InsideContainsUsingMap) { 132246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan map<int, char> container; 132346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(1, 'a')); 132446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(2, 'b')); 132546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan container.insert(make_pair(4, 'c')); 132646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Contains(Pair(1, 'a'))); 132746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Contains(Pair(1, _))); 132846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Contains(Pair(_, 'a'))); 132946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(container, Not(Contains(Pair(3, _)))); 133046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 133146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 1332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests StartsWith(s). 1333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StartsWithTest, MatchesStringWithGivenPrefix) { 1335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const char*> m1 = StartsWith(string("")); 1336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("Hi")); 1337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("")); 1338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const string&> m2 = StartsWith("Hi"); 1341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("Hi")); 1342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("Hi Hi!")); 1343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("High")); 1344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("H")); 1345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(" Hi")); 1346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StartsWithTest, CanDescribeSelf) { 1349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const std::string> m = StartsWith("Hi"); 1350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("starts with \"Hi\"", Describe(m)); 1351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests EndsWith(s). 1354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(EndsWithTest, MatchesStringWithGivenSuffix) { 1356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const char*> m1 = EndsWith(""); 1357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("Hi")); 1358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("")); 1359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const string&> m2 = EndsWith(string("Hi")); 1362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("Hi")); 1363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("Wow Hi Hi")); 1364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("Super Hi")); 1365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("i")); 1366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("Hi ")); 1367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(EndsWithTest, CanDescribeSelf) { 1370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const std::string> m = EndsWith("Hi"); 1371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("ends with \"Hi\"", Describe(m)); 1372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests MatchesRegex(). 1375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) { 1377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const char*> m1 = MatchesRegex("a.*z"); 1378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("az")); 1379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("abcz")); 1380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z")); 1383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("azbz")); 1384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("az1")); 1385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("1az")); 1386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatchesRegexTest, CanDescribeSelf) { 1389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const std::string> m1 = MatchesRegex(string("Hi.*")); 1390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1)); 1391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 139246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const char*> m2 = MatchesRegex(new RE("a.*")); 139346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2)); 1394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests ContainsRegex(). 1397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) { 1399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const char*> m1 = ContainsRegex(string("a.*z")); 1400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("az")); 1401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches("0abcz1")); 1402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z")); 1405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("azbz")); 1406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches("az1")); 1407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches("1a")); 1408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainsRegexTest, CanDescribeSelf) { 1411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const std::string> m1 = ContainsRegex("Hi.*"); 1412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1)); 1413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 141446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const char*> m2 = ContainsRegex(new RE("a.*")); 141546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2)); 1416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests for wide strings. 1419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_STD_WSTRING 1420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrEqTest, MatchesEqual) { 1421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello")); 1422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"Hello")); 1423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"hello")); 1424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 1425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m2 = StrEq(L"Hello"); 1427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hello")); 1428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hi")); 1429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 1432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 1433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::std::wstring str(L"01204500800"); 1435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[3] = L'\0'; 1436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m4 = StrEq(str); 1437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m4.Matches(str)); 1438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m5 = StrEq(str); 1440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m5.Matches(str)); 1441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrEqTest, CanDescribeSelf) { 144446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v"); 144546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 1446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 1447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 1450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m2)); 1451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::std::wstring str(L"01204500800"); 1453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[3] = L'\0'; 1454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m4 = StrEq(str); 1455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 1456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m5 = StrEq(str); 1458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 1459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrNeTest, MatchesUnequalString) { 1462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrNe(L"Hello"); 1463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"")); 1464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(NULL)); 1465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"Hello")); 1466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello")); 1468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"hello")); 1469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hello")); 1470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrNeTest, CanDescribeSelf) { 1473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrNe(L"Hi"); 147446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m)); 1475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 1478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello")); 1479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"Hello")); 1480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"hello")); 1481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"Hi")); 1482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 1483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello"); 1485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"hello")); 1486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hi")); 1487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::std::wstring str1(L"oabocdooeoo"); 1491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::std::wstring str2(L"OABOCDOOEOO"); 1492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m0 = StrCaseEq(str1); 1493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0'))); 1494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[3] = str2[3] = L'\0'; 1496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m1 = StrCaseEq(str1); 1497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(str2)); 1498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 1500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 1501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m2 = StrCaseEq(str1); 1502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[9] = str2[9] = L'\0'; 1503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(str2)); 1504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring&> m3 = StrCaseEq(str1); 1506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m3.Matches(str2)); 1507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(str2 + L"x")); 1509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str2.append(1, L'\0'); 1510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(str2)); 1511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9))); 1512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrCaseEqTest, CanDescribeSelf) { 1515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::std::wstring> m = StrCaseEq(L"Hi"); 1516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 1517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 1521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"Hi")); 1522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(NULL)); 1523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"Hello")); 1524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"hello")); 1525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello")); 1527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"")); 1528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hello")); 1529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStrCaseNeTest, CanDescribeSelf) { 1532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 153346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m)); 1534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr() works for matching wstring-typed values. 1537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideHasSubstrTest, WorksForStringClasses) { 1538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher< ::std::wstring> m1 = HasSubstr(L"foo"); 1539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food."))); 1540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo"))); 1541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo"); 1543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food."))); 1544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo"))); 1545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr() works for matching C-wide-string-typed values. 1548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideHasSubstrTest, WorksForCStrings) { 1549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 1550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 1551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 1552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 1555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"I love food.")); 1556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"tofo")); 1557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(NULL)); 1558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr(s) describes itself properly. 1561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideHasSubstrTest, CanDescribeSelf) { 1562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::std::wstring> m = HasSubstr(L"foo\n\""); 1563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 1564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests StartsWith(s). 1567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) { 1569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L"")); 1570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"Hi")); 1571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"")); 1572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi"); 1575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hi")); 1576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 1577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"High")); 1578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"H")); 1579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L" Hi")); 1580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideStartsWithTest, CanDescribeSelf) { 1583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring> m = StartsWith(L"Hi"); 1584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 1585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests EndsWith(s). 1588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) { 1590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const wchar_t*> m1 = EndsWith(L""); 1591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"Hi")); 1592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"")); 1593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi")); 1596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hi")); 1597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 1598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Super Hi")); 1599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"i")); 1600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hi ")); 1601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(StdWideEndsWithTest, CanDescribeSelf) { 1604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::std::wstring> m = EndsWith(L"Hi"); 1605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 1606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_STD_WSTRING 1609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_GLOBAL_WSTRING 1611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrEqTest, MatchesEqual) { 1612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello")); 1613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"Hello")); 1614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"hello")); 1615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 1616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m2 = StrEq(L"Hello"); 1618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hello")); 1619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hi")); 1620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 1623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 1624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::wstring str(L"01204500800"); 1626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[3] = L'\0'; 1627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m4 = StrEq(str); 1628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m4.Matches(str)); 1629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m5 = StrEq(str); 1631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m5.Matches(str)); 1632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrEqTest, CanDescribeSelf) { 163546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher< ::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v"); 163646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 1637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 1638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 1640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 1641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m2)); 1642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::wstring str(L"01204500800"); 1644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[3] = L'\0'; 1645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m4 = StrEq(str); 1646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 1647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 1648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m5 = StrEq(str); 1649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 1650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrNeTest, MatchesUnequalString) { 1653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrNe(L"Hello"); 1654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"")); 1655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(NULL)); 1656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"Hello")); 1657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello")); 1659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"hello")); 1660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hello")); 1661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrNeTest, CanDescribeSelf) { 1664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrNe(L"Hi"); 166546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m)); 1666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 1669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello")); 1670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"Hello")); 1671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"hello")); 1672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"Hi")); 1673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 1674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello"); 1676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"hello")); 1677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hi")); 1678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 1681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::wstring str1(L"oabocdooeoo"); 1682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::wstring str2(L"OABOCDOOEOO"); 1683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m0 = StrCaseEq(str1); 1684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0'))); 1685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[3] = str2[3] = L'\0'; 1687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m1 = StrCaseEq(str1); 1688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(str2)); 1689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 1691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 1692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m2 = StrCaseEq(str1); 1693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str1[9] = str2[9] = L'\0'; 1694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(str2)); 1695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring&> m3 = StrCaseEq(str1); 1697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m3.Matches(str2)); 1698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(str2 + L"x")); 1700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter str2.append(1, L'\0'); 1701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(str2)); 1702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9))); 1703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrCaseEqTest, CanDescribeSelf) { 1706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::wstring> m = StrCaseEq(L"Hi"); 1707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 1708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 1711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 1712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(L"Hi")); 1713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(NULL)); 1714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"Hello")); 1715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(L"hello")); 1716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello")); 1718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"")); 1719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hello")); 1720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStrCaseNeTest, CanDescribeSelf) { 1723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 172446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m)); 1725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr() works for matching wstring-typed values. 1728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideHasSubstrTest, WorksForStringClasses) { 1729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher< ::wstring> m1 = HasSubstr(L"foo"); 1730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(::wstring(L"I love food."))); 1731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(::wstring(L"tofo"))); 1732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const ::wstring&> m2 = HasSubstr(L"foo"); 1734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(::wstring(L"I love food."))); 1735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(::wstring(L"tofo"))); 1736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr() works for matching C-wide-string-typed values. 1739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideHasSubstrTest, WorksForCStrings) { 1740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 1741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 1742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 1743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 1746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"I love food.")); 1747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"tofo")); 1748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(NULL)); 1749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that HasSubstr(s) describes itself properly. 1752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideHasSubstrTest, CanDescribeSelf) { 1753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher< ::wstring> m = HasSubstr(L"foo\n\""); 1754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 1755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests StartsWith(s). 1758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) { 1760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L"")); 1761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"Hi")); 1762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"")); 1763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const ::wstring&> m2 = StartsWith(L"Hi"); 1766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hi")); 1767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 1768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"High")); 1769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"H")); 1770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L" Hi")); 1771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideStartsWithTest, CanDescribeSelf) { 1774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring> m = StartsWith(L"Hi"); 1775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 1776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests EndsWith(s). 1779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) { 1781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const wchar_t*> m1 = EndsWith(L""); 1782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"Hi")); 1783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(L"")); 1784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(NULL)); 1785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi")); 1787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Hi")); 1788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 1789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m2.Matches(L"Super Hi")); 1790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"i")); 1791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(L"Hi ")); 1792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(GlobalWideEndsWithTest, CanDescribeSelf) { 1795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const ::wstring> m = EndsWith(L"Hi"); 1796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 1797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_GLOBAL_WSTRING 1800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef ::std::tr1::tuple<long, int> Tuple2; // NOLINT 1803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Eq() matches a 2-tuple where the first field == the 1805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// second field. 1806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Eq2Test, MatchesEqualArguments) { 1807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Eq(); 1808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Eq() describes itself properly. 1813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Eq2Test, CanDescribeSelf) { 1814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Eq(); 181546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("are an equal pair", Describe(m)); 1816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ge() matches a 2-tuple where the first field >= the 1819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// second field. 1820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Ge2Test, MatchesGreaterThanOrEqualArguments) { 1821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Ge(); 1822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ge() describes itself properly. 1828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Ge2Test, CanDescribeSelf) { 1829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Ge(); 183046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("are a pair where the first >= the second", Describe(m)); 1831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Gt() matches a 2-tuple where the first field > the 1834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// second field. 1835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Gt2Test, MatchesGreaterThanArguments) { 1836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Gt(); 1837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 1840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Gt() describes itself properly. 1843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Gt2Test, CanDescribeSelf) { 1844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Gt(); 184546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("are a pair where the first > the second", Describe(m)); 1846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Le() matches a 2-tuple where the first field <= the 1849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// second field. 1850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Le2Test, MatchesLessThanOrEqualArguments) { 1851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Le(); 1852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 1854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 1855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Le() describes itself properly. 1858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Le2Test, CanDescribeSelf) { 1859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Le(); 186046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("are a pair where the first <= the second", Describe(m)); 1861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Lt() matches a 2-tuple where the first field < the 1864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// second field. 1865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Lt2Test, MatchesLessThanArguments) { 1866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Lt(); 1867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 1870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Lt() describes itself properly. 1873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Lt2Test, CanDescribeSelf) { 1874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Lt(); 187546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("are a pair where the first < the second", Describe(m)); 1876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1878dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ne() matches a 2-tuple where the first field != the 1879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// second field. 1880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Ne2Test, MatchesUnequalArguments) { 1881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Ne(); 1882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 1883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 1884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 1885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Ne() describes itself properly. 1888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(Ne2Test, CanDescribeSelf) { 1889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const Tuple2&> m = Ne(); 189046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("are an unequal pair", Describe(m)); 1891dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Not(m) matches any value that doesn't match m. 1894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NotTest, NegatesMatcher) { 1895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m; 1896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Not(Eq(2)); 1897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(3)); 1898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(2)); 1899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Not(m) describes itself properly. 1902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NotTest, CanDescribeSelf) { 1903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = Not(Eq(5)); 190446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't equal to 5", Describe(m)); 1905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that monomorphic matchers are safely cast by the Not matcher. 1908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) { 1909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // greater_than_5 is a monomorphic matcher. 1910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> greater_than_5 = Gt(5); 1911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m = Not(greater_than_5); 1913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = Not(greater_than_5); 1914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m3 = Not(m); 1915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 191746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Helper to allow easy testing of AllOf matchers with num parameters. 191846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanvoid AllOfMatches(int num, const Matcher<int>& m) { 191946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan SCOPED_TRACE(Describe(m)); 192046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(0)); 192146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan for (int i = 1; i <= num; ++i) { 192246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(i)); 192346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 192446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(num + 1)); 192546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 192646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 1927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that AllOf(m1, ..., mn) matches any value that matches all of 1928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the given matchers. 1929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllOfTest, MatchesWhenAllMatch) { 1930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m; 1931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Le(2), Ge(1)); 1932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(1)); 1933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(2)); 1934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(0)); 1935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(3)); 1936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Gt(0), Ne(1), Ne(2)); 1938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(3)); 1939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(2)); 1940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(1)); 1941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(0)); 1942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 1944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(4)); 1945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(3)); 1946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(2)); 1947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(1)); 1948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(0)); 1949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 1951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(0)); 1952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(1)); 1953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(3)); 195446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 195546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // The following tests for varying number of sub-matchers. Due to the way 195646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // the sub-matchers are handled it is enough to test every sub-matcher once 195746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // with sub-matchers using the same matcher type. Varying matcher types are 195846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // checked for above. 195946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(2, AllOf(Ne(1), Ne(2))); 196046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3))); 196146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4))); 196246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5))); 196346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6))); 196446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7))); 196546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), 196646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Ne(8))); 196746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), 196846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Ne(8), Ne(9))); 196946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), 197046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Ne(9), Ne(10))); 1971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 1972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that AllOf(m1, ..., mn) describes itself properly. 1974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllOfTest, CanDescribeSelf) { 1975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m; 1976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Le(2), Ge(1)); 197746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m)); 1978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Gt(0), Ne(1), Ne(2)); 198046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(is > 0) and " 198146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 1) and " 198246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't equal to 2))", 1983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 1984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 198746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((is > 0) and " 198846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't equal to 1)) and " 198946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 2) and " 199046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't equal to 3))", 1991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 1992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 199546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((is >= 0) and " 199646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is < 10)) and " 199746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 3) and " 199846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 5) and " 199946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't equal to 7)))", 200046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Describe(m)); 200146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 200246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 200346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that AllOf(m1, ..., mn) describes its negation properly. 200446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AllOfTest, CanDescribeNegation) { 200546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> m; 200646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(Le(2), Ge(1)); 200746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(isn't <= 2) or " 200846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't >= 1)", 200946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 201046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 201146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(Gt(0), Ne(1), Ne(2)); 201246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(isn't > 0) or " 201346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((is equal to 1) or " 201446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is equal to 2))", 201546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 201646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 201746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 201846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 201946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((isn't > 0) or " 202046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is equal to 1)) or " 202146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((is equal to 2) or " 202246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is equal to 3))", 202346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 202446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 202546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 202646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 202746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((isn't >= 0) or " 202846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't < 10)) or " 202946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((is equal to 3) or " 203046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((is equal to 5) or " 203146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is equal to 7)))", 203246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 2033dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2034dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that monomorphic matchers are safely cast by the AllOf matcher. 2036dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) { 2037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // greater_than_5 and less_than_10 are monomorphic matchers. 2038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> greater_than_5 = Gt(5); 2039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> less_than_10 = Lt(10); 2040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m = AllOf(greater_than_5, less_than_10); 2042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = AllOf(greater_than_5, less_than_10); 2043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m3 = AllOf(greater_than_5, m2); 2044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests that BothOf works when composing itself. 2046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10); 2047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10); 2048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 205046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AllOfTest, ExplainsResult) { 205146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> m; 205246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 205346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Successful match. Both matchers need to explain. The second 205446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // matcher doesn't give an explanation, so only the first matcher's 205546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explanation is printed. 205646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(GreaterThan(10), Lt(30)); 205746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 15 more than 10", Explain(m, 25)); 205846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 205946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Successful match. Both matchers need to explain. 206046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(GreaterThan(10), GreaterThan(20)); 206146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20", 206246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, 30)); 206346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 206446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Successful match. All matchers need to explain. The second 206546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // matcher doesn't given an explanation. 206646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20)); 206746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20", 206846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, 25)); 206946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 207046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Successful match. All matchers need to explain. 207146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30)); 207246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, " 207346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "and which is 10 more than 30", 207446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, 40)); 207546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 207646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Failed match. The first matcher, which failed, needs to 207746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explain. 207846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(GreaterThan(10), GreaterThan(20)); 207946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 less than 10", Explain(m, 5)); 208046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 208146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Failed match. The second matcher, which failed, needs to 208246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explain. Since it doesn't given an explanation, nothing is 208346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // printed. 208446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(GreaterThan(10), Lt(30)); 208546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(m, 40)); 208646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 208746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Failed match. The second matcher, which failed, needs to 208846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explain. 208946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AllOf(GreaterThan(10), GreaterThan(20)); 209046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 less than 20", Explain(m, 15)); 209146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 209246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 209346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Helper to allow easy testing of AnyOf matchers with num parameters. 209446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanvoid AnyOfMatches(int num, const Matcher<int>& m) { 209546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan SCOPED_TRACE(Describe(m)); 209646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(0)); 209746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan for (int i = 1; i <= num; ++i) { 209846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(i)); 209946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 210046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(num + 1)); 210146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 210246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that AnyOf(m1, ..., mn) matches any value that matches at 2104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// least one of the given matchers. 2105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AnyOfTest, MatchesWhenAnyMatches) { 2106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m; 2107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Le(1), Ge(3)); 2108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(1)); 2109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(4)); 2110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(2)); 2111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Lt(0), Eq(1), Eq(2)); 2113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(-1)); 2114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(1)); 2115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(2)); 2116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(0)); 2117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 2119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(-1)); 2120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(1)); 2121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(2)); 2122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(3)); 2123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(0)); 2124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Le(0), Gt(10), 3, 5, 7); 2126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(0)); 2127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(11)); 2128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(3)); 2129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(2)); 213046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 213146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // The following tests for varying number of sub-matchers. Due to the way 213246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // the sub-matchers are handled it is enough to test every sub-matcher once 213346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // with sub-matchers using the same matcher type. Varying matcher types are 213446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // checked for above. 213546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(2, AnyOf(1, 2)); 213646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(3, AnyOf(1, 2, 3)); 213746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(4, AnyOf(1, 2, 3, 4)); 213846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5)); 213946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6)); 214046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7)); 214146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8)); 214246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9)); 214346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); 2144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that AnyOf(m1, ..., mn) describes itself properly. 2147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AnyOfTest, CanDescribeSelf) { 2148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m; 2149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Le(1), Ge(3)); 215046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(is <= 1) or (is >= 3)", 2151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 2152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Lt(0), Eq(1), Eq(2)); 215446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(is < 0) or " 2155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "((is equal to 1) or (is equal to 2))", 2156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 2157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 215946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((is < 0) or " 216046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is equal to 1)) or " 2161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "((is equal to 2) or " 216246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is equal to 3))", 2163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 2164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = AnyOf(Le(0), Gt(10), 3, 5, 7); 216646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((is <= 0) or " 216746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is > 10)) or " 2168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "((is equal to 3) or " 2169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "((is equal to 5) or " 217046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(is equal to 7)))", 2171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 2172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 217446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that AnyOf(m1, ..., mn) describes its negation properly. 217546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AnyOfTest, CanDescribeNegation) { 217646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> m; 217746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(Le(1), Ge(3)); 217846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(isn't <= 1) and (isn't >= 3)", 217946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 218046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 218146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(Lt(0), Eq(1), Eq(2)); 218246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(isn't < 0) and " 218346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 1) and (isn't equal to 2))", 218446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 218546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 218646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 218746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((isn't < 0) and " 218846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't equal to 1)) and " 218946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 2) and " 219046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't equal to 3))", 219146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 219246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 219346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(Le(0), Gt(10), 3, 5, 7); 219446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("((isn't <= 0) and " 219546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't > 10)) and " 219646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 3) and " 219746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "((isn't equal to 5) and " 219846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "(isn't equal to 7)))", 219946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 220046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 220146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that monomorphic matchers are safely cast by the AnyOf matcher. 2203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) { 2204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // greater_than_5 and less_than_10 are monomorphic matchers. 2205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> greater_than_5 = Gt(5); 2206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> less_than_10 = Lt(10); 2207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m = AnyOf(greater_than_5, less_than_10); 2209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10); 2210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m3 = AnyOf(greater_than_5, m2); 2211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests that EitherOf works when composing itself. 2213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10); 2214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10); 2215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 221746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AnyOfTest, ExplainsResult) { 221846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> m; 221946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 222046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Failed match. Both matchers need to explain. The second 222146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // matcher doesn't give an explanation, so only the first matcher's 222246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explanation is printed. 222346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(GreaterThan(10), Lt(0)); 222446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 less than 10", Explain(m, 5)); 222546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 222646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Failed match. Both matchers need to explain. 222746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(GreaterThan(10), GreaterThan(20)); 222846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20", 222946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, 5)); 223046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 223146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Failed match. All matchers need to explain. The second 223246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // matcher doesn't given an explanation. 223346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30)); 223446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30", 223546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, 5)); 223646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 223746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Failed match. All matchers need to explain. 223846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30)); 223946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, " 224046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "and which is 25 less than 30", 224146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, 5)); 224246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 224346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Successful match. The first matcher, which succeeded, needs to 224446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explain. 224546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(GreaterThan(10), GreaterThan(20)); 224646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 more than 10", Explain(m, 15)); 224746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 224846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Successful match. The second matcher, which succeeded, needs to 224946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explain. Since it doesn't given an explanation, nothing is 225046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // printed. 225146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(GreaterThan(10), Lt(30)); 225246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(m, 0)); 225346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 225446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Successful match. The second matcher, which succeeded, needs to 225546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explain. 225646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = AnyOf(GreaterThan(30), GreaterThan(20)); 225746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 5 more than 20", Explain(m, 25)); 225846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 225946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The following predicate function and predicate functor are for 2261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// testing the Truly(predicate) matcher. 2262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns non-zero if the input is positive. Note that the return 2264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// type of this function is not bool. It's OK as Truly() accepts any 2265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// unary function or functor whose return type can be implicitly 2266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// converted to bool. 2267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterint IsPositive(double x) { 2268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return x > 0 ? 1 : 0; 2269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This functor returns true if the input is greater than the given 2272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// number. 2273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass IsGreaterThan { 2274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 2275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter explicit IsGreaterThan(int threshold) : threshold_(threshold) {} 2276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool operator()(int n) const { return n > threshold_; } 227846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 228046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int threshold_; 2281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 2282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For testing Truly(). 2284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterconst int foo = 0; 2285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This predicate returns true iff the argument references foo and has 2287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a zero value. 2288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterbool ReferencesFooAndIsZero(const int& n) { 2289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return (&n == &foo) && (n == 0); 2290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Truly(predicate) matches what satisfies the given 2293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// predicate. 2294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TrulyTest, MatchesWhatSatisfiesThePredicate) { 2295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m = Truly(IsPositive); 2296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(2.0)); 2297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(-1.5)); 2298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Truly(predicate_functor) works too. 2301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TrulyTest, CanBeUsedWithFunctor) { 2302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> m = Truly(IsGreaterThan(5)); 2303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(6)); 2304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(4)); 2305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 230746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A class that can be implicitly converted to bool. 230846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass ConvertibleToBool { 230946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 231046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit ConvertibleToBool(int number) : number_(number) {} 231146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan operator bool() const { return number_ != 0; } 231246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 231346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 231446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int number_; 231546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 231646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 231746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanConvertibleToBool IsNotZero(int number) { 231846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return ConvertibleToBool(number); 231946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 232046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 232146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that the predicate used in Truly() may return a class that's 232246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// implicitly convertible to bool, even when the class has no 232346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// operator!(). 232446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) { 232546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<int> m = Truly(IsNotZero); 232646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(1)); 232746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(0)); 232846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 232946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Truly(predicate) can describe itself properly. 2331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TrulyTest, CanDescribeSelf) { 2332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m = Truly(IsPositive); 2333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("satisfies the given predicate", 2334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Describe(m)); 2335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Truly(predicate) works when the matcher takes its 2338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// argument by reference. 2339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(TrulyTest, WorksForByRefArguments) { 2340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> m = Truly(ReferencesFooAndIsZero); 2341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(foo)); 2342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 0; 2343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(n)); 2344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Matches(m) is a predicate satisfied by whatever that 2347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// matches matcher m. 2348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) { 2349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(Matches(Ge(0))(1)); 2350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(Matches(Eq('a'))('b')); 2351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Matches(m) works when the matcher takes its argument by 2354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// reference. 2355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatchesTest, WorksOnByRefArguments) { 2356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int m = 0, n = 0; 2357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n)); 2358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(Matches(Ref(m))(n)); 2359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a Matcher on non-reference type can be used in 2362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Matches(). 2363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatchesTest, WorksWithMatcherOnNonRefType) { 2364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> eq5 = Eq(5); 2365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(Matches(eq5)(5)); 2366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(Matches(eq5)(2)); 2367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests Value(value, matcher). Since Value() is a simple wrapper for 2370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Matches(), which has been tested already, we don't spend a lot of 2371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// effort on testing Value(). 2372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ValueTest, WorksWithPolymorphicMatcher) { 2373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(Value("hi", StartsWith("h"))); 2374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(Value(5, Gt(10))); 2375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ValueTest, WorksWithMonomorphicMatcher) { 2378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int> is_zero = Eq(0); 2379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(Value(0, is_zero)); 2380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(Value('a', is_zero)); 2381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 0; 2383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const int&> ref_n = Ref(n); 2384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(Value(n, ref_n)); 2385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(Value(1, ref_n)); 2386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 238846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) { 238946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener1; 239046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1)); 239146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("% 2 == 0", listener1.str()); 239246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 239346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener2; 239446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2)); 239546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", listener2.str()); 239646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 239746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 239846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) { 239946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<int> is_even = PolymorphicIsEven(); 240046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener1; 240146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1)); 240246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("% 2 == 0", listener1.str()); 240346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 240446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const double&> is_zero = Eq(0); 240546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan StringMatchResultListener listener2; 240646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2)); 240746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", listener2.str()); 240846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 240946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 241046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanMATCHER_P(Really, inner_matcher, "") { 241146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return ExplainMatchResult(inner_matcher, arg, result_listener); 241246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 241346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 241446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExplainMatchResultTest, WorksInsideMATCHER) { 241546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(0, Really(Eq(0))); 241646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 241746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllArgsTest, WorksForTuple) { 2419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt())); 2420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt()))); 2421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllArgsTest, WorksForNonTuple) { 2424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(42, AllArgs(Gt(0))); 2425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT('a', Not(AllArgs(Eq('b')))); 2426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass AllArgsHelper { 2429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 243046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AllArgsHelper() {} 243146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter MOCK_METHOD2(Helper, int(char x, int y)); 243346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 243446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 243546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper); 2436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 2437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllArgsTest, WorksInWithClause) { 2439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AllArgsHelper helper; 2440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ON_CALL(helper, Helper(_, _)) 2441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter .With(AllArgs(Lt())) 2442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter .WillByDefault(Return(1)); 2443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_CALL(helper, Helper(_, _)); 2444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_CALL(helper, Helper(_, _)) 2445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter .With(AllArgs(Gt())) 2446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter .WillOnce(Return(2)); 2447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(1, helper.Helper('\1', 2)); 2449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(2, helper.Helper('a', 1)); 2450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 2453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// matches the matcher. 2454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) { 2455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ASSERT_THAT(5, Ge(2)) << "This should succeed."; 2456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ASSERT_THAT("Foo", EndsWith("oo")); 2457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too."; 2458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT("Hello", StartsWith("Hell")); 2459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 2462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// doesn't match the matcher. 2463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) { 2464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(), 2465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // which cannot reference auto variables. 246646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static unsigned short n; // NOLINT 2467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = 5; 246846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 246946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // VC++ prior to version 8.0 SP1 has a bug where it will not see any 247046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // functions declared in the namespace scope from within nested classes. 247146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all 247246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // namespace-level functions invoked inside them need to be explicitly 247346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // resolved. 247446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)), 2475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "Value of: n\n" 247646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Expected: is > 10\n" 247746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: 5" + OfType("unsigned short")); 2478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = 0; 247946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_NONFATAL_FAILURE( 248046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))), 248146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Value of: n\n" 248246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Expected: (is <= 7) and (is >= 5)\n" 248346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: 0" + OfType("unsigned short")); 2484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument 2487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// has a reference type. 2488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherAssertionTest, WorksForByRefArguments) { 2489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // We use a static variable here as EXPECT_FATAL_FAILURE() cannot 2490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // reference auto variables. 2491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static int n; 2492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = 0; 2493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(n, AllOf(Le(7), Ref(n))); 249446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 2495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "Value of: n\n" 2496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "Expected: does not reference the variable @"); 2497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests the "Actual" part. 249846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 249946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Actual: 0" + OfType("int") + ", which is located @"); 2500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 250246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if !GTEST_OS_SYMBIAN 2503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is 2504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// monomorphic. 250546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 250646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's 250746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Symbian compiler: it tries to compile 250846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// template<T, U> class MatcherCastImpl { ... 250946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// virtual bool MatchAndExplain(T x, ...) const { 251046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// return source_matcher_.MatchAndExplain(static_cast<U>(x), ...); 251146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// with U == string and T == const char* 251246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... ) 251346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the compiler silently crashes with no output. 251446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x) 251546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the code compiles but the converted string is bogus. 2516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) { 2517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> starts_with_he = StartsWith("he"); 2518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ASSERT_THAT("hello", starts_with_he); 2519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> ends_with_ok = EndsWith("ok"); 2521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ASSERT_THAT("book", ends_with_ok); 252246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const string bad = "bad"; 252346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok), 252446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Value of: bad\n" 252546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Expected: ends with \"ok\"\n" 252646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: \"bad\""); 2527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> is_greater_than_5 = Gt(5); 2528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5), 2529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "Value of: 5\n" 253046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Expected: is > 5\n" 253146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: 5" + OfType("int")); 2532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 253346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif // !GTEST_OS_SYMBIAN 2534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests floating-point matchers. 2536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass FloatingPointTest : public testing::Test { 2538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected: 2539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef typename testing::internal::FloatingPoint<RawType> Floating; 2540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef typename Floating::Bits Bits; 2541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual void SetUp() { 2543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const size_t max_ulps = Floating::kMaxUlps; 2544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The bits that represent 0.0. 2546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Bits zero_bits = Floating(0).bits(); 2547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Makes some numbers close to 0.0. 2549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter close_to_positive_zero_ = Floating::ReinterpretBits(zero_bits + max_ulps/2); 2550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter close_to_negative_zero_ = -Floating::ReinterpretBits( 2551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter zero_bits + max_ulps - max_ulps/2); 2552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter further_from_negative_zero_ = -Floating::ReinterpretBits( 2553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter zero_bits + max_ulps + 1 - max_ulps/2); 2554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The bits that represent 1.0. 2556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Bits one_bits = Floating(1).bits(); 2557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Makes some numbers close to 1.0. 2559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter close_to_one_ = Floating::ReinterpretBits(one_bits + max_ulps); 2560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter further_from_one_ = Floating::ReinterpretBits(one_bits + max_ulps + 1); 2561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // +infinity. 2563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter infinity_ = Floating::Infinity(); 2564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The bits that represent +infinity. 2566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Bits infinity_bits = Floating(infinity_).bits(); 2567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Makes some numbers close to infinity. 2569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter close_to_infinity_ = Floating::ReinterpretBits(infinity_bits - max_ulps); 2570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter further_from_infinity_ = Floating::ReinterpretBits( 2571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter infinity_bits - max_ulps - 1); 2572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Makes some NAN's. 2574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter nan1_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 1); 2575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter nan2_ = Floating::ReinterpretBits(Floating::kExponentBitMask | 200); 2576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 2577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter void TestSize() { 2579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ(sizeof(RawType), sizeof(Bits)); 2580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 2581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // A battery of tests for FloatingEqMatcher::Matches. 2583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // matcher_maker is a pointer to a function which creates a FloatingEqMatcher. 2584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter void TestMatches( 2585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) { 2586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<RawType> m1 = matcher_maker(0.0); 2587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(-0.0)); 2588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(close_to_positive_zero_)); 2589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m1.Matches(close_to_negative_zero_)); 2590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m1.Matches(1.0)); 2591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_); 2593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m2.Matches(further_from_negative_zero_)); 2594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<RawType> m3 = matcher_maker(1.0); 2596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m3.Matches(close_to_one_)); 2597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(further_from_one_)); 2598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above. 2600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m3.Matches(0.0)); 2601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<RawType> m4 = matcher_maker(-infinity_); 2603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m4.Matches(-close_to_infinity_)); 2604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<RawType> m5 = matcher_maker(infinity_); 2606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m5.Matches(close_to_infinity_)); 2607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // This is interesting as the representations of infinity_ and nan1_ 2609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // are only 1 DLP apart. 2610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m5.Matches(nan1_)); 2611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // matcher_maker can produce a Matcher<const RawType&>, which is needed in 2613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // some cases. 2614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const RawType&> m6 = matcher_maker(0.0); 2615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m6.Matches(-0.0)); 2616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m6.Matches(close_to_positive_zero_)); 2617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m6.Matches(1.0)); 2618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // matcher_maker can produce a Matcher<RawType&>, which is needed in some 2620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // cases. 2621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<RawType&> m7 = matcher_maker(0.0); 2622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter RawType x = 0.0; 2623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m7.Matches(x)); 2624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter x = 0.01f; 2625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m7.Matches(x)); 2626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 2627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Pre-calculated numbers to be used by the tests. 2629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType close_to_positive_zero_; 2631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType close_to_negative_zero_; 2632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType further_from_negative_zero_; 2633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType close_to_one_; 2635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType further_from_one_; 2636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType infinity_; 2638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType close_to_infinity_; 2639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType further_from_infinity_; 2640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType nan1_; 2642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType nan2_; 2643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 2644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::close_to_positive_zero_; 2647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::close_to_negative_zero_; 2650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::further_from_negative_zero_; 2653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::close_to_one_; 2656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::further_from_one_; 2659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::infinity_; 2662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::close_to_infinity_; 2665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::further_from_infinity_; 2668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::nan1_; 2671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 2673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterRawType FloatingPointTest<RawType>::nan2_; 2674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Instantiate FloatingPointTest for testing floats. 2676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef FloatingPointTest<float> FloatTest; 2677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) { 2679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestMatches(&FloatEq); 2680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) { 2683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestMatches(&NanSensitiveFloatEq); 2684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(FloatTest, FloatEqCannotMatchNaN) { 2687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // FloatEq never matches NaN. 2688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m = FloatEq(nan1_); 2689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(nan1_)); 2690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(nan2_)); 2691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(1.0)); 2692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) { 2695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // NanSensitiveFloatEq will match NaN. 2696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m = NanSensitiveFloatEq(nan1_); 2697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(nan1_)); 2698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(nan2_)); 2699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(1.0)); 2700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(FloatTest, FloatEqCanDescribeSelf) { 2703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m1 = FloatEq(2.0f); 2704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 2", Describe(m1)); 270546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 2706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m2 = FloatEq(0.5f); 2708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 0.5", Describe(m2)); 270946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 2710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m3 = FloatEq(nan1_); 2712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("never matches", Describe(m3)); 2713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is anything", DescribeNegation(m3)); 2714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) { 2717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m1 = NanSensitiveFloatEq(2.0f); 2718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 2", Describe(m1)); 271946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 2720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m2 = NanSensitiveFloatEq(0.5f); 2722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 0.5", Describe(m2)); 272346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 2724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<float> m3 = NanSensitiveFloatEq(nan1_); 2726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is NaN", Describe(m3)); 272746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 2728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Instantiate FloatingPointTest for testing doubles. 2731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef FloatingPointTest<double> DoubleTest; 2732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) { 2734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestMatches(&DoubleEq); 2735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) { 2738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestMatches(&NanSensitiveDoubleEq); 2739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DoubleTest, DoubleEqCannotMatchNaN) { 2742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // DoubleEq never matches NaN. 2743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m = DoubleEq(nan1_); 2744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(nan1_)); 2745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(nan2_)); 2746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(1.0)); 2747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) { 2750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // NanSensitiveDoubleEq will match NaN. 2751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m = NanSensitiveDoubleEq(nan1_); 2752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(nan1_)); 2753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(nan2_)); 2754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(1.0)); 2755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DoubleTest, DoubleEqCanDescribeSelf) { 2758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m1 = DoubleEq(2.0); 2759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 2", Describe(m1)); 276046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 2761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m2 = DoubleEq(0.5); 2763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 0.5", Describe(m2)); 276446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 2765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m3 = DoubleEq(nan1_); 2767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("never matches", Describe(m3)); 2768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is anything", DescribeNegation(m3)); 2769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) { 2772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m1 = NanSensitiveDoubleEq(2.0); 2773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 2", Describe(m1)); 277446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 2775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m2 = NanSensitiveDoubleEq(0.5); 2777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is approximately 0.5", Describe(m2)); 277846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 2779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double> m3 = NanSensitiveDoubleEq(nan1_); 2781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("is NaN", Describe(m3)); 278246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 2783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, RawPointer) { 2786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int*> m = Pointee(Ge(0)); 2787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 1; 2789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&n)); 2790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = -1; 2791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&n)); 2792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 2793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, RawPointerToConst) { 2796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const double*> m = Pointee(Ge(0)); 2797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter double x = 1; 2799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&x)); 2800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter x = -1; 2801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&x)); 2802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 2803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, ReferenceToConstRawPointer) { 2806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int* const &> m = Pointee(Ge(0)); 2807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 1; 2809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&n)); 2810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = -1; 2811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&n)); 2812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 2813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, ReferenceToNonConstRawPointer) { 2816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<double* &> m = Pointee(Ge(0)); 2817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter double x = 1.0; 2819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter double* p = &x; 2820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(p)); 2821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter x = -1; 2822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(p)); 2823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter p = NULL; 2824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(p)); 2825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 282746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Minimal const-propagating pointer. 282846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 282946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass ConstPropagatingPtr { 283046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 283146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typedef T element_type; 283246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 283346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ConstPropagatingPtr() : val_() {} 283446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit ConstPropagatingPtr(T* t) : val_(t) {} 283546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {} 283646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 283746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan T* get() { return val_; } 283846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan T& operator*() { return *val_; } 283946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Most smart pointers return non-const T* and T& from the next methods. 284046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const T* get() const { return val_; } 284146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const T& operator*() const { return *val_; } 284246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 284346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 284446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan T* val_; 284546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 284646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 284746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointeeTest, WorksWithConstPropagatingPointers) { 284846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5)); 284946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int three = 3; 285046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const ConstPropagatingPtr<int> co(&three); 285146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ConstPropagatingPtr<int> o(&three); 285246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(o)); 285346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(co)); 285446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *o = 6; 285546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(o)); 285646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>())); 285746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 285846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 2859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, NeverMatchesNull) { 2860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const char*> m = Pointee(_); 2861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 2862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can write Pointee(value) instead of Pointee(Eq(value)). 2865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, MatchesAgainstAValue) { 2866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int*> m = Pointee(5); 2867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n = 5; 2869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&n)); 2870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter n = -1; 2871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&n)); 2872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 2873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2875dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, CanDescribeSelf) { 2876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int*> m = Pointee(Gt(3)); 287746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("points to a value that is > 3", Describe(m)); 287846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("does not point to a value that is > 3", 2879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DescribeNegation(m)); 2880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PointeeTest, CanExplainMatchResult) { 2883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const string*> m = Pointee(StartsWith("Hi")); 2884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL))); 2886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 288746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<long*> m2 = Pointee(GreaterThan(1)); // NOLINT 288846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan long n = 3; // NOLINT 288946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1", 289046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m2, &n)); 289146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 289246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 289346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointeeTest, AlwaysExplainsPointee) { 289446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<int*> m = Pointee(0); 289546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int n = 42; 289646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n)); 2897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// An uncopyable class. 2900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Uncopyable { 2901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 290246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit Uncopyable(int a_value) : value_(a_value) {} 2903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int value() const { return value_; } 2905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 2906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int value_; 2907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable); 2908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 2909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns true iff x.value() is positive. 2911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterbool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; } 2912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A user-defined struct for testing Field(). 2914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct AStruct { 2915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct() : x(0), y(1.0), z(5), p(NULL) {} 2916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct(const AStruct& rhs) 2917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {} 2918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int x; // A non-const field. 2920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const double y; // A const field. 2921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Uncopyable z; // An uncopyable field. 2922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* p; // A pointer field. 292346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 292446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 292546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_DISALLOW_ASSIGN_(AStruct); 2926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 2927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A derived struct for testing Field(). 2929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct DerivedStruct : public AStruct { 2930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter char ch; 293146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 293246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 293346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_DISALLOW_ASSIGN_(DerivedStruct); 2934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 2935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field(&Foo::field, ...) works when field is non-const. 2937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, WorksForNonConstField) { 2938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<AStruct> m = Field(&AStruct::x, Ge(0)); 2939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 2941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 2942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.x = -1; 2943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 2944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field(&Foo::field, ...) works when field is const. 2947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, WorksForConstField) { 2948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 2949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0)); 2951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 2952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Field(&AStruct::y, Le(0.0)); 2953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 2954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field(&Foo::field, ...) works when field is not copyable. 2957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, WorksForUncopyableField) { 2958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 2959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive)); 2961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 2962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Field(&AStruct::z, Not(Truly(ValueIsPositive))); 2963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 2964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field(&Foo::field, ...) works when field is a pointer. 2967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, WorksForPointerField) { 2968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Matching against NULL. 2969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL)); 2970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 2971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 2972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.p = "hi"; 2973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 2974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Matching a pointer that is not NULL. 2976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Field(&AStruct::p, StartsWith("hi")); 2977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.p = "hill"; 2978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 2979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.p = "hole"; 2980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 2981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() works when the object is passed by reference. 2984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, WorksForByRefArgument) { 2985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 2986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 2988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 2989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.x = -1; 2990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 2991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 2992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 2993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field(&Foo::field, ...) works when the argument's type 2994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is a sub-type of Foo. 2995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, WorksForArgumentOfSubType) { 2996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Note that the matcher expects DerivedStruct but we say AStruct 2997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // inside Field(). 2998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0)); 2999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DerivedStruct d; 3001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(d)); 3002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter d.x = -1; 3003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(d)); 3004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field(&Foo::field, m) works when field's type and m's 3007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// argument type are compatible but not the same. 3008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, WorksForCompatibleMatcherType) { 3009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The field is an int, but the inner matcher expects a signed char. 3010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct&> m = Field(&AStruct::x, 3011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<signed char>(Ge(0))); 3012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 3014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 3015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.x = -1; 3016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 3017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() can describe itself. 3020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, CanDescribeSelf) { 3021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 3022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 302346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 302446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 3025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() can explain the match result. 3028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldTest, CanExplainMatchResult) { 3029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 3030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 3032dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.x = 1; 303346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a)); 3034dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Field(&AStruct::x, GreaterThan(0)); 303646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ( 303746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "whose given field is 1" + OfType("int") + ", which is 1 more than 0", 303846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, a)); 3039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() works when the argument is a pointer to const. 3042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldForPointerTest, WorksForPointerToConst) { 3043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 3044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 3046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&a)); 3047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.x = -1; 3048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&a)); 3049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() works when the argument is a pointer to non-const. 3052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldForPointerTest, WorksForPointerToNonConst) { 3053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<AStruct*> m = Field(&AStruct::x, Ge(0)); 3054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 3056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&a)); 3057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.x = -1; 3058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&a)); 3059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 306146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that Field() works when the argument is a reference to a const pointer. 306246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(FieldForPointerTest, WorksForReferenceToConstPointer) { 306346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0)); 306446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 306546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AStruct a; 306646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(&a)); 306746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan a.x = -1; 306846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(&a)); 306946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 307046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 3071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() does not match the NULL pointer. 3072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldForPointerTest, DoesNotMatchNull) { 3073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct*> m = Field(&AStruct::x, _); 3074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 3075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field(&Foo::field, ...) works when the argument's type 3078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is a sub-type of const Foo*. 3079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldForPointerTest, WorksForArgumentOfSubType) { 3080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Note that the matcher expects DerivedStruct but we say AStruct 3081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // inside Field(). 3082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0)); 3083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DerivedStruct d; 3085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&d)); 3086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter d.x = -1; 3087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&d)); 3088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() can describe itself when used to match a pointer. 3091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldForPointerTest, CanDescribeSelf) { 3092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 3093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 309446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 309546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 3096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Field() can explain the result of matching a pointer. 3099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FieldForPointerTest, CanExplainMatchResult) { 3100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 3101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AStruct a; 3103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.x = 1; 3104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL))); 310546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"), 310646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, &a)); 3107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Field(&AStruct::x, GreaterThan(0)); 310946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") + 311046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ", which is 1 more than 0", Explain(m, &a)); 3111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A user-defined class for testing Property(). 3114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass AClass { 3115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 3116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass() : n_(0) {} 3117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // A getter that returns a non-reference. 3119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n() const { return n_; } 3120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter void set_n(int new_n) { n_ = new_n; } 3122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // A getter that returns a reference to const. 3124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const string& s() const { return s_; } 3125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter void set_s(const string& new_s) { s_ = new_s; } 3127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // A getter that returns a reference to non-const. 3129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter double& x() const { return x_; } 3130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 3131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int n_; 3132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter string s_; 3133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static double x_; 3135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 3136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterdouble AClass::x_ = 0.0; 3138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A derived class for testing Property(). 3140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass DerivedClass : public AClass { 3141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 3142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int k_; 3143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 3144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property(&Foo::property, ...) works when property() 3146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns a non-reference. 3147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, WorksForNonReferenceProperty) { 3148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 3149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_n(1); 3152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 3153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_n(-1); 3155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 3156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property(&Foo::property, ...) works when property() 3159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns a reference to const. 3160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, WorksForReferenceToConstProperty) { 3161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi")); 3162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_s("hill"); 3165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 3166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_s("hole"); 3168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 3169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property(&Foo::property, ...) works when property() 3172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns a reference to non-const. 3173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, WorksForReferenceToNonConstProperty) { 3174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter double x = 0.0; 3175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass&> m = Property(&AClass::x, Ref(x)); 3178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 3179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Property(&AClass::x, Not(Ref(x))); 3181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 3182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property(&Foo::property, ...) works when the argument is 3185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// passed by value. 3186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, WorksForByValueArgument) { 3187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<AClass> m = Property(&AClass::s, StartsWith("hi")); 3188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_s("hill"); 3191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 3192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_s("hole"); 3194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 3195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property(&Foo::property, ...) works when the argument's 3198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// type is a sub-type of Foo. 3199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, WorksForArgumentOfSubType) { 3200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The matcher expects a DerivedClass, but inside the Property() we 3201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // say AClass. 3202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0)); 3203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DerivedClass d; 3205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter d.set_n(1); 3206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(d)); 3207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter d.set_n(-1); 3209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(d)); 3210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property(&Foo::property, m) works when property()'s type 3213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and m's argument type are compatible but different. 3214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, WorksForCompatibleMatcherType) { 3215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // n() returns an int but the inner matcher expects a signed char. 3216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass&> m = Property(&AClass::n, 3217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<signed char>(Ge(0))); 3218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(a)); 3221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_n(-1); 3222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(a)); 3223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property() can describe itself. 3226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, CanDescribeSelf) { 3227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 3228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 322946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 323046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given property isn't >= 0", 3231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DescribeNegation(m)); 3232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property() can explain the match result. 3235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyTest, CanExplainMatchResult) { 3236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 3237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_n(1); 324046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a)); 3241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Property(&AClass::n, GreaterThan(0)); 324346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ( 324446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "whose given property is 1" + OfType("int") + ", which is 1 more than 0", 324546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, a)); 3246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property() works when the argument is a pointer to const. 3249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyForPointerTest, WorksForPointerToConst) { 3250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 3251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_n(1); 3254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&a)); 3255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_n(-1); 3257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&a)); 3258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property() works when the argument is a pointer to non-const. 3261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyForPointerTest, WorksForPointerToNonConst) { 3262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi")); 3263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_s("hill"); 3266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&a)); 3267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_s("hole"); 3269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&a)); 3270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 327246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that Property() works when the argument is a reference to a 327346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// const pointer. 327446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PropertyForPointerTest, WorksForReferenceToConstPointer) { 327546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi")); 327646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 327746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan AClass a; 327846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan a.set_s("hill"); 327946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(m.Matches(&a)); 328046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 328146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan a.set_s("hole"); 328246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(m.Matches(&a)); 328346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 328446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 3285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property() does not match the NULL pointer. 3286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) { 3287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass*> m = Property(&AClass::x, _); 3288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(NULL)); 3289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property(&Foo::property, ...) works when the argument's 3292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// type is a sub-type of const Foo*. 3293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyForPointerTest, WorksForArgumentOfSubType) { 3294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The matcher expects a DerivedClass, but inside the Property() we 3295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // say AClass. 3296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0)); 3297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DerivedClass d; 3299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter d.set_n(1); 3300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(&d)); 3301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter d.set_n(-1); 3303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(&d)); 3304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property() can describe itself when used to match a pointer. 3307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyForPointerTest, CanDescribeSelf) { 3308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 3309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 331046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 331146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is an object whose given property isn't >= 0", 3312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter DescribeNegation(m)); 3313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Property() can explain the result of matching a pointer. 3316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(PropertyForPointerTest, CanExplainMatchResult) { 3317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 3318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter AClass a; 3320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a.set_n(1); 3321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL))); 332246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ( 332346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "which points to an object whose given property is 1" + OfType("int"), 332446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, &a)); 3325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter m = Property(&AClass::n, GreaterThan(0)); 332746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which points to an object whose given property is 1" + 332846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan OfType("int") + ", which is 1 more than 0", 332946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, &a)); 3330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests ResultOf. 3333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// function pointer. 3336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstring IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; } 3337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForFunctionPointers) { 3339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo"))); 3340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher.Matches(1)); 3342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher.Matches(2)); 3343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf() can describe itself. 3346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, CanDescribeItself) { 3347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo")); 3348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 334946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is mapped by the given callable to a value that " 335046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "is equal to \"foo\"", Describe(matcher)); 335146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is mapped by the given callable to a value that " 335246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "isn't equal to \"foo\"", DescribeNegation(matcher)); 3353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf() can explain the match result. 3356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterint IntFunction(int input) { return input == 42 ? 80 : 90; } 3357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, CanExplainMatchResult) { 3359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher = ResultOf(&IntFunction, Ge(85)); 336046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"), 336146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(matcher, 36)); 3362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter matcher = ResultOf(&IntFunction, GreaterThan(85)); 336446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") + 336546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ", which is 5 more than 85", Explain(matcher, 36)); 3366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 3369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns a non-reference. 3370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForNonReferenceResults) { 3371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher = ResultOf(&IntFunction, Eq(80)); 3372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher.Matches(42)); 3374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher.Matches(36)); 3375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 3378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns a reference to non-const. 337946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chandouble& DoubleFunction(double& input) { return input; } // NOLINT 3380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 338146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanUncopyable& RefUncopyableFunction(Uncopyable& obj) { // NOLINT 3382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return obj; 3383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForReferenceToNonConstResults) { 3386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter double x = 3.14; 3387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter double x2 = x; 3388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x)); 3389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher.Matches(x)); 3391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher.Matches(x2)); 3392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Test that ResultOf works with uncopyable objects 3394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Uncopyable obj(0); 3395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Uncopyable obj2(0); 3396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<Uncopyable&> matcher2 = 3397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ResultOf(&RefUncopyableFunction, Ref(obj)); 3398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher2.Matches(obj)); 3400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher2.Matches(obj2)); 3401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 3404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns a reference to const. 3405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterconst string& StringFunction(const string& input) { return input; } 3406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForReferenceToConstResults) { 3408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter string s = "foo"; 3409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter string s2 = s; 3410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s)); 3411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher.Matches(s)); 3413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher.Matches(s2)); 3414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, m) works when f(x) and m's 3417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// argument types are compatible but different. 3418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForCompatibleMatcherTypes) { 3419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // IntFunction() returns int but the inner matcher expects a signed char. 3420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85))); 3421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher.Matches(36)); 3423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher.Matches(42)); 3424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the program aborts when ResultOf is passed 3427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a NULL function pointer. 3428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) { 342946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_DEATH_IF_SUPPORTED( 343046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ResultOf(static_cast<string(*)(int dummy)>(NULL), Eq(string("foo"))), 3431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "NULL function pointer is passed into ResultOf\\(\\)\\."); 3432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// function reference. 3436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForFunctionReferences) { 3437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo")); 3438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher.Matches(1)); 3439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher.Matches(2)); 3440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// function object. 3444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct Functor : public ::std::unary_function<int, string> { 3445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter result_type operator()(argument_type input) const { 3446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return IntToStringFunction(input); 3447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 3448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 3449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForFunctors) { 3451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo"))); 3452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher.Matches(1)); 3454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher.Matches(2)); 3455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ResultOf(f, ...) compiles and works as expected when f is a 3458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// functor with more then one operator() defined. ResultOf() must work 3459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// for each defined operator(). 3460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct PolymorphicFunctor { 3461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef int result_type; 3462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int operator()(int n) { return n; } 3463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int operator()(const char* s) { return static_cast<int>(strlen(s)); } 3464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 3465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForPolymorphicFunctors) { 3467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5)); 3468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher_int.Matches(10)); 3470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher_int.Matches(2)); 3471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5)); 3473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher_string.Matches("long string")); 3475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher_string.Matches("shrt")); 3476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterconst int* ReferencingFunction(const int& n) { return &n; } 3479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct ReferencingFunctor { 3481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef const int* result_type; 3482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter result_type operator()(const int& n) { return &n; } 3483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 3484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ResultOfTest, WorksForReferencingCallables) { 3486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int n = 1; 3487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int n2 = 1; 3488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n)); 3489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher2.Matches(n)); 3490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher2.Matches(n2)); 3491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n)); 3493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(matcher3.Matches(n)); 3494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(matcher3.Matches(n2)); 3495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass DivisibleByImpl { 3498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 349946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {} 3500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 350146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // For testing using ExplainMatchResultTo() with polymorphic matchers. 3502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter template <typename T> 350346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan bool MatchAndExplain(const T& n, MatchResultListener* listener) const { 350446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "which is " << (n % divider_) << " modulo " 350546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan << divider_; 3506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return (n % divider_) == 0; 3507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 3508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 350946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeTo(ostream* os) const { 3510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter *os << "is divisible by " << divider_; 3511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 3512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 351346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeNegationTo(ostream* os) const { 3514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter *os << "is not divisible by " << divider_; 3515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 3516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 351746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void set_divider(int a_divider) { divider_ = a_divider; } 3518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int divider() const { return divider_; } 351946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 3520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 352146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int divider_; 3522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 3523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) { 3525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return MakePolymorphicMatcher(DivisibleByImpl(n)); 3526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when AllOf() fails, only the first failing matcher is 3529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// asked to explain why. 3530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExplainMatchResultTest, AllOf_False_False) { 3531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 353246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 1 modulo 4", Explain(m, 5)); 3533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when AllOf() fails, only the first failing matcher is 3536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// asked to explain why. 3537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExplainMatchResultTest, AllOf_False_True) { 3538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 353946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 2 modulo 4", Explain(m, 6)); 3540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when AllOf() fails, only the first failing matcher is 3543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// asked to explain why. 3544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExplainMatchResultTest, AllOf_True_False) { 3545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3)); 354646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 2 modulo 3", Explain(m, 5)); 3547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when AllOf() succeeds, all matchers are asked to explain 3550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// why. 3551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExplainMatchResultTest, AllOf_True_True) { 3552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3)); 355346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6)); 3554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExplainMatchResultTest, AllOf_True_True_2) { 3557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int> m = AllOf(Ge(2), Le(3)); 3558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", Explain(m, 2)); 3559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExplainmatcherResultTest, MonomorphicMatcher) { 3562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<int> m = GreaterThan(5); 356346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is 1 more than 5", Explain(m, 6)); 3564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The following two tests verify that values without a public copy 3567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ctor can be used as arguments to matchers like Eq(), Ge(), and etc 3568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// with the help of ByRef(). 3569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass NotCopyable { 3571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 357246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit NotCopyable(int a_value) : value_(a_value) {} 3573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int value() const { return value_; } 3575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool operator==(const NotCopyable& rhs) const { 3577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return value() == rhs.value(); 3578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 3579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool operator>=(const NotCopyable& rhs) const { 3581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return value() >= rhs.value(); 3582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 3583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 3584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int value_; 3585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable); 3587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 3588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) { 3590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const NotCopyable const_value1(1); 3591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1)); 3592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const NotCopyable n1(1), n2(2); 3594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(n1)); 3595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(n2)); 3596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ByRefTest, AllowsNotCopyableValueInMatchers) { 3599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter NotCopyable value2(2); 3600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<NotCopyable&> m = Ge(ByRef(value2)); 3601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter NotCopyable n1(1), n2(2); 3603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(n1)); 3604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(n2)); 3605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 360746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_TYPED_TEST 3608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests ContainerEq with different container types, and 3609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// different element types. 3610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 3612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ContainerEqTest : public testing::Test {}; 3613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef testing::Types< 361546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan set<int>, 361646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<size_t>, 361746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan multiset<size_t>, 361846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<int> > 3619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ContainerEqTestTypes; 3620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes); 3622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the filled container is equal to itself. 3624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(ContainerEqTest, EqualsSelf) { 3625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam my_set(vals, vals + 6); 3627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<TypeParam> m = ContainerEq(my_set); 3628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(my_set)); 3629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", Explain(m, my_set)); 3630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that missing values are reported. 3633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(ContainerEqTest, ValueMissing) { 3634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {2, 1, 8, 5}; 3636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam my_set(vals, vals + 6); 3637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam test_set(test_vals, test_vals + 4); 3638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<TypeParam> m = ContainerEq(my_set); 3639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_set)); 364046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which doesn't have these expected elements: 3", 364146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, test_set)); 3642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that added values are reported. 3645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(ContainerEqTest, ValueAdded) { 3646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {1, 2, 3, 5, 8, 46}; 3648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam my_set(vals, vals + 6); 3649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam test_set(test_vals, test_vals + 6); 3650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const TypeParam&> m = ContainerEq(my_set); 3651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_set)); 365246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set)); 3653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that added and missing values are reported together. 3656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) { 3657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {1, 2, 3, 8, 46}; 3659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam my_set(vals, vals + 6); 3660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam test_set(test_vals, test_vals + 5); 3661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<TypeParam> m = ContainerEq(my_set); 3662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_set)); 366346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which has these unexpected elements: 46,\n" 366446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "and doesn't have these expected elements: 5", 366546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, test_set)); 3666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests duplicated value -- expect no explanation. 3669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTYPED_TEST(ContainerEqTest, DuplicateDifference) { 3670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {1, 2, 3, 5, 8}; 3672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam my_set(vals, vals + 6); 3673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParam test_set(test_vals, test_vals + 5); 3674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const TypeParam&> m = ContainerEq(my_set); 3675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Depending on the container, match may be true or false 3676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // But in any case there should be no explanation. 3677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", Explain(m, test_set)); 3678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 367946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif // GTEST_HAS_TYPED_TEST 3680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that mutliple missing values are reported. 3682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Using just vector here, so order is predicatble. 3683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, MultipleValuesMissing) { 3684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {2, 1, 5}; 368646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> my_set(vals, vals + 6); 368746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> test_set(test_vals, test_vals + 3); 368846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<vector<int> > m = ContainerEq(my_set); 3689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_set)); 369046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which doesn't have these expected elements: 3, 8", 369146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, test_set)); 3692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that added values are reported. 3695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Using just vector here, so order is predicatble. 3696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, MultipleValuesAdded) { 3697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46}; 369946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<size_t> my_set(vals, vals + 6); 370046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<size_t> test_set(test_vals, test_vals + 7); 370146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const list<size_t>&> m = ContainerEq(my_set); 3702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_set)); 370346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which has these unexpected elements: 92, 46", 370446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, test_set)); 3705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that added and missing values are reported together. 3708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) { 3709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {1, 2, 3, 92, 46}; 371146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<size_t> my_set(vals, vals + 6); 371246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<size_t> test_set(test_vals, test_vals + 5); 371346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const list<size_t> > m = ContainerEq(my_set); 3714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_set)); 371546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which has these unexpected elements: 92, 46,\n" 371646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "and doesn't have these expected elements: 5, 8", 3717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Explain(m, test_set)); 3718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests to see that duplicate elements are detected, 3721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// but (as above) not reported in the explanation. 3722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) { 3723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int vals[] = {1, 1, 2, 3, 5, 8}; 3724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const int test_vals[] = {1, 2, 3, 5, 8}; 372546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> my_set(vals, vals + 6); 372646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> test_set(test_vals, test_vals + 5); 372746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<vector<int> > m = ContainerEq(my_set); 3728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(my_set)); 3729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_set)); 3730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // There is nothing to report when both sets contain all the same values. 3731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_EQ("", Explain(m, test_set)); 3732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ContainerEq works for non-trivial associative containers, 3735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// like maps. 3736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, WorksForMaps) { 373746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan map<int, std::string> my_map; 3738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter my_map[0] = "a"; 3739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter my_map[1] = "b"; 3740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 374146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan map<int, std::string> test_map; 3742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter test_map[0] = "aa"; 3743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter test_map[1] = "b"; 3744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 374546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const map<int, std::string>&> m = ContainerEq(my_map); 3746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_TRUE(m.Matches(my_map)); 3747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_FALSE(m.Matches(test_map)); 3748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 374946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n" 375046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "and doesn't have these expected elements: (0, \"a\")", 3751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Explain(m, test_map)); 3752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, WorksForNativeArray) { 3755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a1[] = { 1, 2, 3 }; 3756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int a2[] = { 1, 2, 3 }; 3757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter int b[] = { 1, 2, 4 }; 3758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, ContainerEq(a2)); 3760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, Not(ContainerEq(b))); 3761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) { 3764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char a1[][3] = { "hi", "lo" }; 3765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char a2[][3] = { "hi", "lo" }; 3766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char b[][3] = { "lo", "hi" }; 3767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests using ContainerEq() in the first dimension. 3769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, ContainerEq(a2)); 3770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, Not(ContainerEq(b))); 3771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Tests using ContainerEq() in the second dimension. 3773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1]))); 3774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1]))); 3775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) { 3778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int a1[] = { 1, 2, 3 }; 3779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int a2[] = { 1, 2, 3 }; 3780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int b[] = { 1, 2, 3, 4 }; 3781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int* const p1 = a1; 3783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2)); 3784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b))); 3785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const int c[] = { 1, 3, 2 }; 3787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c))); 3788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ContainerEqExtraTest, CopiesNativeArrayParameter) { 3791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter std::string a1[][3] = { 3792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter { "hi", "hello", "ciao" }, 3793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter { "bye", "see you", "ciao" } 3794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter }; 3795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter std::string a2[][3] = { 3797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter { "hi", "hello", "ciao" }, 3798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter { "bye", "see you", "ciao" } 3799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter }; 3800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2); 3802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, m); 3803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 3804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter a2[0][0] = "ha"; 3805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter EXPECT_THAT(a1, m); 3806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 380846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedByTest, WorksForEmptyContainer) { 380946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const vector<int> numbers; 381046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre())); 381146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1)))); 381246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 381346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 381446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedByTest, WorksForNonEmptyContainer) { 381546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<unsigned> numbers; 381646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan numbers.push_back(3); 381746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan numbers.push_back(1); 381846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan numbers.push_back(2); 381946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan numbers.push_back(2); 382046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(), 382146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ElementsAre(3, 2, 2, 1))); 382246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(), 382346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ElementsAre(1, 2, 2, 3)))); 382446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 382546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 382646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedByTest, WorksForNonVectorContainer) { 382746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<string> words; 382846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan words.push_back("say"); 382946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan words.push_back("hello"); 383046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan words.push_back("world"); 383146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(words, WhenSortedBy(less<string>(), 383246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ElementsAre("hello", "say", "world"))); 383346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(words, Not(WhenSortedBy(less<string>(), 383446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ElementsAre("say", "hello", "world")))); 383546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 383646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 383746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedByTest, WorksForNativeArray) { 383846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int numbers[] = { 1, 3, 2, 4 }; 383946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int sorted_numbers[] = { 1, 2, 3, 4 }; 384046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4))); 384146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, WhenSortedBy(less<int>(), 384246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ElementsAreArray(sorted_numbers))); 384346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4)))); 384446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 384546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 384646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedByTest, CanDescribeSelf) { 384746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2)); 384846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(when sorted) has 2 elements where\n" 384946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "element #0 is equal to 1,\n" 385046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "element #1 is equal to 2", 385146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Describe(m)); 385246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n" 385346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "element #0 isn't equal to 1, or\n" 385446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "element #1 isn't equal to 2", 385546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 3856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 385846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedByTest, ExplainsMatchResult) { 385946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int a[] = { 2, 1 }; 386046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match", 386146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a)); 386246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which is { 1, 2 } when sorted", 386346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a)); 3864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 386646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't 386746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// need to test it as exhaustively as we test the latter. 3868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 386946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedTest, WorksForEmptyContainer) { 387046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const vector<int> numbers; 387146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, WhenSorted(ElementsAre())); 387246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1)))); 3873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 387546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(WhenSortedTest, WorksForNonEmptyContainer) { 387646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<string> words; 387746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan words.push_back("3"); 387846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan words.push_back("1"); 387946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan words.push_back("2"); 388046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan words.push_back("2"); 388146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3"))); 388246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2")))); 388346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 3884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 388546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests IsReadableTypeName(). 3886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 388746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) { 388846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(IsReadableTypeName("int")); 388946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(IsReadableTypeName("const unsigned char*")); 389046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(IsReadableTypeName("MyMap<int, void*>")); 389146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(IsReadableTypeName("void (*)(int, bool)")); 3892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 389446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) { 389546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(IsReadableTypeName("my_long_namespace::MyClassName")); 389646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(IsReadableTypeName("int [5][6][7][8][9][10][11]")); 389746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_TRUE(IsReadableTypeName("my_namespace::MyOuterClass::MyInnerClass")); 389846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 3899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 390046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) { 390146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE( 390246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan IsReadableTypeName("basic_string<char, std::char_traits<char> >")); 390346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(IsReadableTypeName("std::vector<int, std::alloc_traits<int> >")); 3904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 390646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) { 390746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_FALSE(IsReadableTypeName("void (&)(int, bool, char, float)")); 3908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 391046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests JoinAsTuple(). 3911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 391246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(JoinAsTupleTest, JoinsEmptyTuple) { 391346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", JoinAsTuple(Strings())); 3914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 391646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(JoinAsTupleTest, JoinsOneTuple) { 391746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* fields[] = { "1" }; 391846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1))); 3919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 392146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(JoinAsTupleTest, JoinsTwoTuple) { 392246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* fields[] = { "1", "a" }; 392346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2))); 3924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 392646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(JoinAsTupleTest, JoinsTenTuple) { 392746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* fields[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; 392846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)", 392946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan JoinAsTuple(Strings(fields, fields + 10))); 3930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 393246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests FormatMatcherDescription(). 393346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 393446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) { 393546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is even", 393646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan FormatMatcherDescription(false, "IsEven", Strings())); 393746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("not (is even)", 393846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan FormatMatcherDescription(true, "IsEven", Strings())); 393946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 394046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* params[] = { "5" }; 394146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("equals 5", 394246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan FormatMatcherDescription(false, "Equals", 394346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Strings(params, params + 1))); 394446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 394546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* params2[] = { "5", "8" }; 394646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("is in range (5, 8)", 394746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan FormatMatcherDescription(false, "IsInRange", 394846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Strings(params2, params2 + 2))); 3949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 395146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests PolymorphicMatcher::mutable_impl(). 395246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PolymorphicMatcherTest, CanAccessMutableImpl) { 395346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 395446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DivisibleByImpl& impl = m.mutable_impl(); 395546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(42, impl.divider()); 395646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 395746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan impl.set_divider(0); 395846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(0, m.mutable_impl().divider()); 3959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 396146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests PolymorphicMatcher::impl(). 396246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PolymorphicMatcherTest, CanAccessImpl) { 396346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 396446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const DivisibleByImpl& impl = m.impl(); 396546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(42, impl.divider()); 3966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 396846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MatcherTupleTest, ExplainsMatchFailure) { 396946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan stringstream ss1; 397046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)), 397146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan make_tuple('a', 10), &ss1); 397246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", ss1.str()); // Successful match. 397346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 397446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan stringstream ss2; 397546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))), 397646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan make_tuple(2, 'b'), &ss2); 397746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(" Expected arg #0: is > 5\n" 397846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: 2, which is 3 less than 5\n" 397946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Expected arg #1: is equal to 'a' (97, 0x61)\n" 398046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: 'b' (98, 0x62)\n", 398146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ss2.str()); // Failed match where both arguments need explanation. 398246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 398346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan stringstream ss3; 398446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))), 398546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan make_tuple(2, 'a'), &ss3); 398646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ(" Expected arg #0: is > 5\n" 398746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: 2, which is 3 less than 5\n", 398846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ss3.str()); // Failed match where only one argument needs 398946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // explanation. 3990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 3991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 399246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests Each(). 399346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 399446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(EachTest, ExplainsMatchResultCorrectly) { 399546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan set<int> a; // empty 399646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 399746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<set<int> > m = Each(2); 399846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(m, a)); 399946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 400046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<const int(&)[1]> n = Each(1); // NOLINT 400146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 400246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int b[1] = { 1 }; 400346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(n, b)); 400446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 400546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan n = Each(3); 400646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose element #0 doesn't match", Explain(n, b)); 400746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 400846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan a.insert(1); 400946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan a.insert(2); 401046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan a.insert(3); 401146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = Each(GreaterThan(0)); 401246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(m, a)); 401346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 401446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan m = Each(GreaterThan(10)); 401546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10", 401646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(m, a)); 4017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 401946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(EachTest, DescribesItselfCorrectly) { 402046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<vector<int> > m = Each(1); 402146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("only contains elements that is equal to 1", Describe(m)); 4022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 402346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Matcher<vector<int> > m2 = Not(m); 402446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2)); 4025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 402746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(EachTest, MatchesVectorWhenAllElementsMatch) { 402846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> some_vector; 402946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(some_vector, Each(1)); 403046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan some_vector.push_back(3); 403146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(some_vector, Not(Each(1))); 403246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(some_vector, Each(3)); 403346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan some_vector.push_back(1); 403446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan some_vector.push_back(2); 403546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(some_vector, Not(Each(3))); 403646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(some_vector, Each(Lt(3.5))); 4037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 403846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<string> another_vector; 403946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_vector.push_back("fee"); 404046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(another_vector, Each(string("fee"))); 404146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_vector.push_back("fie"); 404246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_vector.push_back("foe"); 404346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_vector.push_back("fum"); 404446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(another_vector, Not(Each(string("fee")))); 4045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 404746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(EachTest, MatchesMapWhenAllElementsMatch) { 404846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan map<const char*, int> my_map; 404946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* bar = "a string"; 405046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan my_map[bar] = 2; 405146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(my_map, Each(make_pair(bar, 2))); 4052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 405346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan map<string, int> another_map; 405446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1))); 405546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_map["fee"] = 1; 405646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1))); 405746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_map["fie"] = 2; 405846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_map["foe"] = 3; 405946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan another_map["fum"] = 4; 406046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1)))); 406146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1)))); 406246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(another_map, Each(Pair(_, Gt(0)))); 4063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 406546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(EachTest, AcceptsMatcher) { 406646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int a[] = { 1, 2, 3 }; 406746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(a, Each(Gt(0))); 406846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(a, Not(Each(Gt(1)))); 4069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 407146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(EachTest, WorksForNativeArrayAsTuple) { 407246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int a[] = { 1, 2 }; 407346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int* const pointer = a; 407446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0))); 407546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1)))); 4076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 407846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// For testing Pointwise(). 407946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass IsHalfOfMatcher { 408046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 408146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan template <typename T1, typename T2> 408246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan bool MatchAndExplain(const tuple<T1, T2>& a_pair, 408346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan MatchResultListener* listener) const { 408446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (get<0>(a_pair) == get<1>(a_pair)/2) { 408546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "where the second is " << get<1>(a_pair); 408646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return true; 408746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } else { 408846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *listener << "where the second/2 is " << get<1>(a_pair)/2; 408946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return false; 409046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 409146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 409246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 409346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeTo(ostream* os) const { 409446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *os << "are a pair where the first is half of the second"; 409546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 409646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 409746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void DescribeNegationTo(ostream* os) const { 409846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan *os << "are a pair where the first isn't half of the second"; 409946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 410046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 410146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 410246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanPolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() { 410346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return MakePolymorphicMatcher(IsHalfOfMatcher()); 4104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 410646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, DescribesSelf) { 410746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> rhs; 410846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(1); 410946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(2); 411046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(3); 411146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs); 411246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("contains 3 values, where each value and its corresponding value " 411346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "in { 1, 2, 3 } are a pair where the first is half of the second", 411446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Describe(m)); 411546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("doesn't contain exactly 3 values, or contains a value x at some " 411646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "index i where x and the i-th value of { 1, 2, 3 } are a pair " 411746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "where the first isn't half of the second", 411846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan DescribeNegation(m)); 411946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 4120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 412146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, MakesCopyOfRhs) { 412246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan list<signed char> rhs; 412346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(2); 412446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(4); 4125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 412646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int lhs[] = { 1, 2 }; 412746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs); 412846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, m); 4129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 413046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Changing rhs now shouldn't affect m, which made a copy of rhs. 413146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(6); 413246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, m); 4133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 413546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, WorksForLhsNativeArray) { 413646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int lhs[] = { 1, 2, 3 }; 413746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> rhs; 413846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(2); 413946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(4); 414046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan rhs.push_back(6); 414146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Pointwise(Lt(), rhs)); 414246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 414346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 4144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 414546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, WorksForRhsNativeArray) { 414646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int rhs[] = { 1, 2, 3 }; 414746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan vector<int> lhs; 414846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan lhs.push_back(2); 414946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan lhs.push_back(4); 415046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan lhs.push_back(6); 415146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Pointwise(Gt(), rhs)); 415246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs))); 4153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 415546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, RejectsWrongSize) { 415646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const double lhs[2] = { 1, 2 }; 415746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int rhs[1] = { 0 }; 415846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 415946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("which contains 2 values", 416046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(Pointwise(Gt(), rhs), lhs)); 416146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 416246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int rhs2[3] = { 0, 1, 2 }; 416346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2))); 4164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 416646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, RejectsWrongContent) { 416746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const double lhs[3] = { 1, 2, 3 }; 416846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int rhs[3] = { 2, 6, 4 }; 416946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs))); 417046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("where the value pair (2, 6) at index #1 don't match, " 417146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "where the second/2 is 3", 417246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Explain(Pointwise(IsHalfOf(), rhs), lhs)); 4173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 417546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, AcceptsCorrectContent) { 417646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const double lhs[3] = { 1, 2, 3 }; 417746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int rhs[3] = { 2, 4, 6 }; 417846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs)); 417946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs)); 4180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 418246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(PointwiseTest, AllowsMonomorphicInnerMatcher) { 418346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const double lhs[3] = { 1, 2, 3 }; 418446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const int rhs[3] = { 2, 4, 6 }; 418546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf(); 418646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Pointwise(m1, rhs)); 418746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs)); 418846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 418946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // This type works as a tuple<const double&, const int&> can be 419046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // implicitly cast to tuple<double, int>. 419146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Matcher<tuple<double, int> > m2 = IsHalfOf(); 419246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_THAT(lhs, Pointwise(m2, rhs)); 419346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs)); 4194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 4195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 4196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace gmock_matchers_test 4197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace testing 4198