113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com// 3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3113481Sgiacomo.travaglini@arm.com 3213481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes. 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This file tests some commonly used argument matchers. 3513481Sgiacomo.travaglini@arm.com 3613481Sgiacomo.travaglini@arm.com#include "gmock/gmock-matchers.h" 3713481Sgiacomo.travaglini@arm.com#include "gmock/gmock-more-matchers.h" 3813481Sgiacomo.travaglini@arm.com 3913481Sgiacomo.travaglini@arm.com#include <string.h> 4013481Sgiacomo.travaglini@arm.com#include <time.h> 4113481Sgiacomo.travaglini@arm.com#include <deque> 4213481Sgiacomo.travaglini@arm.com#include <functional> 4313481Sgiacomo.travaglini@arm.com#include <iostream> 4413481Sgiacomo.travaglini@arm.com#include <iterator> 4513481Sgiacomo.travaglini@arm.com#include <limits> 4613481Sgiacomo.travaglini@arm.com#include <list> 4713481Sgiacomo.travaglini@arm.com#include <map> 4813481Sgiacomo.travaglini@arm.com#include <set> 4913481Sgiacomo.travaglini@arm.com#include <sstream> 5013481Sgiacomo.travaglini@arm.com#include <string> 5113481Sgiacomo.travaglini@arm.com#include <utility> 5213481Sgiacomo.travaglini@arm.com#include <vector> 5313481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h" 5413481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 5513481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h" 5613481Sgiacomo.travaglini@arm.com 5713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FORWARD_LIST_ 5813481Sgiacomo.travaglini@arm.com# include <forward_list> // NOLINT 5913481Sgiacomo.travaglini@arm.com#endif 6013481Sgiacomo.travaglini@arm.com 6113481Sgiacomo.travaglini@arm.comnamespace testing { 6213481Sgiacomo.travaglini@arm.com 6313481Sgiacomo.travaglini@arm.comnamespace internal { 6413481Sgiacomo.travaglini@arm.comGTEST_API_ string JoinAsTuple(const Strings& fields); 6513481Sgiacomo.travaglini@arm.com} // namespace internal 6613481Sgiacomo.travaglini@arm.com 6713481Sgiacomo.travaglini@arm.comnamespace gmock_matchers_test { 6813481Sgiacomo.travaglini@arm.com 6913481Sgiacomo.travaglini@arm.comusing std::greater; 7013481Sgiacomo.travaglini@arm.comusing std::less; 7113481Sgiacomo.travaglini@arm.comusing std::list; 7213481Sgiacomo.travaglini@arm.comusing std::make_pair; 7313481Sgiacomo.travaglini@arm.comusing std::map; 7413481Sgiacomo.travaglini@arm.comusing std::multimap; 7513481Sgiacomo.travaglini@arm.comusing std::multiset; 7613481Sgiacomo.travaglini@arm.comusing std::ostream; 7713481Sgiacomo.travaglini@arm.comusing std::pair; 7813481Sgiacomo.travaglini@arm.comusing std::set; 7913481Sgiacomo.travaglini@arm.comusing std::stringstream; 8013481Sgiacomo.travaglini@arm.comusing std::vector; 8113481Sgiacomo.travaglini@arm.comusing testing::A; 8213481Sgiacomo.travaglini@arm.comusing testing::AllArgs; 8313481Sgiacomo.travaglini@arm.comusing testing::AllOf; 8413481Sgiacomo.travaglini@arm.comusing testing::An; 8513481Sgiacomo.travaglini@arm.comusing testing::AnyOf; 8613481Sgiacomo.travaglini@arm.comusing testing::ByRef; 8713481Sgiacomo.travaglini@arm.comusing testing::ContainsRegex; 8813481Sgiacomo.travaglini@arm.comusing testing::DoubleEq; 8913481Sgiacomo.travaglini@arm.comusing testing::DoubleNear; 9013481Sgiacomo.travaglini@arm.comusing testing::EndsWith; 9113481Sgiacomo.travaglini@arm.comusing testing::Eq; 9213481Sgiacomo.travaglini@arm.comusing testing::ExplainMatchResult; 9313481Sgiacomo.travaglini@arm.comusing testing::Field; 9413481Sgiacomo.travaglini@arm.comusing testing::FloatEq; 9513481Sgiacomo.travaglini@arm.comusing testing::FloatNear; 9613481Sgiacomo.travaglini@arm.comusing testing::Ge; 9713481Sgiacomo.travaglini@arm.comusing testing::Gt; 9813481Sgiacomo.travaglini@arm.comusing testing::HasSubstr; 9913481Sgiacomo.travaglini@arm.comusing testing::IsEmpty; 10013481Sgiacomo.travaglini@arm.comusing testing::IsNull; 10113481Sgiacomo.travaglini@arm.comusing testing::Key; 10213481Sgiacomo.travaglini@arm.comusing testing::Le; 10313481Sgiacomo.travaglini@arm.comusing testing::Lt; 10413481Sgiacomo.travaglini@arm.comusing testing::MakeMatcher; 10513481Sgiacomo.travaglini@arm.comusing testing::MakePolymorphicMatcher; 10613481Sgiacomo.travaglini@arm.comusing testing::MatchResultListener; 10713481Sgiacomo.travaglini@arm.comusing testing::Matcher; 10813481Sgiacomo.travaglini@arm.comusing testing::MatcherCast; 10913481Sgiacomo.travaglini@arm.comusing testing::MatcherInterface; 11013481Sgiacomo.travaglini@arm.comusing testing::Matches; 11113481Sgiacomo.travaglini@arm.comusing testing::MatchesRegex; 11213481Sgiacomo.travaglini@arm.comusing testing::NanSensitiveDoubleEq; 11313481Sgiacomo.travaglini@arm.comusing testing::NanSensitiveDoubleNear; 11413481Sgiacomo.travaglini@arm.comusing testing::NanSensitiveFloatEq; 11513481Sgiacomo.travaglini@arm.comusing testing::NanSensitiveFloatNear; 11613481Sgiacomo.travaglini@arm.comusing testing::Ne; 11713481Sgiacomo.travaglini@arm.comusing testing::Not; 11813481Sgiacomo.travaglini@arm.comusing testing::NotNull; 11913481Sgiacomo.travaglini@arm.comusing testing::Pair; 12013481Sgiacomo.travaglini@arm.comusing testing::Pointee; 12113481Sgiacomo.travaglini@arm.comusing testing::Pointwise; 12213481Sgiacomo.travaglini@arm.comusing testing::PolymorphicMatcher; 12313481Sgiacomo.travaglini@arm.comusing testing::Property; 12413481Sgiacomo.travaglini@arm.comusing testing::Ref; 12513481Sgiacomo.travaglini@arm.comusing testing::ResultOf; 12613481Sgiacomo.travaglini@arm.comusing testing::SizeIs; 12713481Sgiacomo.travaglini@arm.comusing testing::StartsWith; 12813481Sgiacomo.travaglini@arm.comusing testing::StrCaseEq; 12913481Sgiacomo.travaglini@arm.comusing testing::StrCaseNe; 13013481Sgiacomo.travaglini@arm.comusing testing::StrEq; 13113481Sgiacomo.travaglini@arm.comusing testing::StrNe; 13213481Sgiacomo.travaglini@arm.comusing testing::StringMatchResultListener; 13313481Sgiacomo.travaglini@arm.comusing testing::Truly; 13413481Sgiacomo.travaglini@arm.comusing testing::TypedEq; 13513481Sgiacomo.travaglini@arm.comusing testing::UnorderedPointwise; 13613481Sgiacomo.travaglini@arm.comusing testing::Value; 13713481Sgiacomo.travaglini@arm.comusing testing::WhenSorted; 13813481Sgiacomo.travaglini@arm.comusing testing::WhenSortedBy; 13913481Sgiacomo.travaglini@arm.comusing testing::_; 14013481Sgiacomo.travaglini@arm.comusing testing::get; 14113481Sgiacomo.travaglini@arm.comusing testing::internal::DummyMatchResultListener; 14213481Sgiacomo.travaglini@arm.comusing testing::internal::ElementMatcherPair; 14313481Sgiacomo.travaglini@arm.comusing testing::internal::ElementMatcherPairs; 14413481Sgiacomo.travaglini@arm.comusing testing::internal::ExplainMatchFailureTupleTo; 14513481Sgiacomo.travaglini@arm.comusing testing::internal::FloatingEqMatcher; 14613481Sgiacomo.travaglini@arm.comusing testing::internal::FormatMatcherDescription; 14713481Sgiacomo.travaglini@arm.comusing testing::internal::IsReadableTypeName; 14813481Sgiacomo.travaglini@arm.comusing testing::internal::JoinAsTuple; 14913481Sgiacomo.travaglini@arm.comusing testing::internal::linked_ptr; 15013481Sgiacomo.travaglini@arm.comusing testing::internal::MatchMatrix; 15113481Sgiacomo.travaglini@arm.comusing testing::internal::RE; 15213481Sgiacomo.travaglini@arm.comusing testing::internal::scoped_ptr; 15313481Sgiacomo.travaglini@arm.comusing testing::internal::StreamMatchResultListener; 15413481Sgiacomo.travaglini@arm.comusing testing::internal::Strings; 15513481Sgiacomo.travaglini@arm.comusing testing::internal::linked_ptr; 15613481Sgiacomo.travaglini@arm.comusing testing::internal::scoped_ptr; 15713481Sgiacomo.travaglini@arm.comusing testing::internal::string; 15813481Sgiacomo.travaglini@arm.comusing testing::make_tuple; 15913481Sgiacomo.travaglini@arm.comusing testing::tuple; 16013481Sgiacomo.travaglini@arm.com 16113481Sgiacomo.travaglini@arm.com// For testing ExplainMatchResultTo(). 16213481Sgiacomo.travaglini@arm.comclass GreaterThanMatcher : public MatcherInterface<int> { 16313481Sgiacomo.travaglini@arm.com public: 16413481Sgiacomo.travaglini@arm.com explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} 16513481Sgiacomo.travaglini@arm.com 16613481Sgiacomo.travaglini@arm.com virtual void DescribeTo(ostream* os) const { 16713481Sgiacomo.travaglini@arm.com *os << "is > " << rhs_; 16813481Sgiacomo.travaglini@arm.com } 16913481Sgiacomo.travaglini@arm.com 17013481Sgiacomo.travaglini@arm.com virtual bool MatchAndExplain(int lhs, 17113481Sgiacomo.travaglini@arm.com MatchResultListener* listener) const { 17213481Sgiacomo.travaglini@arm.com const int diff = lhs - rhs_; 17313481Sgiacomo.travaglini@arm.com if (diff > 0) { 17413481Sgiacomo.travaglini@arm.com *listener << "which is " << diff << " more than " << rhs_; 17513481Sgiacomo.travaglini@arm.com } else if (diff == 0) { 17613481Sgiacomo.travaglini@arm.com *listener << "which is the same as " << rhs_; 17713481Sgiacomo.travaglini@arm.com } else { 17813481Sgiacomo.travaglini@arm.com *listener << "which is " << -diff << " less than " << rhs_; 17913481Sgiacomo.travaglini@arm.com } 18013481Sgiacomo.travaglini@arm.com 18113481Sgiacomo.travaglini@arm.com return lhs > rhs_; 18213481Sgiacomo.travaglini@arm.com } 18313481Sgiacomo.travaglini@arm.com 18413481Sgiacomo.travaglini@arm.com private: 18513481Sgiacomo.travaglini@arm.com int rhs_; 18613481Sgiacomo.travaglini@arm.com}; 18713481Sgiacomo.travaglini@arm.com 18813481Sgiacomo.travaglini@arm.comMatcher<int> GreaterThan(int n) { 18913481Sgiacomo.travaglini@arm.com return MakeMatcher(new GreaterThanMatcher(n)); 19013481Sgiacomo.travaglini@arm.com} 19113481Sgiacomo.travaglini@arm.com 19213481Sgiacomo.travaglini@arm.comstring OfType(const string& type_name) { 19313481Sgiacomo.travaglini@arm.com#if GTEST_HAS_RTTI 19413481Sgiacomo.travaglini@arm.com return " (of type " + type_name + ")"; 19513481Sgiacomo.travaglini@arm.com#else 19613481Sgiacomo.travaglini@arm.com return ""; 19713481Sgiacomo.travaglini@arm.com#endif 19813481Sgiacomo.travaglini@arm.com} 19913481Sgiacomo.travaglini@arm.com 20013481Sgiacomo.travaglini@arm.com// Returns the description of the given matcher. 20113481Sgiacomo.travaglini@arm.comtemplate <typename T> 20213481Sgiacomo.travaglini@arm.comstring Describe(const Matcher<T>& m) { 20313481Sgiacomo.travaglini@arm.com stringstream ss; 20413481Sgiacomo.travaglini@arm.com m.DescribeTo(&ss); 20513481Sgiacomo.travaglini@arm.com return ss.str(); 20613481Sgiacomo.travaglini@arm.com} 20713481Sgiacomo.travaglini@arm.com 20813481Sgiacomo.travaglini@arm.com// Returns the description of the negation of the given matcher. 20913481Sgiacomo.travaglini@arm.comtemplate <typename T> 21013481Sgiacomo.travaglini@arm.comstring DescribeNegation(const Matcher<T>& m) { 21113481Sgiacomo.travaglini@arm.com stringstream ss; 21213481Sgiacomo.travaglini@arm.com m.DescribeNegationTo(&ss); 21313481Sgiacomo.travaglini@arm.com return ss.str(); 21413481Sgiacomo.travaglini@arm.com} 21513481Sgiacomo.travaglini@arm.com 21613481Sgiacomo.travaglini@arm.com// Returns the reason why x matches, or doesn't match, m. 21713481Sgiacomo.travaglini@arm.comtemplate <typename MatcherType, typename Value> 21813481Sgiacomo.travaglini@arm.comstring Explain(const MatcherType& m, const Value& x) { 21913481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 22013481Sgiacomo.travaglini@arm.com ExplainMatchResult(m, x, &listener); 22113481Sgiacomo.travaglini@arm.com return listener.str(); 22213481Sgiacomo.travaglini@arm.com} 22313481Sgiacomo.travaglini@arm.com 22413481Sgiacomo.travaglini@arm.comTEST(MatchResultListenerTest, StreamingWorks) { 22513481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 22613481Sgiacomo.travaglini@arm.com listener << "hi" << 5; 22713481Sgiacomo.travaglini@arm.com EXPECT_EQ("hi5", listener.str()); 22813481Sgiacomo.travaglini@arm.com 22913481Sgiacomo.travaglini@arm.com listener.Clear(); 23013481Sgiacomo.travaglini@arm.com EXPECT_EQ("", listener.str()); 23113481Sgiacomo.travaglini@arm.com 23213481Sgiacomo.travaglini@arm.com listener << 42; 23313481Sgiacomo.travaglini@arm.com EXPECT_EQ("42", listener.str()); 23413481Sgiacomo.travaglini@arm.com 23513481Sgiacomo.travaglini@arm.com // Streaming shouldn't crash when the underlying ostream is NULL. 23613481Sgiacomo.travaglini@arm.com DummyMatchResultListener dummy; 23713481Sgiacomo.travaglini@arm.com dummy << "hi" << 5; 23813481Sgiacomo.travaglini@arm.com} 23913481Sgiacomo.travaglini@arm.com 24013481Sgiacomo.travaglini@arm.comTEST(MatchResultListenerTest, CanAccessUnderlyingStream) { 24113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(DummyMatchResultListener().stream() == NULL); 24213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(StreamMatchResultListener(NULL).stream() == NULL); 24313481Sgiacomo.travaglini@arm.com 24413481Sgiacomo.travaglini@arm.com EXPECT_EQ(&std::cout, StreamMatchResultListener(&std::cout).stream()); 24513481Sgiacomo.travaglini@arm.com} 24613481Sgiacomo.travaglini@arm.com 24713481Sgiacomo.travaglini@arm.comTEST(MatchResultListenerTest, IsInterestedWorks) { 24813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(StringMatchResultListener().IsInterested()); 24913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(StreamMatchResultListener(&std::cout).IsInterested()); 25013481Sgiacomo.travaglini@arm.com 25113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(DummyMatchResultListener().IsInterested()); 25213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(StreamMatchResultListener(NULL).IsInterested()); 25313481Sgiacomo.travaglini@arm.com} 25413481Sgiacomo.travaglini@arm.com 25513481Sgiacomo.travaglini@arm.com// Makes sure that the MatcherInterface<T> interface doesn't 25613481Sgiacomo.travaglini@arm.com// change. 25713481Sgiacomo.travaglini@arm.comclass EvenMatcherImpl : public MatcherInterface<int> { 25813481Sgiacomo.travaglini@arm.com public: 25913481Sgiacomo.travaglini@arm.com virtual bool MatchAndExplain(int x, 26013481Sgiacomo.travaglini@arm.com MatchResultListener* /* listener */) const { 26113481Sgiacomo.travaglini@arm.com return x % 2 == 0; 26213481Sgiacomo.travaglini@arm.com } 26313481Sgiacomo.travaglini@arm.com 26413481Sgiacomo.travaglini@arm.com virtual void DescribeTo(ostream* os) const { 26513481Sgiacomo.travaglini@arm.com *os << "is an even number"; 26613481Sgiacomo.travaglini@arm.com } 26713481Sgiacomo.travaglini@arm.com 26813481Sgiacomo.travaglini@arm.com // We deliberately don't define DescribeNegationTo() and 26913481Sgiacomo.travaglini@arm.com // ExplainMatchResultTo() here, to make sure the definition of these 27013481Sgiacomo.travaglini@arm.com // two methods is optional. 27113481Sgiacomo.travaglini@arm.com}; 27213481Sgiacomo.travaglini@arm.com 27313481Sgiacomo.travaglini@arm.com// Makes sure that the MatcherInterface API doesn't change. 27413481Sgiacomo.travaglini@arm.comTEST(MatcherInterfaceTest, CanBeImplementedUsingPublishedAPI) { 27513481Sgiacomo.travaglini@arm.com EvenMatcherImpl m; 27613481Sgiacomo.travaglini@arm.com} 27713481Sgiacomo.travaglini@arm.com 27813481Sgiacomo.travaglini@arm.com// Tests implementing a monomorphic matcher using MatchAndExplain(). 27913481Sgiacomo.travaglini@arm.com 28013481Sgiacomo.travaglini@arm.comclass NewEvenMatcherImpl : public MatcherInterface<int> { 28113481Sgiacomo.travaglini@arm.com public: 28213481Sgiacomo.travaglini@arm.com virtual bool MatchAndExplain(int x, MatchResultListener* listener) const { 28313481Sgiacomo.travaglini@arm.com const bool match = x % 2 == 0; 28413481Sgiacomo.travaglini@arm.com // Verifies that we can stream to a listener directly. 28513481Sgiacomo.travaglini@arm.com *listener << "value % " << 2; 28613481Sgiacomo.travaglini@arm.com if (listener->stream() != NULL) { 28713481Sgiacomo.travaglini@arm.com // Verifies that we can stream to a listener's underlying stream 28813481Sgiacomo.travaglini@arm.com // too. 28913481Sgiacomo.travaglini@arm.com *listener->stream() << " == " << (x % 2); 29013481Sgiacomo.travaglini@arm.com } 29113481Sgiacomo.travaglini@arm.com return match; 29213481Sgiacomo.travaglini@arm.com } 29313481Sgiacomo.travaglini@arm.com 29413481Sgiacomo.travaglini@arm.com virtual void DescribeTo(ostream* os) const { 29513481Sgiacomo.travaglini@arm.com *os << "is an even number"; 29613481Sgiacomo.travaglini@arm.com } 29713481Sgiacomo.travaglini@arm.com}; 29813481Sgiacomo.travaglini@arm.com 29913481Sgiacomo.travaglini@arm.comTEST(MatcherInterfaceTest, CanBeImplementedUsingNewAPI) { 30013481Sgiacomo.travaglini@arm.com Matcher<int> m = MakeMatcher(new NewEvenMatcherImpl); 30113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(2)); 30213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(3)); 30313481Sgiacomo.travaglini@arm.com EXPECT_EQ("value % 2 == 0", Explain(m, 2)); 30413481Sgiacomo.travaglini@arm.com EXPECT_EQ("value % 2 == 1", Explain(m, 3)); 30513481Sgiacomo.travaglini@arm.com} 30613481Sgiacomo.travaglini@arm.com 30713481Sgiacomo.travaglini@arm.com// Tests default-constructing a matcher. 30813481Sgiacomo.travaglini@arm.comTEST(MatcherTest, CanBeDefaultConstructed) { 30913481Sgiacomo.travaglini@arm.com Matcher<double> m; 31013481Sgiacomo.travaglini@arm.com} 31113481Sgiacomo.travaglini@arm.com 31213481Sgiacomo.travaglini@arm.com// Tests that Matcher<T> can be constructed from a MatcherInterface<T>*. 31313481Sgiacomo.travaglini@arm.comTEST(MatcherTest, CanBeConstructedFromMatcherInterface) { 31413481Sgiacomo.travaglini@arm.com const MatcherInterface<int>* impl = new EvenMatcherImpl; 31513481Sgiacomo.travaglini@arm.com Matcher<int> m(impl); 31613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(4)); 31713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(5)); 31813481Sgiacomo.travaglini@arm.com} 31913481Sgiacomo.travaglini@arm.com 32013481Sgiacomo.travaglini@arm.com// Tests that value can be used in place of Eq(value). 32113481Sgiacomo.travaglini@arm.comTEST(MatcherTest, CanBeImplicitlyConstructedFromValue) { 32213481Sgiacomo.travaglini@arm.com Matcher<int> m1 = 5; 32313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(5)); 32413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(6)); 32513481Sgiacomo.travaglini@arm.com} 32613481Sgiacomo.travaglini@arm.com 32713481Sgiacomo.travaglini@arm.com// Tests that NULL can be used in place of Eq(NULL). 32813481Sgiacomo.travaglini@arm.comTEST(MatcherTest, CanBeImplicitlyConstructedFromNULL) { 32913481Sgiacomo.travaglini@arm.com Matcher<int*> m1 = NULL; 33013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(NULL)); 33113481Sgiacomo.travaglini@arm.com int n = 0; 33213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(&n)); 33313481Sgiacomo.travaglini@arm.com} 33413481Sgiacomo.travaglini@arm.com 33513481Sgiacomo.travaglini@arm.com// Tests that matchers are copyable. 33613481Sgiacomo.travaglini@arm.comTEST(MatcherTest, IsCopyable) { 33713481Sgiacomo.travaglini@arm.com // Tests the copy constructor. 33813481Sgiacomo.travaglini@arm.com Matcher<bool> m1 = Eq(false); 33913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(false)); 34013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(true)); 34113481Sgiacomo.travaglini@arm.com 34213481Sgiacomo.travaglini@arm.com // Tests the assignment operator. 34313481Sgiacomo.travaglini@arm.com m1 = Eq(true); 34413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(true)); 34513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(false)); 34613481Sgiacomo.travaglini@arm.com} 34713481Sgiacomo.travaglini@arm.com 34813481Sgiacomo.travaglini@arm.com// Tests that Matcher<T>::DescribeTo() calls 34913481Sgiacomo.travaglini@arm.com// MatcherInterface<T>::DescribeTo(). 35013481Sgiacomo.travaglini@arm.comTEST(MatcherTest, CanDescribeItself) { 35113481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an even number", 35213481Sgiacomo.travaglini@arm.com Describe(Matcher<int>(new EvenMatcherImpl))); 35313481Sgiacomo.travaglini@arm.com} 35413481Sgiacomo.travaglini@arm.com 35513481Sgiacomo.travaglini@arm.com// Tests Matcher<T>::MatchAndExplain(). 35613481Sgiacomo.travaglini@arm.comTEST(MatcherTest, MatchAndExplain) { 35713481Sgiacomo.travaglini@arm.com Matcher<int> m = GreaterThan(0); 35813481Sgiacomo.travaglini@arm.com StringMatchResultListener listener1; 35913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.MatchAndExplain(42, &listener1)); 36013481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 42 more than 0", listener1.str()); 36113481Sgiacomo.travaglini@arm.com 36213481Sgiacomo.travaglini@arm.com StringMatchResultListener listener2; 36313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.MatchAndExplain(-9, &listener2)); 36413481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 9 less than 0", listener2.str()); 36513481Sgiacomo.travaglini@arm.com} 36613481Sgiacomo.travaglini@arm.com 36713481Sgiacomo.travaglini@arm.com// Tests that a C-string literal can be implicitly converted to a 36813481Sgiacomo.travaglini@arm.com// Matcher<string> or Matcher<const string&>. 36913481Sgiacomo.travaglini@arm.comTEST(StringMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 37013481Sgiacomo.travaglini@arm.com Matcher<string> m1 = "hi"; 37113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("hi")); 37213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches("hello")); 37313481Sgiacomo.travaglini@arm.com 37413481Sgiacomo.travaglini@arm.com Matcher<const string&> m2 = "hi"; 37513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("hi")); 37613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("hello")); 37713481Sgiacomo.travaglini@arm.com} 37813481Sgiacomo.travaglini@arm.com 37913481Sgiacomo.travaglini@arm.com// Tests that a string object can be implicitly converted to a 38013481Sgiacomo.travaglini@arm.com// Matcher<string> or Matcher<const string&>. 38113481Sgiacomo.travaglini@arm.comTEST(StringMatcherTest, CanBeImplicitlyConstructedFromString) { 38213481Sgiacomo.travaglini@arm.com Matcher<string> m1 = string("hi"); 38313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("hi")); 38413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches("hello")); 38513481Sgiacomo.travaglini@arm.com 38613481Sgiacomo.travaglini@arm.com Matcher<const string&> m2 = string("hi"); 38713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("hi")); 38813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("hello")); 38913481Sgiacomo.travaglini@arm.com} 39013481Sgiacomo.travaglini@arm.com 39113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STRING_PIECE_ 39213481Sgiacomo.travaglini@arm.com// Tests that a C-string literal can be implicitly converted to a 39313481Sgiacomo.travaglini@arm.com// Matcher<StringPiece> or Matcher<const StringPiece&>. 39413481Sgiacomo.travaglini@arm.comTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromCStringLiteral) { 39513481Sgiacomo.travaglini@arm.com Matcher<StringPiece> m1 = "cats"; 39613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("cats")); 39713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches("dogs")); 39813481Sgiacomo.travaglini@arm.com 39913481Sgiacomo.travaglini@arm.com Matcher<const StringPiece&> m2 = "cats"; 40013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("cats")); 40113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("dogs")); 40213481Sgiacomo.travaglini@arm.com} 40313481Sgiacomo.travaglini@arm.com 40413481Sgiacomo.travaglini@arm.com// Tests that a string object can be implicitly converted to a 40513481Sgiacomo.travaglini@arm.com// Matcher<StringPiece> or Matcher<const StringPiece&>. 40613481Sgiacomo.travaglini@arm.comTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromString) { 40713481Sgiacomo.travaglini@arm.com Matcher<StringPiece> m1 = string("cats"); 40813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("cats")); 40913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches("dogs")); 41013481Sgiacomo.travaglini@arm.com 41113481Sgiacomo.travaglini@arm.com Matcher<const StringPiece&> m2 = string("cats"); 41213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("cats")); 41313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("dogs")); 41413481Sgiacomo.travaglini@arm.com} 41513481Sgiacomo.travaglini@arm.com 41613481Sgiacomo.travaglini@arm.com// Tests that a StringPiece object can be implicitly converted to a 41713481Sgiacomo.travaglini@arm.com// Matcher<StringPiece> or Matcher<const StringPiece&>. 41813481Sgiacomo.travaglini@arm.comTEST(StringPieceMatcherTest, CanBeImplicitlyConstructedFromStringPiece) { 41913481Sgiacomo.travaglini@arm.com Matcher<StringPiece> m1 = StringPiece("cats"); 42013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("cats")); 42113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches("dogs")); 42213481Sgiacomo.travaglini@arm.com 42313481Sgiacomo.travaglini@arm.com Matcher<const StringPiece&> m2 = StringPiece("cats"); 42413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("cats")); 42513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("dogs")); 42613481Sgiacomo.travaglini@arm.com} 42713481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STRING_PIECE_ 42813481Sgiacomo.travaglini@arm.com 42913481Sgiacomo.travaglini@arm.com// Tests that MakeMatcher() constructs a Matcher<T> from a 43013481Sgiacomo.travaglini@arm.com// MatcherInterface* without requiring the user to explicitly 43113481Sgiacomo.travaglini@arm.com// write the type. 43213481Sgiacomo.travaglini@arm.comTEST(MakeMatcherTest, ConstructsMatcherFromMatcherInterface) { 43313481Sgiacomo.travaglini@arm.com const MatcherInterface<int>* dummy_impl = NULL; 43413481Sgiacomo.travaglini@arm.com Matcher<int> m = MakeMatcher(dummy_impl); 43513481Sgiacomo.travaglini@arm.com} 43613481Sgiacomo.travaglini@arm.com 43713481Sgiacomo.travaglini@arm.com// Tests that MakePolymorphicMatcher() can construct a polymorphic 43813481Sgiacomo.travaglini@arm.com// matcher from its implementation using the old API. 43913481Sgiacomo.travaglini@arm.comconst int g_bar = 1; 44013481Sgiacomo.travaglini@arm.comclass ReferencesBarOrIsZeroImpl { 44113481Sgiacomo.travaglini@arm.com public: 44213481Sgiacomo.travaglini@arm.com template <typename T> 44313481Sgiacomo.travaglini@arm.com bool MatchAndExplain(const T& x, 44413481Sgiacomo.travaglini@arm.com MatchResultListener* /* listener */) const { 44513481Sgiacomo.travaglini@arm.com const void* p = &x; 44613481Sgiacomo.travaglini@arm.com return p == &g_bar || x == 0; 44713481Sgiacomo.travaglini@arm.com } 44813481Sgiacomo.travaglini@arm.com 44913481Sgiacomo.travaglini@arm.com void DescribeTo(ostream* os) const { *os << "g_bar or zero"; } 45013481Sgiacomo.travaglini@arm.com 45113481Sgiacomo.travaglini@arm.com void DescribeNegationTo(ostream* os) const { 45213481Sgiacomo.travaglini@arm.com *os << "doesn't reference g_bar and is not zero"; 45313481Sgiacomo.travaglini@arm.com } 45413481Sgiacomo.travaglini@arm.com}; 45513481Sgiacomo.travaglini@arm.com 45613481Sgiacomo.travaglini@arm.com// This function verifies that MakePolymorphicMatcher() returns a 45713481Sgiacomo.travaglini@arm.com// PolymorphicMatcher<T> where T is the argument's type. 45813481Sgiacomo.travaglini@arm.comPolymorphicMatcher<ReferencesBarOrIsZeroImpl> ReferencesBarOrIsZero() { 45913481Sgiacomo.travaglini@arm.com return MakePolymorphicMatcher(ReferencesBarOrIsZeroImpl()); 46013481Sgiacomo.travaglini@arm.com} 46113481Sgiacomo.travaglini@arm.com 46213481Sgiacomo.travaglini@arm.comTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingOldAPI) { 46313481Sgiacomo.travaglini@arm.com // Using a polymorphic matcher to match a reference type. 46413481Sgiacomo.travaglini@arm.com Matcher<const int&> m1 = ReferencesBarOrIsZero(); 46513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(0)); 46613481Sgiacomo.travaglini@arm.com // Verifies that the identity of a by-reference argument is preserved. 46713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(g_bar)); 46813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(1)); 46913481Sgiacomo.travaglini@arm.com EXPECT_EQ("g_bar or zero", Describe(m1)); 47013481Sgiacomo.travaglini@arm.com 47113481Sgiacomo.travaglini@arm.com // Using a polymorphic matcher to match a value type. 47213481Sgiacomo.travaglini@arm.com Matcher<double> m2 = ReferencesBarOrIsZero(); 47313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0.0)); 47413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(0.1)); 47513481Sgiacomo.travaglini@arm.com EXPECT_EQ("g_bar or zero", Describe(m2)); 47613481Sgiacomo.travaglini@arm.com} 47713481Sgiacomo.travaglini@arm.com 47813481Sgiacomo.travaglini@arm.com// Tests implementing a polymorphic matcher using MatchAndExplain(). 47913481Sgiacomo.travaglini@arm.com 48013481Sgiacomo.travaglini@arm.comclass PolymorphicIsEvenImpl { 48113481Sgiacomo.travaglini@arm.com public: 48213481Sgiacomo.travaglini@arm.com void DescribeTo(ostream* os) const { *os << "is even"; } 48313481Sgiacomo.travaglini@arm.com 48413481Sgiacomo.travaglini@arm.com void DescribeNegationTo(ostream* os) const { 48513481Sgiacomo.travaglini@arm.com *os << "is odd"; 48613481Sgiacomo.travaglini@arm.com } 48713481Sgiacomo.travaglini@arm.com 48813481Sgiacomo.travaglini@arm.com template <typename T> 48913481Sgiacomo.travaglini@arm.com bool MatchAndExplain(const T& x, MatchResultListener* listener) const { 49013481Sgiacomo.travaglini@arm.com // Verifies that we can stream to the listener directly. 49113481Sgiacomo.travaglini@arm.com *listener << "% " << 2; 49213481Sgiacomo.travaglini@arm.com if (listener->stream() != NULL) { 49313481Sgiacomo.travaglini@arm.com // Verifies that we can stream to the listener's underlying stream 49413481Sgiacomo.travaglini@arm.com // too. 49513481Sgiacomo.travaglini@arm.com *listener->stream() << " == " << (x % 2); 49613481Sgiacomo.travaglini@arm.com } 49713481Sgiacomo.travaglini@arm.com return (x % 2) == 0; 49813481Sgiacomo.travaglini@arm.com } 49913481Sgiacomo.travaglini@arm.com}; 50013481Sgiacomo.travaglini@arm.com 50113481Sgiacomo.travaglini@arm.comPolymorphicMatcher<PolymorphicIsEvenImpl> PolymorphicIsEven() { 50213481Sgiacomo.travaglini@arm.com return MakePolymorphicMatcher(PolymorphicIsEvenImpl()); 50313481Sgiacomo.travaglini@arm.com} 50413481Sgiacomo.travaglini@arm.com 50513481Sgiacomo.travaglini@arm.comTEST(MakePolymorphicMatcherTest, ConstructsMatcherUsingNewAPI) { 50613481Sgiacomo.travaglini@arm.com // Using PolymorphicIsEven() as a Matcher<int>. 50713481Sgiacomo.travaglini@arm.com const Matcher<int> m1 = PolymorphicIsEven(); 50813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(42)); 50913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(43)); 51013481Sgiacomo.travaglini@arm.com EXPECT_EQ("is even", Describe(m1)); 51113481Sgiacomo.travaglini@arm.com 51213481Sgiacomo.travaglini@arm.com const Matcher<int> not_m1 = Not(m1); 51313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is odd", Describe(not_m1)); 51413481Sgiacomo.travaglini@arm.com 51513481Sgiacomo.travaglini@arm.com EXPECT_EQ("% 2 == 0", Explain(m1, 42)); 51613481Sgiacomo.travaglini@arm.com 51713481Sgiacomo.travaglini@arm.com // Using PolymorphicIsEven() as a Matcher<char>. 51813481Sgiacomo.travaglini@arm.com const Matcher<char> m2 = PolymorphicIsEven(); 51913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches('\x42')); 52013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches('\x43')); 52113481Sgiacomo.travaglini@arm.com EXPECT_EQ("is even", Describe(m2)); 52213481Sgiacomo.travaglini@arm.com 52313481Sgiacomo.travaglini@arm.com const Matcher<char> not_m2 = Not(m2); 52413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is odd", Describe(not_m2)); 52513481Sgiacomo.travaglini@arm.com 52613481Sgiacomo.travaglini@arm.com EXPECT_EQ("% 2 == 0", Explain(m2, '\x42')); 52713481Sgiacomo.travaglini@arm.com} 52813481Sgiacomo.travaglini@arm.com 52913481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<T>(m) works when m is a polymorphic matcher. 53013481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromPolymorphicMatcher) { 53113481Sgiacomo.travaglini@arm.com Matcher<int> m = MatcherCast<int>(Eq(5)); 53213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(5)); 53313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(6)); 53413481Sgiacomo.travaglini@arm.com} 53513481Sgiacomo.travaglini@arm.com 53613481Sgiacomo.travaglini@arm.com// For testing casting matchers between compatible types. 53713481Sgiacomo.travaglini@arm.comclass IntValue { 53813481Sgiacomo.travaglini@arm.com public: 53913481Sgiacomo.travaglini@arm.com // An int can be statically (although not implicitly) cast to a 54013481Sgiacomo.travaglini@arm.com // IntValue. 54113481Sgiacomo.travaglini@arm.com explicit IntValue(int a_value) : value_(a_value) {} 54213481Sgiacomo.travaglini@arm.com 54313481Sgiacomo.travaglini@arm.com int value() const { return value_; } 54413481Sgiacomo.travaglini@arm.com private: 54513481Sgiacomo.travaglini@arm.com int value_; 54613481Sgiacomo.travaglini@arm.com}; 54713481Sgiacomo.travaglini@arm.com 54813481Sgiacomo.travaglini@arm.com// For testing casting matchers between compatible types. 54913481Sgiacomo.travaglini@arm.combool IsPositiveIntValue(const IntValue& foo) { 55013481Sgiacomo.travaglini@arm.com return foo.value() > 0; 55113481Sgiacomo.travaglini@arm.com} 55213481Sgiacomo.travaglini@arm.com 55313481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<T>(m) works when m is a Matcher<U> where T 55413481Sgiacomo.travaglini@arm.com// can be statically converted to U. 55513481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromCompatibleType) { 55613481Sgiacomo.travaglini@arm.com Matcher<double> m1 = Eq(2.0); 55713481Sgiacomo.travaglini@arm.com Matcher<int> m2 = MatcherCast<int>(m1); 55813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(2)); 55913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(3)); 56013481Sgiacomo.travaglini@arm.com 56113481Sgiacomo.travaglini@arm.com Matcher<IntValue> m3 = Truly(IsPositiveIntValue); 56213481Sgiacomo.travaglini@arm.com Matcher<int> m4 = MatcherCast<int>(m3); 56313481Sgiacomo.travaglini@arm.com // In the following, the arguments 1 and 0 are statically converted 56413481Sgiacomo.travaglini@arm.com // to IntValue objects, and then tested by the IsPositiveIntValue() 56513481Sgiacomo.travaglini@arm.com // predicate. 56613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m4.Matches(1)); 56713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m4.Matches(0)); 56813481Sgiacomo.travaglini@arm.com} 56913481Sgiacomo.travaglini@arm.com 57013481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<T>(m) works when m is a Matcher<const T&>. 57113481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromConstReferenceToNonReference) { 57213481Sgiacomo.travaglini@arm.com Matcher<const int&> m1 = Eq(0); 57313481Sgiacomo.travaglini@arm.com Matcher<int> m2 = MatcherCast<int>(m1); 57413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0)); 57513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(1)); 57613481Sgiacomo.travaglini@arm.com} 57713481Sgiacomo.travaglini@arm.com 57813481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<T>(m) works when m is a Matcher<T&>. 57913481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromReferenceToNonReference) { 58013481Sgiacomo.travaglini@arm.com Matcher<int&> m1 = Eq(0); 58113481Sgiacomo.travaglini@arm.com Matcher<int> m2 = MatcherCast<int>(m1); 58213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0)); 58313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(1)); 58413481Sgiacomo.travaglini@arm.com} 58513481Sgiacomo.travaglini@arm.com 58613481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 58713481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromNonReferenceToConstReference) { 58813481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Eq(0); 58913481Sgiacomo.travaglini@arm.com Matcher<const int&> m2 = MatcherCast<const int&>(m1); 59013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0)); 59113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(1)); 59213481Sgiacomo.travaglini@arm.com} 59313481Sgiacomo.travaglini@arm.com 59413481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<T&>(m) works when m is a Matcher<T>. 59513481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromNonReferenceToReference) { 59613481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Eq(0); 59713481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = MatcherCast<int&>(m1); 59813481Sgiacomo.travaglini@arm.com int n = 0; 59913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(n)); 60013481Sgiacomo.travaglini@arm.com n = 1; 60113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(n)); 60213481Sgiacomo.travaglini@arm.com} 60313481Sgiacomo.travaglini@arm.com 60413481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<T>(m) works when m is a Matcher<T>. 60513481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromSameType) { 60613481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Eq(0); 60713481Sgiacomo.travaglini@arm.com Matcher<int> m2 = MatcherCast<int>(m1); 60813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0)); 60913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(1)); 61013481Sgiacomo.travaglini@arm.com} 61113481Sgiacomo.travaglini@arm.com 61213481Sgiacomo.travaglini@arm.com// Implicitly convertible from any type. 61313481Sgiacomo.travaglini@arm.comstruct ConvertibleFromAny { 61413481Sgiacomo.travaglini@arm.com ConvertibleFromAny(int a_value) : value(a_value) {} 61513481Sgiacomo.travaglini@arm.com template <typename T> 61613481Sgiacomo.travaglini@arm.com explicit ConvertibleFromAny(const T& /*a_value*/) : value(-1) { 61713481Sgiacomo.travaglini@arm.com ADD_FAILURE() << "Conversion constructor called"; 61813481Sgiacomo.travaglini@arm.com } 61913481Sgiacomo.travaglini@arm.com int value; 62013481Sgiacomo.travaglini@arm.com}; 62113481Sgiacomo.travaglini@arm.com 62213481Sgiacomo.travaglini@arm.combool operator==(const ConvertibleFromAny& a, const ConvertibleFromAny& b) { 62313481Sgiacomo.travaglini@arm.com return a.value == b.value; 62413481Sgiacomo.travaglini@arm.com} 62513481Sgiacomo.travaglini@arm.com 62613481Sgiacomo.travaglini@arm.comostream& operator<<(ostream& os, const ConvertibleFromAny& a) { 62713481Sgiacomo.travaglini@arm.com return os << a.value; 62813481Sgiacomo.travaglini@arm.com} 62913481Sgiacomo.travaglini@arm.com 63013481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, ConversionConstructorIsUsed) { 63113481Sgiacomo.travaglini@arm.com Matcher<ConvertibleFromAny> m = MatcherCast<ConvertibleFromAny>(1); 63213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 63313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 63413481Sgiacomo.travaglini@arm.com} 63513481Sgiacomo.travaglini@arm.com 63613481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, FromConvertibleFromAny) { 63713481Sgiacomo.travaglini@arm.com Matcher<ConvertibleFromAny> m = 63813481Sgiacomo.travaglini@arm.com MatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 63913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 64013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 64113481Sgiacomo.travaglini@arm.com} 64213481Sgiacomo.travaglini@arm.com 64313481Sgiacomo.travaglini@arm.comstruct IntReferenceWrapper { 64413481Sgiacomo.travaglini@arm.com IntReferenceWrapper(const int& a_value) : value(&a_value) {} 64513481Sgiacomo.travaglini@arm.com const int* value; 64613481Sgiacomo.travaglini@arm.com}; 64713481Sgiacomo.travaglini@arm.com 64813481Sgiacomo.travaglini@arm.combool operator==(const IntReferenceWrapper& a, const IntReferenceWrapper& b) { 64913481Sgiacomo.travaglini@arm.com return a.value == b.value; 65013481Sgiacomo.travaglini@arm.com} 65113481Sgiacomo.travaglini@arm.com 65213481Sgiacomo.travaglini@arm.comTEST(MatcherCastTest, ValueIsNotCopied) { 65313481Sgiacomo.travaglini@arm.com int n = 42; 65413481Sgiacomo.travaglini@arm.com Matcher<IntReferenceWrapper> m = MatcherCast<IntReferenceWrapper>(n); 65513481Sgiacomo.travaglini@arm.com // Verify that the matcher holds a reference to n, not to its temporary copy. 65613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(n)); 65713481Sgiacomo.travaglini@arm.com} 65813481Sgiacomo.travaglini@arm.com 65913481Sgiacomo.travaglini@arm.comclass Base { 66013481Sgiacomo.travaglini@arm.com public: 66113481Sgiacomo.travaglini@arm.com virtual ~Base() {} 66213481Sgiacomo.travaglini@arm.com Base() {} 66313481Sgiacomo.travaglini@arm.com private: 66413481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(Base); 66513481Sgiacomo.travaglini@arm.com}; 66613481Sgiacomo.travaglini@arm.com 66713481Sgiacomo.travaglini@arm.comclass Derived : public Base { 66813481Sgiacomo.travaglini@arm.com public: 66913481Sgiacomo.travaglini@arm.com Derived() : Base() {} 67013481Sgiacomo.travaglini@arm.com int i; 67113481Sgiacomo.travaglini@arm.com}; 67213481Sgiacomo.travaglini@arm.com 67313481Sgiacomo.travaglini@arm.comclass OtherDerived : public Base {}; 67413481Sgiacomo.travaglini@arm.com 67513481Sgiacomo.travaglini@arm.com// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher. 67613481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromPolymorphicMatcher) { 67713481Sgiacomo.travaglini@arm.com Matcher<char> m2 = SafeMatcherCast<char>(Eq(32)); 67813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(' ')); 67913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches('\n')); 68013481Sgiacomo.travaglini@arm.com} 68113481Sgiacomo.travaglini@arm.com 68213481Sgiacomo.travaglini@arm.com// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where 68313481Sgiacomo.travaglini@arm.com// T and U are arithmetic types and T can be losslessly converted to 68413481Sgiacomo.travaglini@arm.com// U. 68513481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromLosslesslyConvertibleArithmeticType) { 68613481Sgiacomo.travaglini@arm.com Matcher<double> m1 = DoubleEq(1.0); 68713481Sgiacomo.travaglini@arm.com Matcher<float> m2 = SafeMatcherCast<float>(m1); 68813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(1.0f)); 68913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(2.0f)); 69013481Sgiacomo.travaglini@arm.com 69113481Sgiacomo.travaglini@arm.com Matcher<char> m3 = SafeMatcherCast<char>(TypedEq<int>('a')); 69213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches('a')); 69313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches('b')); 69413481Sgiacomo.travaglini@arm.com} 69513481Sgiacomo.travaglini@arm.com 69613481Sgiacomo.travaglini@arm.com// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<U> where T and U 69713481Sgiacomo.travaglini@arm.com// are pointers or references to a derived and a base class, correspondingly. 69813481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromBaseClass) { 69913481Sgiacomo.travaglini@arm.com Derived d, d2; 70013481Sgiacomo.travaglini@arm.com Matcher<Base*> m1 = Eq(&d); 70113481Sgiacomo.travaglini@arm.com Matcher<Derived*> m2 = SafeMatcherCast<Derived*>(m1); 70213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(&d)); 70313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(&d2)); 70413481Sgiacomo.travaglini@arm.com 70513481Sgiacomo.travaglini@arm.com Matcher<Base&> m3 = Ref(d); 70613481Sgiacomo.travaglini@arm.com Matcher<Derived&> m4 = SafeMatcherCast<Derived&>(m3); 70713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m4.Matches(d)); 70813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m4.Matches(d2)); 70913481Sgiacomo.travaglini@arm.com} 71013481Sgiacomo.travaglini@arm.com 71113481Sgiacomo.travaglini@arm.com// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<const T&>. 71213481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromConstReferenceToReference) { 71313481Sgiacomo.travaglini@arm.com int n = 0; 71413481Sgiacomo.travaglini@arm.com Matcher<const int&> m1 = Ref(n); 71513481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 71613481Sgiacomo.travaglini@arm.com int n1 = 0; 71713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(n)); 71813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(n1)); 71913481Sgiacomo.travaglini@arm.com} 72013481Sgiacomo.travaglini@arm.com 72113481Sgiacomo.travaglini@arm.com// Tests that MatcherCast<const T&>(m) works when m is a Matcher<T>. 72213481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromNonReferenceToConstReference) { 72313481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Eq(0); 72413481Sgiacomo.travaglini@arm.com Matcher<const int&> m2 = SafeMatcherCast<const int&>(m1); 72513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0)); 72613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(1)); 72713481Sgiacomo.travaglini@arm.com} 72813481Sgiacomo.travaglini@arm.com 72913481Sgiacomo.travaglini@arm.com// Tests that SafeMatcherCast<T&>(m) works when m is a Matcher<T>. 73013481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromNonReferenceToReference) { 73113481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Eq(0); 73213481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = SafeMatcherCast<int&>(m1); 73313481Sgiacomo.travaglini@arm.com int n = 0; 73413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(n)); 73513481Sgiacomo.travaglini@arm.com n = 1; 73613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(n)); 73713481Sgiacomo.travaglini@arm.com} 73813481Sgiacomo.travaglini@arm.com 73913481Sgiacomo.travaglini@arm.com// Tests that SafeMatcherCast<T>(m) works when m is a Matcher<T>. 74013481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromSameType) { 74113481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Eq(0); 74213481Sgiacomo.travaglini@arm.com Matcher<int> m2 = SafeMatcherCast<int>(m1); 74313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0)); 74413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(1)); 74513481Sgiacomo.travaglini@arm.com} 74613481Sgiacomo.travaglini@arm.com 74713481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, ConversionConstructorIsUsed) { 74813481Sgiacomo.travaglini@arm.com Matcher<ConvertibleFromAny> m = SafeMatcherCast<ConvertibleFromAny>(1); 74913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 75013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 75113481Sgiacomo.travaglini@arm.com} 75213481Sgiacomo.travaglini@arm.com 75313481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, FromConvertibleFromAny) { 75413481Sgiacomo.travaglini@arm.com Matcher<ConvertibleFromAny> m = 75513481Sgiacomo.travaglini@arm.com SafeMatcherCast<ConvertibleFromAny>(Eq(ConvertibleFromAny(1))); 75613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(ConvertibleFromAny(1))); 75713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(ConvertibleFromAny(2))); 75813481Sgiacomo.travaglini@arm.com} 75913481Sgiacomo.travaglini@arm.com 76013481Sgiacomo.travaglini@arm.comTEST(SafeMatcherCastTest, ValueIsNotCopied) { 76113481Sgiacomo.travaglini@arm.com int n = 42; 76213481Sgiacomo.travaglini@arm.com Matcher<IntReferenceWrapper> m = SafeMatcherCast<IntReferenceWrapper>(n); 76313481Sgiacomo.travaglini@arm.com // Verify that the matcher holds a reference to n, not to its temporary copy. 76413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(n)); 76513481Sgiacomo.travaglini@arm.com} 76613481Sgiacomo.travaglini@arm.com 76713481Sgiacomo.travaglini@arm.comTEST(ExpectThat, TakesLiterals) { 76813481Sgiacomo.travaglini@arm.com EXPECT_THAT(1, 1); 76913481Sgiacomo.travaglini@arm.com EXPECT_THAT(1.0, 1.0); 77013481Sgiacomo.travaglini@arm.com EXPECT_THAT(string(), ""); 77113481Sgiacomo.travaglini@arm.com} 77213481Sgiacomo.travaglini@arm.com 77313481Sgiacomo.travaglini@arm.comTEST(ExpectThat, TakesFunctions) { 77413481Sgiacomo.travaglini@arm.com struct Helper { 77513481Sgiacomo.travaglini@arm.com static void Func() {} 77613481Sgiacomo.travaglini@arm.com }; 77713481Sgiacomo.travaglini@arm.com void (*func)() = Helper::Func; 77813481Sgiacomo.travaglini@arm.com EXPECT_THAT(func, Helper::Func); 77913481Sgiacomo.travaglini@arm.com EXPECT_THAT(func, &Helper::Func); 78013481Sgiacomo.travaglini@arm.com} 78113481Sgiacomo.travaglini@arm.com 78213481Sgiacomo.travaglini@arm.com// Tests that A<T>() matches any value of type T. 78313481Sgiacomo.travaglini@arm.comTEST(ATest, MatchesAnyValue) { 78413481Sgiacomo.travaglini@arm.com // Tests a matcher for a value type. 78513481Sgiacomo.travaglini@arm.com Matcher<double> m1 = A<double>(); 78613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(91.43)); 78713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(-15.32)); 78813481Sgiacomo.travaglini@arm.com 78913481Sgiacomo.travaglini@arm.com // Tests a matcher for a reference type. 79013481Sgiacomo.travaglini@arm.com int a = 2; 79113481Sgiacomo.travaglini@arm.com int b = -6; 79213481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = A<int&>(); 79313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(a)); 79413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(b)); 79513481Sgiacomo.travaglini@arm.com} 79613481Sgiacomo.travaglini@arm.com 79713481Sgiacomo.travaglini@arm.comTEST(ATest, WorksForDerivedClass) { 79813481Sgiacomo.travaglini@arm.com Base base; 79913481Sgiacomo.travaglini@arm.com Derived derived; 80013481Sgiacomo.travaglini@arm.com EXPECT_THAT(&base, A<Base*>()); 80113481Sgiacomo.travaglini@arm.com // This shouldn't compile: EXPECT_THAT(&base, A<Derived*>()); 80213481Sgiacomo.travaglini@arm.com EXPECT_THAT(&derived, A<Base*>()); 80313481Sgiacomo.travaglini@arm.com EXPECT_THAT(&derived, A<Derived*>()); 80413481Sgiacomo.travaglini@arm.com} 80513481Sgiacomo.travaglini@arm.com 80613481Sgiacomo.travaglini@arm.com// Tests that A<T>() describes itself properly. 80713481Sgiacomo.travaglini@arm.comTEST(ATest, CanDescribeSelf) { 80813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is anything", Describe(A<bool>())); 80913481Sgiacomo.travaglini@arm.com} 81013481Sgiacomo.travaglini@arm.com 81113481Sgiacomo.travaglini@arm.com// Tests that An<T>() matches any value of type T. 81213481Sgiacomo.travaglini@arm.comTEST(AnTest, MatchesAnyValue) { 81313481Sgiacomo.travaglini@arm.com // Tests a matcher for a value type. 81413481Sgiacomo.travaglini@arm.com Matcher<int> m1 = An<int>(); 81513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(9143)); 81613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(-1532)); 81713481Sgiacomo.travaglini@arm.com 81813481Sgiacomo.travaglini@arm.com // Tests a matcher for a reference type. 81913481Sgiacomo.travaglini@arm.com int a = 2; 82013481Sgiacomo.travaglini@arm.com int b = -6; 82113481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = An<int&>(); 82213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(a)); 82313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(b)); 82413481Sgiacomo.travaglini@arm.com} 82513481Sgiacomo.travaglini@arm.com 82613481Sgiacomo.travaglini@arm.com// Tests that An<T>() describes itself properly. 82713481Sgiacomo.travaglini@arm.comTEST(AnTest, CanDescribeSelf) { 82813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is anything", Describe(An<int>())); 82913481Sgiacomo.travaglini@arm.com} 83013481Sgiacomo.travaglini@arm.com 83113481Sgiacomo.travaglini@arm.com// Tests that _ can be used as a matcher for any type and matches any 83213481Sgiacomo.travaglini@arm.com// value of that type. 83313481Sgiacomo.travaglini@arm.comTEST(UnderscoreTest, MatchesAnyValue) { 83413481Sgiacomo.travaglini@arm.com // Uses _ as a matcher for a value type. 83513481Sgiacomo.travaglini@arm.com Matcher<int> m1 = _; 83613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(123)); 83713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(-242)); 83813481Sgiacomo.travaglini@arm.com 83913481Sgiacomo.travaglini@arm.com // Uses _ as a matcher for a reference type. 84013481Sgiacomo.travaglini@arm.com bool a = false; 84113481Sgiacomo.travaglini@arm.com const bool b = true; 84213481Sgiacomo.travaglini@arm.com Matcher<const bool&> m2 = _; 84313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(a)); 84413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(b)); 84513481Sgiacomo.travaglini@arm.com} 84613481Sgiacomo.travaglini@arm.com 84713481Sgiacomo.travaglini@arm.com// Tests that _ describes itself properly. 84813481Sgiacomo.travaglini@arm.comTEST(UnderscoreTest, CanDescribeSelf) { 84913481Sgiacomo.travaglini@arm.com Matcher<int> m = _; 85013481Sgiacomo.travaglini@arm.com EXPECT_EQ("is anything", Describe(m)); 85113481Sgiacomo.travaglini@arm.com} 85213481Sgiacomo.travaglini@arm.com 85313481Sgiacomo.travaglini@arm.com// Tests that Eq(x) matches any value equal to x. 85413481Sgiacomo.travaglini@arm.comTEST(EqTest, MatchesEqualValue) { 85513481Sgiacomo.travaglini@arm.com // 2 C-strings with same content but different addresses. 85613481Sgiacomo.travaglini@arm.com const char a1[] = "hi"; 85713481Sgiacomo.travaglini@arm.com const char a2[] = "hi"; 85813481Sgiacomo.travaglini@arm.com 85913481Sgiacomo.travaglini@arm.com Matcher<const char*> m1 = Eq(a1); 86013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(a1)); 86113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(a2)); 86213481Sgiacomo.travaglini@arm.com} 86313481Sgiacomo.travaglini@arm.com 86413481Sgiacomo.travaglini@arm.com// Tests that Eq(v) describes itself properly. 86513481Sgiacomo.travaglini@arm.com 86613481Sgiacomo.travaglini@arm.comclass Unprintable { 86713481Sgiacomo.travaglini@arm.com public: 86813481Sgiacomo.travaglini@arm.com Unprintable() : c_('a') {} 86913481Sgiacomo.travaglini@arm.com 87013481Sgiacomo.travaglini@arm.com private: 87113481Sgiacomo.travaglini@arm.com char c_; 87213481Sgiacomo.travaglini@arm.com}; 87313481Sgiacomo.travaglini@arm.com 87413481Sgiacomo.travaglini@arm.cominline bool operator==(const Unprintable& /* lhs */, 87513481Sgiacomo.travaglini@arm.com const Unprintable& /* rhs */) { 87613481Sgiacomo.travaglini@arm.com return true; 87713481Sgiacomo.travaglini@arm.com} 87813481Sgiacomo.travaglini@arm.com 87913481Sgiacomo.travaglini@arm.comTEST(EqTest, CanDescribeSelf) { 88013481Sgiacomo.travaglini@arm.com Matcher<Unprintable> m = Eq(Unprintable()); 88113481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to 1-byte object <61>", Describe(m)); 88213481Sgiacomo.travaglini@arm.com} 88313481Sgiacomo.travaglini@arm.com 88413481Sgiacomo.travaglini@arm.com// Tests that Eq(v) can be used to match any type that supports 88513481Sgiacomo.travaglini@arm.com// comparing with type T, where T is v's type. 88613481Sgiacomo.travaglini@arm.comTEST(EqTest, IsPolymorphic) { 88713481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Eq(1); 88813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(1)); 88913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(2)); 89013481Sgiacomo.travaglini@arm.com 89113481Sgiacomo.travaglini@arm.com Matcher<char> m2 = Eq(1); 89213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches('\1')); 89313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches('a')); 89413481Sgiacomo.travaglini@arm.com} 89513481Sgiacomo.travaglini@arm.com 89613481Sgiacomo.travaglini@arm.com// Tests that TypedEq<T>(v) matches values of type T that's equal to v. 89713481Sgiacomo.travaglini@arm.comTEST(TypedEqTest, ChecksEqualityForGivenType) { 89813481Sgiacomo.travaglini@arm.com Matcher<char> m1 = TypedEq<char>('a'); 89913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches('a')); 90013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches('b')); 90113481Sgiacomo.travaglini@arm.com 90213481Sgiacomo.travaglini@arm.com Matcher<int> m2 = TypedEq<int>(6); 90313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(6)); 90413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(7)); 90513481Sgiacomo.travaglini@arm.com} 90613481Sgiacomo.travaglini@arm.com 90713481Sgiacomo.travaglini@arm.com// Tests that TypedEq(v) describes itself properly. 90813481Sgiacomo.travaglini@arm.comTEST(TypedEqTest, CanDescribeSelf) { 90913481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to 2", Describe(TypedEq<int>(2))); 91013481Sgiacomo.travaglini@arm.com} 91113481Sgiacomo.travaglini@arm.com 91213481Sgiacomo.travaglini@arm.com// Tests that TypedEq<T>(v) has type Matcher<T>. 91313481Sgiacomo.travaglini@arm.com 91413481Sgiacomo.travaglini@arm.com// Type<T>::IsTypeOf(v) compiles iff the type of value v is T, where T 91513481Sgiacomo.travaglini@arm.com// is a "bare" type (i.e. not in the form of const U or U&). If v's 91613481Sgiacomo.travaglini@arm.com// type is not T, the compiler will generate a message about 91713481Sgiacomo.travaglini@arm.com// "undefined referece". 91813481Sgiacomo.travaglini@arm.comtemplate <typename T> 91913481Sgiacomo.travaglini@arm.comstruct Type { 92013481Sgiacomo.travaglini@arm.com static bool IsTypeOf(const T& /* v */) { return true; } 92113481Sgiacomo.travaglini@arm.com 92213481Sgiacomo.travaglini@arm.com template <typename T2> 92313481Sgiacomo.travaglini@arm.com static void IsTypeOf(T2 v); 92413481Sgiacomo.travaglini@arm.com}; 92513481Sgiacomo.travaglini@arm.com 92613481Sgiacomo.travaglini@arm.comTEST(TypedEqTest, HasSpecifiedType) { 92713481Sgiacomo.travaglini@arm.com // Verfies that the type of TypedEq<T>(v) is Matcher<T>. 92813481Sgiacomo.travaglini@arm.com Type<Matcher<int> >::IsTypeOf(TypedEq<int>(5)); 92913481Sgiacomo.travaglini@arm.com Type<Matcher<double> >::IsTypeOf(TypedEq<double>(5)); 93013481Sgiacomo.travaglini@arm.com} 93113481Sgiacomo.travaglini@arm.com 93213481Sgiacomo.travaglini@arm.com// Tests that Ge(v) matches anything >= v. 93313481Sgiacomo.travaglini@arm.comTEST(GeTest, ImplementsGreaterThanOrEqual) { 93413481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Ge(0); 93513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(1)); 93613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(0)); 93713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(-1)); 93813481Sgiacomo.travaglini@arm.com} 93913481Sgiacomo.travaglini@arm.com 94013481Sgiacomo.travaglini@arm.com// Tests that Ge(v) describes itself properly. 94113481Sgiacomo.travaglini@arm.comTEST(GeTest, CanDescribeSelf) { 94213481Sgiacomo.travaglini@arm.com Matcher<int> m = Ge(5); 94313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is >= 5", Describe(m)); 94413481Sgiacomo.travaglini@arm.com} 94513481Sgiacomo.travaglini@arm.com 94613481Sgiacomo.travaglini@arm.com// Tests that Gt(v) matches anything > v. 94713481Sgiacomo.travaglini@arm.comTEST(GtTest, ImplementsGreaterThan) { 94813481Sgiacomo.travaglini@arm.com Matcher<double> m1 = Gt(0); 94913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(1.0)); 95013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(0.0)); 95113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(-1.0)); 95213481Sgiacomo.travaglini@arm.com} 95313481Sgiacomo.travaglini@arm.com 95413481Sgiacomo.travaglini@arm.com// Tests that Gt(v) describes itself properly. 95513481Sgiacomo.travaglini@arm.comTEST(GtTest, CanDescribeSelf) { 95613481Sgiacomo.travaglini@arm.com Matcher<int> m = Gt(5); 95713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is > 5", Describe(m)); 95813481Sgiacomo.travaglini@arm.com} 95913481Sgiacomo.travaglini@arm.com 96013481Sgiacomo.travaglini@arm.com// Tests that Le(v) matches anything <= v. 96113481Sgiacomo.travaglini@arm.comTEST(LeTest, ImplementsLessThanOrEqual) { 96213481Sgiacomo.travaglini@arm.com Matcher<char> m1 = Le('b'); 96313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches('a')); 96413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches('b')); 96513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches('c')); 96613481Sgiacomo.travaglini@arm.com} 96713481Sgiacomo.travaglini@arm.com 96813481Sgiacomo.travaglini@arm.com// Tests that Le(v) describes itself properly. 96913481Sgiacomo.travaglini@arm.comTEST(LeTest, CanDescribeSelf) { 97013481Sgiacomo.travaglini@arm.com Matcher<int> m = Le(5); 97113481Sgiacomo.travaglini@arm.com EXPECT_EQ("is <= 5", Describe(m)); 97213481Sgiacomo.travaglini@arm.com} 97313481Sgiacomo.travaglini@arm.com 97413481Sgiacomo.travaglini@arm.com// Tests that Lt(v) matches anything < v. 97513481Sgiacomo.travaglini@arm.comTEST(LtTest, ImplementsLessThan) { 97613481Sgiacomo.travaglini@arm.com Matcher<const string&> m1 = Lt("Hello"); 97713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("Abc")); 97813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches("Hello")); 97913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches("Hello, world!")); 98013481Sgiacomo.travaglini@arm.com} 98113481Sgiacomo.travaglini@arm.com 98213481Sgiacomo.travaglini@arm.com// Tests that Lt(v) describes itself properly. 98313481Sgiacomo.travaglini@arm.comTEST(LtTest, CanDescribeSelf) { 98413481Sgiacomo.travaglini@arm.com Matcher<int> m = Lt(5); 98513481Sgiacomo.travaglini@arm.com EXPECT_EQ("is < 5", Describe(m)); 98613481Sgiacomo.travaglini@arm.com} 98713481Sgiacomo.travaglini@arm.com 98813481Sgiacomo.travaglini@arm.com// Tests that Ne(v) matches anything != v. 98913481Sgiacomo.travaglini@arm.comTEST(NeTest, ImplementsNotEqual) { 99013481Sgiacomo.travaglini@arm.com Matcher<int> m1 = Ne(0); 99113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(1)); 99213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(-1)); 99313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(0)); 99413481Sgiacomo.travaglini@arm.com} 99513481Sgiacomo.travaglini@arm.com 99613481Sgiacomo.travaglini@arm.com// Tests that Ne(v) describes itself properly. 99713481Sgiacomo.travaglini@arm.comTEST(NeTest, CanDescribeSelf) { 99813481Sgiacomo.travaglini@arm.com Matcher<int> m = Ne(5); 99913481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to 5", Describe(m)); 100013481Sgiacomo.travaglini@arm.com} 100113481Sgiacomo.travaglini@arm.com 100213481Sgiacomo.travaglini@arm.com// Tests that IsNull() matches any NULL pointer of any type. 100313481Sgiacomo.travaglini@arm.comTEST(IsNullTest, MatchesNullPointer) { 100413481Sgiacomo.travaglini@arm.com Matcher<int*> m1 = IsNull(); 100513481Sgiacomo.travaglini@arm.com int* p1 = NULL; 100613481Sgiacomo.travaglini@arm.com int n = 0; 100713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(p1)); 100813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(&n)); 100913481Sgiacomo.travaglini@arm.com 101013481Sgiacomo.travaglini@arm.com Matcher<const char*> m2 = IsNull(); 101113481Sgiacomo.travaglini@arm.com const char* p2 = NULL; 101213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(p2)); 101313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("hi")); 101413481Sgiacomo.travaglini@arm.com 101513481Sgiacomo.travaglini@arm.com#if !GTEST_OS_SYMBIAN 101613481Sgiacomo.travaglini@arm.com // Nokia's Symbian compiler generates: 101713481Sgiacomo.travaglini@arm.com // gmock-matchers.h: ambiguous access to overloaded function 101813481Sgiacomo.travaglini@arm.com // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(void *)' 101913481Sgiacomo.travaglini@arm.com // gmock-matchers.h: 'testing::Matcher<void *>::Matcher(const testing:: 102013481Sgiacomo.travaglini@arm.com // MatcherInterface<void *> *)' 102113481Sgiacomo.travaglini@arm.com // gmock-matchers.h: (point of instantiation: 'testing:: 102213481Sgiacomo.travaglini@arm.com // gmock_matchers_test::IsNullTest_MatchesNullPointer_Test::TestBody()') 102313481Sgiacomo.travaglini@arm.com // gmock-matchers.h: (instantiating: 'testing::PolymorphicMatc 102413481Sgiacomo.travaglini@arm.com Matcher<void*> m3 = IsNull(); 102513481Sgiacomo.travaglini@arm.com void* p3 = NULL; 102613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(p3)); 102713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(reinterpret_cast<void*>(0xbeef))); 102813481Sgiacomo.travaglini@arm.com#endif 102913481Sgiacomo.travaglini@arm.com} 103013481Sgiacomo.travaglini@arm.com 103113481Sgiacomo.travaglini@arm.comTEST(IsNullTest, LinkedPtr) { 103213481Sgiacomo.travaglini@arm.com const Matcher<linked_ptr<int> > m = IsNull(); 103313481Sgiacomo.travaglini@arm.com const linked_ptr<int> null_p; 103413481Sgiacomo.travaglini@arm.com const linked_ptr<int> non_null_p(new int); 103513481Sgiacomo.travaglini@arm.com 103613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(null_p)); 103713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(non_null_p)); 103813481Sgiacomo.travaglini@arm.com} 103913481Sgiacomo.travaglini@arm.com 104013481Sgiacomo.travaglini@arm.comTEST(IsNullTest, ReferenceToConstLinkedPtr) { 104113481Sgiacomo.travaglini@arm.com const Matcher<const linked_ptr<double>&> m = IsNull(); 104213481Sgiacomo.travaglini@arm.com const linked_ptr<double> null_p; 104313481Sgiacomo.travaglini@arm.com const linked_ptr<double> non_null_p(new double); 104413481Sgiacomo.travaglini@arm.com 104513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(null_p)); 104613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(non_null_p)); 104713481Sgiacomo.travaglini@arm.com} 104813481Sgiacomo.travaglini@arm.com 104913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_ 105013481Sgiacomo.travaglini@arm.comTEST(IsNullTest, StdFunction) { 105113481Sgiacomo.travaglini@arm.com const Matcher<std::function<void()>> m = IsNull(); 105213481Sgiacomo.travaglini@arm.com 105313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(std::function<void()>())); 105413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches([]{})); 105513481Sgiacomo.travaglini@arm.com} 105613481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_FUNCTION_ 105713481Sgiacomo.travaglini@arm.com 105813481Sgiacomo.travaglini@arm.com// Tests that IsNull() describes itself properly. 105913481Sgiacomo.travaglini@arm.comTEST(IsNullTest, CanDescribeSelf) { 106013481Sgiacomo.travaglini@arm.com Matcher<int*> m = IsNull(); 106113481Sgiacomo.travaglini@arm.com EXPECT_EQ("is NULL", Describe(m)); 106213481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't NULL", DescribeNegation(m)); 106313481Sgiacomo.travaglini@arm.com} 106413481Sgiacomo.travaglini@arm.com 106513481Sgiacomo.travaglini@arm.com// Tests that NotNull() matches any non-NULL pointer of any type. 106613481Sgiacomo.travaglini@arm.comTEST(NotNullTest, MatchesNonNullPointer) { 106713481Sgiacomo.travaglini@arm.com Matcher<int*> m1 = NotNull(); 106813481Sgiacomo.travaglini@arm.com int* p1 = NULL; 106913481Sgiacomo.travaglini@arm.com int n = 0; 107013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(p1)); 107113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(&n)); 107213481Sgiacomo.travaglini@arm.com 107313481Sgiacomo.travaglini@arm.com Matcher<const char*> m2 = NotNull(); 107413481Sgiacomo.travaglini@arm.com const char* p2 = NULL; 107513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(p2)); 107613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("hi")); 107713481Sgiacomo.travaglini@arm.com} 107813481Sgiacomo.travaglini@arm.com 107913481Sgiacomo.travaglini@arm.comTEST(NotNullTest, LinkedPtr) { 108013481Sgiacomo.travaglini@arm.com const Matcher<linked_ptr<int> > m = NotNull(); 108113481Sgiacomo.travaglini@arm.com const linked_ptr<int> null_p; 108213481Sgiacomo.travaglini@arm.com const linked_ptr<int> non_null_p(new int); 108313481Sgiacomo.travaglini@arm.com 108413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(null_p)); 108513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(non_null_p)); 108613481Sgiacomo.travaglini@arm.com} 108713481Sgiacomo.travaglini@arm.com 108813481Sgiacomo.travaglini@arm.comTEST(NotNullTest, ReferenceToConstLinkedPtr) { 108913481Sgiacomo.travaglini@arm.com const Matcher<const linked_ptr<double>&> m = NotNull(); 109013481Sgiacomo.travaglini@arm.com const linked_ptr<double> null_p; 109113481Sgiacomo.travaglini@arm.com const linked_ptr<double> non_null_p(new double); 109213481Sgiacomo.travaglini@arm.com 109313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(null_p)); 109413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(non_null_p)); 109513481Sgiacomo.travaglini@arm.com} 109613481Sgiacomo.travaglini@arm.com 109713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_ 109813481Sgiacomo.travaglini@arm.comTEST(NotNullTest, StdFunction) { 109913481Sgiacomo.travaglini@arm.com const Matcher<std::function<void()>> m = NotNull(); 110013481Sgiacomo.travaglini@arm.com 110113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches([]{})); 110213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(std::function<void()>())); 110313481Sgiacomo.travaglini@arm.com} 110413481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_FUNCTION_ 110513481Sgiacomo.travaglini@arm.com 110613481Sgiacomo.travaglini@arm.com// Tests that NotNull() describes itself properly. 110713481Sgiacomo.travaglini@arm.comTEST(NotNullTest, CanDescribeSelf) { 110813481Sgiacomo.travaglini@arm.com Matcher<int*> m = NotNull(); 110913481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't NULL", Describe(m)); 111013481Sgiacomo.travaglini@arm.com} 111113481Sgiacomo.travaglini@arm.com 111213481Sgiacomo.travaglini@arm.com// Tests that Ref(variable) matches an argument that references 111313481Sgiacomo.travaglini@arm.com// 'variable'. 111413481Sgiacomo.travaglini@arm.comTEST(RefTest, MatchesSameVariable) { 111513481Sgiacomo.travaglini@arm.com int a = 0; 111613481Sgiacomo.travaglini@arm.com int b = 0; 111713481Sgiacomo.travaglini@arm.com Matcher<int&> m = Ref(a); 111813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 111913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(b)); 112013481Sgiacomo.travaglini@arm.com} 112113481Sgiacomo.travaglini@arm.com 112213481Sgiacomo.travaglini@arm.com// Tests that Ref(variable) describes itself properly. 112313481Sgiacomo.travaglini@arm.comTEST(RefTest, CanDescribeSelf) { 112413481Sgiacomo.travaglini@arm.com int n = 5; 112513481Sgiacomo.travaglini@arm.com Matcher<int&> m = Ref(n); 112613481Sgiacomo.travaglini@arm.com stringstream ss; 112713481Sgiacomo.travaglini@arm.com ss << "references the variable @" << &n << " 5"; 112813481Sgiacomo.travaglini@arm.com EXPECT_EQ(string(ss.str()), Describe(m)); 112913481Sgiacomo.travaglini@arm.com} 113013481Sgiacomo.travaglini@arm.com 113113481Sgiacomo.travaglini@arm.com// Test that Ref(non_const_varialbe) can be used as a matcher for a 113213481Sgiacomo.travaglini@arm.com// const reference. 113313481Sgiacomo.travaglini@arm.comTEST(RefTest, CanBeUsedAsMatcherForConstReference) { 113413481Sgiacomo.travaglini@arm.com int a = 0; 113513481Sgiacomo.travaglini@arm.com int b = 0; 113613481Sgiacomo.travaglini@arm.com Matcher<const int&> m = Ref(a); 113713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 113813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(b)); 113913481Sgiacomo.travaglini@arm.com} 114013481Sgiacomo.travaglini@arm.com 114113481Sgiacomo.travaglini@arm.com// Tests that Ref(variable) is covariant, i.e. Ref(derived) can be 114213481Sgiacomo.travaglini@arm.com// used wherever Ref(base) can be used (Ref(derived) is a sub-type 114313481Sgiacomo.travaglini@arm.com// of Ref(base), but not vice versa. 114413481Sgiacomo.travaglini@arm.com 114513481Sgiacomo.travaglini@arm.comTEST(RefTest, IsCovariant) { 114613481Sgiacomo.travaglini@arm.com Base base, base2; 114713481Sgiacomo.travaglini@arm.com Derived derived; 114813481Sgiacomo.travaglini@arm.com Matcher<const Base&> m1 = Ref(base); 114913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(base)); 115013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(base2)); 115113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(derived)); 115213481Sgiacomo.travaglini@arm.com 115313481Sgiacomo.travaglini@arm.com m1 = Ref(derived); 115413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(derived)); 115513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(base)); 115613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(base2)); 115713481Sgiacomo.travaglini@arm.com} 115813481Sgiacomo.travaglini@arm.com 115913481Sgiacomo.travaglini@arm.comTEST(RefTest, ExplainsResult) { 116013481Sgiacomo.travaglini@arm.com int n = 0; 116113481Sgiacomo.travaglini@arm.com EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), n), 116213481Sgiacomo.travaglini@arm.com StartsWith("which is located @")); 116313481Sgiacomo.travaglini@arm.com 116413481Sgiacomo.travaglini@arm.com int m = 0; 116513481Sgiacomo.travaglini@arm.com EXPECT_THAT(Explain(Matcher<const int&>(Ref(n)), m), 116613481Sgiacomo.travaglini@arm.com StartsWith("which is located @")); 116713481Sgiacomo.travaglini@arm.com} 116813481Sgiacomo.travaglini@arm.com 116913481Sgiacomo.travaglini@arm.com// Tests string comparison matchers. 117013481Sgiacomo.travaglini@arm.com 117113481Sgiacomo.travaglini@arm.comTEST(StrEqTest, MatchesEqualString) { 117213481Sgiacomo.travaglini@arm.com Matcher<const char*> m = StrEq(string("Hello")); 117313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches("Hello")); 117413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches("hello")); 117513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 117613481Sgiacomo.travaglini@arm.com 117713481Sgiacomo.travaglini@arm.com Matcher<const string&> m2 = StrEq("Hello"); 117813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("Hello")); 117913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("Hi")); 118013481Sgiacomo.travaglini@arm.com} 118113481Sgiacomo.travaglini@arm.com 118213481Sgiacomo.travaglini@arm.comTEST(StrEqTest, CanDescribeSelf) { 118313481Sgiacomo.travaglini@arm.com Matcher<string> m = StrEq("Hi-\'\"?\\\a\b\f\n\r\t\v\xD3"); 118413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to \"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\\xD3\"", 118513481Sgiacomo.travaglini@arm.com Describe(m)); 118613481Sgiacomo.travaglini@arm.com 118713481Sgiacomo.travaglini@arm.com string str("01204500800"); 118813481Sgiacomo.travaglini@arm.com str[3] = '\0'; 118913481Sgiacomo.travaglini@arm.com Matcher<string> m2 = StrEq(str); 119013481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to \"012\\04500800\"", Describe(m2)); 119113481Sgiacomo.travaglini@arm.com str[0] = str[6] = str[7] = str[9] = str[10] = '\0'; 119213481Sgiacomo.travaglini@arm.com Matcher<string> m3 = StrEq(str); 119313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to \"\\012\\045\\0\\08\\0\\0\"", Describe(m3)); 119413481Sgiacomo.travaglini@arm.com} 119513481Sgiacomo.travaglini@arm.com 119613481Sgiacomo.travaglini@arm.comTEST(StrNeTest, MatchesUnequalString) { 119713481Sgiacomo.travaglini@arm.com Matcher<const char*> m = StrNe("Hello"); 119813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches("")); 119913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(NULL)); 120013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches("Hello")); 120113481Sgiacomo.travaglini@arm.com 120213481Sgiacomo.travaglini@arm.com Matcher<string> m2 = StrNe(string("Hello")); 120313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("hello")); 120413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("Hello")); 120513481Sgiacomo.travaglini@arm.com} 120613481Sgiacomo.travaglini@arm.com 120713481Sgiacomo.travaglini@arm.comTEST(StrNeTest, CanDescribeSelf) { 120813481Sgiacomo.travaglini@arm.com Matcher<const char*> m = StrNe("Hi"); 120913481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to \"Hi\"", Describe(m)); 121013481Sgiacomo.travaglini@arm.com} 121113481Sgiacomo.travaglini@arm.com 121213481Sgiacomo.travaglini@arm.comTEST(StrCaseEqTest, MatchesEqualStringIgnoringCase) { 121313481Sgiacomo.travaglini@arm.com Matcher<const char*> m = StrCaseEq(string("Hello")); 121413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches("Hello")); 121513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches("hello")); 121613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches("Hi")); 121713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 121813481Sgiacomo.travaglini@arm.com 121913481Sgiacomo.travaglini@arm.com Matcher<const string&> m2 = StrCaseEq("Hello"); 122013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("hello")); 122113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("Hi")); 122213481Sgiacomo.travaglini@arm.com} 122313481Sgiacomo.travaglini@arm.com 122413481Sgiacomo.travaglini@arm.comTEST(StrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 122513481Sgiacomo.travaglini@arm.com string str1("oabocdooeoo"); 122613481Sgiacomo.travaglini@arm.com string str2("OABOCDOOEOO"); 122713481Sgiacomo.travaglini@arm.com Matcher<const string&> m0 = StrCaseEq(str1); 122813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m0.Matches(str2 + string(1, '\0'))); 122913481Sgiacomo.travaglini@arm.com 123013481Sgiacomo.travaglini@arm.com str1[3] = str2[3] = '\0'; 123113481Sgiacomo.travaglini@arm.com Matcher<const string&> m1 = StrCaseEq(str1); 123213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(str2)); 123313481Sgiacomo.travaglini@arm.com 123413481Sgiacomo.travaglini@arm.com str1[0] = str1[6] = str1[7] = str1[10] = '\0'; 123513481Sgiacomo.travaglini@arm.com str2[0] = str2[6] = str2[7] = str2[10] = '\0'; 123613481Sgiacomo.travaglini@arm.com Matcher<const string&> m2 = StrCaseEq(str1); 123713481Sgiacomo.travaglini@arm.com str1[9] = str2[9] = '\0'; 123813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(str2)); 123913481Sgiacomo.travaglini@arm.com 124013481Sgiacomo.travaglini@arm.com Matcher<const string&> m3 = StrCaseEq(str1); 124113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(str2)); 124213481Sgiacomo.travaglini@arm.com 124313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(str2 + "x")); 124413481Sgiacomo.travaglini@arm.com str2.append(1, '\0'); 124513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(str2)); 124613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(string(str2, 0, 9))); 124713481Sgiacomo.travaglini@arm.com} 124813481Sgiacomo.travaglini@arm.com 124913481Sgiacomo.travaglini@arm.comTEST(StrCaseEqTest, CanDescribeSelf) { 125013481Sgiacomo.travaglini@arm.com Matcher<string> m = StrCaseEq("Hi"); 125113481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to (ignoring case) \"Hi\"", Describe(m)); 125213481Sgiacomo.travaglini@arm.com} 125313481Sgiacomo.travaglini@arm.com 125413481Sgiacomo.travaglini@arm.comTEST(StrCaseNeTest, MatchesUnequalStringIgnoringCase) { 125513481Sgiacomo.travaglini@arm.com Matcher<const char*> m = StrCaseNe("Hello"); 125613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches("Hi")); 125713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(NULL)); 125813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches("Hello")); 125913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches("hello")); 126013481Sgiacomo.travaglini@arm.com 126113481Sgiacomo.travaglini@arm.com Matcher<string> m2 = StrCaseNe(string("Hello")); 126213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("")); 126313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("Hello")); 126413481Sgiacomo.travaglini@arm.com} 126513481Sgiacomo.travaglini@arm.com 126613481Sgiacomo.travaglini@arm.comTEST(StrCaseNeTest, CanDescribeSelf) { 126713481Sgiacomo.travaglini@arm.com Matcher<const char*> m = StrCaseNe("Hi"); 126813481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to (ignoring case) \"Hi\"", Describe(m)); 126913481Sgiacomo.travaglini@arm.com} 127013481Sgiacomo.travaglini@arm.com 127113481Sgiacomo.travaglini@arm.com// Tests that HasSubstr() works for matching string-typed values. 127213481Sgiacomo.travaglini@arm.comTEST(HasSubstrTest, WorksForStringClasses) { 127313481Sgiacomo.travaglini@arm.com const Matcher<string> m1 = HasSubstr("foo"); 127413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(string("I love food."))); 127513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(string("tofo"))); 127613481Sgiacomo.travaglini@arm.com 127713481Sgiacomo.travaglini@arm.com const Matcher<const std::string&> m2 = HasSubstr("foo"); 127813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(std::string("I love food."))); 127913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(std::string("tofo"))); 128013481Sgiacomo.travaglini@arm.com} 128113481Sgiacomo.travaglini@arm.com 128213481Sgiacomo.travaglini@arm.com// Tests that HasSubstr() works for matching C-string-typed values. 128313481Sgiacomo.travaglini@arm.comTEST(HasSubstrTest, WorksForCStrings) { 128413481Sgiacomo.travaglini@arm.com const Matcher<char*> m1 = HasSubstr("foo"); 128513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(const_cast<char*>("I love food."))); 128613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(const_cast<char*>("tofo"))); 128713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 128813481Sgiacomo.travaglini@arm.com 128913481Sgiacomo.travaglini@arm.com const Matcher<const char*> m2 = HasSubstr("foo"); 129013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("I love food.")); 129113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("tofo")); 129213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(NULL)); 129313481Sgiacomo.travaglini@arm.com} 129413481Sgiacomo.travaglini@arm.com 129513481Sgiacomo.travaglini@arm.com// Tests that HasSubstr(s) describes itself properly. 129613481Sgiacomo.travaglini@arm.comTEST(HasSubstrTest, CanDescribeSelf) { 129713481Sgiacomo.travaglini@arm.com Matcher<string> m = HasSubstr("foo\n\""); 129813481Sgiacomo.travaglini@arm.com EXPECT_EQ("has substring \"foo\\n\\\"\"", Describe(m)); 129913481Sgiacomo.travaglini@arm.com} 130013481Sgiacomo.travaglini@arm.com 130113481Sgiacomo.travaglini@arm.comTEST(KeyTest, CanDescribeSelf) { 130213481Sgiacomo.travaglini@arm.com Matcher<const pair<std::string, int>&> m = Key("foo"); 130313481Sgiacomo.travaglini@arm.com EXPECT_EQ("has a key that is equal to \"foo\"", Describe(m)); 130413481Sgiacomo.travaglini@arm.com EXPECT_EQ("doesn't have a key that is equal to \"foo\"", DescribeNegation(m)); 130513481Sgiacomo.travaglini@arm.com} 130613481Sgiacomo.travaglini@arm.com 130713481Sgiacomo.travaglini@arm.comTEST(KeyTest, ExplainsResult) { 130813481Sgiacomo.travaglini@arm.com Matcher<pair<int, bool> > m = Key(GreaterThan(10)); 130913481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose first field is a value which is 5 less than 10", 131013481Sgiacomo.travaglini@arm.com Explain(m, make_pair(5, true))); 131113481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose first field is a value which is 5 more than 10", 131213481Sgiacomo.travaglini@arm.com Explain(m, make_pair(15, true))); 131313481Sgiacomo.travaglini@arm.com} 131413481Sgiacomo.travaglini@arm.com 131513481Sgiacomo.travaglini@arm.comTEST(KeyTest, MatchesCorrectly) { 131613481Sgiacomo.travaglini@arm.com pair<int, std::string> p(25, "foo"); 131713481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Key(25)); 131813481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Key(42))); 131913481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Key(Ge(20))); 132013481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Key(Lt(25)))); 132113481Sgiacomo.travaglini@arm.com} 132213481Sgiacomo.travaglini@arm.com 132313481Sgiacomo.travaglini@arm.comTEST(KeyTest, SafelyCastsInnerMatcher) { 132413481Sgiacomo.travaglini@arm.com Matcher<int> is_positive = Gt(0); 132513481Sgiacomo.travaglini@arm.com Matcher<int> is_negative = Lt(0); 132613481Sgiacomo.travaglini@arm.com pair<char, bool> p('a', true); 132713481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Key(is_positive)); 132813481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Key(is_negative))); 132913481Sgiacomo.travaglini@arm.com} 133013481Sgiacomo.travaglini@arm.com 133113481Sgiacomo.travaglini@arm.comTEST(KeyTest, InsideContainsUsingMap) { 133213481Sgiacomo.travaglini@arm.com map<int, char> container; 133313481Sgiacomo.travaglini@arm.com container.insert(make_pair(1, 'a')); 133413481Sgiacomo.travaglini@arm.com container.insert(make_pair(2, 'b')); 133513481Sgiacomo.travaglini@arm.com container.insert(make_pair(4, 'c')); 133613481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Contains(Key(1))); 133713481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(Contains(Key(3)))); 133813481Sgiacomo.travaglini@arm.com} 133913481Sgiacomo.travaglini@arm.com 134013481Sgiacomo.travaglini@arm.comTEST(KeyTest, InsideContainsUsingMultimap) { 134113481Sgiacomo.travaglini@arm.com multimap<int, char> container; 134213481Sgiacomo.travaglini@arm.com container.insert(make_pair(1, 'a')); 134313481Sgiacomo.travaglini@arm.com container.insert(make_pair(2, 'b')); 134413481Sgiacomo.travaglini@arm.com container.insert(make_pair(4, 'c')); 134513481Sgiacomo.travaglini@arm.com 134613481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(Contains(Key(25)))); 134713481Sgiacomo.travaglini@arm.com container.insert(make_pair(25, 'd')); 134813481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Contains(Key(25))); 134913481Sgiacomo.travaglini@arm.com container.insert(make_pair(25, 'e')); 135013481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Contains(Key(25))); 135113481Sgiacomo.travaglini@arm.com 135213481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Contains(Key(1))); 135313481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(Contains(Key(3)))); 135413481Sgiacomo.travaglini@arm.com} 135513481Sgiacomo.travaglini@arm.com 135613481Sgiacomo.travaglini@arm.comTEST(PairTest, Typing) { 135713481Sgiacomo.travaglini@arm.com // Test verifies the following type conversions can be compiled. 135813481Sgiacomo.travaglini@arm.com Matcher<const pair<const char*, int>&> m1 = Pair("foo", 42); 135913481Sgiacomo.travaglini@arm.com Matcher<const pair<const char*, int> > m2 = Pair("foo", 42); 136013481Sgiacomo.travaglini@arm.com Matcher<pair<const char*, int> > m3 = Pair("foo", 42); 136113481Sgiacomo.travaglini@arm.com 136213481Sgiacomo.travaglini@arm.com Matcher<pair<int, const std::string> > m4 = Pair(25, "42"); 136313481Sgiacomo.travaglini@arm.com Matcher<pair<const std::string, int> > m5 = Pair("25", 42); 136413481Sgiacomo.travaglini@arm.com} 136513481Sgiacomo.travaglini@arm.com 136613481Sgiacomo.travaglini@arm.comTEST(PairTest, CanDescribeSelf) { 136713481Sgiacomo.travaglini@arm.com Matcher<const pair<std::string, int>&> m1 = Pair("foo", 42); 136813481Sgiacomo.travaglini@arm.com EXPECT_EQ("has a first field that is equal to \"foo\"" 136913481Sgiacomo.travaglini@arm.com ", and has a second field that is equal to 42", 137013481Sgiacomo.travaglini@arm.com Describe(m1)); 137113481Sgiacomo.travaglini@arm.com EXPECT_EQ("has a first field that isn't equal to \"foo\"" 137213481Sgiacomo.travaglini@arm.com ", or has a second field that isn't equal to 42", 137313481Sgiacomo.travaglini@arm.com DescribeNegation(m1)); 137413481Sgiacomo.travaglini@arm.com // Double and triple negation (1 or 2 times not and description of negation). 137513481Sgiacomo.travaglini@arm.com Matcher<const pair<int, int>&> m2 = Not(Pair(Not(13), 42)); 137613481Sgiacomo.travaglini@arm.com EXPECT_EQ("has a first field that isn't equal to 13" 137713481Sgiacomo.travaglini@arm.com ", and has a second field that is equal to 42", 137813481Sgiacomo.travaglini@arm.com DescribeNegation(m2)); 137913481Sgiacomo.travaglini@arm.com} 138013481Sgiacomo.travaglini@arm.com 138113481Sgiacomo.travaglini@arm.comTEST(PairTest, CanExplainMatchResultTo) { 138213481Sgiacomo.travaglini@arm.com // If neither field matches, Pair() should explain about the first 138313481Sgiacomo.travaglini@arm.com // field. 138413481Sgiacomo.travaglini@arm.com const Matcher<pair<int, int> > m = Pair(GreaterThan(0), GreaterThan(0)); 138513481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose first field does not match, which is 1 less than 0", 138613481Sgiacomo.travaglini@arm.com Explain(m, make_pair(-1, -2))); 138713481Sgiacomo.travaglini@arm.com 138813481Sgiacomo.travaglini@arm.com // If the first field matches but the second doesn't, Pair() should 138913481Sgiacomo.travaglini@arm.com // explain about the second field. 139013481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose second field does not match, which is 2 less than 0", 139113481Sgiacomo.travaglini@arm.com Explain(m, make_pair(1, -2))); 139213481Sgiacomo.travaglini@arm.com 139313481Sgiacomo.travaglini@arm.com // If the first field doesn't match but the second does, Pair() 139413481Sgiacomo.travaglini@arm.com // should explain about the first field. 139513481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose first field does not match, which is 1 less than 0", 139613481Sgiacomo.travaglini@arm.com Explain(m, make_pair(-1, 2))); 139713481Sgiacomo.travaglini@arm.com 139813481Sgiacomo.travaglini@arm.com // If both fields match, Pair() should explain about them both. 139913481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose both fields match, where the first field is a value " 140013481Sgiacomo.travaglini@arm.com "which is 1 more than 0, and the second field is a value " 140113481Sgiacomo.travaglini@arm.com "which is 2 more than 0", 140213481Sgiacomo.travaglini@arm.com Explain(m, make_pair(1, 2))); 140313481Sgiacomo.travaglini@arm.com 140413481Sgiacomo.travaglini@arm.com // If only the first match has an explanation, only this explanation should 140513481Sgiacomo.travaglini@arm.com // be printed. 140613481Sgiacomo.travaglini@arm.com const Matcher<pair<int, int> > explain_first = Pair(GreaterThan(0), 0); 140713481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose both fields match, where the first field is a value " 140813481Sgiacomo.travaglini@arm.com "which is 1 more than 0", 140913481Sgiacomo.travaglini@arm.com Explain(explain_first, make_pair(1, 0))); 141013481Sgiacomo.travaglini@arm.com 141113481Sgiacomo.travaglini@arm.com // If only the second match has an explanation, only this explanation should 141213481Sgiacomo.travaglini@arm.com // be printed. 141313481Sgiacomo.travaglini@arm.com const Matcher<pair<int, int> > explain_second = Pair(0, GreaterThan(0)); 141413481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose both fields match, where the second field is a value " 141513481Sgiacomo.travaglini@arm.com "which is 1 more than 0", 141613481Sgiacomo.travaglini@arm.com Explain(explain_second, make_pair(0, 1))); 141713481Sgiacomo.travaglini@arm.com} 141813481Sgiacomo.travaglini@arm.com 141913481Sgiacomo.travaglini@arm.comTEST(PairTest, MatchesCorrectly) { 142013481Sgiacomo.travaglini@arm.com pair<int, std::string> p(25, "foo"); 142113481Sgiacomo.travaglini@arm.com 142213481Sgiacomo.travaglini@arm.com // Both fields match. 142313481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Pair(25, "foo")); 142413481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Pair(Ge(20), HasSubstr("o"))); 142513481Sgiacomo.travaglini@arm.com 142613481Sgiacomo.travaglini@arm.com // 'first' doesnt' match, but 'second' matches. 142713481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(42, "foo"))); 142813481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(Lt(25), "foo"))); 142913481Sgiacomo.travaglini@arm.com 143013481Sgiacomo.travaglini@arm.com // 'first' matches, but 'second' doesn't match. 143113481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(25, "bar"))); 143213481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(25, Not("foo")))); 143313481Sgiacomo.travaglini@arm.com 143413481Sgiacomo.travaglini@arm.com // Neither field matches. 143513481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(13, "bar"))); 143613481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(Lt(13), HasSubstr("a")))); 143713481Sgiacomo.travaglini@arm.com} 143813481Sgiacomo.travaglini@arm.com 143913481Sgiacomo.travaglini@arm.comTEST(PairTest, SafelyCastsInnerMatchers) { 144013481Sgiacomo.travaglini@arm.com Matcher<int> is_positive = Gt(0); 144113481Sgiacomo.travaglini@arm.com Matcher<int> is_negative = Lt(0); 144213481Sgiacomo.travaglini@arm.com pair<char, bool> p('a', true); 144313481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Pair(is_positive, _)); 144413481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(is_negative, _))); 144513481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Pair(_, is_positive)); 144613481Sgiacomo.travaglini@arm.com EXPECT_THAT(p, Not(Pair(_, is_negative))); 144713481Sgiacomo.travaglini@arm.com} 144813481Sgiacomo.travaglini@arm.com 144913481Sgiacomo.travaglini@arm.comTEST(PairTest, InsideContainsUsingMap) { 145013481Sgiacomo.travaglini@arm.com map<int, char> container; 145113481Sgiacomo.travaglini@arm.com container.insert(make_pair(1, 'a')); 145213481Sgiacomo.travaglini@arm.com container.insert(make_pair(2, 'b')); 145313481Sgiacomo.travaglini@arm.com container.insert(make_pair(4, 'c')); 145413481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Contains(Pair(1, 'a'))); 145513481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Contains(Pair(1, _))); 145613481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Contains(Pair(_, 'a'))); 145713481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(Contains(Pair(3, _)))); 145813481Sgiacomo.travaglini@arm.com} 145913481Sgiacomo.travaglini@arm.com 146013481Sgiacomo.travaglini@arm.com// Tests StartsWith(s). 146113481Sgiacomo.travaglini@arm.com 146213481Sgiacomo.travaglini@arm.comTEST(StartsWithTest, MatchesStringWithGivenPrefix) { 146313481Sgiacomo.travaglini@arm.com const Matcher<const char*> m1 = StartsWith(string("")); 146413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("Hi")); 146513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("")); 146613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 146713481Sgiacomo.travaglini@arm.com 146813481Sgiacomo.travaglini@arm.com const Matcher<const string&> m2 = StartsWith("Hi"); 146913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("Hi")); 147013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("Hi Hi!")); 147113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("High")); 147213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("H")); 147313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(" Hi")); 147413481Sgiacomo.travaglini@arm.com} 147513481Sgiacomo.travaglini@arm.com 147613481Sgiacomo.travaglini@arm.comTEST(StartsWithTest, CanDescribeSelf) { 147713481Sgiacomo.travaglini@arm.com Matcher<const std::string> m = StartsWith("Hi"); 147813481Sgiacomo.travaglini@arm.com EXPECT_EQ("starts with \"Hi\"", Describe(m)); 147913481Sgiacomo.travaglini@arm.com} 148013481Sgiacomo.travaglini@arm.com 148113481Sgiacomo.travaglini@arm.com// Tests EndsWith(s). 148213481Sgiacomo.travaglini@arm.com 148313481Sgiacomo.travaglini@arm.comTEST(EndsWithTest, MatchesStringWithGivenSuffix) { 148413481Sgiacomo.travaglini@arm.com const Matcher<const char*> m1 = EndsWith(""); 148513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("Hi")); 148613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("")); 148713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 148813481Sgiacomo.travaglini@arm.com 148913481Sgiacomo.travaglini@arm.com const Matcher<const string&> m2 = EndsWith(string("Hi")); 149013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("Hi")); 149113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("Wow Hi Hi")); 149213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("Super Hi")); 149313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("i")); 149413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("Hi ")); 149513481Sgiacomo.travaglini@arm.com} 149613481Sgiacomo.travaglini@arm.com 149713481Sgiacomo.travaglini@arm.comTEST(EndsWithTest, CanDescribeSelf) { 149813481Sgiacomo.travaglini@arm.com Matcher<const std::string> m = EndsWith("Hi"); 149913481Sgiacomo.travaglini@arm.com EXPECT_EQ("ends with \"Hi\"", Describe(m)); 150013481Sgiacomo.travaglini@arm.com} 150113481Sgiacomo.travaglini@arm.com 150213481Sgiacomo.travaglini@arm.com// Tests MatchesRegex(). 150313481Sgiacomo.travaglini@arm.com 150413481Sgiacomo.travaglini@arm.comTEST(MatchesRegexTest, MatchesStringMatchingGivenRegex) { 150513481Sgiacomo.travaglini@arm.com const Matcher<const char*> m1 = MatchesRegex("a.*z"); 150613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("az")); 150713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("abcz")); 150813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 150913481Sgiacomo.travaglini@arm.com 151013481Sgiacomo.travaglini@arm.com const Matcher<const string&> m2 = MatchesRegex(new RE("a.*z")); 151113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("azbz")); 151213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("az1")); 151313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("1az")); 151413481Sgiacomo.travaglini@arm.com} 151513481Sgiacomo.travaglini@arm.com 151613481Sgiacomo.travaglini@arm.comTEST(MatchesRegexTest, CanDescribeSelf) { 151713481Sgiacomo.travaglini@arm.com Matcher<const std::string> m1 = MatchesRegex(string("Hi.*")); 151813481Sgiacomo.travaglini@arm.com EXPECT_EQ("matches regular expression \"Hi.*\"", Describe(m1)); 151913481Sgiacomo.travaglini@arm.com 152013481Sgiacomo.travaglini@arm.com Matcher<const char*> m2 = MatchesRegex(new RE("a.*")); 152113481Sgiacomo.travaglini@arm.com EXPECT_EQ("matches regular expression \"a.*\"", Describe(m2)); 152213481Sgiacomo.travaglini@arm.com} 152313481Sgiacomo.travaglini@arm.com 152413481Sgiacomo.travaglini@arm.com// Tests ContainsRegex(). 152513481Sgiacomo.travaglini@arm.com 152613481Sgiacomo.travaglini@arm.comTEST(ContainsRegexTest, MatchesStringContainingGivenRegex) { 152713481Sgiacomo.travaglini@arm.com const Matcher<const char*> m1 = ContainsRegex(string("a.*z")); 152813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("az")); 152913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("0abcz1")); 153013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 153113481Sgiacomo.travaglini@arm.com 153213481Sgiacomo.travaglini@arm.com const Matcher<const string&> m2 = ContainsRegex(new RE("a.*z")); 153313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("azbz")); 153413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("az1")); 153513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches("1a")); 153613481Sgiacomo.travaglini@arm.com} 153713481Sgiacomo.travaglini@arm.com 153813481Sgiacomo.travaglini@arm.comTEST(ContainsRegexTest, CanDescribeSelf) { 153913481Sgiacomo.travaglini@arm.com Matcher<const std::string> m1 = ContainsRegex("Hi.*"); 154013481Sgiacomo.travaglini@arm.com EXPECT_EQ("contains regular expression \"Hi.*\"", Describe(m1)); 154113481Sgiacomo.travaglini@arm.com 154213481Sgiacomo.travaglini@arm.com Matcher<const char*> m2 = ContainsRegex(new RE("a.*")); 154313481Sgiacomo.travaglini@arm.com EXPECT_EQ("contains regular expression \"a.*\"", Describe(m2)); 154413481Sgiacomo.travaglini@arm.com} 154513481Sgiacomo.travaglini@arm.com 154613481Sgiacomo.travaglini@arm.com// Tests for wide strings. 154713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_WSTRING 154813481Sgiacomo.travaglini@arm.comTEST(StdWideStrEqTest, MatchesEqual) { 154913481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrEq(::std::wstring(L"Hello")); 155013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"Hello")); 155113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"hello")); 155213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 155313481Sgiacomo.travaglini@arm.com 155413481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m2 = StrEq(L"Hello"); 155513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hello")); 155613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hi")); 155713481Sgiacomo.travaglini@arm.com 155813481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 155913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 156013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 156113481Sgiacomo.travaglini@arm.com 156213481Sgiacomo.travaglini@arm.com ::std::wstring str(L"01204500800"); 156313481Sgiacomo.travaglini@arm.com str[3] = L'\0'; 156413481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m4 = StrEq(str); 156513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m4.Matches(str)); 156613481Sgiacomo.travaglini@arm.com str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 156713481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m5 = StrEq(str); 156813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m5.Matches(str)); 156913481Sgiacomo.travaglini@arm.com} 157013481Sgiacomo.travaglini@arm.com 157113481Sgiacomo.travaglini@arm.comTEST(StdWideStrEqTest, CanDescribeSelf) { 157213481Sgiacomo.travaglini@arm.com Matcher< ::std::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v"); 157313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 157413481Sgiacomo.travaglini@arm.com Describe(m)); 157513481Sgiacomo.travaglini@arm.com 157613481Sgiacomo.travaglini@arm.com Matcher< ::std::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 157713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 157813481Sgiacomo.travaglini@arm.com Describe(m2)); 157913481Sgiacomo.travaglini@arm.com 158013481Sgiacomo.travaglini@arm.com ::std::wstring str(L"01204500800"); 158113481Sgiacomo.travaglini@arm.com str[3] = L'\0'; 158213481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m4 = StrEq(str); 158313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 158413481Sgiacomo.travaglini@arm.com str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 158513481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m5 = StrEq(str); 158613481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 158713481Sgiacomo.travaglini@arm.com} 158813481Sgiacomo.travaglini@arm.com 158913481Sgiacomo.travaglini@arm.comTEST(StdWideStrNeTest, MatchesUnequalString) { 159013481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrNe(L"Hello"); 159113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"")); 159213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(NULL)); 159313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"Hello")); 159413481Sgiacomo.travaglini@arm.com 159513481Sgiacomo.travaglini@arm.com Matcher< ::std::wstring> m2 = StrNe(::std::wstring(L"Hello")); 159613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"hello")); 159713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hello")); 159813481Sgiacomo.travaglini@arm.com} 159913481Sgiacomo.travaglini@arm.com 160013481Sgiacomo.travaglini@arm.comTEST(StdWideStrNeTest, CanDescribeSelf) { 160113481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrNe(L"Hi"); 160213481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m)); 160313481Sgiacomo.travaglini@arm.com} 160413481Sgiacomo.travaglini@arm.com 160513481Sgiacomo.travaglini@arm.comTEST(StdWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 160613481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrCaseEq(::std::wstring(L"Hello")); 160713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"Hello")); 160813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"hello")); 160913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"Hi")); 161013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 161113481Sgiacomo.travaglini@arm.com 161213481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m2 = StrCaseEq(L"Hello"); 161313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"hello")); 161413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hi")); 161513481Sgiacomo.travaglini@arm.com} 161613481Sgiacomo.travaglini@arm.com 161713481Sgiacomo.travaglini@arm.comTEST(StdWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 161813481Sgiacomo.travaglini@arm.com ::std::wstring str1(L"oabocdooeoo"); 161913481Sgiacomo.travaglini@arm.com ::std::wstring str2(L"OABOCDOOEOO"); 162013481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m0 = StrCaseEq(str1); 162113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m0.Matches(str2 + ::std::wstring(1, L'\0'))); 162213481Sgiacomo.travaglini@arm.com 162313481Sgiacomo.travaglini@arm.com str1[3] = str2[3] = L'\0'; 162413481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m1 = StrCaseEq(str1); 162513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(str2)); 162613481Sgiacomo.travaglini@arm.com 162713481Sgiacomo.travaglini@arm.com str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 162813481Sgiacomo.travaglini@arm.com str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 162913481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m2 = StrCaseEq(str1); 163013481Sgiacomo.travaglini@arm.com str1[9] = str2[9] = L'\0'; 163113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(str2)); 163213481Sgiacomo.travaglini@arm.com 163313481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring&> m3 = StrCaseEq(str1); 163413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(str2)); 163513481Sgiacomo.travaglini@arm.com 163613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(str2 + L"x")); 163713481Sgiacomo.travaglini@arm.com str2.append(1, L'\0'); 163813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(str2)); 163913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(::std::wstring(str2, 0, 9))); 164013481Sgiacomo.travaglini@arm.com} 164113481Sgiacomo.travaglini@arm.com 164213481Sgiacomo.travaglini@arm.comTEST(StdWideStrCaseEqTest, CanDescribeSelf) { 164313481Sgiacomo.travaglini@arm.com Matcher< ::std::wstring> m = StrCaseEq(L"Hi"); 164413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 164513481Sgiacomo.travaglini@arm.com} 164613481Sgiacomo.travaglini@arm.com 164713481Sgiacomo.travaglini@arm.comTEST(StdWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 164813481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 164913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"Hi")); 165013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(NULL)); 165113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"Hello")); 165213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"hello")); 165313481Sgiacomo.travaglini@arm.com 165413481Sgiacomo.travaglini@arm.com Matcher< ::std::wstring> m2 = StrCaseNe(::std::wstring(L"Hello")); 165513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"")); 165613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hello")); 165713481Sgiacomo.travaglini@arm.com} 165813481Sgiacomo.travaglini@arm.com 165913481Sgiacomo.travaglini@arm.comTEST(StdWideStrCaseNeTest, CanDescribeSelf) { 166013481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 166113481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m)); 166213481Sgiacomo.travaglini@arm.com} 166313481Sgiacomo.travaglini@arm.com 166413481Sgiacomo.travaglini@arm.com// Tests that HasSubstr() works for matching wstring-typed values. 166513481Sgiacomo.travaglini@arm.comTEST(StdWideHasSubstrTest, WorksForStringClasses) { 166613481Sgiacomo.travaglini@arm.com const Matcher< ::std::wstring> m1 = HasSubstr(L"foo"); 166713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(::std::wstring(L"I love food."))); 166813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(::std::wstring(L"tofo"))); 166913481Sgiacomo.travaglini@arm.com 167013481Sgiacomo.travaglini@arm.com const Matcher<const ::std::wstring&> m2 = HasSubstr(L"foo"); 167113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(::std::wstring(L"I love food."))); 167213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(::std::wstring(L"tofo"))); 167313481Sgiacomo.travaglini@arm.com} 167413481Sgiacomo.travaglini@arm.com 167513481Sgiacomo.travaglini@arm.com// Tests that HasSubstr() works for matching C-wide-string-typed values. 167613481Sgiacomo.travaglini@arm.comTEST(StdWideHasSubstrTest, WorksForCStrings) { 167713481Sgiacomo.travaglini@arm.com const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 167813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 167913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 168013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 168113481Sgiacomo.travaglini@arm.com 168213481Sgiacomo.travaglini@arm.com const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 168313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"I love food.")); 168413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"tofo")); 168513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(NULL)); 168613481Sgiacomo.travaglini@arm.com} 168713481Sgiacomo.travaglini@arm.com 168813481Sgiacomo.travaglini@arm.com// Tests that HasSubstr(s) describes itself properly. 168913481Sgiacomo.travaglini@arm.comTEST(StdWideHasSubstrTest, CanDescribeSelf) { 169013481Sgiacomo.travaglini@arm.com Matcher< ::std::wstring> m = HasSubstr(L"foo\n\""); 169113481Sgiacomo.travaglini@arm.com EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 169213481Sgiacomo.travaglini@arm.com} 169313481Sgiacomo.travaglini@arm.com 169413481Sgiacomo.travaglini@arm.com// Tests StartsWith(s). 169513481Sgiacomo.travaglini@arm.com 169613481Sgiacomo.travaglini@arm.comTEST(StdWideStartsWithTest, MatchesStringWithGivenPrefix) { 169713481Sgiacomo.travaglini@arm.com const Matcher<const wchar_t*> m1 = StartsWith(::std::wstring(L"")); 169813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"Hi")); 169913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"")); 170013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 170113481Sgiacomo.travaglini@arm.com 170213481Sgiacomo.travaglini@arm.com const Matcher<const ::std::wstring&> m2 = StartsWith(L"Hi"); 170313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hi")); 170413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 170513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"High")); 170613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"H")); 170713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L" Hi")); 170813481Sgiacomo.travaglini@arm.com} 170913481Sgiacomo.travaglini@arm.com 171013481Sgiacomo.travaglini@arm.comTEST(StdWideStartsWithTest, CanDescribeSelf) { 171113481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring> m = StartsWith(L"Hi"); 171213481Sgiacomo.travaglini@arm.com EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 171313481Sgiacomo.travaglini@arm.com} 171413481Sgiacomo.travaglini@arm.com 171513481Sgiacomo.travaglini@arm.com// Tests EndsWith(s). 171613481Sgiacomo.travaglini@arm.com 171713481Sgiacomo.travaglini@arm.comTEST(StdWideEndsWithTest, MatchesStringWithGivenSuffix) { 171813481Sgiacomo.travaglini@arm.com const Matcher<const wchar_t*> m1 = EndsWith(L""); 171913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"Hi")); 172013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"")); 172113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 172213481Sgiacomo.travaglini@arm.com 172313481Sgiacomo.travaglini@arm.com const Matcher<const ::std::wstring&> m2 = EndsWith(::std::wstring(L"Hi")); 172413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hi")); 172513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 172613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Super Hi")); 172713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"i")); 172813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hi ")); 172913481Sgiacomo.travaglini@arm.com} 173013481Sgiacomo.travaglini@arm.com 173113481Sgiacomo.travaglini@arm.comTEST(StdWideEndsWithTest, CanDescribeSelf) { 173213481Sgiacomo.travaglini@arm.com Matcher<const ::std::wstring> m = EndsWith(L"Hi"); 173313481Sgiacomo.travaglini@arm.com EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 173413481Sgiacomo.travaglini@arm.com} 173513481Sgiacomo.travaglini@arm.com 173613481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_WSTRING 173713481Sgiacomo.travaglini@arm.com 173813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_GLOBAL_WSTRING 173913481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrEqTest, MatchesEqual) { 174013481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrEq(::wstring(L"Hello")); 174113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"Hello")); 174213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"hello")); 174313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 174413481Sgiacomo.travaglini@arm.com 174513481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m2 = StrEq(L"Hello"); 174613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hello")); 174713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hi")); 174813481Sgiacomo.travaglini@arm.com 174913481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m3 = StrEq(L"\xD3\x576\x8D3\xC74D"); 175013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(L"\xD3\x576\x8D3\xC74D")); 175113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(L"\xD3\x576\x8D3\xC74E")); 175213481Sgiacomo.travaglini@arm.com 175313481Sgiacomo.travaglini@arm.com ::wstring str(L"01204500800"); 175413481Sgiacomo.travaglini@arm.com str[3] = L'\0'; 175513481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m4 = StrEq(str); 175613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m4.Matches(str)); 175713481Sgiacomo.travaglini@arm.com str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 175813481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m5 = StrEq(str); 175913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m5.Matches(str)); 176013481Sgiacomo.travaglini@arm.com} 176113481Sgiacomo.travaglini@arm.com 176213481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrEqTest, CanDescribeSelf) { 176313481Sgiacomo.travaglini@arm.com Matcher< ::wstring> m = StrEq(L"Hi-\'\"?\\\a\b\f\n\r\t\v"); 176413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"Hi-\'\\\"?\\\\\\a\\b\\f\\n\\r\\t\\v\"", 176513481Sgiacomo.travaglini@arm.com Describe(m)); 176613481Sgiacomo.travaglini@arm.com 176713481Sgiacomo.travaglini@arm.com Matcher< ::wstring> m2 = StrEq(L"\xD3\x576\x8D3\xC74D"); 176813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"\\xD3\\x576\\x8D3\\xC74D\"", 176913481Sgiacomo.travaglini@arm.com Describe(m2)); 177013481Sgiacomo.travaglini@arm.com 177113481Sgiacomo.travaglini@arm.com ::wstring str(L"01204500800"); 177213481Sgiacomo.travaglini@arm.com str[3] = L'\0'; 177313481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m4 = StrEq(str); 177413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"012\\04500800\"", Describe(m4)); 177513481Sgiacomo.travaglini@arm.com str[0] = str[6] = str[7] = str[9] = str[10] = L'\0'; 177613481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m5 = StrEq(str); 177713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to L\"\\012\\045\\0\\08\\0\\0\"", Describe(m5)); 177813481Sgiacomo.travaglini@arm.com} 177913481Sgiacomo.travaglini@arm.com 178013481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrNeTest, MatchesUnequalString) { 178113481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrNe(L"Hello"); 178213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"")); 178313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(NULL)); 178413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"Hello")); 178513481Sgiacomo.travaglini@arm.com 178613481Sgiacomo.travaglini@arm.com Matcher< ::wstring> m2 = StrNe(::wstring(L"Hello")); 178713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"hello")); 178813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hello")); 178913481Sgiacomo.travaglini@arm.com} 179013481Sgiacomo.travaglini@arm.com 179113481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrNeTest, CanDescribeSelf) { 179213481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrNe(L"Hi"); 179313481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to L\"Hi\"", Describe(m)); 179413481Sgiacomo.travaglini@arm.com} 179513481Sgiacomo.travaglini@arm.com 179613481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrCaseEqTest, MatchesEqualStringIgnoringCase) { 179713481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrCaseEq(::wstring(L"Hello")); 179813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"Hello")); 179913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"hello")); 180013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"Hi")); 180113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 180213481Sgiacomo.travaglini@arm.com 180313481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m2 = StrCaseEq(L"Hello"); 180413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"hello")); 180513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hi")); 180613481Sgiacomo.travaglini@arm.com} 180713481Sgiacomo.travaglini@arm.com 180813481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrCaseEqTest, MatchesEqualStringWith0IgnoringCase) { 180913481Sgiacomo.travaglini@arm.com ::wstring str1(L"oabocdooeoo"); 181013481Sgiacomo.travaglini@arm.com ::wstring str2(L"OABOCDOOEOO"); 181113481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m0 = StrCaseEq(str1); 181213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m0.Matches(str2 + ::wstring(1, L'\0'))); 181313481Sgiacomo.travaglini@arm.com 181413481Sgiacomo.travaglini@arm.com str1[3] = str2[3] = L'\0'; 181513481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m1 = StrCaseEq(str1); 181613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(str2)); 181713481Sgiacomo.travaglini@arm.com 181813481Sgiacomo.travaglini@arm.com str1[0] = str1[6] = str1[7] = str1[10] = L'\0'; 181913481Sgiacomo.travaglini@arm.com str2[0] = str2[6] = str2[7] = str2[10] = L'\0'; 182013481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m2 = StrCaseEq(str1); 182113481Sgiacomo.travaglini@arm.com str1[9] = str2[9] = L'\0'; 182213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(str2)); 182313481Sgiacomo.travaglini@arm.com 182413481Sgiacomo.travaglini@arm.com Matcher<const ::wstring&> m3 = StrCaseEq(str1); 182513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(str2)); 182613481Sgiacomo.travaglini@arm.com 182713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(str2 + L"x")); 182813481Sgiacomo.travaglini@arm.com str2.append(1, L'\0'); 182913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(str2)); 183013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(::wstring(str2, 0, 9))); 183113481Sgiacomo.travaglini@arm.com} 183213481Sgiacomo.travaglini@arm.com 183313481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrCaseEqTest, CanDescribeSelf) { 183413481Sgiacomo.travaglini@arm.com Matcher< ::wstring> m = StrCaseEq(L"Hi"); 183513481Sgiacomo.travaglini@arm.com EXPECT_EQ("is equal to (ignoring case) L\"Hi\"", Describe(m)); 183613481Sgiacomo.travaglini@arm.com} 183713481Sgiacomo.travaglini@arm.com 183813481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrCaseNeTest, MatchesUnequalStringIgnoringCase) { 183913481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrCaseNe(L"Hello"); 184013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(L"Hi")); 184113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(NULL)); 184213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"Hello")); 184313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(L"hello")); 184413481Sgiacomo.travaglini@arm.com 184513481Sgiacomo.travaglini@arm.com Matcher< ::wstring> m2 = StrCaseNe(::wstring(L"Hello")); 184613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"")); 184713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hello")); 184813481Sgiacomo.travaglini@arm.com} 184913481Sgiacomo.travaglini@arm.com 185013481Sgiacomo.travaglini@arm.comTEST(GlobalWideStrCaseNeTest, CanDescribeSelf) { 185113481Sgiacomo.travaglini@arm.com Matcher<const wchar_t*> m = StrCaseNe(L"Hi"); 185213481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to (ignoring case) L\"Hi\"", Describe(m)); 185313481Sgiacomo.travaglini@arm.com} 185413481Sgiacomo.travaglini@arm.com 185513481Sgiacomo.travaglini@arm.com// Tests that HasSubstr() works for matching wstring-typed values. 185613481Sgiacomo.travaglini@arm.comTEST(GlobalWideHasSubstrTest, WorksForStringClasses) { 185713481Sgiacomo.travaglini@arm.com const Matcher< ::wstring> m1 = HasSubstr(L"foo"); 185813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(::wstring(L"I love food."))); 185913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(::wstring(L"tofo"))); 186013481Sgiacomo.travaglini@arm.com 186113481Sgiacomo.travaglini@arm.com const Matcher<const ::wstring&> m2 = HasSubstr(L"foo"); 186213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(::wstring(L"I love food."))); 186313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(::wstring(L"tofo"))); 186413481Sgiacomo.travaglini@arm.com} 186513481Sgiacomo.travaglini@arm.com 186613481Sgiacomo.travaglini@arm.com// Tests that HasSubstr() works for matching C-wide-string-typed values. 186713481Sgiacomo.travaglini@arm.comTEST(GlobalWideHasSubstrTest, WorksForCStrings) { 186813481Sgiacomo.travaglini@arm.com const Matcher<wchar_t*> m1 = HasSubstr(L"foo"); 186913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(const_cast<wchar_t*>(L"I love food."))); 187013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(const_cast<wchar_t*>(L"tofo"))); 187113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 187213481Sgiacomo.travaglini@arm.com 187313481Sgiacomo.travaglini@arm.com const Matcher<const wchar_t*> m2 = HasSubstr(L"foo"); 187413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"I love food.")); 187513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"tofo")); 187613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(NULL)); 187713481Sgiacomo.travaglini@arm.com} 187813481Sgiacomo.travaglini@arm.com 187913481Sgiacomo.travaglini@arm.com// Tests that HasSubstr(s) describes itself properly. 188013481Sgiacomo.travaglini@arm.comTEST(GlobalWideHasSubstrTest, CanDescribeSelf) { 188113481Sgiacomo.travaglini@arm.com Matcher< ::wstring> m = HasSubstr(L"foo\n\""); 188213481Sgiacomo.travaglini@arm.com EXPECT_EQ("has substring L\"foo\\n\\\"\"", Describe(m)); 188313481Sgiacomo.travaglini@arm.com} 188413481Sgiacomo.travaglini@arm.com 188513481Sgiacomo.travaglini@arm.com// Tests StartsWith(s). 188613481Sgiacomo.travaglini@arm.com 188713481Sgiacomo.travaglini@arm.comTEST(GlobalWideStartsWithTest, MatchesStringWithGivenPrefix) { 188813481Sgiacomo.travaglini@arm.com const Matcher<const wchar_t*> m1 = StartsWith(::wstring(L"")); 188913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"Hi")); 189013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"")); 189113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 189213481Sgiacomo.travaglini@arm.com 189313481Sgiacomo.travaglini@arm.com const Matcher<const ::wstring&> m2 = StartsWith(L"Hi"); 189413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hi")); 189513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hi Hi!")); 189613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"High")); 189713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"H")); 189813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L" Hi")); 189913481Sgiacomo.travaglini@arm.com} 190013481Sgiacomo.travaglini@arm.com 190113481Sgiacomo.travaglini@arm.comTEST(GlobalWideStartsWithTest, CanDescribeSelf) { 190213481Sgiacomo.travaglini@arm.com Matcher<const ::wstring> m = StartsWith(L"Hi"); 190313481Sgiacomo.travaglini@arm.com EXPECT_EQ("starts with L\"Hi\"", Describe(m)); 190413481Sgiacomo.travaglini@arm.com} 190513481Sgiacomo.travaglini@arm.com 190613481Sgiacomo.travaglini@arm.com// Tests EndsWith(s). 190713481Sgiacomo.travaglini@arm.com 190813481Sgiacomo.travaglini@arm.comTEST(GlobalWideEndsWithTest, MatchesStringWithGivenSuffix) { 190913481Sgiacomo.travaglini@arm.com const Matcher<const wchar_t*> m1 = EndsWith(L""); 191013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"Hi")); 191113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(L"")); 191213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(NULL)); 191313481Sgiacomo.travaglini@arm.com 191413481Sgiacomo.travaglini@arm.com const Matcher<const ::wstring&> m2 = EndsWith(::wstring(L"Hi")); 191513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Hi")); 191613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Wow Hi Hi")); 191713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(L"Super Hi")); 191813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"i")); 191913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(L"Hi ")); 192013481Sgiacomo.travaglini@arm.com} 192113481Sgiacomo.travaglini@arm.com 192213481Sgiacomo.travaglini@arm.comTEST(GlobalWideEndsWithTest, CanDescribeSelf) { 192313481Sgiacomo.travaglini@arm.com Matcher<const ::wstring> m = EndsWith(L"Hi"); 192413481Sgiacomo.travaglini@arm.com EXPECT_EQ("ends with L\"Hi\"", Describe(m)); 192513481Sgiacomo.travaglini@arm.com} 192613481Sgiacomo.travaglini@arm.com 192713481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_GLOBAL_WSTRING 192813481Sgiacomo.travaglini@arm.com 192913481Sgiacomo.travaglini@arm.com 193013481Sgiacomo.travaglini@arm.comtypedef ::testing::tuple<long, int> Tuple2; // NOLINT 193113481Sgiacomo.travaglini@arm.com 193213481Sgiacomo.travaglini@arm.com// Tests that Eq() matches a 2-tuple where the first field == the 193313481Sgiacomo.travaglini@arm.com// second field. 193413481Sgiacomo.travaglini@arm.comTEST(Eq2Test, MatchesEqualArguments) { 193513481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Eq(); 193613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 193713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 193813481Sgiacomo.travaglini@arm.com} 193913481Sgiacomo.travaglini@arm.com 194013481Sgiacomo.travaglini@arm.com// Tests that Eq() describes itself properly. 194113481Sgiacomo.travaglini@arm.comTEST(Eq2Test, CanDescribeSelf) { 194213481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Eq(); 194313481Sgiacomo.travaglini@arm.com EXPECT_EQ("are an equal pair", Describe(m)); 194413481Sgiacomo.travaglini@arm.com} 194513481Sgiacomo.travaglini@arm.com 194613481Sgiacomo.travaglini@arm.com// Tests that Ge() matches a 2-tuple where the first field >= the 194713481Sgiacomo.travaglini@arm.com// second field. 194813481Sgiacomo.travaglini@arm.comTEST(Ge2Test, MatchesGreaterThanOrEqualArguments) { 194913481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Ge(); 195013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 195113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 195213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 195313481Sgiacomo.travaglini@arm.com} 195413481Sgiacomo.travaglini@arm.com 195513481Sgiacomo.travaglini@arm.com// Tests that Ge() describes itself properly. 195613481Sgiacomo.travaglini@arm.comTEST(Ge2Test, CanDescribeSelf) { 195713481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Ge(); 195813481Sgiacomo.travaglini@arm.com EXPECT_EQ("are a pair where the first >= the second", Describe(m)); 195913481Sgiacomo.travaglini@arm.com} 196013481Sgiacomo.travaglini@arm.com 196113481Sgiacomo.travaglini@arm.com// Tests that Gt() matches a 2-tuple where the first field > the 196213481Sgiacomo.travaglini@arm.com// second field. 196313481Sgiacomo.travaglini@arm.comTEST(Gt2Test, MatchesGreaterThanArguments) { 196413481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Gt(); 196513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 196613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 196713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 6))); 196813481Sgiacomo.travaglini@arm.com} 196913481Sgiacomo.travaglini@arm.com 197013481Sgiacomo.travaglini@arm.com// Tests that Gt() describes itself properly. 197113481Sgiacomo.travaglini@arm.comTEST(Gt2Test, CanDescribeSelf) { 197213481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Gt(); 197313481Sgiacomo.travaglini@arm.com EXPECT_EQ("are a pair where the first > the second", Describe(m)); 197413481Sgiacomo.travaglini@arm.com} 197513481Sgiacomo.travaglini@arm.com 197613481Sgiacomo.travaglini@arm.com// Tests that Le() matches a 2-tuple where the first field <= the 197713481Sgiacomo.travaglini@arm.com// second field. 197813481Sgiacomo.travaglini@arm.comTEST(Le2Test, MatchesLessThanOrEqualArguments) { 197913481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Le(); 198013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 198113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 5))); 198213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 198313481Sgiacomo.travaglini@arm.com} 198413481Sgiacomo.travaglini@arm.com 198513481Sgiacomo.travaglini@arm.com// Tests that Le() describes itself properly. 198613481Sgiacomo.travaglini@arm.comTEST(Le2Test, CanDescribeSelf) { 198713481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Le(); 198813481Sgiacomo.travaglini@arm.com EXPECT_EQ("are a pair where the first <= the second", Describe(m)); 198913481Sgiacomo.travaglini@arm.com} 199013481Sgiacomo.travaglini@arm.com 199113481Sgiacomo.travaglini@arm.com// Tests that Lt() matches a 2-tuple where the first field < the 199213481Sgiacomo.travaglini@arm.com// second field. 199313481Sgiacomo.travaglini@arm.comTEST(Lt2Test, MatchesLessThanArguments) { 199413481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Lt(); 199513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 199613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 199713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 4))); 199813481Sgiacomo.travaglini@arm.com} 199913481Sgiacomo.travaglini@arm.com 200013481Sgiacomo.travaglini@arm.com// Tests that Lt() describes itself properly. 200113481Sgiacomo.travaglini@arm.comTEST(Lt2Test, CanDescribeSelf) { 200213481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Lt(); 200313481Sgiacomo.travaglini@arm.com EXPECT_EQ("are a pair where the first < the second", Describe(m)); 200413481Sgiacomo.travaglini@arm.com} 200513481Sgiacomo.travaglini@arm.com 200613481Sgiacomo.travaglini@arm.com// Tests that Ne() matches a 2-tuple where the first field != the 200713481Sgiacomo.travaglini@arm.com// second field. 200813481Sgiacomo.travaglini@arm.comTEST(Ne2Test, MatchesUnequalArguments) { 200913481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Ne(); 201013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 6))); 201113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple2(5L, 4))); 201213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple2(5L, 5))); 201313481Sgiacomo.travaglini@arm.com} 201413481Sgiacomo.travaglini@arm.com 201513481Sgiacomo.travaglini@arm.com// Tests that Ne() describes itself properly. 201613481Sgiacomo.travaglini@arm.comTEST(Ne2Test, CanDescribeSelf) { 201713481Sgiacomo.travaglini@arm.com Matcher<const Tuple2&> m = Ne(); 201813481Sgiacomo.travaglini@arm.com EXPECT_EQ("are an unequal pair", Describe(m)); 201913481Sgiacomo.travaglini@arm.com} 202013481Sgiacomo.travaglini@arm.com 202113481Sgiacomo.travaglini@arm.com// Tests that Not(m) matches any value that doesn't match m. 202213481Sgiacomo.travaglini@arm.comTEST(NotTest, NegatesMatcher) { 202313481Sgiacomo.travaglini@arm.com Matcher<int> m; 202413481Sgiacomo.travaglini@arm.com m = Not(Eq(2)); 202513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(3)); 202613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(2)); 202713481Sgiacomo.travaglini@arm.com} 202813481Sgiacomo.travaglini@arm.com 202913481Sgiacomo.travaglini@arm.com// Tests that Not(m) describes itself properly. 203013481Sgiacomo.travaglini@arm.comTEST(NotTest, CanDescribeSelf) { 203113481Sgiacomo.travaglini@arm.com Matcher<int> m = Not(Eq(5)); 203213481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't equal to 5", Describe(m)); 203313481Sgiacomo.travaglini@arm.com} 203413481Sgiacomo.travaglini@arm.com 203513481Sgiacomo.travaglini@arm.com// Tests that monomorphic matchers are safely cast by the Not matcher. 203613481Sgiacomo.travaglini@arm.comTEST(NotTest, NotMatcherSafelyCastsMonomorphicMatchers) { 203713481Sgiacomo.travaglini@arm.com // greater_than_5 is a monomorphic matcher. 203813481Sgiacomo.travaglini@arm.com Matcher<int> greater_than_5 = Gt(5); 203913481Sgiacomo.travaglini@arm.com 204013481Sgiacomo.travaglini@arm.com Matcher<const int&> m = Not(greater_than_5); 204113481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = Not(greater_than_5); 204213481Sgiacomo.travaglini@arm.com Matcher<int&> m3 = Not(m); 204313481Sgiacomo.travaglini@arm.com} 204413481Sgiacomo.travaglini@arm.com 204513481Sgiacomo.travaglini@arm.com// Helper to allow easy testing of AllOf matchers with num parameters. 204613481Sgiacomo.travaglini@arm.comvoid AllOfMatches(int num, const Matcher<int>& m) { 204713481Sgiacomo.travaglini@arm.com SCOPED_TRACE(Describe(m)); 204813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(0)); 204913481Sgiacomo.travaglini@arm.com for (int i = 1; i <= num; ++i) { 205013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(i)); 205113481Sgiacomo.travaglini@arm.com } 205213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(num + 1)); 205313481Sgiacomo.travaglini@arm.com} 205413481Sgiacomo.travaglini@arm.com 205513481Sgiacomo.travaglini@arm.com// Tests that AllOf(m1, ..., mn) matches any value that matches all of 205613481Sgiacomo.travaglini@arm.com// the given matchers. 205713481Sgiacomo.travaglini@arm.comTEST(AllOfTest, MatchesWhenAllMatch) { 205813481Sgiacomo.travaglini@arm.com Matcher<int> m; 205913481Sgiacomo.travaglini@arm.com m = AllOf(Le(2), Ge(1)); 206013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(1)); 206113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(2)); 206213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(0)); 206313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(3)); 206413481Sgiacomo.travaglini@arm.com 206513481Sgiacomo.travaglini@arm.com m = AllOf(Gt(0), Ne(1), Ne(2)); 206613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(3)); 206713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(2)); 206813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1)); 206913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(0)); 207013481Sgiacomo.travaglini@arm.com 207113481Sgiacomo.travaglini@arm.com m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 207213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(4)); 207313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(3)); 207413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(2)); 207513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1)); 207613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(0)); 207713481Sgiacomo.travaglini@arm.com 207813481Sgiacomo.travaglini@arm.com m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 207913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(0)); 208013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(1)); 208113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(3)); 208213481Sgiacomo.travaglini@arm.com 208313481Sgiacomo.travaglini@arm.com // The following tests for varying number of sub-matchers. Due to the way 208413481Sgiacomo.travaglini@arm.com // the sub-matchers are handled it is enough to test every sub-matcher once 208513481Sgiacomo.travaglini@arm.com // with sub-matchers using the same matcher type. Varying matcher types are 208613481Sgiacomo.travaglini@arm.com // checked for above. 208713481Sgiacomo.travaglini@arm.com AllOfMatches(2, AllOf(Ne(1), Ne(2))); 208813481Sgiacomo.travaglini@arm.com AllOfMatches(3, AllOf(Ne(1), Ne(2), Ne(3))); 208913481Sgiacomo.travaglini@arm.com AllOfMatches(4, AllOf(Ne(1), Ne(2), Ne(3), Ne(4))); 209013481Sgiacomo.travaglini@arm.com AllOfMatches(5, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5))); 209113481Sgiacomo.travaglini@arm.com AllOfMatches(6, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6))); 209213481Sgiacomo.travaglini@arm.com AllOfMatches(7, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7))); 209313481Sgiacomo.travaglini@arm.com AllOfMatches(8, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), 209413481Sgiacomo.travaglini@arm.com Ne(8))); 209513481Sgiacomo.travaglini@arm.com AllOfMatches(9, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), 209613481Sgiacomo.travaglini@arm.com Ne(8), Ne(9))); 209713481Sgiacomo.travaglini@arm.com AllOfMatches(10, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), 209813481Sgiacomo.travaglini@arm.com Ne(9), Ne(10))); 209913481Sgiacomo.travaglini@arm.com} 210013481Sgiacomo.travaglini@arm.com 210113481Sgiacomo.travaglini@arm.com#if GTEST_LANG_CXX11 210213481Sgiacomo.travaglini@arm.com// Tests the variadic version of the AllOfMatcher. 210313481Sgiacomo.travaglini@arm.comTEST(AllOfTest, VariadicMatchesWhenAllMatch) { 210413481Sgiacomo.travaglini@arm.com // Make sure AllOf is defined in the right namespace and does not depend on 210513481Sgiacomo.travaglini@arm.com // ADL. 210613481Sgiacomo.travaglini@arm.com ::testing::AllOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); 210713481Sgiacomo.travaglini@arm.com Matcher<int> m = AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), 210813481Sgiacomo.travaglini@arm.com Ne(9), Ne(10), Ne(11)); 210913481Sgiacomo.travaglini@arm.com EXPECT_THAT(Describe(m), EndsWith("and (isn't equal to 11))))))))))")); 211013481Sgiacomo.travaglini@arm.com AllOfMatches(11, m); 211113481Sgiacomo.travaglini@arm.com AllOfMatches(50, AllOf(Ne(1), Ne(2), Ne(3), Ne(4), Ne(5), Ne(6), Ne(7), Ne(8), 211213481Sgiacomo.travaglini@arm.com Ne(9), Ne(10), Ne(11), Ne(12), Ne(13), Ne(14), Ne(15), 211313481Sgiacomo.travaglini@arm.com Ne(16), Ne(17), Ne(18), Ne(19), Ne(20), Ne(21), Ne(22), 211413481Sgiacomo.travaglini@arm.com Ne(23), Ne(24), Ne(25), Ne(26), Ne(27), Ne(28), Ne(29), 211513481Sgiacomo.travaglini@arm.com Ne(30), Ne(31), Ne(32), Ne(33), Ne(34), Ne(35), Ne(36), 211613481Sgiacomo.travaglini@arm.com Ne(37), Ne(38), Ne(39), Ne(40), Ne(41), Ne(42), Ne(43), 211713481Sgiacomo.travaglini@arm.com Ne(44), Ne(45), Ne(46), Ne(47), Ne(48), Ne(49), 211813481Sgiacomo.travaglini@arm.com Ne(50))); 211913481Sgiacomo.travaglini@arm.com} 212013481Sgiacomo.travaglini@arm.com 212113481Sgiacomo.travaglini@arm.com#endif // GTEST_LANG_CXX11 212213481Sgiacomo.travaglini@arm.com 212313481Sgiacomo.travaglini@arm.com// Tests that AllOf(m1, ..., mn) describes itself properly. 212413481Sgiacomo.travaglini@arm.comTEST(AllOfTest, CanDescribeSelf) { 212513481Sgiacomo.travaglini@arm.com Matcher<int> m; 212613481Sgiacomo.travaglini@arm.com m = AllOf(Le(2), Ge(1)); 212713481Sgiacomo.travaglini@arm.com EXPECT_EQ("(is <= 2) and (is >= 1)", Describe(m)); 212813481Sgiacomo.travaglini@arm.com 212913481Sgiacomo.travaglini@arm.com m = AllOf(Gt(0), Ne(1), Ne(2)); 213013481Sgiacomo.travaglini@arm.com EXPECT_EQ("(is > 0) and " 213113481Sgiacomo.travaglini@arm.com "((isn't equal to 1) and " 213213481Sgiacomo.travaglini@arm.com "(isn't equal to 2))", 213313481Sgiacomo.travaglini@arm.com Describe(m)); 213413481Sgiacomo.travaglini@arm.com 213513481Sgiacomo.travaglini@arm.com 213613481Sgiacomo.travaglini@arm.com m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 213713481Sgiacomo.travaglini@arm.com EXPECT_EQ("((is > 0) and " 213813481Sgiacomo.travaglini@arm.com "(isn't equal to 1)) and " 213913481Sgiacomo.travaglini@arm.com "((isn't equal to 2) and " 214013481Sgiacomo.travaglini@arm.com "(isn't equal to 3))", 214113481Sgiacomo.travaglini@arm.com Describe(m)); 214213481Sgiacomo.travaglini@arm.com 214313481Sgiacomo.travaglini@arm.com 214413481Sgiacomo.travaglini@arm.com m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 214513481Sgiacomo.travaglini@arm.com EXPECT_EQ("((is >= 0) and " 214613481Sgiacomo.travaglini@arm.com "(is < 10)) and " 214713481Sgiacomo.travaglini@arm.com "((isn't equal to 3) and " 214813481Sgiacomo.travaglini@arm.com "((isn't equal to 5) and " 214913481Sgiacomo.travaglini@arm.com "(isn't equal to 7)))", 215013481Sgiacomo.travaglini@arm.com Describe(m)); 215113481Sgiacomo.travaglini@arm.com} 215213481Sgiacomo.travaglini@arm.com 215313481Sgiacomo.travaglini@arm.com// Tests that AllOf(m1, ..., mn) describes its negation properly. 215413481Sgiacomo.travaglini@arm.comTEST(AllOfTest, CanDescribeNegation) { 215513481Sgiacomo.travaglini@arm.com Matcher<int> m; 215613481Sgiacomo.travaglini@arm.com m = AllOf(Le(2), Ge(1)); 215713481Sgiacomo.travaglini@arm.com EXPECT_EQ("(isn't <= 2) or " 215813481Sgiacomo.travaglini@arm.com "(isn't >= 1)", 215913481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 216013481Sgiacomo.travaglini@arm.com 216113481Sgiacomo.travaglini@arm.com m = AllOf(Gt(0), Ne(1), Ne(2)); 216213481Sgiacomo.travaglini@arm.com EXPECT_EQ("(isn't > 0) or " 216313481Sgiacomo.travaglini@arm.com "((is equal to 1) or " 216413481Sgiacomo.travaglini@arm.com "(is equal to 2))", 216513481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 216613481Sgiacomo.travaglini@arm.com 216713481Sgiacomo.travaglini@arm.com 216813481Sgiacomo.travaglini@arm.com m = AllOf(Gt(0), Ne(1), Ne(2), Ne(3)); 216913481Sgiacomo.travaglini@arm.com EXPECT_EQ("((isn't > 0) or " 217013481Sgiacomo.travaglini@arm.com "(is equal to 1)) or " 217113481Sgiacomo.travaglini@arm.com "((is equal to 2) or " 217213481Sgiacomo.travaglini@arm.com "(is equal to 3))", 217313481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 217413481Sgiacomo.travaglini@arm.com 217513481Sgiacomo.travaglini@arm.com 217613481Sgiacomo.travaglini@arm.com m = AllOf(Ge(0), Lt(10), Ne(3), Ne(5), Ne(7)); 217713481Sgiacomo.travaglini@arm.com EXPECT_EQ("((isn't >= 0) or " 217813481Sgiacomo.travaglini@arm.com "(isn't < 10)) or " 217913481Sgiacomo.travaglini@arm.com "((is equal to 3) or " 218013481Sgiacomo.travaglini@arm.com "((is equal to 5) or " 218113481Sgiacomo.travaglini@arm.com "(is equal to 7)))", 218213481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 218313481Sgiacomo.travaglini@arm.com} 218413481Sgiacomo.travaglini@arm.com 218513481Sgiacomo.travaglini@arm.com// Tests that monomorphic matchers are safely cast by the AllOf matcher. 218613481Sgiacomo.travaglini@arm.comTEST(AllOfTest, AllOfMatcherSafelyCastsMonomorphicMatchers) { 218713481Sgiacomo.travaglini@arm.com // greater_than_5 and less_than_10 are monomorphic matchers. 218813481Sgiacomo.travaglini@arm.com Matcher<int> greater_than_5 = Gt(5); 218913481Sgiacomo.travaglini@arm.com Matcher<int> less_than_10 = Lt(10); 219013481Sgiacomo.travaglini@arm.com 219113481Sgiacomo.travaglini@arm.com Matcher<const int&> m = AllOf(greater_than_5, less_than_10); 219213481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = AllOf(greater_than_5, less_than_10); 219313481Sgiacomo.travaglini@arm.com Matcher<int&> m3 = AllOf(greater_than_5, m2); 219413481Sgiacomo.travaglini@arm.com 219513481Sgiacomo.travaglini@arm.com // Tests that BothOf works when composing itself. 219613481Sgiacomo.travaglini@arm.com Matcher<const int&> m4 = AllOf(greater_than_5, less_than_10, less_than_10); 219713481Sgiacomo.travaglini@arm.com Matcher<int&> m5 = AllOf(greater_than_5, less_than_10, less_than_10); 219813481Sgiacomo.travaglini@arm.com} 219913481Sgiacomo.travaglini@arm.com 220013481Sgiacomo.travaglini@arm.comTEST(AllOfTest, ExplainsResult) { 220113481Sgiacomo.travaglini@arm.com Matcher<int> m; 220213481Sgiacomo.travaglini@arm.com 220313481Sgiacomo.travaglini@arm.com // Successful match. Both matchers need to explain. The second 220413481Sgiacomo.travaglini@arm.com // matcher doesn't give an explanation, so only the first matcher's 220513481Sgiacomo.travaglini@arm.com // explanation is printed. 220613481Sgiacomo.travaglini@arm.com m = AllOf(GreaterThan(10), Lt(30)); 220713481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 15 more than 10", Explain(m, 25)); 220813481Sgiacomo.travaglini@arm.com 220913481Sgiacomo.travaglini@arm.com // Successful match. Both matchers need to explain. 221013481Sgiacomo.travaglini@arm.com m = AllOf(GreaterThan(10), GreaterThan(20)); 221113481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 20 more than 10, and which is 10 more than 20", 221213481Sgiacomo.travaglini@arm.com Explain(m, 30)); 221313481Sgiacomo.travaglini@arm.com 221413481Sgiacomo.travaglini@arm.com // Successful match. All matchers need to explain. The second 221513481Sgiacomo.travaglini@arm.com // matcher doesn't given an explanation. 221613481Sgiacomo.travaglini@arm.com m = AllOf(GreaterThan(10), Lt(30), GreaterThan(20)); 221713481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 15 more than 10, and which is 5 more than 20", 221813481Sgiacomo.travaglini@arm.com Explain(m, 25)); 221913481Sgiacomo.travaglini@arm.com 222013481Sgiacomo.travaglini@arm.com // Successful match. All matchers need to explain. 222113481Sgiacomo.travaglini@arm.com m = AllOf(GreaterThan(10), GreaterThan(20), GreaterThan(30)); 222213481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 30 more than 10, and which is 20 more than 20, " 222313481Sgiacomo.travaglini@arm.com "and which is 10 more than 30", 222413481Sgiacomo.travaglini@arm.com Explain(m, 40)); 222513481Sgiacomo.travaglini@arm.com 222613481Sgiacomo.travaglini@arm.com // Failed match. The first matcher, which failed, needs to 222713481Sgiacomo.travaglini@arm.com // explain. 222813481Sgiacomo.travaglini@arm.com m = AllOf(GreaterThan(10), GreaterThan(20)); 222913481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 less than 10", Explain(m, 5)); 223013481Sgiacomo.travaglini@arm.com 223113481Sgiacomo.travaglini@arm.com // Failed match. The second matcher, which failed, needs to 223213481Sgiacomo.travaglini@arm.com // explain. Since it doesn't given an explanation, nothing is 223313481Sgiacomo.travaglini@arm.com // printed. 223413481Sgiacomo.travaglini@arm.com m = AllOf(GreaterThan(10), Lt(30)); 223513481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 40)); 223613481Sgiacomo.travaglini@arm.com 223713481Sgiacomo.travaglini@arm.com // Failed match. The second matcher, which failed, needs to 223813481Sgiacomo.travaglini@arm.com // explain. 223913481Sgiacomo.travaglini@arm.com m = AllOf(GreaterThan(10), GreaterThan(20)); 224013481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 less than 20", Explain(m, 15)); 224113481Sgiacomo.travaglini@arm.com} 224213481Sgiacomo.travaglini@arm.com 224313481Sgiacomo.travaglini@arm.com// Helper to allow easy testing of AnyOf matchers with num parameters. 224413481Sgiacomo.travaglini@arm.comvoid AnyOfMatches(int num, const Matcher<int>& m) { 224513481Sgiacomo.travaglini@arm.com SCOPED_TRACE(Describe(m)); 224613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(0)); 224713481Sgiacomo.travaglini@arm.com for (int i = 1; i <= num; ++i) { 224813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(i)); 224913481Sgiacomo.travaglini@arm.com } 225013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(num + 1)); 225113481Sgiacomo.travaglini@arm.com} 225213481Sgiacomo.travaglini@arm.com 225313481Sgiacomo.travaglini@arm.com// Tests that AnyOf(m1, ..., mn) matches any value that matches at 225413481Sgiacomo.travaglini@arm.com// least one of the given matchers. 225513481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, MatchesWhenAnyMatches) { 225613481Sgiacomo.travaglini@arm.com Matcher<int> m; 225713481Sgiacomo.travaglini@arm.com m = AnyOf(Le(1), Ge(3)); 225813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(1)); 225913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(4)); 226013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(2)); 226113481Sgiacomo.travaglini@arm.com 226213481Sgiacomo.travaglini@arm.com m = AnyOf(Lt(0), Eq(1), Eq(2)); 226313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(-1)); 226413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(1)); 226513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(2)); 226613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(0)); 226713481Sgiacomo.travaglini@arm.com 226813481Sgiacomo.travaglini@arm.com m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 226913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(-1)); 227013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(1)); 227113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(2)); 227213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(3)); 227313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(0)); 227413481Sgiacomo.travaglini@arm.com 227513481Sgiacomo.travaglini@arm.com m = AnyOf(Le(0), Gt(10), 3, 5, 7); 227613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(0)); 227713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(11)); 227813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(3)); 227913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(2)); 228013481Sgiacomo.travaglini@arm.com 228113481Sgiacomo.travaglini@arm.com // The following tests for varying number of sub-matchers. Due to the way 228213481Sgiacomo.travaglini@arm.com // the sub-matchers are handled it is enough to test every sub-matcher once 228313481Sgiacomo.travaglini@arm.com // with sub-matchers using the same matcher type. Varying matcher types are 228413481Sgiacomo.travaglini@arm.com // checked for above. 228513481Sgiacomo.travaglini@arm.com AnyOfMatches(2, AnyOf(1, 2)); 228613481Sgiacomo.travaglini@arm.com AnyOfMatches(3, AnyOf(1, 2, 3)); 228713481Sgiacomo.travaglini@arm.com AnyOfMatches(4, AnyOf(1, 2, 3, 4)); 228813481Sgiacomo.travaglini@arm.com AnyOfMatches(5, AnyOf(1, 2, 3, 4, 5)); 228913481Sgiacomo.travaglini@arm.com AnyOfMatches(6, AnyOf(1, 2, 3, 4, 5, 6)); 229013481Sgiacomo.travaglini@arm.com AnyOfMatches(7, AnyOf(1, 2, 3, 4, 5, 6, 7)); 229113481Sgiacomo.travaglini@arm.com AnyOfMatches(8, AnyOf(1, 2, 3, 4, 5, 6, 7, 8)); 229213481Sgiacomo.travaglini@arm.com AnyOfMatches(9, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9)); 229313481Sgiacomo.travaglini@arm.com AnyOfMatches(10, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); 229413481Sgiacomo.travaglini@arm.com} 229513481Sgiacomo.travaglini@arm.com 229613481Sgiacomo.travaglini@arm.com#if GTEST_LANG_CXX11 229713481Sgiacomo.travaglini@arm.com// Tests the variadic version of the AnyOfMatcher. 229813481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, VariadicMatchesWhenAnyMatches) { 229913481Sgiacomo.travaglini@arm.com // Also make sure AnyOf is defined in the right namespace and does not depend 230013481Sgiacomo.travaglini@arm.com // on ADL. 230113481Sgiacomo.travaglini@arm.com Matcher<int> m = ::testing::AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); 230213481Sgiacomo.travaglini@arm.com 230313481Sgiacomo.travaglini@arm.com EXPECT_THAT(Describe(m), EndsWith("or (is equal to 11))))))))))")); 230413481Sgiacomo.travaglini@arm.com AnyOfMatches(11, m); 230513481Sgiacomo.travaglini@arm.com AnyOfMatches(50, AnyOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 230613481Sgiacomo.travaglini@arm.com 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 230713481Sgiacomo.travaglini@arm.com 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 230813481Sgiacomo.travaglini@arm.com 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 230913481Sgiacomo.travaglini@arm.com 41, 42, 43, 44, 45, 46, 47, 48, 49, 50)); 231013481Sgiacomo.travaglini@arm.com} 231113481Sgiacomo.travaglini@arm.com 231213481Sgiacomo.travaglini@arm.com#endif // GTEST_LANG_CXX11 231313481Sgiacomo.travaglini@arm.com 231413481Sgiacomo.travaglini@arm.com// Tests that AnyOf(m1, ..., mn) describes itself properly. 231513481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, CanDescribeSelf) { 231613481Sgiacomo.travaglini@arm.com Matcher<int> m; 231713481Sgiacomo.travaglini@arm.com m = AnyOf(Le(1), Ge(3)); 231813481Sgiacomo.travaglini@arm.com EXPECT_EQ("(is <= 1) or (is >= 3)", 231913481Sgiacomo.travaglini@arm.com Describe(m)); 232013481Sgiacomo.travaglini@arm.com 232113481Sgiacomo.travaglini@arm.com m = AnyOf(Lt(0), Eq(1), Eq(2)); 232213481Sgiacomo.travaglini@arm.com EXPECT_EQ("(is < 0) or " 232313481Sgiacomo.travaglini@arm.com "((is equal to 1) or (is equal to 2))", 232413481Sgiacomo.travaglini@arm.com Describe(m)); 232513481Sgiacomo.travaglini@arm.com 232613481Sgiacomo.travaglini@arm.com m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 232713481Sgiacomo.travaglini@arm.com EXPECT_EQ("((is < 0) or " 232813481Sgiacomo.travaglini@arm.com "(is equal to 1)) or " 232913481Sgiacomo.travaglini@arm.com "((is equal to 2) or " 233013481Sgiacomo.travaglini@arm.com "(is equal to 3))", 233113481Sgiacomo.travaglini@arm.com Describe(m)); 233213481Sgiacomo.travaglini@arm.com 233313481Sgiacomo.travaglini@arm.com m = AnyOf(Le(0), Gt(10), 3, 5, 7); 233413481Sgiacomo.travaglini@arm.com EXPECT_EQ("((is <= 0) or " 233513481Sgiacomo.travaglini@arm.com "(is > 10)) or " 233613481Sgiacomo.travaglini@arm.com "((is equal to 3) or " 233713481Sgiacomo.travaglini@arm.com "((is equal to 5) or " 233813481Sgiacomo.travaglini@arm.com "(is equal to 7)))", 233913481Sgiacomo.travaglini@arm.com Describe(m)); 234013481Sgiacomo.travaglini@arm.com} 234113481Sgiacomo.travaglini@arm.com 234213481Sgiacomo.travaglini@arm.com// Tests that AnyOf(m1, ..., mn) describes its negation properly. 234313481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, CanDescribeNegation) { 234413481Sgiacomo.travaglini@arm.com Matcher<int> m; 234513481Sgiacomo.travaglini@arm.com m = AnyOf(Le(1), Ge(3)); 234613481Sgiacomo.travaglini@arm.com EXPECT_EQ("(isn't <= 1) and (isn't >= 3)", 234713481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 234813481Sgiacomo.travaglini@arm.com 234913481Sgiacomo.travaglini@arm.com m = AnyOf(Lt(0), Eq(1), Eq(2)); 235013481Sgiacomo.travaglini@arm.com EXPECT_EQ("(isn't < 0) and " 235113481Sgiacomo.travaglini@arm.com "((isn't equal to 1) and (isn't equal to 2))", 235213481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 235313481Sgiacomo.travaglini@arm.com 235413481Sgiacomo.travaglini@arm.com m = AnyOf(Lt(0), Eq(1), Eq(2), Eq(3)); 235513481Sgiacomo.travaglini@arm.com EXPECT_EQ("((isn't < 0) and " 235613481Sgiacomo.travaglini@arm.com "(isn't equal to 1)) and " 235713481Sgiacomo.travaglini@arm.com "((isn't equal to 2) and " 235813481Sgiacomo.travaglini@arm.com "(isn't equal to 3))", 235913481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 236013481Sgiacomo.travaglini@arm.com 236113481Sgiacomo.travaglini@arm.com m = AnyOf(Le(0), Gt(10), 3, 5, 7); 236213481Sgiacomo.travaglini@arm.com EXPECT_EQ("((isn't <= 0) and " 236313481Sgiacomo.travaglini@arm.com "(isn't > 10)) and " 236413481Sgiacomo.travaglini@arm.com "((isn't equal to 3) and " 236513481Sgiacomo.travaglini@arm.com "((isn't equal to 5) and " 236613481Sgiacomo.travaglini@arm.com "(isn't equal to 7)))", 236713481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 236813481Sgiacomo.travaglini@arm.com} 236913481Sgiacomo.travaglini@arm.com 237013481Sgiacomo.travaglini@arm.com// Tests that monomorphic matchers are safely cast by the AnyOf matcher. 237113481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, AnyOfMatcherSafelyCastsMonomorphicMatchers) { 237213481Sgiacomo.travaglini@arm.com // greater_than_5 and less_than_10 are monomorphic matchers. 237313481Sgiacomo.travaglini@arm.com Matcher<int> greater_than_5 = Gt(5); 237413481Sgiacomo.travaglini@arm.com Matcher<int> less_than_10 = Lt(10); 237513481Sgiacomo.travaglini@arm.com 237613481Sgiacomo.travaglini@arm.com Matcher<const int&> m = AnyOf(greater_than_5, less_than_10); 237713481Sgiacomo.travaglini@arm.com Matcher<int&> m2 = AnyOf(greater_than_5, less_than_10); 237813481Sgiacomo.travaglini@arm.com Matcher<int&> m3 = AnyOf(greater_than_5, m2); 237913481Sgiacomo.travaglini@arm.com 238013481Sgiacomo.travaglini@arm.com // Tests that EitherOf works when composing itself. 238113481Sgiacomo.travaglini@arm.com Matcher<const int&> m4 = AnyOf(greater_than_5, less_than_10, less_than_10); 238213481Sgiacomo.travaglini@arm.com Matcher<int&> m5 = AnyOf(greater_than_5, less_than_10, less_than_10); 238313481Sgiacomo.travaglini@arm.com} 238413481Sgiacomo.travaglini@arm.com 238513481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, ExplainsResult) { 238613481Sgiacomo.travaglini@arm.com Matcher<int> m; 238713481Sgiacomo.travaglini@arm.com 238813481Sgiacomo.travaglini@arm.com // Failed match. Both matchers need to explain. The second 238913481Sgiacomo.travaglini@arm.com // matcher doesn't give an explanation, so only the first matcher's 239013481Sgiacomo.travaglini@arm.com // explanation is printed. 239113481Sgiacomo.travaglini@arm.com m = AnyOf(GreaterThan(10), Lt(0)); 239213481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 less than 10", Explain(m, 5)); 239313481Sgiacomo.travaglini@arm.com 239413481Sgiacomo.travaglini@arm.com // Failed match. Both matchers need to explain. 239513481Sgiacomo.travaglini@arm.com m = AnyOf(GreaterThan(10), GreaterThan(20)); 239613481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20", 239713481Sgiacomo.travaglini@arm.com Explain(m, 5)); 239813481Sgiacomo.travaglini@arm.com 239913481Sgiacomo.travaglini@arm.com // Failed match. All matchers need to explain. The second 240013481Sgiacomo.travaglini@arm.com // matcher doesn't given an explanation. 240113481Sgiacomo.travaglini@arm.com m = AnyOf(GreaterThan(10), Gt(20), GreaterThan(30)); 240213481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 less than 10, and which is 25 less than 30", 240313481Sgiacomo.travaglini@arm.com Explain(m, 5)); 240413481Sgiacomo.travaglini@arm.com 240513481Sgiacomo.travaglini@arm.com // Failed match. All matchers need to explain. 240613481Sgiacomo.travaglini@arm.com m = AnyOf(GreaterThan(10), GreaterThan(20), GreaterThan(30)); 240713481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 less than 10, and which is 15 less than 20, " 240813481Sgiacomo.travaglini@arm.com "and which is 25 less than 30", 240913481Sgiacomo.travaglini@arm.com Explain(m, 5)); 241013481Sgiacomo.travaglini@arm.com 241113481Sgiacomo.travaglini@arm.com // Successful match. The first matcher, which succeeded, needs to 241213481Sgiacomo.travaglini@arm.com // explain. 241313481Sgiacomo.travaglini@arm.com m = AnyOf(GreaterThan(10), GreaterThan(20)); 241413481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 more than 10", Explain(m, 15)); 241513481Sgiacomo.travaglini@arm.com 241613481Sgiacomo.travaglini@arm.com // Successful match. The second matcher, which succeeded, needs to 241713481Sgiacomo.travaglini@arm.com // explain. Since it doesn't given an explanation, nothing is 241813481Sgiacomo.travaglini@arm.com // printed. 241913481Sgiacomo.travaglini@arm.com m = AnyOf(GreaterThan(10), Lt(30)); 242013481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 0)); 242113481Sgiacomo.travaglini@arm.com 242213481Sgiacomo.travaglini@arm.com // Successful match. The second matcher, which succeeded, needs to 242313481Sgiacomo.travaglini@arm.com // explain. 242413481Sgiacomo.travaglini@arm.com m = AnyOf(GreaterThan(30), GreaterThan(20)); 242513481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 5 more than 20", Explain(m, 25)); 242613481Sgiacomo.travaglini@arm.com} 242713481Sgiacomo.travaglini@arm.com 242813481Sgiacomo.travaglini@arm.com// The following predicate function and predicate functor are for 242913481Sgiacomo.travaglini@arm.com// testing the Truly(predicate) matcher. 243013481Sgiacomo.travaglini@arm.com 243113481Sgiacomo.travaglini@arm.com// Returns non-zero if the input is positive. Note that the return 243213481Sgiacomo.travaglini@arm.com// type of this function is not bool. It's OK as Truly() accepts any 243313481Sgiacomo.travaglini@arm.com// unary function or functor whose return type can be implicitly 243413481Sgiacomo.travaglini@arm.com// converted to bool. 243513481Sgiacomo.travaglini@arm.comint IsPositive(double x) { 243613481Sgiacomo.travaglini@arm.com return x > 0 ? 1 : 0; 243713481Sgiacomo.travaglini@arm.com} 243813481Sgiacomo.travaglini@arm.com 243913481Sgiacomo.travaglini@arm.com// This functor returns true if the input is greater than the given 244013481Sgiacomo.travaglini@arm.com// number. 244113481Sgiacomo.travaglini@arm.comclass IsGreaterThan { 244213481Sgiacomo.travaglini@arm.com public: 244313481Sgiacomo.travaglini@arm.com explicit IsGreaterThan(int threshold) : threshold_(threshold) {} 244413481Sgiacomo.travaglini@arm.com 244513481Sgiacomo.travaglini@arm.com bool operator()(int n) const { return n > threshold_; } 244613481Sgiacomo.travaglini@arm.com 244713481Sgiacomo.travaglini@arm.com private: 244813481Sgiacomo.travaglini@arm.com int threshold_; 244913481Sgiacomo.travaglini@arm.com}; 245013481Sgiacomo.travaglini@arm.com 245113481Sgiacomo.travaglini@arm.com// For testing Truly(). 245213481Sgiacomo.travaglini@arm.comconst int foo = 0; 245313481Sgiacomo.travaglini@arm.com 245413481Sgiacomo.travaglini@arm.com// This predicate returns true iff the argument references foo and has 245513481Sgiacomo.travaglini@arm.com// a zero value. 245613481Sgiacomo.travaglini@arm.combool ReferencesFooAndIsZero(const int& n) { 245713481Sgiacomo.travaglini@arm.com return (&n == &foo) && (n == 0); 245813481Sgiacomo.travaglini@arm.com} 245913481Sgiacomo.travaglini@arm.com 246013481Sgiacomo.travaglini@arm.com// Tests that Truly(predicate) matches what satisfies the given 246113481Sgiacomo.travaglini@arm.com// predicate. 246213481Sgiacomo.travaglini@arm.comTEST(TrulyTest, MatchesWhatSatisfiesThePredicate) { 246313481Sgiacomo.travaglini@arm.com Matcher<double> m = Truly(IsPositive); 246413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(2.0)); 246513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(-1.5)); 246613481Sgiacomo.travaglini@arm.com} 246713481Sgiacomo.travaglini@arm.com 246813481Sgiacomo.travaglini@arm.com// Tests that Truly(predicate_functor) works too. 246913481Sgiacomo.travaglini@arm.comTEST(TrulyTest, CanBeUsedWithFunctor) { 247013481Sgiacomo.travaglini@arm.com Matcher<int> m = Truly(IsGreaterThan(5)); 247113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(6)); 247213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(4)); 247313481Sgiacomo.travaglini@arm.com} 247413481Sgiacomo.travaglini@arm.com 247513481Sgiacomo.travaglini@arm.com// A class that can be implicitly converted to bool. 247613481Sgiacomo.travaglini@arm.comclass ConvertibleToBool { 247713481Sgiacomo.travaglini@arm.com public: 247813481Sgiacomo.travaglini@arm.com explicit ConvertibleToBool(int number) : number_(number) {} 247913481Sgiacomo.travaglini@arm.com operator bool() const { return number_ != 0; } 248013481Sgiacomo.travaglini@arm.com 248113481Sgiacomo.travaglini@arm.com private: 248213481Sgiacomo.travaglini@arm.com int number_; 248313481Sgiacomo.travaglini@arm.com}; 248413481Sgiacomo.travaglini@arm.com 248513481Sgiacomo.travaglini@arm.comConvertibleToBool IsNotZero(int number) { 248613481Sgiacomo.travaglini@arm.com return ConvertibleToBool(number); 248713481Sgiacomo.travaglini@arm.com} 248813481Sgiacomo.travaglini@arm.com 248913481Sgiacomo.travaglini@arm.com// Tests that the predicate used in Truly() may return a class that's 249013481Sgiacomo.travaglini@arm.com// implicitly convertible to bool, even when the class has no 249113481Sgiacomo.travaglini@arm.com// operator!(). 249213481Sgiacomo.travaglini@arm.comTEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) { 249313481Sgiacomo.travaglini@arm.com Matcher<int> m = Truly(IsNotZero); 249413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(1)); 249513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(0)); 249613481Sgiacomo.travaglini@arm.com} 249713481Sgiacomo.travaglini@arm.com 249813481Sgiacomo.travaglini@arm.com// Tests that Truly(predicate) can describe itself properly. 249913481Sgiacomo.travaglini@arm.comTEST(TrulyTest, CanDescribeSelf) { 250013481Sgiacomo.travaglini@arm.com Matcher<double> m = Truly(IsPositive); 250113481Sgiacomo.travaglini@arm.com EXPECT_EQ("satisfies the given predicate", 250213481Sgiacomo.travaglini@arm.com Describe(m)); 250313481Sgiacomo.travaglini@arm.com} 250413481Sgiacomo.travaglini@arm.com 250513481Sgiacomo.travaglini@arm.com// Tests that Truly(predicate) works when the matcher takes its 250613481Sgiacomo.travaglini@arm.com// argument by reference. 250713481Sgiacomo.travaglini@arm.comTEST(TrulyTest, WorksForByRefArguments) { 250813481Sgiacomo.travaglini@arm.com Matcher<const int&> m = Truly(ReferencesFooAndIsZero); 250913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(foo)); 251013481Sgiacomo.travaglini@arm.com int n = 0; 251113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(n)); 251213481Sgiacomo.travaglini@arm.com} 251313481Sgiacomo.travaglini@arm.com 251413481Sgiacomo.travaglini@arm.com// Tests that Matches(m) is a predicate satisfied by whatever that 251513481Sgiacomo.travaglini@arm.com// matches matcher m. 251613481Sgiacomo.travaglini@arm.comTEST(MatchesTest, IsSatisfiedByWhatMatchesTheMatcher) { 251713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(Matches(Ge(0))(1)); 251813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(Matches(Eq('a'))('b')); 251913481Sgiacomo.travaglini@arm.com} 252013481Sgiacomo.travaglini@arm.com 252113481Sgiacomo.travaglini@arm.com// Tests that Matches(m) works when the matcher takes its argument by 252213481Sgiacomo.travaglini@arm.com// reference. 252313481Sgiacomo.travaglini@arm.comTEST(MatchesTest, WorksOnByRefArguments) { 252413481Sgiacomo.travaglini@arm.com int m = 0, n = 0; 252513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(Matches(AllOf(Ref(n), Eq(0)))(n)); 252613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(Matches(Ref(m))(n)); 252713481Sgiacomo.travaglini@arm.com} 252813481Sgiacomo.travaglini@arm.com 252913481Sgiacomo.travaglini@arm.com// Tests that a Matcher on non-reference type can be used in 253013481Sgiacomo.travaglini@arm.com// Matches(). 253113481Sgiacomo.travaglini@arm.comTEST(MatchesTest, WorksWithMatcherOnNonRefType) { 253213481Sgiacomo.travaglini@arm.com Matcher<int> eq5 = Eq(5); 253313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(Matches(eq5)(5)); 253413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(Matches(eq5)(2)); 253513481Sgiacomo.travaglini@arm.com} 253613481Sgiacomo.travaglini@arm.com 253713481Sgiacomo.travaglini@arm.com// Tests Value(value, matcher). Since Value() is a simple wrapper for 253813481Sgiacomo.travaglini@arm.com// Matches(), which has been tested already, we don't spend a lot of 253913481Sgiacomo.travaglini@arm.com// effort on testing Value(). 254013481Sgiacomo.travaglini@arm.comTEST(ValueTest, WorksWithPolymorphicMatcher) { 254113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(Value("hi", StartsWith("h"))); 254213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(Value(5, Gt(10))); 254313481Sgiacomo.travaglini@arm.com} 254413481Sgiacomo.travaglini@arm.com 254513481Sgiacomo.travaglini@arm.comTEST(ValueTest, WorksWithMonomorphicMatcher) { 254613481Sgiacomo.travaglini@arm.com const Matcher<int> is_zero = Eq(0); 254713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(Value(0, is_zero)); 254813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(Value('a', is_zero)); 254913481Sgiacomo.travaglini@arm.com 255013481Sgiacomo.travaglini@arm.com int n = 0; 255113481Sgiacomo.travaglini@arm.com const Matcher<const int&> ref_n = Ref(n); 255213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(Value(n, ref_n)); 255313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(Value(1, ref_n)); 255413481Sgiacomo.travaglini@arm.com} 255513481Sgiacomo.travaglini@arm.com 255613481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, WorksWithPolymorphicMatcher) { 255713481Sgiacomo.travaglini@arm.com StringMatchResultListener listener1; 255813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ExplainMatchResult(PolymorphicIsEven(), 42, &listener1)); 255913481Sgiacomo.travaglini@arm.com EXPECT_EQ("% 2 == 0", listener1.str()); 256013481Sgiacomo.travaglini@arm.com 256113481Sgiacomo.travaglini@arm.com StringMatchResultListener listener2; 256213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(Ge(42), 1.5, &listener2)); 256313481Sgiacomo.travaglini@arm.com EXPECT_EQ("", listener2.str()); 256413481Sgiacomo.travaglini@arm.com} 256513481Sgiacomo.travaglini@arm.com 256613481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) { 256713481Sgiacomo.travaglini@arm.com const Matcher<int> is_even = PolymorphicIsEven(); 256813481Sgiacomo.travaglini@arm.com StringMatchResultListener listener1; 256913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ExplainMatchResult(is_even, 42, &listener1)); 257013481Sgiacomo.travaglini@arm.com EXPECT_EQ("% 2 == 0", listener1.str()); 257113481Sgiacomo.travaglini@arm.com 257213481Sgiacomo.travaglini@arm.com const Matcher<const double&> is_zero = Eq(0); 257313481Sgiacomo.travaglini@arm.com StringMatchResultListener listener2; 257413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(is_zero, 1.5, &listener2)); 257513481Sgiacomo.travaglini@arm.com EXPECT_EQ("", listener2.str()); 257613481Sgiacomo.travaglini@arm.com} 257713481Sgiacomo.travaglini@arm.com 257813481Sgiacomo.travaglini@arm.comMATCHER_P(Really, inner_matcher, "") { 257913481Sgiacomo.travaglini@arm.com return ExplainMatchResult(inner_matcher, arg, result_listener); 258013481Sgiacomo.travaglini@arm.com} 258113481Sgiacomo.travaglini@arm.com 258213481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, WorksInsideMATCHER) { 258313481Sgiacomo.travaglini@arm.com EXPECT_THAT(0, Really(Eq(0))); 258413481Sgiacomo.travaglini@arm.com} 258513481Sgiacomo.travaglini@arm.com 258613481Sgiacomo.travaglini@arm.comTEST(AllArgsTest, WorksForTuple) { 258713481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(1, 2L), AllArgs(Lt())); 258813481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(2L, 1), Not(AllArgs(Lt()))); 258913481Sgiacomo.travaglini@arm.com} 259013481Sgiacomo.travaglini@arm.com 259113481Sgiacomo.travaglini@arm.comTEST(AllArgsTest, WorksForNonTuple) { 259213481Sgiacomo.travaglini@arm.com EXPECT_THAT(42, AllArgs(Gt(0))); 259313481Sgiacomo.travaglini@arm.com EXPECT_THAT('a', Not(AllArgs(Eq('b')))); 259413481Sgiacomo.travaglini@arm.com} 259513481Sgiacomo.travaglini@arm.com 259613481Sgiacomo.travaglini@arm.comclass AllArgsHelper { 259713481Sgiacomo.travaglini@arm.com public: 259813481Sgiacomo.travaglini@arm.com AllArgsHelper() {} 259913481Sgiacomo.travaglini@arm.com 260013481Sgiacomo.travaglini@arm.com MOCK_METHOD2(Helper, int(char x, int y)); 260113481Sgiacomo.travaglini@arm.com 260213481Sgiacomo.travaglini@arm.com private: 260313481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(AllArgsHelper); 260413481Sgiacomo.travaglini@arm.com}; 260513481Sgiacomo.travaglini@arm.com 260613481Sgiacomo.travaglini@arm.comTEST(AllArgsTest, WorksInWithClause) { 260713481Sgiacomo.travaglini@arm.com AllArgsHelper helper; 260813481Sgiacomo.travaglini@arm.com ON_CALL(helper, Helper(_, _)) 260913481Sgiacomo.travaglini@arm.com .With(AllArgs(Lt())) 261013481Sgiacomo.travaglini@arm.com .WillByDefault(Return(1)); 261113481Sgiacomo.travaglini@arm.com EXPECT_CALL(helper, Helper(_, _)); 261213481Sgiacomo.travaglini@arm.com EXPECT_CALL(helper, Helper(_, _)) 261313481Sgiacomo.travaglini@arm.com .With(AllArgs(Gt())) 261413481Sgiacomo.travaglini@arm.com .WillOnce(Return(2)); 261513481Sgiacomo.travaglini@arm.com 261613481Sgiacomo.travaglini@arm.com EXPECT_EQ(1, helper.Helper('\1', 2)); 261713481Sgiacomo.travaglini@arm.com EXPECT_EQ(2, helper.Helper('a', 1)); 261813481Sgiacomo.travaglini@arm.com} 261913481Sgiacomo.travaglini@arm.com 262013481Sgiacomo.travaglini@arm.com// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 262113481Sgiacomo.travaglini@arm.com// matches the matcher. 262213481Sgiacomo.travaglini@arm.comTEST(MatcherAssertionTest, WorksWhenMatcherIsSatisfied) { 262313481Sgiacomo.travaglini@arm.com ASSERT_THAT(5, Ge(2)) << "This should succeed."; 262413481Sgiacomo.travaglini@arm.com ASSERT_THAT("Foo", EndsWith("oo")); 262513481Sgiacomo.travaglini@arm.com EXPECT_THAT(2, AllOf(Le(7), Ge(0))) << "This should succeed too."; 262613481Sgiacomo.travaglini@arm.com EXPECT_THAT("Hello", StartsWith("Hell")); 262713481Sgiacomo.travaglini@arm.com} 262813481Sgiacomo.travaglini@arm.com 262913481Sgiacomo.travaglini@arm.com// Tests that ASSERT_THAT() and EXPECT_THAT() work when the value 263013481Sgiacomo.travaglini@arm.com// doesn't match the matcher. 263113481Sgiacomo.travaglini@arm.comTEST(MatcherAssertionTest, WorksWhenMatcherIsNotSatisfied) { 263213481Sgiacomo.travaglini@arm.com // 'n' must be static as it is used in an EXPECT_FATAL_FAILURE(), 263313481Sgiacomo.travaglini@arm.com // which cannot reference auto variables. 263413481Sgiacomo.travaglini@arm.com static unsigned short n; // NOLINT 263513481Sgiacomo.travaglini@arm.com n = 5; 263613481Sgiacomo.travaglini@arm.com 263713481Sgiacomo.travaglini@arm.com // VC++ prior to version 8.0 SP1 has a bug where it will not see any 263813481Sgiacomo.travaglini@arm.com // functions declared in the namespace scope from within nested classes. 263913481Sgiacomo.travaglini@arm.com // EXPECT/ASSERT_(NON)FATAL_FAILURE macros use nested classes so that all 264013481Sgiacomo.travaglini@arm.com // namespace-level functions invoked inside them need to be explicitly 264113481Sgiacomo.travaglini@arm.com // resolved. 264213481Sgiacomo.travaglini@arm.com EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Gt(10)), 264313481Sgiacomo.travaglini@arm.com "Value of: n\n" 264413481Sgiacomo.travaglini@arm.com "Expected: is > 10\n" 264513481Sgiacomo.travaglini@arm.com " Actual: 5" + OfType("unsigned short")); 264613481Sgiacomo.travaglini@arm.com n = 0; 264713481Sgiacomo.travaglini@arm.com EXPECT_NONFATAL_FAILURE( 264813481Sgiacomo.travaglini@arm.com EXPECT_THAT(n, ::testing::AllOf(::testing::Le(7), ::testing::Ge(5))), 264913481Sgiacomo.travaglini@arm.com "Value of: n\n" 265013481Sgiacomo.travaglini@arm.com "Expected: (is <= 7) and (is >= 5)\n" 265113481Sgiacomo.travaglini@arm.com " Actual: 0" + OfType("unsigned short")); 265213481Sgiacomo.travaglini@arm.com} 265313481Sgiacomo.travaglini@arm.com 265413481Sgiacomo.travaglini@arm.com// Tests that ASSERT_THAT() and EXPECT_THAT() work when the argument 265513481Sgiacomo.travaglini@arm.com// has a reference type. 265613481Sgiacomo.travaglini@arm.comTEST(MatcherAssertionTest, WorksForByRefArguments) { 265713481Sgiacomo.travaglini@arm.com // We use a static variable here as EXPECT_FATAL_FAILURE() cannot 265813481Sgiacomo.travaglini@arm.com // reference auto variables. 265913481Sgiacomo.travaglini@arm.com static int n; 266013481Sgiacomo.travaglini@arm.com n = 0; 266113481Sgiacomo.travaglini@arm.com EXPECT_THAT(n, AllOf(Le(7), Ref(n))); 266213481Sgiacomo.travaglini@arm.com EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 266313481Sgiacomo.travaglini@arm.com "Value of: n\n" 266413481Sgiacomo.travaglini@arm.com "Expected: does not reference the variable @"); 266513481Sgiacomo.travaglini@arm.com // Tests the "Actual" part. 266613481Sgiacomo.travaglini@arm.com EXPECT_FATAL_FAILURE(ASSERT_THAT(n, ::testing::Not(::testing::Ref(n))), 266713481Sgiacomo.travaglini@arm.com "Actual: 0" + OfType("int") + ", which is located @"); 266813481Sgiacomo.travaglini@arm.com} 266913481Sgiacomo.travaglini@arm.com 267013481Sgiacomo.travaglini@arm.com#if !GTEST_OS_SYMBIAN 267113481Sgiacomo.travaglini@arm.com// Tests that ASSERT_THAT() and EXPECT_THAT() work when the matcher is 267213481Sgiacomo.travaglini@arm.com// monomorphic. 267313481Sgiacomo.travaglini@arm.com 267413481Sgiacomo.travaglini@arm.com// ASSERT_THAT("hello", starts_with_he) fails to compile with Nokia's 267513481Sgiacomo.travaglini@arm.com// Symbian compiler: it tries to compile 267613481Sgiacomo.travaglini@arm.com// template<T, U> class MatcherCastImpl { ... 267713481Sgiacomo.travaglini@arm.com// virtual bool MatchAndExplain(T x, ...) const { 267813481Sgiacomo.travaglini@arm.com// return source_matcher_.MatchAndExplain(static_cast<U>(x), ...); 267913481Sgiacomo.travaglini@arm.com// with U == string and T == const char* 268013481Sgiacomo.travaglini@arm.com// With ASSERT_THAT("hello"...) changed to ASSERT_THAT(string("hello") ... ) 268113481Sgiacomo.travaglini@arm.com// the compiler silently crashes with no output. 268213481Sgiacomo.travaglini@arm.com// If MatcherCastImpl is changed to use U(x) instead of static_cast<U>(x) 268313481Sgiacomo.travaglini@arm.com// the code compiles but the converted string is bogus. 268413481Sgiacomo.travaglini@arm.comTEST(MatcherAssertionTest, WorksForMonomorphicMatcher) { 268513481Sgiacomo.travaglini@arm.com Matcher<const char*> starts_with_he = StartsWith("he"); 268613481Sgiacomo.travaglini@arm.com ASSERT_THAT("hello", starts_with_he); 268713481Sgiacomo.travaglini@arm.com 268813481Sgiacomo.travaglini@arm.com Matcher<const string&> ends_with_ok = EndsWith("ok"); 268913481Sgiacomo.travaglini@arm.com ASSERT_THAT("book", ends_with_ok); 269013481Sgiacomo.travaglini@arm.com const string bad = "bad"; 269113481Sgiacomo.travaglini@arm.com EXPECT_NONFATAL_FAILURE(EXPECT_THAT(bad, ends_with_ok), 269213481Sgiacomo.travaglini@arm.com "Value of: bad\n" 269313481Sgiacomo.travaglini@arm.com "Expected: ends with \"ok\"\n" 269413481Sgiacomo.travaglini@arm.com " Actual: \"bad\""); 269513481Sgiacomo.travaglini@arm.com Matcher<int> is_greater_than_5 = Gt(5); 269613481Sgiacomo.travaglini@arm.com EXPECT_NONFATAL_FAILURE(EXPECT_THAT(5, is_greater_than_5), 269713481Sgiacomo.travaglini@arm.com "Value of: 5\n" 269813481Sgiacomo.travaglini@arm.com "Expected: is > 5\n" 269913481Sgiacomo.travaglini@arm.com " Actual: 5" + OfType("int")); 270013481Sgiacomo.travaglini@arm.com} 270113481Sgiacomo.travaglini@arm.com#endif // !GTEST_OS_SYMBIAN 270213481Sgiacomo.travaglini@arm.com 270313481Sgiacomo.travaglini@arm.com// Tests floating-point matchers. 270413481Sgiacomo.travaglini@arm.comtemplate <typename RawType> 270513481Sgiacomo.travaglini@arm.comclass FloatingPointTest : public testing::Test { 270613481Sgiacomo.travaglini@arm.com protected: 270713481Sgiacomo.travaglini@arm.com typedef testing::internal::FloatingPoint<RawType> Floating; 270813481Sgiacomo.travaglini@arm.com typedef typename Floating::Bits Bits; 270913481Sgiacomo.travaglini@arm.com 271013481Sgiacomo.travaglini@arm.com FloatingPointTest() 271113481Sgiacomo.travaglini@arm.com : max_ulps_(Floating::kMaxUlps), 271213481Sgiacomo.travaglini@arm.com zero_bits_(Floating(0).bits()), 271313481Sgiacomo.travaglini@arm.com one_bits_(Floating(1).bits()), 271413481Sgiacomo.travaglini@arm.com infinity_bits_(Floating(Floating::Infinity()).bits()), 271513481Sgiacomo.travaglini@arm.com close_to_positive_zero_(AsBits(zero_bits_ + max_ulps_/2)), 271613481Sgiacomo.travaglini@arm.com close_to_negative_zero_(AsBits(zero_bits_ + max_ulps_ - max_ulps_/2)), 271713481Sgiacomo.travaglini@arm.com further_from_negative_zero_(-AsBits( 271813481Sgiacomo.travaglini@arm.com zero_bits_ + max_ulps_ + 1 - max_ulps_/2)), 271913481Sgiacomo.travaglini@arm.com close_to_one_(AsBits(one_bits_ + max_ulps_)), 272013481Sgiacomo.travaglini@arm.com further_from_one_(AsBits(one_bits_ + max_ulps_ + 1)), 272113481Sgiacomo.travaglini@arm.com infinity_(Floating::Infinity()), 272213481Sgiacomo.travaglini@arm.com close_to_infinity_(AsBits(infinity_bits_ - max_ulps_)), 272313481Sgiacomo.travaglini@arm.com further_from_infinity_(AsBits(infinity_bits_ - max_ulps_ - 1)), 272413481Sgiacomo.travaglini@arm.com max_(Floating::Max()), 272513481Sgiacomo.travaglini@arm.com nan1_(AsBits(Floating::kExponentBitMask | 1)), 272613481Sgiacomo.travaglini@arm.com nan2_(AsBits(Floating::kExponentBitMask | 200)) { 272713481Sgiacomo.travaglini@arm.com } 272813481Sgiacomo.travaglini@arm.com 272913481Sgiacomo.travaglini@arm.com void TestSize() { 273013481Sgiacomo.travaglini@arm.com EXPECT_EQ(sizeof(RawType), sizeof(Bits)); 273113481Sgiacomo.travaglini@arm.com } 273213481Sgiacomo.travaglini@arm.com 273313481Sgiacomo.travaglini@arm.com // A battery of tests for FloatingEqMatcher::Matches. 273413481Sgiacomo.travaglini@arm.com // matcher_maker is a pointer to a function which creates a FloatingEqMatcher. 273513481Sgiacomo.travaglini@arm.com void TestMatches( 273613481Sgiacomo.travaglini@arm.com testing::internal::FloatingEqMatcher<RawType> (*matcher_maker)(RawType)) { 273713481Sgiacomo.travaglini@arm.com Matcher<RawType> m1 = matcher_maker(0.0); 273813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(-0.0)); 273913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(close_to_positive_zero_)); 274013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(close_to_negative_zero_)); 274113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(1.0)); 274213481Sgiacomo.travaglini@arm.com 274313481Sgiacomo.travaglini@arm.com Matcher<RawType> m2 = matcher_maker(close_to_positive_zero_); 274413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(further_from_negative_zero_)); 274513481Sgiacomo.travaglini@arm.com 274613481Sgiacomo.travaglini@arm.com Matcher<RawType> m3 = matcher_maker(1.0); 274713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(close_to_one_)); 274813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(further_from_one_)); 274913481Sgiacomo.travaglini@arm.com 275013481Sgiacomo.travaglini@arm.com // Test commutativity: matcher_maker(0.0).Matches(1.0) was tested above. 275113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(0.0)); 275213481Sgiacomo.travaglini@arm.com 275313481Sgiacomo.travaglini@arm.com Matcher<RawType> m4 = matcher_maker(-infinity_); 275413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m4.Matches(-close_to_infinity_)); 275513481Sgiacomo.travaglini@arm.com 275613481Sgiacomo.travaglini@arm.com Matcher<RawType> m5 = matcher_maker(infinity_); 275713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m5.Matches(close_to_infinity_)); 275813481Sgiacomo.travaglini@arm.com 275913481Sgiacomo.travaglini@arm.com // This is interesting as the representations of infinity_ and nan1_ 276013481Sgiacomo.travaglini@arm.com // are only 1 DLP apart. 276113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m5.Matches(nan1_)); 276213481Sgiacomo.travaglini@arm.com 276313481Sgiacomo.travaglini@arm.com // matcher_maker can produce a Matcher<const RawType&>, which is needed in 276413481Sgiacomo.travaglini@arm.com // some cases. 276513481Sgiacomo.travaglini@arm.com Matcher<const RawType&> m6 = matcher_maker(0.0); 276613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m6.Matches(-0.0)); 276713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m6.Matches(close_to_positive_zero_)); 276813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m6.Matches(1.0)); 276913481Sgiacomo.travaglini@arm.com 277013481Sgiacomo.travaglini@arm.com // matcher_maker can produce a Matcher<RawType&>, which is needed in some 277113481Sgiacomo.travaglini@arm.com // cases. 277213481Sgiacomo.travaglini@arm.com Matcher<RawType&> m7 = matcher_maker(0.0); 277313481Sgiacomo.travaglini@arm.com RawType x = 0.0; 277413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m7.Matches(x)); 277513481Sgiacomo.travaglini@arm.com x = 0.01f; 277613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m7.Matches(x)); 277713481Sgiacomo.travaglini@arm.com } 277813481Sgiacomo.travaglini@arm.com 277913481Sgiacomo.travaglini@arm.com // Pre-calculated numbers to be used by the tests. 278013481Sgiacomo.travaglini@arm.com 278113481Sgiacomo.travaglini@arm.com const size_t max_ulps_; 278213481Sgiacomo.travaglini@arm.com 278313481Sgiacomo.travaglini@arm.com const Bits zero_bits_; // The bits that represent 0.0. 278413481Sgiacomo.travaglini@arm.com const Bits one_bits_; // The bits that represent 1.0. 278513481Sgiacomo.travaglini@arm.com const Bits infinity_bits_; // The bits that represent +infinity. 278613481Sgiacomo.travaglini@arm.com 278713481Sgiacomo.travaglini@arm.com // Some numbers close to 0.0. 278813481Sgiacomo.travaglini@arm.com const RawType close_to_positive_zero_; 278913481Sgiacomo.travaglini@arm.com const RawType close_to_negative_zero_; 279013481Sgiacomo.travaglini@arm.com const RawType further_from_negative_zero_; 279113481Sgiacomo.travaglini@arm.com 279213481Sgiacomo.travaglini@arm.com // Some numbers close to 1.0. 279313481Sgiacomo.travaglini@arm.com const RawType close_to_one_; 279413481Sgiacomo.travaglini@arm.com const RawType further_from_one_; 279513481Sgiacomo.travaglini@arm.com 279613481Sgiacomo.travaglini@arm.com // Some numbers close to +infinity. 279713481Sgiacomo.travaglini@arm.com const RawType infinity_; 279813481Sgiacomo.travaglini@arm.com const RawType close_to_infinity_; 279913481Sgiacomo.travaglini@arm.com const RawType further_from_infinity_; 280013481Sgiacomo.travaglini@arm.com 280113481Sgiacomo.travaglini@arm.com // Maximum representable value that's not infinity. 280213481Sgiacomo.travaglini@arm.com const RawType max_; 280313481Sgiacomo.travaglini@arm.com 280413481Sgiacomo.travaglini@arm.com // Some NaNs. 280513481Sgiacomo.travaglini@arm.com const RawType nan1_; 280613481Sgiacomo.travaglini@arm.com const RawType nan2_; 280713481Sgiacomo.travaglini@arm.com 280813481Sgiacomo.travaglini@arm.com private: 280913481Sgiacomo.travaglini@arm.com template <typename T> 281013481Sgiacomo.travaglini@arm.com static RawType AsBits(T value) { 281113481Sgiacomo.travaglini@arm.com return Floating::ReinterpretBits(static_cast<Bits>(value)); 281213481Sgiacomo.travaglini@arm.com } 281313481Sgiacomo.travaglini@arm.com}; 281413481Sgiacomo.travaglini@arm.com 281513481Sgiacomo.travaglini@arm.com// Tests floating-point matchers with fixed epsilons. 281613481Sgiacomo.travaglini@arm.comtemplate <typename RawType> 281713481Sgiacomo.travaglini@arm.comclass FloatingPointNearTest : public FloatingPointTest<RawType> { 281813481Sgiacomo.travaglini@arm.com protected: 281913481Sgiacomo.travaglini@arm.com typedef FloatingPointTest<RawType> ParentType; 282013481Sgiacomo.travaglini@arm.com 282113481Sgiacomo.travaglini@arm.com // A battery of tests for FloatingEqMatcher::Matches with a fixed epsilon. 282213481Sgiacomo.travaglini@arm.com // matcher_maker is a pointer to a function which creates a FloatingEqMatcher. 282313481Sgiacomo.travaglini@arm.com void TestNearMatches( 282413481Sgiacomo.travaglini@arm.com testing::internal::FloatingEqMatcher<RawType> 282513481Sgiacomo.travaglini@arm.com (*matcher_maker)(RawType, RawType)) { 282613481Sgiacomo.travaglini@arm.com Matcher<RawType> m1 = matcher_maker(0.0, 0.0); 282713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(0.0)); 282813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches(-0.0)); 282913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(ParentType::close_to_positive_zero_)); 283013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(ParentType::close_to_negative_zero_)); 283113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m1.Matches(1.0)); 283213481Sgiacomo.travaglini@arm.com 283313481Sgiacomo.travaglini@arm.com Matcher<RawType> m2 = matcher_maker(0.0, 1.0); 283413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(0.0)); 283513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(-0.0)); 283613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(1.0)); 283713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches(-1.0)); 283813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(ParentType::close_to_one_)); 283913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m2.Matches(-ParentType::close_to_one_)); 284013481Sgiacomo.travaglini@arm.com 284113481Sgiacomo.travaglini@arm.com // Check that inf matches inf, regardless of the of the specified max 284213481Sgiacomo.travaglini@arm.com // absolute error. 284313481Sgiacomo.travaglini@arm.com Matcher<RawType> m3 = matcher_maker(ParentType::infinity_, 0.0); 284413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m3.Matches(ParentType::infinity_)); 284513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(ParentType::close_to_infinity_)); 284613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m3.Matches(-ParentType::infinity_)); 284713481Sgiacomo.travaglini@arm.com 284813481Sgiacomo.travaglini@arm.com Matcher<RawType> m4 = matcher_maker(-ParentType::infinity_, 0.0); 284913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m4.Matches(-ParentType::infinity_)); 285013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m4.Matches(-ParentType::close_to_infinity_)); 285113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m4.Matches(ParentType::infinity_)); 285213481Sgiacomo.travaglini@arm.com 285313481Sgiacomo.travaglini@arm.com // Test various overflow scenarios. 285413481Sgiacomo.travaglini@arm.com Matcher<RawType> m5 = matcher_maker(ParentType::max_, ParentType::max_); 285513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m5.Matches(ParentType::max_)); 285613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m5.Matches(-ParentType::max_)); 285713481Sgiacomo.travaglini@arm.com 285813481Sgiacomo.travaglini@arm.com Matcher<RawType> m6 = matcher_maker(-ParentType::max_, ParentType::max_); 285913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m6.Matches(ParentType::max_)); 286013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m6.Matches(-ParentType::max_)); 286113481Sgiacomo.travaglini@arm.com 286213481Sgiacomo.travaglini@arm.com Matcher<RawType> m7 = matcher_maker(ParentType::max_, 0); 286313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m7.Matches(ParentType::max_)); 286413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m7.Matches(-ParentType::max_)); 286513481Sgiacomo.travaglini@arm.com 286613481Sgiacomo.travaglini@arm.com Matcher<RawType> m8 = matcher_maker(-ParentType::max_, 0); 286713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m8.Matches(ParentType::max_)); 286813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m8.Matches(-ParentType::max_)); 286913481Sgiacomo.travaglini@arm.com 287013481Sgiacomo.travaglini@arm.com // The difference between max() and -max() normally overflows to infinity, 287113481Sgiacomo.travaglini@arm.com // but it should still match if the max_abs_error is also infinity. 287213481Sgiacomo.travaglini@arm.com Matcher<RawType> m9 = matcher_maker( 287313481Sgiacomo.travaglini@arm.com ParentType::max_, ParentType::infinity_); 287413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m8.Matches(-ParentType::max_)); 287513481Sgiacomo.travaglini@arm.com 287613481Sgiacomo.travaglini@arm.com // matcher_maker can produce a Matcher<const RawType&>, which is needed in 287713481Sgiacomo.travaglini@arm.com // some cases. 287813481Sgiacomo.travaglini@arm.com Matcher<const RawType&> m10 = matcher_maker(0.0, 1.0); 287913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m10.Matches(-0.0)); 288013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m10.Matches(ParentType::close_to_positive_zero_)); 288113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m10.Matches(ParentType::close_to_one_)); 288213481Sgiacomo.travaglini@arm.com 288313481Sgiacomo.travaglini@arm.com // matcher_maker can produce a Matcher<RawType&>, which is needed in some 288413481Sgiacomo.travaglini@arm.com // cases. 288513481Sgiacomo.travaglini@arm.com Matcher<RawType&> m11 = matcher_maker(0.0, 1.0); 288613481Sgiacomo.travaglini@arm.com RawType x = 0.0; 288713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m11.Matches(x)); 288813481Sgiacomo.travaglini@arm.com x = 1.0f; 288913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m11.Matches(x)); 289013481Sgiacomo.travaglini@arm.com x = -1.0f; 289113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m11.Matches(x)); 289213481Sgiacomo.travaglini@arm.com x = 1.1f; 289313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m11.Matches(x)); 289413481Sgiacomo.travaglini@arm.com x = -1.1f; 289513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m11.Matches(x)); 289613481Sgiacomo.travaglini@arm.com } 289713481Sgiacomo.travaglini@arm.com}; 289813481Sgiacomo.travaglini@arm.com 289913481Sgiacomo.travaglini@arm.com// Instantiate FloatingPointTest for testing floats. 290013481Sgiacomo.travaglini@arm.comtypedef FloatingPointTest<float> FloatTest; 290113481Sgiacomo.travaglini@arm.com 290213481Sgiacomo.travaglini@arm.comTEST_F(FloatTest, FloatEqApproximatelyMatchesFloats) { 290313481Sgiacomo.travaglini@arm.com TestMatches(&FloatEq); 290413481Sgiacomo.travaglini@arm.com} 290513481Sgiacomo.travaglini@arm.com 290613481Sgiacomo.travaglini@arm.comTEST_F(FloatTest, NanSensitiveFloatEqApproximatelyMatchesFloats) { 290713481Sgiacomo.travaglini@arm.com TestMatches(&NanSensitiveFloatEq); 290813481Sgiacomo.travaglini@arm.com} 290913481Sgiacomo.travaglini@arm.com 291013481Sgiacomo.travaglini@arm.comTEST_F(FloatTest, FloatEqCannotMatchNaN) { 291113481Sgiacomo.travaglini@arm.com // FloatEq never matches NaN. 291213481Sgiacomo.travaglini@arm.com Matcher<float> m = FloatEq(nan1_); 291313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan1_)); 291413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan2_)); 291513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 291613481Sgiacomo.travaglini@arm.com} 291713481Sgiacomo.travaglini@arm.com 291813481Sgiacomo.travaglini@arm.comTEST_F(FloatTest, NanSensitiveFloatEqCanMatchNaN) { 291913481Sgiacomo.travaglini@arm.com // NanSensitiveFloatEq will match NaN. 292013481Sgiacomo.travaglini@arm.com Matcher<float> m = NanSensitiveFloatEq(nan1_); 292113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan1_)); 292213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan2_)); 292313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 292413481Sgiacomo.travaglini@arm.com} 292513481Sgiacomo.travaglini@arm.com 292613481Sgiacomo.travaglini@arm.comTEST_F(FloatTest, FloatEqCanDescribeSelf) { 292713481Sgiacomo.travaglini@arm.com Matcher<float> m1 = FloatEq(2.0f); 292813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2", Describe(m1)); 292913481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 293013481Sgiacomo.travaglini@arm.com 293113481Sgiacomo.travaglini@arm.com Matcher<float> m2 = FloatEq(0.5f); 293213481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5", Describe(m2)); 293313481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 293413481Sgiacomo.travaglini@arm.com 293513481Sgiacomo.travaglini@arm.com Matcher<float> m3 = FloatEq(nan1_); 293613481Sgiacomo.travaglini@arm.com EXPECT_EQ("never matches", Describe(m3)); 293713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is anything", DescribeNegation(m3)); 293813481Sgiacomo.travaglini@arm.com} 293913481Sgiacomo.travaglini@arm.com 294013481Sgiacomo.travaglini@arm.comTEST_F(FloatTest, NanSensitiveFloatEqCanDescribeSelf) { 294113481Sgiacomo.travaglini@arm.com Matcher<float> m1 = NanSensitiveFloatEq(2.0f); 294213481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2", Describe(m1)); 294313481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 294413481Sgiacomo.travaglini@arm.com 294513481Sgiacomo.travaglini@arm.com Matcher<float> m2 = NanSensitiveFloatEq(0.5f); 294613481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5", Describe(m2)); 294713481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 294813481Sgiacomo.travaglini@arm.com 294913481Sgiacomo.travaglini@arm.com Matcher<float> m3 = NanSensitiveFloatEq(nan1_); 295013481Sgiacomo.travaglini@arm.com EXPECT_EQ("is NaN", Describe(m3)); 295113481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 295213481Sgiacomo.travaglini@arm.com} 295313481Sgiacomo.travaglini@arm.com 295413481Sgiacomo.travaglini@arm.com// Instantiate FloatingPointTest for testing floats with a user-specified 295513481Sgiacomo.travaglini@arm.com// max absolute error. 295613481Sgiacomo.travaglini@arm.comtypedef FloatingPointNearTest<float> FloatNearTest; 295713481Sgiacomo.travaglini@arm.com 295813481Sgiacomo.travaglini@arm.comTEST_F(FloatNearTest, FloatNearMatches) { 295913481Sgiacomo.travaglini@arm.com TestNearMatches(&FloatNear); 296013481Sgiacomo.travaglini@arm.com} 296113481Sgiacomo.travaglini@arm.com 296213481Sgiacomo.travaglini@arm.comTEST_F(FloatNearTest, NanSensitiveFloatNearApproximatelyMatchesFloats) { 296313481Sgiacomo.travaglini@arm.com TestNearMatches(&NanSensitiveFloatNear); 296413481Sgiacomo.travaglini@arm.com} 296513481Sgiacomo.travaglini@arm.com 296613481Sgiacomo.travaglini@arm.comTEST_F(FloatNearTest, FloatNearCanDescribeSelf) { 296713481Sgiacomo.travaglini@arm.com Matcher<float> m1 = FloatNear(2.0f, 0.5f); 296813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 296913481Sgiacomo.travaglini@arm.com EXPECT_EQ( 297013481Sgiacomo.travaglini@arm.com "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 297113481Sgiacomo.travaglini@arm.com 297213481Sgiacomo.travaglini@arm.com Matcher<float> m2 = FloatNear(0.5f, 0.5f); 297313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 297413481Sgiacomo.travaglini@arm.com EXPECT_EQ( 297513481Sgiacomo.travaglini@arm.com "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 297613481Sgiacomo.travaglini@arm.com 297713481Sgiacomo.travaglini@arm.com Matcher<float> m3 = FloatNear(nan1_, 0.0); 297813481Sgiacomo.travaglini@arm.com EXPECT_EQ("never matches", Describe(m3)); 297913481Sgiacomo.travaglini@arm.com EXPECT_EQ("is anything", DescribeNegation(m3)); 298013481Sgiacomo.travaglini@arm.com} 298113481Sgiacomo.travaglini@arm.com 298213481Sgiacomo.travaglini@arm.comTEST_F(FloatNearTest, NanSensitiveFloatNearCanDescribeSelf) { 298313481Sgiacomo.travaglini@arm.com Matcher<float> m1 = NanSensitiveFloatNear(2.0f, 0.5f); 298413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 298513481Sgiacomo.travaglini@arm.com EXPECT_EQ( 298613481Sgiacomo.travaglini@arm.com "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 298713481Sgiacomo.travaglini@arm.com 298813481Sgiacomo.travaglini@arm.com Matcher<float> m2 = NanSensitiveFloatNear(0.5f, 0.5f); 298913481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 299013481Sgiacomo.travaglini@arm.com EXPECT_EQ( 299113481Sgiacomo.travaglini@arm.com "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 299213481Sgiacomo.travaglini@arm.com 299313481Sgiacomo.travaglini@arm.com Matcher<float> m3 = NanSensitiveFloatNear(nan1_, 0.1f); 299413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is NaN", Describe(m3)); 299513481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 299613481Sgiacomo.travaglini@arm.com} 299713481Sgiacomo.travaglini@arm.com 299813481Sgiacomo.travaglini@arm.comTEST_F(FloatNearTest, FloatNearCannotMatchNaN) { 299913481Sgiacomo.travaglini@arm.com // FloatNear never matches NaN. 300013481Sgiacomo.travaglini@arm.com Matcher<float> m = FloatNear(ParentType::nan1_, 0.1f); 300113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan1_)); 300213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan2_)); 300313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 300413481Sgiacomo.travaglini@arm.com} 300513481Sgiacomo.travaglini@arm.com 300613481Sgiacomo.travaglini@arm.comTEST_F(FloatNearTest, NanSensitiveFloatNearCanMatchNaN) { 300713481Sgiacomo.travaglini@arm.com // NanSensitiveFloatNear will match NaN. 300813481Sgiacomo.travaglini@arm.com Matcher<float> m = NanSensitiveFloatNear(nan1_, 0.1f); 300913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan1_)); 301013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan2_)); 301113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 301213481Sgiacomo.travaglini@arm.com} 301313481Sgiacomo.travaglini@arm.com 301413481Sgiacomo.travaglini@arm.com// Instantiate FloatingPointTest for testing doubles. 301513481Sgiacomo.travaglini@arm.comtypedef FloatingPointTest<double> DoubleTest; 301613481Sgiacomo.travaglini@arm.com 301713481Sgiacomo.travaglini@arm.comTEST_F(DoubleTest, DoubleEqApproximatelyMatchesDoubles) { 301813481Sgiacomo.travaglini@arm.com TestMatches(&DoubleEq); 301913481Sgiacomo.travaglini@arm.com} 302013481Sgiacomo.travaglini@arm.com 302113481Sgiacomo.travaglini@arm.comTEST_F(DoubleTest, NanSensitiveDoubleEqApproximatelyMatchesDoubles) { 302213481Sgiacomo.travaglini@arm.com TestMatches(&NanSensitiveDoubleEq); 302313481Sgiacomo.travaglini@arm.com} 302413481Sgiacomo.travaglini@arm.com 302513481Sgiacomo.travaglini@arm.comTEST_F(DoubleTest, DoubleEqCannotMatchNaN) { 302613481Sgiacomo.travaglini@arm.com // DoubleEq never matches NaN. 302713481Sgiacomo.travaglini@arm.com Matcher<double> m = DoubleEq(nan1_); 302813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan1_)); 302913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan2_)); 303013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 303113481Sgiacomo.travaglini@arm.com} 303213481Sgiacomo.travaglini@arm.com 303313481Sgiacomo.travaglini@arm.comTEST_F(DoubleTest, NanSensitiveDoubleEqCanMatchNaN) { 303413481Sgiacomo.travaglini@arm.com // NanSensitiveDoubleEq will match NaN. 303513481Sgiacomo.travaglini@arm.com Matcher<double> m = NanSensitiveDoubleEq(nan1_); 303613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan1_)); 303713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan2_)); 303813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 303913481Sgiacomo.travaglini@arm.com} 304013481Sgiacomo.travaglini@arm.com 304113481Sgiacomo.travaglini@arm.comTEST_F(DoubleTest, DoubleEqCanDescribeSelf) { 304213481Sgiacomo.travaglini@arm.com Matcher<double> m1 = DoubleEq(2.0); 304313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2", Describe(m1)); 304413481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 304513481Sgiacomo.travaglini@arm.com 304613481Sgiacomo.travaglini@arm.com Matcher<double> m2 = DoubleEq(0.5); 304713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5", Describe(m2)); 304813481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 304913481Sgiacomo.travaglini@arm.com 305013481Sgiacomo.travaglini@arm.com Matcher<double> m3 = DoubleEq(nan1_); 305113481Sgiacomo.travaglini@arm.com EXPECT_EQ("never matches", Describe(m3)); 305213481Sgiacomo.travaglini@arm.com EXPECT_EQ("is anything", DescribeNegation(m3)); 305313481Sgiacomo.travaglini@arm.com} 305413481Sgiacomo.travaglini@arm.com 305513481Sgiacomo.travaglini@arm.comTEST_F(DoubleTest, NanSensitiveDoubleEqCanDescribeSelf) { 305613481Sgiacomo.travaglini@arm.com Matcher<double> m1 = NanSensitiveDoubleEq(2.0); 305713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2", Describe(m1)); 305813481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 2", DescribeNegation(m1)); 305913481Sgiacomo.travaglini@arm.com 306013481Sgiacomo.travaglini@arm.com Matcher<double> m2 = NanSensitiveDoubleEq(0.5); 306113481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5", Describe(m2)); 306213481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't approximately 0.5", DescribeNegation(m2)); 306313481Sgiacomo.travaglini@arm.com 306413481Sgiacomo.travaglini@arm.com Matcher<double> m3 = NanSensitiveDoubleEq(nan1_); 306513481Sgiacomo.travaglini@arm.com EXPECT_EQ("is NaN", Describe(m3)); 306613481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 306713481Sgiacomo.travaglini@arm.com} 306813481Sgiacomo.travaglini@arm.com 306913481Sgiacomo.travaglini@arm.com// Instantiate FloatingPointTest for testing floats with a user-specified 307013481Sgiacomo.travaglini@arm.com// max absolute error. 307113481Sgiacomo.travaglini@arm.comtypedef FloatingPointNearTest<double> DoubleNearTest; 307213481Sgiacomo.travaglini@arm.com 307313481Sgiacomo.travaglini@arm.comTEST_F(DoubleNearTest, DoubleNearMatches) { 307413481Sgiacomo.travaglini@arm.com TestNearMatches(&DoubleNear); 307513481Sgiacomo.travaglini@arm.com} 307613481Sgiacomo.travaglini@arm.com 307713481Sgiacomo.travaglini@arm.comTEST_F(DoubleNearTest, NanSensitiveDoubleNearApproximatelyMatchesDoubles) { 307813481Sgiacomo.travaglini@arm.com TestNearMatches(&NanSensitiveDoubleNear); 307913481Sgiacomo.travaglini@arm.com} 308013481Sgiacomo.travaglini@arm.com 308113481Sgiacomo.travaglini@arm.comTEST_F(DoubleNearTest, DoubleNearCanDescribeSelf) { 308213481Sgiacomo.travaglini@arm.com Matcher<double> m1 = DoubleNear(2.0, 0.5); 308313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 308413481Sgiacomo.travaglini@arm.com EXPECT_EQ( 308513481Sgiacomo.travaglini@arm.com "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 308613481Sgiacomo.travaglini@arm.com 308713481Sgiacomo.travaglini@arm.com Matcher<double> m2 = DoubleNear(0.5, 0.5); 308813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 308913481Sgiacomo.travaglini@arm.com EXPECT_EQ( 309013481Sgiacomo.travaglini@arm.com "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 309113481Sgiacomo.travaglini@arm.com 309213481Sgiacomo.travaglini@arm.com Matcher<double> m3 = DoubleNear(nan1_, 0.0); 309313481Sgiacomo.travaglini@arm.com EXPECT_EQ("never matches", Describe(m3)); 309413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is anything", DescribeNegation(m3)); 309513481Sgiacomo.travaglini@arm.com} 309613481Sgiacomo.travaglini@arm.com 309713481Sgiacomo.travaglini@arm.comTEST_F(DoubleNearTest, ExplainsResultWhenMatchFails) { 309813481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(DoubleNear(2.0, 0.1), 2.05)); 309913481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 0.2 from 2", Explain(DoubleNear(2.0, 0.1), 2.2)); 310013481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is -0.3 from 2", Explain(DoubleNear(2.0, 0.1), 1.7)); 310113481Sgiacomo.travaglini@arm.com 310213481Sgiacomo.travaglini@arm.com const string explanation = Explain(DoubleNear(2.1, 1e-10), 2.1 + 1.2e-10); 310313481Sgiacomo.travaglini@arm.com // Different C++ implementations may print floating-point numbers 310413481Sgiacomo.travaglini@arm.com // slightly differently. 310513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(explanation == "which is 1.2e-10 from 2.1" || // GCC 310613481Sgiacomo.travaglini@arm.com explanation == "which is 1.2e-010 from 2.1") // MSVC 310713481Sgiacomo.travaglini@arm.com << " where explanation is \"" << explanation << "\"."; 310813481Sgiacomo.travaglini@arm.com} 310913481Sgiacomo.travaglini@arm.com 311013481Sgiacomo.travaglini@arm.comTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanDescribeSelf) { 311113481Sgiacomo.travaglini@arm.com Matcher<double> m1 = NanSensitiveDoubleNear(2.0, 0.5); 311213481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 2 (absolute error <= 0.5)", Describe(m1)); 311313481Sgiacomo.travaglini@arm.com EXPECT_EQ( 311413481Sgiacomo.travaglini@arm.com "isn't approximately 2 (absolute error > 0.5)", DescribeNegation(m1)); 311513481Sgiacomo.travaglini@arm.com 311613481Sgiacomo.travaglini@arm.com Matcher<double> m2 = NanSensitiveDoubleNear(0.5, 0.5); 311713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is approximately 0.5 (absolute error <= 0.5)", Describe(m2)); 311813481Sgiacomo.travaglini@arm.com EXPECT_EQ( 311913481Sgiacomo.travaglini@arm.com "isn't approximately 0.5 (absolute error > 0.5)", DescribeNegation(m2)); 312013481Sgiacomo.travaglini@arm.com 312113481Sgiacomo.travaglini@arm.com Matcher<double> m3 = NanSensitiveDoubleNear(nan1_, 0.1); 312213481Sgiacomo.travaglini@arm.com EXPECT_EQ("is NaN", Describe(m3)); 312313481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't NaN", DescribeNegation(m3)); 312413481Sgiacomo.travaglini@arm.com} 312513481Sgiacomo.travaglini@arm.com 312613481Sgiacomo.travaglini@arm.comTEST_F(DoubleNearTest, DoubleNearCannotMatchNaN) { 312713481Sgiacomo.travaglini@arm.com // DoubleNear never matches NaN. 312813481Sgiacomo.travaglini@arm.com Matcher<double> m = DoubleNear(ParentType::nan1_, 0.1); 312913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan1_)); 313013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(nan2_)); 313113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 313213481Sgiacomo.travaglini@arm.com} 313313481Sgiacomo.travaglini@arm.com 313413481Sgiacomo.travaglini@arm.comTEST_F(DoubleNearTest, NanSensitiveDoubleNearCanMatchNaN) { 313513481Sgiacomo.travaglini@arm.com // NanSensitiveDoubleNear will match NaN. 313613481Sgiacomo.travaglini@arm.com Matcher<double> m = NanSensitiveDoubleNear(nan1_, 0.1); 313713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan1_)); 313813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(nan2_)); 313913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(1.0)); 314013481Sgiacomo.travaglini@arm.com} 314113481Sgiacomo.travaglini@arm.com 314213481Sgiacomo.travaglini@arm.comTEST(PointeeTest, RawPointer) { 314313481Sgiacomo.travaglini@arm.com const Matcher<int*> m = Pointee(Ge(0)); 314413481Sgiacomo.travaglini@arm.com 314513481Sgiacomo.travaglini@arm.com int n = 1; 314613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&n)); 314713481Sgiacomo.travaglini@arm.com n = -1; 314813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&n)); 314913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 315013481Sgiacomo.travaglini@arm.com} 315113481Sgiacomo.travaglini@arm.com 315213481Sgiacomo.travaglini@arm.comTEST(PointeeTest, RawPointerToConst) { 315313481Sgiacomo.travaglini@arm.com const Matcher<const double*> m = Pointee(Ge(0)); 315413481Sgiacomo.travaglini@arm.com 315513481Sgiacomo.travaglini@arm.com double x = 1; 315613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&x)); 315713481Sgiacomo.travaglini@arm.com x = -1; 315813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&x)); 315913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 316013481Sgiacomo.travaglini@arm.com} 316113481Sgiacomo.travaglini@arm.com 316213481Sgiacomo.travaglini@arm.comTEST(PointeeTest, ReferenceToConstRawPointer) { 316313481Sgiacomo.travaglini@arm.com const Matcher<int* const &> m = Pointee(Ge(0)); 316413481Sgiacomo.travaglini@arm.com 316513481Sgiacomo.travaglini@arm.com int n = 1; 316613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&n)); 316713481Sgiacomo.travaglini@arm.com n = -1; 316813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&n)); 316913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 317013481Sgiacomo.travaglini@arm.com} 317113481Sgiacomo.travaglini@arm.com 317213481Sgiacomo.travaglini@arm.comTEST(PointeeTest, ReferenceToNonConstRawPointer) { 317313481Sgiacomo.travaglini@arm.com const Matcher<double* &> m = Pointee(Ge(0)); 317413481Sgiacomo.travaglini@arm.com 317513481Sgiacomo.travaglini@arm.com double x = 1.0; 317613481Sgiacomo.travaglini@arm.com double* p = &x; 317713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(p)); 317813481Sgiacomo.travaglini@arm.com x = -1; 317913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(p)); 318013481Sgiacomo.travaglini@arm.com p = NULL; 318113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(p)); 318213481Sgiacomo.travaglini@arm.com} 318313481Sgiacomo.travaglini@arm.com 318413481Sgiacomo.travaglini@arm.comMATCHER_P(FieldIIs, inner_matcher, "") { 318513481Sgiacomo.travaglini@arm.com return ExplainMatchResult(inner_matcher, arg.i, result_listener); 318613481Sgiacomo.travaglini@arm.com} 318713481Sgiacomo.travaglini@arm.com 318813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_RTTI 318913481Sgiacomo.travaglini@arm.com 319013481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, SameType) { 319113481Sgiacomo.travaglini@arm.com Derived derived; 319213481Sgiacomo.travaglini@arm.com derived.i = 4; 319313481Sgiacomo.travaglini@arm.com 319413481Sgiacomo.travaglini@arm.com // Right type. A pointer is passed down. 319513481Sgiacomo.travaglini@arm.com Base* as_base_ptr = &derived; 319613481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull()))); 319713481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4)))); 319813481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, 319913481Sgiacomo.travaglini@arm.com Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5))))); 320013481Sgiacomo.travaglini@arm.com} 320113481Sgiacomo.travaglini@arm.com 320213481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, WrongTypes) { 320313481Sgiacomo.travaglini@arm.com Base base; 320413481Sgiacomo.travaglini@arm.com Derived derived; 320513481Sgiacomo.travaglini@arm.com OtherDerived other_derived; 320613481Sgiacomo.travaglini@arm.com 320713481Sgiacomo.travaglini@arm.com // Wrong types. NULL is passed. 320813481Sgiacomo.travaglini@arm.com EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_)))); 320913481Sgiacomo.travaglini@arm.com EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull())); 321013481Sgiacomo.travaglini@arm.com Base* as_base_ptr = &derived; 321113481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_)))); 321213481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull())); 321313481Sgiacomo.travaglini@arm.com as_base_ptr = &other_derived; 321413481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_)))); 321513481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull())); 321613481Sgiacomo.travaglini@arm.com} 321713481Sgiacomo.travaglini@arm.com 321813481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, AlreadyNull) { 321913481Sgiacomo.travaglini@arm.com // Already NULL. 322013481Sgiacomo.travaglini@arm.com Base* as_base_ptr = NULL; 322113481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull())); 322213481Sgiacomo.travaglini@arm.com} 322313481Sgiacomo.travaglini@arm.com 322413481Sgiacomo.travaglini@arm.comstruct AmbiguousCastTypes { 322513481Sgiacomo.travaglini@arm.com class VirtualDerived : public virtual Base {}; 322613481Sgiacomo.travaglini@arm.com class DerivedSub1 : public VirtualDerived {}; 322713481Sgiacomo.travaglini@arm.com class DerivedSub2 : public VirtualDerived {}; 322813481Sgiacomo.travaglini@arm.com class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {}; 322913481Sgiacomo.travaglini@arm.com}; 323013481Sgiacomo.travaglini@arm.com 323113481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, AmbiguousCast) { 323213481Sgiacomo.travaglini@arm.com AmbiguousCastTypes::DerivedSub1 sub1; 323313481Sgiacomo.travaglini@arm.com AmbiguousCastTypes::ManyDerivedInHierarchy many_derived; 323413481Sgiacomo.travaglini@arm.com // Multiply derived from Base. dynamic_cast<> returns NULL. 323513481Sgiacomo.travaglini@arm.com Base* as_base_ptr = 323613481Sgiacomo.travaglini@arm.com static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived); 323713481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ptr, 323813481Sgiacomo.travaglini@arm.com WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull())); 323913481Sgiacomo.travaglini@arm.com as_base_ptr = &sub1; 324013481Sgiacomo.travaglini@arm.com EXPECT_THAT( 324113481Sgiacomo.travaglini@arm.com as_base_ptr, 324213481Sgiacomo.travaglini@arm.com WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull()))); 324313481Sgiacomo.travaglini@arm.com} 324413481Sgiacomo.travaglini@arm.com 324513481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, Describe) { 324613481Sgiacomo.travaglini@arm.com Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_)); 324713481Sgiacomo.travaglini@arm.com const string prefix = 324813481Sgiacomo.travaglini@arm.com "when dynamic_cast to " + internal::GetTypeName<Derived*>() + ", "; 324913481Sgiacomo.travaglini@arm.com EXPECT_EQ(prefix + "points to a value that is anything", Describe(matcher)); 325013481Sgiacomo.travaglini@arm.com EXPECT_EQ(prefix + "does not point to a value that is anything", 325113481Sgiacomo.travaglini@arm.com DescribeNegation(matcher)); 325213481Sgiacomo.travaglini@arm.com} 325313481Sgiacomo.travaglini@arm.com 325413481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, Explain) { 325513481Sgiacomo.travaglini@arm.com Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_)); 325613481Sgiacomo.travaglini@arm.com Base* null = NULL; 325713481Sgiacomo.travaglini@arm.com EXPECT_THAT(Explain(matcher, null), HasSubstr("NULL")); 325813481Sgiacomo.travaglini@arm.com Derived derived; 325913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(&derived)); 326013481Sgiacomo.travaglini@arm.com EXPECT_THAT(Explain(matcher, &derived), HasSubstr("which points to ")); 326113481Sgiacomo.travaglini@arm.com 326213481Sgiacomo.travaglini@arm.com // With references, the matcher itself can fail. Test for that one. 326313481Sgiacomo.travaglini@arm.com Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_); 326413481Sgiacomo.travaglini@arm.com EXPECT_THAT(Explain(ref_matcher, derived), 326513481Sgiacomo.travaglini@arm.com HasSubstr("which cannot be dynamic_cast")); 326613481Sgiacomo.travaglini@arm.com} 326713481Sgiacomo.travaglini@arm.com 326813481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, GoodReference) { 326913481Sgiacomo.travaglini@arm.com Derived derived; 327013481Sgiacomo.travaglini@arm.com derived.i = 4; 327113481Sgiacomo.travaglini@arm.com Base& as_base_ref = derived; 327213481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4))); 327313481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5)))); 327413481Sgiacomo.travaglini@arm.com} 327513481Sgiacomo.travaglini@arm.com 327613481Sgiacomo.travaglini@arm.comTEST(WhenDynamicCastToTest, BadReference) { 327713481Sgiacomo.travaglini@arm.com Derived derived; 327813481Sgiacomo.travaglini@arm.com Base& as_base_ref = derived; 327913481Sgiacomo.travaglini@arm.com EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_))); 328013481Sgiacomo.travaglini@arm.com} 328113481Sgiacomo.travaglini@arm.com 328213481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_RTTI 328313481Sgiacomo.travaglini@arm.com 328413481Sgiacomo.travaglini@arm.com// Minimal const-propagating pointer. 328513481Sgiacomo.travaglini@arm.comtemplate <typename T> 328613481Sgiacomo.travaglini@arm.comclass ConstPropagatingPtr { 328713481Sgiacomo.travaglini@arm.com public: 328813481Sgiacomo.travaglini@arm.com typedef T element_type; 328913481Sgiacomo.travaglini@arm.com 329013481Sgiacomo.travaglini@arm.com ConstPropagatingPtr() : val_() {} 329113481Sgiacomo.travaglini@arm.com explicit ConstPropagatingPtr(T* t) : val_(t) {} 329213481Sgiacomo.travaglini@arm.com ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {} 329313481Sgiacomo.travaglini@arm.com 329413481Sgiacomo.travaglini@arm.com T* get() { return val_; } 329513481Sgiacomo.travaglini@arm.com T& operator*() { return *val_; } 329613481Sgiacomo.travaglini@arm.com // Most smart pointers return non-const T* and T& from the next methods. 329713481Sgiacomo.travaglini@arm.com const T* get() const { return val_; } 329813481Sgiacomo.travaglini@arm.com const T& operator*() const { return *val_; } 329913481Sgiacomo.travaglini@arm.com 330013481Sgiacomo.travaglini@arm.com private: 330113481Sgiacomo.travaglini@arm.com T* val_; 330213481Sgiacomo.travaglini@arm.com}; 330313481Sgiacomo.travaglini@arm.com 330413481Sgiacomo.travaglini@arm.comTEST(PointeeTest, WorksWithConstPropagatingPointers) { 330513481Sgiacomo.travaglini@arm.com const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5)); 330613481Sgiacomo.travaglini@arm.com int three = 3; 330713481Sgiacomo.travaglini@arm.com const ConstPropagatingPtr<int> co(&three); 330813481Sgiacomo.travaglini@arm.com ConstPropagatingPtr<int> o(&three); 330913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(o)); 331013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(co)); 331113481Sgiacomo.travaglini@arm.com *o = 6; 331213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(o)); 331313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>())); 331413481Sgiacomo.travaglini@arm.com} 331513481Sgiacomo.travaglini@arm.com 331613481Sgiacomo.travaglini@arm.comTEST(PointeeTest, NeverMatchesNull) { 331713481Sgiacomo.travaglini@arm.com const Matcher<const char*> m = Pointee(_); 331813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 331913481Sgiacomo.travaglini@arm.com} 332013481Sgiacomo.travaglini@arm.com 332113481Sgiacomo.travaglini@arm.com// Tests that we can write Pointee(value) instead of Pointee(Eq(value)). 332213481Sgiacomo.travaglini@arm.comTEST(PointeeTest, MatchesAgainstAValue) { 332313481Sgiacomo.travaglini@arm.com const Matcher<int*> m = Pointee(5); 332413481Sgiacomo.travaglini@arm.com 332513481Sgiacomo.travaglini@arm.com int n = 5; 332613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&n)); 332713481Sgiacomo.travaglini@arm.com n = -1; 332813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&n)); 332913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 333013481Sgiacomo.travaglini@arm.com} 333113481Sgiacomo.travaglini@arm.com 333213481Sgiacomo.travaglini@arm.comTEST(PointeeTest, CanDescribeSelf) { 333313481Sgiacomo.travaglini@arm.com const Matcher<int*> m = Pointee(Gt(3)); 333413481Sgiacomo.travaglini@arm.com EXPECT_EQ("points to a value that is > 3", Describe(m)); 333513481Sgiacomo.travaglini@arm.com EXPECT_EQ("does not point to a value that is > 3", 333613481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 333713481Sgiacomo.travaglini@arm.com} 333813481Sgiacomo.travaglini@arm.com 333913481Sgiacomo.travaglini@arm.comTEST(PointeeTest, CanExplainMatchResult) { 334013481Sgiacomo.travaglini@arm.com const Matcher<const string*> m = Pointee(StartsWith("Hi")); 334113481Sgiacomo.travaglini@arm.com 334213481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, static_cast<const string*>(NULL))); 334313481Sgiacomo.travaglini@arm.com 334413481Sgiacomo.travaglini@arm.com const Matcher<long*> m2 = Pointee(GreaterThan(1)); // NOLINT 334513481Sgiacomo.travaglini@arm.com long n = 3; // NOLINT 334613481Sgiacomo.travaglini@arm.com EXPECT_EQ("which points to 3" + OfType("long") + ", which is 2 more than 1", 334713481Sgiacomo.travaglini@arm.com Explain(m2, &n)); 334813481Sgiacomo.travaglini@arm.com} 334913481Sgiacomo.travaglini@arm.com 335013481Sgiacomo.travaglini@arm.comTEST(PointeeTest, AlwaysExplainsPointee) { 335113481Sgiacomo.travaglini@arm.com const Matcher<int*> m = Pointee(0); 335213481Sgiacomo.travaglini@arm.com int n = 42; 335313481Sgiacomo.travaglini@arm.com EXPECT_EQ("which points to 42" + OfType("int"), Explain(m, &n)); 335413481Sgiacomo.travaglini@arm.com} 335513481Sgiacomo.travaglini@arm.com 335613481Sgiacomo.travaglini@arm.com// An uncopyable class. 335713481Sgiacomo.travaglini@arm.comclass Uncopyable { 335813481Sgiacomo.travaglini@arm.com public: 335913481Sgiacomo.travaglini@arm.com Uncopyable() : value_(-1) {} 336013481Sgiacomo.travaglini@arm.com explicit Uncopyable(int a_value) : value_(a_value) {} 336113481Sgiacomo.travaglini@arm.com 336213481Sgiacomo.travaglini@arm.com int value() const { return value_; } 336313481Sgiacomo.travaglini@arm.com void set_value(int i) { value_ = i; } 336413481Sgiacomo.travaglini@arm.com 336513481Sgiacomo.travaglini@arm.com private: 336613481Sgiacomo.travaglini@arm.com int value_; 336713481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable); 336813481Sgiacomo.travaglini@arm.com}; 336913481Sgiacomo.travaglini@arm.com 337013481Sgiacomo.travaglini@arm.com// Returns true iff x.value() is positive. 337113481Sgiacomo.travaglini@arm.combool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; } 337213481Sgiacomo.travaglini@arm.com 337313481Sgiacomo.travaglini@arm.comMATCHER_P(UncopyableIs, inner_matcher, "") { 337413481Sgiacomo.travaglini@arm.com return ExplainMatchResult(inner_matcher, arg.value(), result_listener); 337513481Sgiacomo.travaglini@arm.com} 337613481Sgiacomo.travaglini@arm.com 337713481Sgiacomo.travaglini@arm.com// A user-defined struct for testing Field(). 337813481Sgiacomo.travaglini@arm.comstruct AStruct { 337913481Sgiacomo.travaglini@arm.com AStruct() : x(0), y(1.0), z(5), p(NULL) {} 338013481Sgiacomo.travaglini@arm.com AStruct(const AStruct& rhs) 338113481Sgiacomo.travaglini@arm.com : x(rhs.x), y(rhs.y), z(rhs.z.value()), p(rhs.p) {} 338213481Sgiacomo.travaglini@arm.com 338313481Sgiacomo.travaglini@arm.com int x; // A non-const field. 338413481Sgiacomo.travaglini@arm.com const double y; // A const field. 338513481Sgiacomo.travaglini@arm.com Uncopyable z; // An uncopyable field. 338613481Sgiacomo.travaglini@arm.com const char* p; // A pointer field. 338713481Sgiacomo.travaglini@arm.com 338813481Sgiacomo.travaglini@arm.com private: 338913481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_ASSIGN_(AStruct); 339013481Sgiacomo.travaglini@arm.com}; 339113481Sgiacomo.travaglini@arm.com 339213481Sgiacomo.travaglini@arm.com// A derived struct for testing Field(). 339313481Sgiacomo.travaglini@arm.comstruct DerivedStruct : public AStruct { 339413481Sgiacomo.travaglini@arm.com char ch; 339513481Sgiacomo.travaglini@arm.com 339613481Sgiacomo.travaglini@arm.com private: 339713481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_ASSIGN_(DerivedStruct); 339813481Sgiacomo.travaglini@arm.com}; 339913481Sgiacomo.travaglini@arm.com 340013481Sgiacomo.travaglini@arm.com// Tests that Field(&Foo::field, ...) works when field is non-const. 340113481Sgiacomo.travaglini@arm.comTEST(FieldTest, WorksForNonConstField) { 340213481Sgiacomo.travaglini@arm.com Matcher<AStruct> m = Field(&AStruct::x, Ge(0)); 340313481Sgiacomo.travaglini@arm.com 340413481Sgiacomo.travaglini@arm.com AStruct a; 340513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 340613481Sgiacomo.travaglini@arm.com a.x = -1; 340713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 340813481Sgiacomo.travaglini@arm.com} 340913481Sgiacomo.travaglini@arm.com 341013481Sgiacomo.travaglini@arm.com// Tests that Field(&Foo::field, ...) works when field is const. 341113481Sgiacomo.travaglini@arm.comTEST(FieldTest, WorksForConstField) { 341213481Sgiacomo.travaglini@arm.com AStruct a; 341313481Sgiacomo.travaglini@arm.com 341413481Sgiacomo.travaglini@arm.com Matcher<AStruct> m = Field(&AStruct::y, Ge(0.0)); 341513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 341613481Sgiacomo.travaglini@arm.com m = Field(&AStruct::y, Le(0.0)); 341713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 341813481Sgiacomo.travaglini@arm.com} 341913481Sgiacomo.travaglini@arm.com 342013481Sgiacomo.travaglini@arm.com// Tests that Field(&Foo::field, ...) works when field is not copyable. 342113481Sgiacomo.travaglini@arm.comTEST(FieldTest, WorksForUncopyableField) { 342213481Sgiacomo.travaglini@arm.com AStruct a; 342313481Sgiacomo.travaglini@arm.com 342413481Sgiacomo.travaglini@arm.com Matcher<AStruct> m = Field(&AStruct::z, Truly(ValueIsPositive)); 342513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 342613481Sgiacomo.travaglini@arm.com m = Field(&AStruct::z, Not(Truly(ValueIsPositive))); 342713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 342813481Sgiacomo.travaglini@arm.com} 342913481Sgiacomo.travaglini@arm.com 343013481Sgiacomo.travaglini@arm.com// Tests that Field(&Foo::field, ...) works when field is a pointer. 343113481Sgiacomo.travaglini@arm.comTEST(FieldTest, WorksForPointerField) { 343213481Sgiacomo.travaglini@arm.com // Matching against NULL. 343313481Sgiacomo.travaglini@arm.com Matcher<AStruct> m = Field(&AStruct::p, static_cast<const char*>(NULL)); 343413481Sgiacomo.travaglini@arm.com AStruct a; 343513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 343613481Sgiacomo.travaglini@arm.com a.p = "hi"; 343713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 343813481Sgiacomo.travaglini@arm.com 343913481Sgiacomo.travaglini@arm.com // Matching a pointer that is not NULL. 344013481Sgiacomo.travaglini@arm.com m = Field(&AStruct::p, StartsWith("hi")); 344113481Sgiacomo.travaglini@arm.com a.p = "hill"; 344213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 344313481Sgiacomo.travaglini@arm.com a.p = "hole"; 344413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 344513481Sgiacomo.travaglini@arm.com} 344613481Sgiacomo.travaglini@arm.com 344713481Sgiacomo.travaglini@arm.com// Tests that Field() works when the object is passed by reference. 344813481Sgiacomo.travaglini@arm.comTEST(FieldTest, WorksForByRefArgument) { 344913481Sgiacomo.travaglini@arm.com Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 345013481Sgiacomo.travaglini@arm.com 345113481Sgiacomo.travaglini@arm.com AStruct a; 345213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 345313481Sgiacomo.travaglini@arm.com a.x = -1; 345413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 345513481Sgiacomo.travaglini@arm.com} 345613481Sgiacomo.travaglini@arm.com 345713481Sgiacomo.travaglini@arm.com// Tests that Field(&Foo::field, ...) works when the argument's type 345813481Sgiacomo.travaglini@arm.com// is a sub-type of Foo. 345913481Sgiacomo.travaglini@arm.comTEST(FieldTest, WorksForArgumentOfSubType) { 346013481Sgiacomo.travaglini@arm.com // Note that the matcher expects DerivedStruct but we say AStruct 346113481Sgiacomo.travaglini@arm.com // inside Field(). 346213481Sgiacomo.travaglini@arm.com Matcher<const DerivedStruct&> m = Field(&AStruct::x, Ge(0)); 346313481Sgiacomo.travaglini@arm.com 346413481Sgiacomo.travaglini@arm.com DerivedStruct d; 346513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(d)); 346613481Sgiacomo.travaglini@arm.com d.x = -1; 346713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(d)); 346813481Sgiacomo.travaglini@arm.com} 346913481Sgiacomo.travaglini@arm.com 347013481Sgiacomo.travaglini@arm.com// Tests that Field(&Foo::field, m) works when field's type and m's 347113481Sgiacomo.travaglini@arm.com// argument type are compatible but not the same. 347213481Sgiacomo.travaglini@arm.comTEST(FieldTest, WorksForCompatibleMatcherType) { 347313481Sgiacomo.travaglini@arm.com // The field is an int, but the inner matcher expects a signed char. 347413481Sgiacomo.travaglini@arm.com Matcher<const AStruct&> m = Field(&AStruct::x, 347513481Sgiacomo.travaglini@arm.com Matcher<signed char>(Ge(0))); 347613481Sgiacomo.travaglini@arm.com 347713481Sgiacomo.travaglini@arm.com AStruct a; 347813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 347913481Sgiacomo.travaglini@arm.com a.x = -1; 348013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 348113481Sgiacomo.travaglini@arm.com} 348213481Sgiacomo.travaglini@arm.com 348313481Sgiacomo.travaglini@arm.com// Tests that Field() can describe itself. 348413481Sgiacomo.travaglini@arm.comTEST(FieldTest, CanDescribeSelf) { 348513481Sgiacomo.travaglini@arm.com Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 348613481Sgiacomo.travaglini@arm.com 348713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 348813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 348913481Sgiacomo.travaglini@arm.com} 349013481Sgiacomo.travaglini@arm.com 349113481Sgiacomo.travaglini@arm.com// Tests that Field() can explain the match result. 349213481Sgiacomo.travaglini@arm.comTEST(FieldTest, CanExplainMatchResult) { 349313481Sgiacomo.travaglini@arm.com Matcher<const AStruct&> m = Field(&AStruct::x, Ge(0)); 349413481Sgiacomo.travaglini@arm.com 349513481Sgiacomo.travaglini@arm.com AStruct a; 349613481Sgiacomo.travaglini@arm.com a.x = 1; 349713481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose given field is 1" + OfType("int"), Explain(m, a)); 349813481Sgiacomo.travaglini@arm.com 349913481Sgiacomo.travaglini@arm.com m = Field(&AStruct::x, GreaterThan(0)); 350013481Sgiacomo.travaglini@arm.com EXPECT_EQ( 350113481Sgiacomo.travaglini@arm.com "whose given field is 1" + OfType("int") + ", which is 1 more than 0", 350213481Sgiacomo.travaglini@arm.com Explain(m, a)); 350313481Sgiacomo.travaglini@arm.com} 350413481Sgiacomo.travaglini@arm.com 350513481Sgiacomo.travaglini@arm.com// Tests that Field() works when the argument is a pointer to const. 350613481Sgiacomo.travaglini@arm.comTEST(FieldForPointerTest, WorksForPointerToConst) { 350713481Sgiacomo.travaglini@arm.com Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 350813481Sgiacomo.travaglini@arm.com 350913481Sgiacomo.travaglini@arm.com AStruct a; 351013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&a)); 351113481Sgiacomo.travaglini@arm.com a.x = -1; 351213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&a)); 351313481Sgiacomo.travaglini@arm.com} 351413481Sgiacomo.travaglini@arm.com 351513481Sgiacomo.travaglini@arm.com// Tests that Field() works when the argument is a pointer to non-const. 351613481Sgiacomo.travaglini@arm.comTEST(FieldForPointerTest, WorksForPointerToNonConst) { 351713481Sgiacomo.travaglini@arm.com Matcher<AStruct*> m = Field(&AStruct::x, Ge(0)); 351813481Sgiacomo.travaglini@arm.com 351913481Sgiacomo.travaglini@arm.com AStruct a; 352013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&a)); 352113481Sgiacomo.travaglini@arm.com a.x = -1; 352213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&a)); 352313481Sgiacomo.travaglini@arm.com} 352413481Sgiacomo.travaglini@arm.com 352513481Sgiacomo.travaglini@arm.com// Tests that Field() works when the argument is a reference to a const pointer. 352613481Sgiacomo.travaglini@arm.comTEST(FieldForPointerTest, WorksForReferenceToConstPointer) { 352713481Sgiacomo.travaglini@arm.com Matcher<AStruct* const&> m = Field(&AStruct::x, Ge(0)); 352813481Sgiacomo.travaglini@arm.com 352913481Sgiacomo.travaglini@arm.com AStruct a; 353013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&a)); 353113481Sgiacomo.travaglini@arm.com a.x = -1; 353213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&a)); 353313481Sgiacomo.travaglini@arm.com} 353413481Sgiacomo.travaglini@arm.com 353513481Sgiacomo.travaglini@arm.com// Tests that Field() does not match the NULL pointer. 353613481Sgiacomo.travaglini@arm.comTEST(FieldForPointerTest, DoesNotMatchNull) { 353713481Sgiacomo.travaglini@arm.com Matcher<const AStruct*> m = Field(&AStruct::x, _); 353813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 353913481Sgiacomo.travaglini@arm.com} 354013481Sgiacomo.travaglini@arm.com 354113481Sgiacomo.travaglini@arm.com// Tests that Field(&Foo::field, ...) works when the argument's type 354213481Sgiacomo.travaglini@arm.com// is a sub-type of const Foo*. 354313481Sgiacomo.travaglini@arm.comTEST(FieldForPointerTest, WorksForArgumentOfSubType) { 354413481Sgiacomo.travaglini@arm.com // Note that the matcher expects DerivedStruct but we say AStruct 354513481Sgiacomo.travaglini@arm.com // inside Field(). 354613481Sgiacomo.travaglini@arm.com Matcher<DerivedStruct*> m = Field(&AStruct::x, Ge(0)); 354713481Sgiacomo.travaglini@arm.com 354813481Sgiacomo.travaglini@arm.com DerivedStruct d; 354913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&d)); 355013481Sgiacomo.travaglini@arm.com d.x = -1; 355113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&d)); 355213481Sgiacomo.travaglini@arm.com} 355313481Sgiacomo.travaglini@arm.com 355413481Sgiacomo.travaglini@arm.com// Tests that Field() can describe itself when used to match a pointer. 355513481Sgiacomo.travaglini@arm.comTEST(FieldForPointerTest, CanDescribeSelf) { 355613481Sgiacomo.travaglini@arm.com Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 355713481Sgiacomo.travaglini@arm.com 355813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given field is >= 0", Describe(m)); 355913481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given field isn't >= 0", DescribeNegation(m)); 356013481Sgiacomo.travaglini@arm.com} 356113481Sgiacomo.travaglini@arm.com 356213481Sgiacomo.travaglini@arm.com// Tests that Field() can explain the result of matching a pointer. 356313481Sgiacomo.travaglini@arm.comTEST(FieldForPointerTest, CanExplainMatchResult) { 356413481Sgiacomo.travaglini@arm.com Matcher<const AStruct*> m = Field(&AStruct::x, Ge(0)); 356513481Sgiacomo.travaglini@arm.com 356613481Sgiacomo.travaglini@arm.com AStruct a; 356713481Sgiacomo.travaglini@arm.com a.x = 1; 356813481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, static_cast<const AStruct*>(NULL))); 356913481Sgiacomo.travaglini@arm.com EXPECT_EQ("which points to an object whose given field is 1" + OfType("int"), 357013481Sgiacomo.travaglini@arm.com Explain(m, &a)); 357113481Sgiacomo.travaglini@arm.com 357213481Sgiacomo.travaglini@arm.com m = Field(&AStruct::x, GreaterThan(0)); 357313481Sgiacomo.travaglini@arm.com EXPECT_EQ("which points to an object whose given field is 1" + OfType("int") + 357413481Sgiacomo.travaglini@arm.com ", which is 1 more than 0", Explain(m, &a)); 357513481Sgiacomo.travaglini@arm.com} 357613481Sgiacomo.travaglini@arm.com 357713481Sgiacomo.travaglini@arm.com// A user-defined class for testing Property(). 357813481Sgiacomo.travaglini@arm.comclass AClass { 357913481Sgiacomo.travaglini@arm.com public: 358013481Sgiacomo.travaglini@arm.com AClass() : n_(0) {} 358113481Sgiacomo.travaglini@arm.com 358213481Sgiacomo.travaglini@arm.com // A getter that returns a non-reference. 358313481Sgiacomo.travaglini@arm.com int n() const { return n_; } 358413481Sgiacomo.travaglini@arm.com 358513481Sgiacomo.travaglini@arm.com void set_n(int new_n) { n_ = new_n; } 358613481Sgiacomo.travaglini@arm.com 358713481Sgiacomo.travaglini@arm.com // A getter that returns a reference to const. 358813481Sgiacomo.travaglini@arm.com const string& s() const { return s_; } 358913481Sgiacomo.travaglini@arm.com 359013481Sgiacomo.travaglini@arm.com void set_s(const string& new_s) { s_ = new_s; } 359113481Sgiacomo.travaglini@arm.com 359213481Sgiacomo.travaglini@arm.com // A getter that returns a reference to non-const. 359313481Sgiacomo.travaglini@arm.com double& x() const { return x_; } 359413481Sgiacomo.travaglini@arm.com private: 359513481Sgiacomo.travaglini@arm.com int n_; 359613481Sgiacomo.travaglini@arm.com string s_; 359713481Sgiacomo.travaglini@arm.com 359813481Sgiacomo.travaglini@arm.com static double x_; 359913481Sgiacomo.travaglini@arm.com}; 360013481Sgiacomo.travaglini@arm.com 360113481Sgiacomo.travaglini@arm.comdouble AClass::x_ = 0.0; 360213481Sgiacomo.travaglini@arm.com 360313481Sgiacomo.travaglini@arm.com// A derived class for testing Property(). 360413481Sgiacomo.travaglini@arm.comclass DerivedClass : public AClass { 360513481Sgiacomo.travaglini@arm.com public: 360613481Sgiacomo.travaglini@arm.com int k() const { return k_; } 360713481Sgiacomo.travaglini@arm.com private: 360813481Sgiacomo.travaglini@arm.com int k_; 360913481Sgiacomo.travaglini@arm.com}; 361013481Sgiacomo.travaglini@arm.com 361113481Sgiacomo.travaglini@arm.com// Tests that Property(&Foo::property, ...) works when property() 361213481Sgiacomo.travaglini@arm.com// returns a non-reference. 361313481Sgiacomo.travaglini@arm.comTEST(PropertyTest, WorksForNonReferenceProperty) { 361413481Sgiacomo.travaglini@arm.com Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 361513481Sgiacomo.travaglini@arm.com 361613481Sgiacomo.travaglini@arm.com AClass a; 361713481Sgiacomo.travaglini@arm.com a.set_n(1); 361813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 361913481Sgiacomo.travaglini@arm.com 362013481Sgiacomo.travaglini@arm.com a.set_n(-1); 362113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 362213481Sgiacomo.travaglini@arm.com} 362313481Sgiacomo.travaglini@arm.com 362413481Sgiacomo.travaglini@arm.com// Tests that Property(&Foo::property, ...) works when property() 362513481Sgiacomo.travaglini@arm.com// returns a reference to const. 362613481Sgiacomo.travaglini@arm.comTEST(PropertyTest, WorksForReferenceToConstProperty) { 362713481Sgiacomo.travaglini@arm.com Matcher<const AClass&> m = Property(&AClass::s, StartsWith("hi")); 362813481Sgiacomo.travaglini@arm.com 362913481Sgiacomo.travaglini@arm.com AClass a; 363013481Sgiacomo.travaglini@arm.com a.set_s("hill"); 363113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 363213481Sgiacomo.travaglini@arm.com 363313481Sgiacomo.travaglini@arm.com a.set_s("hole"); 363413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 363513481Sgiacomo.travaglini@arm.com} 363613481Sgiacomo.travaglini@arm.com 363713481Sgiacomo.travaglini@arm.com// Tests that Property(&Foo::property, ...) works when property() 363813481Sgiacomo.travaglini@arm.com// returns a reference to non-const. 363913481Sgiacomo.travaglini@arm.comTEST(PropertyTest, WorksForReferenceToNonConstProperty) { 364013481Sgiacomo.travaglini@arm.com double x = 0.0; 364113481Sgiacomo.travaglini@arm.com AClass a; 364213481Sgiacomo.travaglini@arm.com 364313481Sgiacomo.travaglini@arm.com Matcher<const AClass&> m = Property(&AClass::x, Ref(x)); 364413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 364513481Sgiacomo.travaglini@arm.com 364613481Sgiacomo.travaglini@arm.com m = Property(&AClass::x, Not(Ref(x))); 364713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 364813481Sgiacomo.travaglini@arm.com} 364913481Sgiacomo.travaglini@arm.com 365013481Sgiacomo.travaglini@arm.com// Tests that Property(&Foo::property, ...) works when the argument is 365113481Sgiacomo.travaglini@arm.com// passed by value. 365213481Sgiacomo.travaglini@arm.comTEST(PropertyTest, WorksForByValueArgument) { 365313481Sgiacomo.travaglini@arm.com Matcher<AClass> m = Property(&AClass::s, StartsWith("hi")); 365413481Sgiacomo.travaglini@arm.com 365513481Sgiacomo.travaglini@arm.com AClass a; 365613481Sgiacomo.travaglini@arm.com a.set_s("hill"); 365713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 365813481Sgiacomo.travaglini@arm.com 365913481Sgiacomo.travaglini@arm.com a.set_s("hole"); 366013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 366113481Sgiacomo.travaglini@arm.com} 366213481Sgiacomo.travaglini@arm.com 366313481Sgiacomo.travaglini@arm.com// Tests that Property(&Foo::property, ...) works when the argument's 366413481Sgiacomo.travaglini@arm.com// type is a sub-type of Foo. 366513481Sgiacomo.travaglini@arm.comTEST(PropertyTest, WorksForArgumentOfSubType) { 366613481Sgiacomo.travaglini@arm.com // The matcher expects a DerivedClass, but inside the Property() we 366713481Sgiacomo.travaglini@arm.com // say AClass. 366813481Sgiacomo.travaglini@arm.com Matcher<const DerivedClass&> m = Property(&AClass::n, Ge(0)); 366913481Sgiacomo.travaglini@arm.com 367013481Sgiacomo.travaglini@arm.com DerivedClass d; 367113481Sgiacomo.travaglini@arm.com d.set_n(1); 367213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(d)); 367313481Sgiacomo.travaglini@arm.com 367413481Sgiacomo.travaglini@arm.com d.set_n(-1); 367513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(d)); 367613481Sgiacomo.travaglini@arm.com} 367713481Sgiacomo.travaglini@arm.com 367813481Sgiacomo.travaglini@arm.com// Tests that Property(&Foo::property, m) works when property()'s type 367913481Sgiacomo.travaglini@arm.com// and m's argument type are compatible but different. 368013481Sgiacomo.travaglini@arm.comTEST(PropertyTest, WorksForCompatibleMatcherType) { 368113481Sgiacomo.travaglini@arm.com // n() returns an int but the inner matcher expects a signed char. 368213481Sgiacomo.travaglini@arm.com Matcher<const AClass&> m = Property(&AClass::n, 368313481Sgiacomo.travaglini@arm.com Matcher<signed char>(Ge(0))); 368413481Sgiacomo.travaglini@arm.com 368513481Sgiacomo.travaglini@arm.com AClass a; 368613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(a)); 368713481Sgiacomo.travaglini@arm.com a.set_n(-1); 368813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(a)); 368913481Sgiacomo.travaglini@arm.com} 369013481Sgiacomo.travaglini@arm.com 369113481Sgiacomo.travaglini@arm.com// Tests that Property() can describe itself. 369213481Sgiacomo.travaglini@arm.comTEST(PropertyTest, CanDescribeSelf) { 369313481Sgiacomo.travaglini@arm.com Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 369413481Sgiacomo.travaglini@arm.com 369513481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 369613481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given property isn't >= 0", 369713481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 369813481Sgiacomo.travaglini@arm.com} 369913481Sgiacomo.travaglini@arm.com 370013481Sgiacomo.travaglini@arm.com// Tests that Property() can explain the match result. 370113481Sgiacomo.travaglini@arm.comTEST(PropertyTest, CanExplainMatchResult) { 370213481Sgiacomo.travaglini@arm.com Matcher<const AClass&> m = Property(&AClass::n, Ge(0)); 370313481Sgiacomo.travaglini@arm.com 370413481Sgiacomo.travaglini@arm.com AClass a; 370513481Sgiacomo.travaglini@arm.com a.set_n(1); 370613481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose given property is 1" + OfType("int"), Explain(m, a)); 370713481Sgiacomo.travaglini@arm.com 370813481Sgiacomo.travaglini@arm.com m = Property(&AClass::n, GreaterThan(0)); 370913481Sgiacomo.travaglini@arm.com EXPECT_EQ( 371013481Sgiacomo.travaglini@arm.com "whose given property is 1" + OfType("int") + ", which is 1 more than 0", 371113481Sgiacomo.travaglini@arm.com Explain(m, a)); 371213481Sgiacomo.travaglini@arm.com} 371313481Sgiacomo.travaglini@arm.com 371413481Sgiacomo.travaglini@arm.com// Tests that Property() works when the argument is a pointer to const. 371513481Sgiacomo.travaglini@arm.comTEST(PropertyForPointerTest, WorksForPointerToConst) { 371613481Sgiacomo.travaglini@arm.com Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 371713481Sgiacomo.travaglini@arm.com 371813481Sgiacomo.travaglini@arm.com AClass a; 371913481Sgiacomo.travaglini@arm.com a.set_n(1); 372013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&a)); 372113481Sgiacomo.travaglini@arm.com 372213481Sgiacomo.travaglini@arm.com a.set_n(-1); 372313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&a)); 372413481Sgiacomo.travaglini@arm.com} 372513481Sgiacomo.travaglini@arm.com 372613481Sgiacomo.travaglini@arm.com// Tests that Property() works when the argument is a pointer to non-const. 372713481Sgiacomo.travaglini@arm.comTEST(PropertyForPointerTest, WorksForPointerToNonConst) { 372813481Sgiacomo.travaglini@arm.com Matcher<AClass*> m = Property(&AClass::s, StartsWith("hi")); 372913481Sgiacomo.travaglini@arm.com 373013481Sgiacomo.travaglini@arm.com AClass a; 373113481Sgiacomo.travaglini@arm.com a.set_s("hill"); 373213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&a)); 373313481Sgiacomo.travaglini@arm.com 373413481Sgiacomo.travaglini@arm.com a.set_s("hole"); 373513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&a)); 373613481Sgiacomo.travaglini@arm.com} 373713481Sgiacomo.travaglini@arm.com 373813481Sgiacomo.travaglini@arm.com// Tests that Property() works when the argument is a reference to a 373913481Sgiacomo.travaglini@arm.com// const pointer. 374013481Sgiacomo.travaglini@arm.comTEST(PropertyForPointerTest, WorksForReferenceToConstPointer) { 374113481Sgiacomo.travaglini@arm.com Matcher<AClass* const&> m = Property(&AClass::s, StartsWith("hi")); 374213481Sgiacomo.travaglini@arm.com 374313481Sgiacomo.travaglini@arm.com AClass a; 374413481Sgiacomo.travaglini@arm.com a.set_s("hill"); 374513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&a)); 374613481Sgiacomo.travaglini@arm.com 374713481Sgiacomo.travaglini@arm.com a.set_s("hole"); 374813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&a)); 374913481Sgiacomo.travaglini@arm.com} 375013481Sgiacomo.travaglini@arm.com 375113481Sgiacomo.travaglini@arm.com// Tests that Property() does not match the NULL pointer. 375213481Sgiacomo.travaglini@arm.comTEST(PropertyForPointerTest, WorksForReferenceToNonConstProperty) { 375313481Sgiacomo.travaglini@arm.com Matcher<const AClass*> m = Property(&AClass::x, _); 375413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(NULL)); 375513481Sgiacomo.travaglini@arm.com} 375613481Sgiacomo.travaglini@arm.com 375713481Sgiacomo.travaglini@arm.com// Tests that Property(&Foo::property, ...) works when the argument's 375813481Sgiacomo.travaglini@arm.com// type is a sub-type of const Foo*. 375913481Sgiacomo.travaglini@arm.comTEST(PropertyForPointerTest, WorksForArgumentOfSubType) { 376013481Sgiacomo.travaglini@arm.com // The matcher expects a DerivedClass, but inside the Property() we 376113481Sgiacomo.travaglini@arm.com // say AClass. 376213481Sgiacomo.travaglini@arm.com Matcher<const DerivedClass*> m = Property(&AClass::n, Ge(0)); 376313481Sgiacomo.travaglini@arm.com 376413481Sgiacomo.travaglini@arm.com DerivedClass d; 376513481Sgiacomo.travaglini@arm.com d.set_n(1); 376613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(&d)); 376713481Sgiacomo.travaglini@arm.com 376813481Sgiacomo.travaglini@arm.com d.set_n(-1); 376913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(&d)); 377013481Sgiacomo.travaglini@arm.com} 377113481Sgiacomo.travaglini@arm.com 377213481Sgiacomo.travaglini@arm.com// Tests that Property() can describe itself when used to match a pointer. 377313481Sgiacomo.travaglini@arm.comTEST(PropertyForPointerTest, CanDescribeSelf) { 377413481Sgiacomo.travaglini@arm.com Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 377513481Sgiacomo.travaglini@arm.com 377613481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given property is >= 0", Describe(m)); 377713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is an object whose given property isn't >= 0", 377813481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 377913481Sgiacomo.travaglini@arm.com} 378013481Sgiacomo.travaglini@arm.com 378113481Sgiacomo.travaglini@arm.com// Tests that Property() can explain the result of matching a pointer. 378213481Sgiacomo.travaglini@arm.comTEST(PropertyForPointerTest, CanExplainMatchResult) { 378313481Sgiacomo.travaglini@arm.com Matcher<const AClass*> m = Property(&AClass::n, Ge(0)); 378413481Sgiacomo.travaglini@arm.com 378513481Sgiacomo.travaglini@arm.com AClass a; 378613481Sgiacomo.travaglini@arm.com a.set_n(1); 378713481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, static_cast<const AClass*>(NULL))); 378813481Sgiacomo.travaglini@arm.com EXPECT_EQ( 378913481Sgiacomo.travaglini@arm.com "which points to an object whose given property is 1" + OfType("int"), 379013481Sgiacomo.travaglini@arm.com Explain(m, &a)); 379113481Sgiacomo.travaglini@arm.com 379213481Sgiacomo.travaglini@arm.com m = Property(&AClass::n, GreaterThan(0)); 379313481Sgiacomo.travaglini@arm.com EXPECT_EQ("which points to an object whose given property is 1" + 379413481Sgiacomo.travaglini@arm.com OfType("int") + ", which is 1 more than 0", 379513481Sgiacomo.travaglini@arm.com Explain(m, &a)); 379613481Sgiacomo.travaglini@arm.com} 379713481Sgiacomo.travaglini@arm.com 379813481Sgiacomo.travaglini@arm.com// Tests ResultOf. 379913481Sgiacomo.travaglini@arm.com 380013481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, ...) compiles and works as expected when f is a 380113481Sgiacomo.travaglini@arm.com// function pointer. 380213481Sgiacomo.travaglini@arm.comstring IntToStringFunction(int input) { return input == 1 ? "foo" : "bar"; } 380313481Sgiacomo.travaglini@arm.com 380413481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForFunctionPointers) { 380513481Sgiacomo.travaglini@arm.com Matcher<int> matcher = ResultOf(&IntToStringFunction, Eq(string("foo"))); 380613481Sgiacomo.travaglini@arm.com 380713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(1)); 380813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher.Matches(2)); 380913481Sgiacomo.travaglini@arm.com} 381013481Sgiacomo.travaglini@arm.com 381113481Sgiacomo.travaglini@arm.com// Tests that ResultOf() can describe itself. 381213481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, CanDescribeItself) { 381313481Sgiacomo.travaglini@arm.com Matcher<int> matcher = ResultOf(&IntToStringFunction, StrEq("foo")); 381413481Sgiacomo.travaglini@arm.com 381513481Sgiacomo.travaglini@arm.com EXPECT_EQ("is mapped by the given callable to a value that " 381613481Sgiacomo.travaglini@arm.com "is equal to \"foo\"", Describe(matcher)); 381713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is mapped by the given callable to a value that " 381813481Sgiacomo.travaglini@arm.com "isn't equal to \"foo\"", DescribeNegation(matcher)); 381913481Sgiacomo.travaglini@arm.com} 382013481Sgiacomo.travaglini@arm.com 382113481Sgiacomo.travaglini@arm.com// Tests that ResultOf() can explain the match result. 382213481Sgiacomo.travaglini@arm.comint IntFunction(int input) { return input == 42 ? 80 : 90; } 382313481Sgiacomo.travaglini@arm.com 382413481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, CanExplainMatchResult) { 382513481Sgiacomo.travaglini@arm.com Matcher<int> matcher = ResultOf(&IntFunction, Ge(85)); 382613481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int"), 382713481Sgiacomo.travaglini@arm.com Explain(matcher, 36)); 382813481Sgiacomo.travaglini@arm.com 382913481Sgiacomo.travaglini@arm.com matcher = ResultOf(&IntFunction, GreaterThan(85)); 383013481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is mapped by the given callable to 90" + OfType("int") + 383113481Sgiacomo.travaglini@arm.com ", which is 5 more than 85", Explain(matcher, 36)); 383213481Sgiacomo.travaglini@arm.com} 383313481Sgiacomo.travaglini@arm.com 383413481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 383513481Sgiacomo.travaglini@arm.com// returns a non-reference. 383613481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForNonReferenceResults) { 383713481Sgiacomo.travaglini@arm.com Matcher<int> matcher = ResultOf(&IntFunction, Eq(80)); 383813481Sgiacomo.travaglini@arm.com 383913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(42)); 384013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher.Matches(36)); 384113481Sgiacomo.travaglini@arm.com} 384213481Sgiacomo.travaglini@arm.com 384313481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 384413481Sgiacomo.travaglini@arm.com// returns a reference to non-const. 384513481Sgiacomo.travaglini@arm.comdouble& DoubleFunction(double& input) { return input; } // NOLINT 384613481Sgiacomo.travaglini@arm.com 384713481Sgiacomo.travaglini@arm.comUncopyable& RefUncopyableFunction(Uncopyable& obj) { // NOLINT 384813481Sgiacomo.travaglini@arm.com return obj; 384913481Sgiacomo.travaglini@arm.com} 385013481Sgiacomo.travaglini@arm.com 385113481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForReferenceToNonConstResults) { 385213481Sgiacomo.travaglini@arm.com double x = 3.14; 385313481Sgiacomo.travaglini@arm.com double x2 = x; 385413481Sgiacomo.travaglini@arm.com Matcher<double&> matcher = ResultOf(&DoubleFunction, Ref(x)); 385513481Sgiacomo.travaglini@arm.com 385613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(x)); 385713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher.Matches(x2)); 385813481Sgiacomo.travaglini@arm.com 385913481Sgiacomo.travaglini@arm.com // Test that ResultOf works with uncopyable objects 386013481Sgiacomo.travaglini@arm.com Uncopyable obj(0); 386113481Sgiacomo.travaglini@arm.com Uncopyable obj2(0); 386213481Sgiacomo.travaglini@arm.com Matcher<Uncopyable&> matcher2 = 386313481Sgiacomo.travaglini@arm.com ResultOf(&RefUncopyableFunction, Ref(obj)); 386413481Sgiacomo.travaglini@arm.com 386513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher2.Matches(obj)); 386613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher2.Matches(obj2)); 386713481Sgiacomo.travaglini@arm.com} 386813481Sgiacomo.travaglini@arm.com 386913481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, ...) compiles and works as expected when f(x) 387013481Sgiacomo.travaglini@arm.com// returns a reference to const. 387113481Sgiacomo.travaglini@arm.comconst string& StringFunction(const string& input) { return input; } 387213481Sgiacomo.travaglini@arm.com 387313481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForReferenceToConstResults) { 387413481Sgiacomo.travaglini@arm.com string s = "foo"; 387513481Sgiacomo.travaglini@arm.com string s2 = s; 387613481Sgiacomo.travaglini@arm.com Matcher<const string&> matcher = ResultOf(&StringFunction, Ref(s)); 387713481Sgiacomo.travaglini@arm.com 387813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(s)); 387913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher.Matches(s2)); 388013481Sgiacomo.travaglini@arm.com} 388113481Sgiacomo.travaglini@arm.com 388213481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, m) works when f(x) and m's 388313481Sgiacomo.travaglini@arm.com// argument types are compatible but different. 388413481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForCompatibleMatcherTypes) { 388513481Sgiacomo.travaglini@arm.com // IntFunction() returns int but the inner matcher expects a signed char. 388613481Sgiacomo.travaglini@arm.com Matcher<int> matcher = ResultOf(IntFunction, Matcher<signed char>(Ge(85))); 388713481Sgiacomo.travaglini@arm.com 388813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(36)); 388913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher.Matches(42)); 389013481Sgiacomo.travaglini@arm.com} 389113481Sgiacomo.travaglini@arm.com 389213481Sgiacomo.travaglini@arm.com// Tests that the program aborts when ResultOf is passed 389313481Sgiacomo.travaglini@arm.com// a NULL function pointer. 389413481Sgiacomo.travaglini@arm.comTEST(ResultOfDeathTest, DiesOnNullFunctionPointers) { 389513481Sgiacomo.travaglini@arm.com EXPECT_DEATH_IF_SUPPORTED( 389613481Sgiacomo.travaglini@arm.com ResultOf(static_cast<string(*)(int dummy)>(NULL), Eq(string("foo"))), 389713481Sgiacomo.travaglini@arm.com "NULL function pointer is passed into ResultOf\\(\\)\\."); 389813481Sgiacomo.travaglini@arm.com} 389913481Sgiacomo.travaglini@arm.com 390013481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, ...) compiles and works as expected when f is a 390113481Sgiacomo.travaglini@arm.com// function reference. 390213481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForFunctionReferences) { 390313481Sgiacomo.travaglini@arm.com Matcher<int> matcher = ResultOf(IntToStringFunction, StrEq("foo")); 390413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(1)); 390513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher.Matches(2)); 390613481Sgiacomo.travaglini@arm.com} 390713481Sgiacomo.travaglini@arm.com 390813481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, ...) compiles and works as expected when f is a 390913481Sgiacomo.travaglini@arm.com// function object. 391013481Sgiacomo.travaglini@arm.comstruct Functor : public ::std::unary_function<int, string> { 391113481Sgiacomo.travaglini@arm.com result_type operator()(argument_type input) const { 391213481Sgiacomo.travaglini@arm.com return IntToStringFunction(input); 391313481Sgiacomo.travaglini@arm.com } 391413481Sgiacomo.travaglini@arm.com}; 391513481Sgiacomo.travaglini@arm.com 391613481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForFunctors) { 391713481Sgiacomo.travaglini@arm.com Matcher<int> matcher = ResultOf(Functor(), Eq(string("foo"))); 391813481Sgiacomo.travaglini@arm.com 391913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher.Matches(1)); 392013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher.Matches(2)); 392113481Sgiacomo.travaglini@arm.com} 392213481Sgiacomo.travaglini@arm.com 392313481Sgiacomo.travaglini@arm.com// Tests that ResultOf(f, ...) compiles and works as expected when f is a 392413481Sgiacomo.travaglini@arm.com// functor with more then one operator() defined. ResultOf() must work 392513481Sgiacomo.travaglini@arm.com// for each defined operator(). 392613481Sgiacomo.travaglini@arm.comstruct PolymorphicFunctor { 392713481Sgiacomo.travaglini@arm.com typedef int result_type; 392813481Sgiacomo.travaglini@arm.com int operator()(int n) { return n; } 392913481Sgiacomo.travaglini@arm.com int operator()(const char* s) { return static_cast<int>(strlen(s)); } 393013481Sgiacomo.travaglini@arm.com}; 393113481Sgiacomo.travaglini@arm.com 393213481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForPolymorphicFunctors) { 393313481Sgiacomo.travaglini@arm.com Matcher<int> matcher_int = ResultOf(PolymorphicFunctor(), Ge(5)); 393413481Sgiacomo.travaglini@arm.com 393513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher_int.Matches(10)); 393613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher_int.Matches(2)); 393713481Sgiacomo.travaglini@arm.com 393813481Sgiacomo.travaglini@arm.com Matcher<const char*> matcher_string = ResultOf(PolymorphicFunctor(), Ge(5)); 393913481Sgiacomo.travaglini@arm.com 394013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher_string.Matches("long string")); 394113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher_string.Matches("shrt")); 394213481Sgiacomo.travaglini@arm.com} 394313481Sgiacomo.travaglini@arm.com 394413481Sgiacomo.travaglini@arm.comconst int* ReferencingFunction(const int& n) { return &n; } 394513481Sgiacomo.travaglini@arm.com 394613481Sgiacomo.travaglini@arm.comstruct ReferencingFunctor { 394713481Sgiacomo.travaglini@arm.com typedef const int* result_type; 394813481Sgiacomo.travaglini@arm.com result_type operator()(const int& n) { return &n; } 394913481Sgiacomo.travaglini@arm.com}; 395013481Sgiacomo.travaglini@arm.com 395113481Sgiacomo.travaglini@arm.comTEST(ResultOfTest, WorksForReferencingCallables) { 395213481Sgiacomo.travaglini@arm.com const int n = 1; 395313481Sgiacomo.travaglini@arm.com const int n2 = 1; 395413481Sgiacomo.travaglini@arm.com Matcher<const int&> matcher2 = ResultOf(ReferencingFunction, Eq(&n)); 395513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher2.Matches(n)); 395613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher2.Matches(n2)); 395713481Sgiacomo.travaglini@arm.com 395813481Sgiacomo.travaglini@arm.com Matcher<const int&> matcher3 = ResultOf(ReferencingFunctor(), Eq(&n)); 395913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(matcher3.Matches(n)); 396013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(matcher3.Matches(n2)); 396113481Sgiacomo.travaglini@arm.com} 396213481Sgiacomo.travaglini@arm.com 396313481Sgiacomo.travaglini@arm.comclass DivisibleByImpl { 396413481Sgiacomo.travaglini@arm.com public: 396513481Sgiacomo.travaglini@arm.com explicit DivisibleByImpl(int a_divider) : divider_(a_divider) {} 396613481Sgiacomo.travaglini@arm.com 396713481Sgiacomo.travaglini@arm.com // For testing using ExplainMatchResultTo() with polymorphic matchers. 396813481Sgiacomo.travaglini@arm.com template <typename T> 396913481Sgiacomo.travaglini@arm.com bool MatchAndExplain(const T& n, MatchResultListener* listener) const { 397013481Sgiacomo.travaglini@arm.com *listener << "which is " << (n % divider_) << " modulo " 397113481Sgiacomo.travaglini@arm.com << divider_; 397213481Sgiacomo.travaglini@arm.com return (n % divider_) == 0; 397313481Sgiacomo.travaglini@arm.com } 397413481Sgiacomo.travaglini@arm.com 397513481Sgiacomo.travaglini@arm.com void DescribeTo(ostream* os) const { 397613481Sgiacomo.travaglini@arm.com *os << "is divisible by " << divider_; 397713481Sgiacomo.travaglini@arm.com } 397813481Sgiacomo.travaglini@arm.com 397913481Sgiacomo.travaglini@arm.com void DescribeNegationTo(ostream* os) const { 398013481Sgiacomo.travaglini@arm.com *os << "is not divisible by " << divider_; 398113481Sgiacomo.travaglini@arm.com } 398213481Sgiacomo.travaglini@arm.com 398313481Sgiacomo.travaglini@arm.com void set_divider(int a_divider) { divider_ = a_divider; } 398413481Sgiacomo.travaglini@arm.com int divider() const { return divider_; } 398513481Sgiacomo.travaglini@arm.com 398613481Sgiacomo.travaglini@arm.com private: 398713481Sgiacomo.travaglini@arm.com int divider_; 398813481Sgiacomo.travaglini@arm.com}; 398913481Sgiacomo.travaglini@arm.com 399013481Sgiacomo.travaglini@arm.comPolymorphicMatcher<DivisibleByImpl> DivisibleBy(int n) { 399113481Sgiacomo.travaglini@arm.com return MakePolymorphicMatcher(DivisibleByImpl(n)); 399213481Sgiacomo.travaglini@arm.com} 399313481Sgiacomo.travaglini@arm.com 399413481Sgiacomo.travaglini@arm.com// Tests that when AllOf() fails, only the first failing matcher is 399513481Sgiacomo.travaglini@arm.com// asked to explain why. 399613481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, AllOf_False_False) { 399713481Sgiacomo.travaglini@arm.com const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 399813481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 1 modulo 4", Explain(m, 5)); 399913481Sgiacomo.travaglini@arm.com} 400013481Sgiacomo.travaglini@arm.com 400113481Sgiacomo.travaglini@arm.com// Tests that when AllOf() fails, only the first failing matcher is 400213481Sgiacomo.travaglini@arm.com// asked to explain why. 400313481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, AllOf_False_True) { 400413481Sgiacomo.travaglini@arm.com const Matcher<int> m = AllOf(DivisibleBy(4), DivisibleBy(3)); 400513481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 2 modulo 4", Explain(m, 6)); 400613481Sgiacomo.travaglini@arm.com} 400713481Sgiacomo.travaglini@arm.com 400813481Sgiacomo.travaglini@arm.com// Tests that when AllOf() fails, only the first failing matcher is 400913481Sgiacomo.travaglini@arm.com// asked to explain why. 401013481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, AllOf_True_False) { 401113481Sgiacomo.travaglini@arm.com const Matcher<int> m = AllOf(Ge(1), DivisibleBy(3)); 401213481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 2 modulo 3", Explain(m, 5)); 401313481Sgiacomo.travaglini@arm.com} 401413481Sgiacomo.travaglini@arm.com 401513481Sgiacomo.travaglini@arm.com// Tests that when AllOf() succeeds, all matchers are asked to explain 401613481Sgiacomo.travaglini@arm.com// why. 401713481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, AllOf_True_True) { 401813481Sgiacomo.travaglini@arm.com const Matcher<int> m = AllOf(DivisibleBy(2), DivisibleBy(3)); 401913481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 0 modulo 2, and which is 0 modulo 3", Explain(m, 6)); 402013481Sgiacomo.travaglini@arm.com} 402113481Sgiacomo.travaglini@arm.com 402213481Sgiacomo.travaglini@arm.comTEST(ExplainMatchResultTest, AllOf_True_True_2) { 402313481Sgiacomo.travaglini@arm.com const Matcher<int> m = AllOf(Ge(2), Le(3)); 402413481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 2)); 402513481Sgiacomo.travaglini@arm.com} 402613481Sgiacomo.travaglini@arm.com 402713481Sgiacomo.travaglini@arm.comTEST(ExplainmatcherResultTest, MonomorphicMatcher) { 402813481Sgiacomo.travaglini@arm.com const Matcher<int> m = GreaterThan(5); 402913481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is 1 more than 5", Explain(m, 6)); 403013481Sgiacomo.travaglini@arm.com} 403113481Sgiacomo.travaglini@arm.com 403213481Sgiacomo.travaglini@arm.com// The following two tests verify that values without a public copy 403313481Sgiacomo.travaglini@arm.com// ctor can be used as arguments to matchers like Eq(), Ge(), and etc 403413481Sgiacomo.travaglini@arm.com// with the help of ByRef(). 403513481Sgiacomo.travaglini@arm.com 403613481Sgiacomo.travaglini@arm.comclass NotCopyable { 403713481Sgiacomo.travaglini@arm.com public: 403813481Sgiacomo.travaglini@arm.com explicit NotCopyable(int a_value) : value_(a_value) {} 403913481Sgiacomo.travaglini@arm.com 404013481Sgiacomo.travaglini@arm.com int value() const { return value_; } 404113481Sgiacomo.travaglini@arm.com 404213481Sgiacomo.travaglini@arm.com bool operator==(const NotCopyable& rhs) const { 404313481Sgiacomo.travaglini@arm.com return value() == rhs.value(); 404413481Sgiacomo.travaglini@arm.com } 404513481Sgiacomo.travaglini@arm.com 404613481Sgiacomo.travaglini@arm.com bool operator>=(const NotCopyable& rhs) const { 404713481Sgiacomo.travaglini@arm.com return value() >= rhs.value(); 404813481Sgiacomo.travaglini@arm.com } 404913481Sgiacomo.travaglini@arm.com private: 405013481Sgiacomo.travaglini@arm.com int value_; 405113481Sgiacomo.travaglini@arm.com 405213481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(NotCopyable); 405313481Sgiacomo.travaglini@arm.com}; 405413481Sgiacomo.travaglini@arm.com 405513481Sgiacomo.travaglini@arm.comTEST(ByRefTest, AllowsNotCopyableConstValueInMatchers) { 405613481Sgiacomo.travaglini@arm.com const NotCopyable const_value1(1); 405713481Sgiacomo.travaglini@arm.com const Matcher<const NotCopyable&> m = Eq(ByRef(const_value1)); 405813481Sgiacomo.travaglini@arm.com 405913481Sgiacomo.travaglini@arm.com const NotCopyable n1(1), n2(2); 406013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(n1)); 406113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(n2)); 406213481Sgiacomo.travaglini@arm.com} 406313481Sgiacomo.travaglini@arm.com 406413481Sgiacomo.travaglini@arm.comTEST(ByRefTest, AllowsNotCopyableValueInMatchers) { 406513481Sgiacomo.travaglini@arm.com NotCopyable value2(2); 406613481Sgiacomo.travaglini@arm.com const Matcher<NotCopyable&> m = Ge(ByRef(value2)); 406713481Sgiacomo.travaglini@arm.com 406813481Sgiacomo.travaglini@arm.com NotCopyable n1(1), n2(2); 406913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(n1)); 407013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(n2)); 407113481Sgiacomo.travaglini@arm.com} 407213481Sgiacomo.travaglini@arm.com 407313481Sgiacomo.travaglini@arm.comTEST(IsEmptyTest, ImplementsIsEmpty) { 407413481Sgiacomo.travaglini@arm.com vector<int> container; 407513481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, IsEmpty()); 407613481Sgiacomo.travaglini@arm.com container.push_back(0); 407713481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(IsEmpty())); 407813481Sgiacomo.travaglini@arm.com container.push_back(1); 407913481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(IsEmpty())); 408013481Sgiacomo.travaglini@arm.com} 408113481Sgiacomo.travaglini@arm.com 408213481Sgiacomo.travaglini@arm.comTEST(IsEmptyTest, WorksWithString) { 408313481Sgiacomo.travaglini@arm.com string text; 408413481Sgiacomo.travaglini@arm.com EXPECT_THAT(text, IsEmpty()); 408513481Sgiacomo.travaglini@arm.com text = "foo"; 408613481Sgiacomo.travaglini@arm.com EXPECT_THAT(text, Not(IsEmpty())); 408713481Sgiacomo.travaglini@arm.com text = string("\0", 1); 408813481Sgiacomo.travaglini@arm.com EXPECT_THAT(text, Not(IsEmpty())); 408913481Sgiacomo.travaglini@arm.com} 409013481Sgiacomo.travaglini@arm.com 409113481Sgiacomo.travaglini@arm.comTEST(IsEmptyTest, CanDescribeSelf) { 409213481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = IsEmpty(); 409313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is empty", Describe(m)); 409413481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't empty", DescribeNegation(m)); 409513481Sgiacomo.travaglini@arm.com} 409613481Sgiacomo.travaglini@arm.com 409713481Sgiacomo.travaglini@arm.comTEST(IsEmptyTest, ExplainsResult) { 409813481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = IsEmpty(); 409913481Sgiacomo.travaglini@arm.com vector<int> container; 410013481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, container)); 410113481Sgiacomo.travaglini@arm.com container.push_back(0); 410213481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size is 1", Explain(m, container)); 410313481Sgiacomo.travaglini@arm.com} 410413481Sgiacomo.travaglini@arm.com 410513481Sgiacomo.travaglini@arm.comTEST(SizeIsTest, ImplementsSizeIs) { 410613481Sgiacomo.travaglini@arm.com vector<int> container; 410713481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, SizeIs(0)); 410813481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(SizeIs(1))); 410913481Sgiacomo.travaglini@arm.com container.push_back(0); 411013481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(SizeIs(0))); 411113481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, SizeIs(1)); 411213481Sgiacomo.travaglini@arm.com container.push_back(0); 411313481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(SizeIs(0))); 411413481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, SizeIs(2)); 411513481Sgiacomo.travaglini@arm.com} 411613481Sgiacomo.travaglini@arm.com 411713481Sgiacomo.travaglini@arm.comTEST(SizeIsTest, WorksWithMap) { 411813481Sgiacomo.travaglini@arm.com map<string, int> container; 411913481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, SizeIs(0)); 412013481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(SizeIs(1))); 412113481Sgiacomo.travaglini@arm.com container.insert(make_pair("foo", 1)); 412213481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(SizeIs(0))); 412313481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, SizeIs(1)); 412413481Sgiacomo.travaglini@arm.com container.insert(make_pair("bar", 2)); 412513481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(SizeIs(0))); 412613481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, SizeIs(2)); 412713481Sgiacomo.travaglini@arm.com} 412813481Sgiacomo.travaglini@arm.com 412913481Sgiacomo.travaglini@arm.comTEST(SizeIsTest, WorksWithReferences) { 413013481Sgiacomo.travaglini@arm.com vector<int> container; 413113481Sgiacomo.travaglini@arm.com Matcher<const vector<int>&> m = SizeIs(1); 413213481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(m)); 413313481Sgiacomo.travaglini@arm.com container.push_back(0); 413413481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, m); 413513481Sgiacomo.travaglini@arm.com} 413613481Sgiacomo.travaglini@arm.com 413713481Sgiacomo.travaglini@arm.comTEST(SizeIsTest, CanDescribeSelf) { 413813481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = SizeIs(2); 413913481Sgiacomo.travaglini@arm.com EXPECT_EQ("size is equal to 2", Describe(m)); 414013481Sgiacomo.travaglini@arm.com EXPECT_EQ("size isn't equal to 2", DescribeNegation(m)); 414113481Sgiacomo.travaglini@arm.com} 414213481Sgiacomo.travaglini@arm.com 414313481Sgiacomo.travaglini@arm.comTEST(SizeIsTest, ExplainsResult) { 414413481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m1 = SizeIs(2); 414513481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m2 = SizeIs(Lt(2u)); 414613481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m3 = SizeIs(AnyOf(0, 3)); 414713481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m4 = SizeIs(GreaterThan(1)); 414813481Sgiacomo.travaglini@arm.com vector<int> container; 414913481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 0 doesn't match", Explain(m1, container)); 415013481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 0 matches", Explain(m2, container)); 415113481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 0 matches", Explain(m3, container)); 415213481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 0 doesn't match, which is 1 less than 1", 415313481Sgiacomo.travaglini@arm.com Explain(m4, container)); 415413481Sgiacomo.travaglini@arm.com container.push_back(0); 415513481Sgiacomo.travaglini@arm.com container.push_back(0); 415613481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 2 matches", Explain(m1, container)); 415713481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 2 doesn't match", Explain(m2, container)); 415813481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 2 doesn't match", Explain(m3, container)); 415913481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose size 2 matches, which is 1 more than 1", 416013481Sgiacomo.travaglini@arm.com Explain(m4, container)); 416113481Sgiacomo.travaglini@arm.com} 416213481Sgiacomo.travaglini@arm.com 416313481Sgiacomo.travaglini@arm.com#if GTEST_HAS_TYPED_TEST 416413481Sgiacomo.travaglini@arm.com// Tests ContainerEq with different container types, and 416513481Sgiacomo.travaglini@arm.com// different element types. 416613481Sgiacomo.travaglini@arm.com 416713481Sgiacomo.travaglini@arm.comtemplate <typename T> 416813481Sgiacomo.travaglini@arm.comclass ContainerEqTest : public testing::Test {}; 416913481Sgiacomo.travaglini@arm.com 417013481Sgiacomo.travaglini@arm.comtypedef testing::Types< 417113481Sgiacomo.travaglini@arm.com set<int>, 417213481Sgiacomo.travaglini@arm.com vector<size_t>, 417313481Sgiacomo.travaglini@arm.com multiset<size_t>, 417413481Sgiacomo.travaglini@arm.com list<int> > 417513481Sgiacomo.travaglini@arm.com ContainerEqTestTypes; 417613481Sgiacomo.travaglini@arm.com 417713481Sgiacomo.travaglini@arm.comTYPED_TEST_CASE(ContainerEqTest, ContainerEqTestTypes); 417813481Sgiacomo.travaglini@arm.com 417913481Sgiacomo.travaglini@arm.com// Tests that the filled container is equal to itself. 418013481Sgiacomo.travaglini@arm.comTYPED_TEST(ContainerEqTest, EqualsSelf) { 418113481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 418213481Sgiacomo.travaglini@arm.com TypeParam my_set(vals, vals + 6); 418313481Sgiacomo.travaglini@arm.com const Matcher<TypeParam> m = ContainerEq(my_set); 418413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(my_set)); 418513481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, my_set)); 418613481Sgiacomo.travaglini@arm.com} 418713481Sgiacomo.travaglini@arm.com 418813481Sgiacomo.travaglini@arm.com// Tests that missing values are reported. 418913481Sgiacomo.travaglini@arm.comTYPED_TEST(ContainerEqTest, ValueMissing) { 419013481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 419113481Sgiacomo.travaglini@arm.com static const int test_vals[] = {2, 1, 8, 5}; 419213481Sgiacomo.travaglini@arm.com TypeParam my_set(vals, vals + 6); 419313481Sgiacomo.travaglini@arm.com TypeParam test_set(test_vals, test_vals + 4); 419413481Sgiacomo.travaglini@arm.com const Matcher<TypeParam> m = ContainerEq(my_set); 419513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_set)); 419613481Sgiacomo.travaglini@arm.com EXPECT_EQ("which doesn't have these expected elements: 3", 419713481Sgiacomo.travaglini@arm.com Explain(m, test_set)); 419813481Sgiacomo.travaglini@arm.com} 419913481Sgiacomo.travaglini@arm.com 420013481Sgiacomo.travaglini@arm.com// Tests that added values are reported. 420113481Sgiacomo.travaglini@arm.comTYPED_TEST(ContainerEqTest, ValueAdded) { 420213481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 420313481Sgiacomo.travaglini@arm.com static const int test_vals[] = {1, 2, 3, 5, 8, 46}; 420413481Sgiacomo.travaglini@arm.com TypeParam my_set(vals, vals + 6); 420513481Sgiacomo.travaglini@arm.com TypeParam test_set(test_vals, test_vals + 6); 420613481Sgiacomo.travaglini@arm.com const Matcher<const TypeParam&> m = ContainerEq(my_set); 420713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_set)); 420813481Sgiacomo.travaglini@arm.com EXPECT_EQ("which has these unexpected elements: 46", Explain(m, test_set)); 420913481Sgiacomo.travaglini@arm.com} 421013481Sgiacomo.travaglini@arm.com 421113481Sgiacomo.travaglini@arm.com// Tests that added and missing values are reported together. 421213481Sgiacomo.travaglini@arm.comTYPED_TEST(ContainerEqTest, ValueAddedAndRemoved) { 421313481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 421413481Sgiacomo.travaglini@arm.com static const int test_vals[] = {1, 2, 3, 8, 46}; 421513481Sgiacomo.travaglini@arm.com TypeParam my_set(vals, vals + 6); 421613481Sgiacomo.travaglini@arm.com TypeParam test_set(test_vals, test_vals + 5); 421713481Sgiacomo.travaglini@arm.com const Matcher<TypeParam> m = ContainerEq(my_set); 421813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_set)); 421913481Sgiacomo.travaglini@arm.com EXPECT_EQ("which has these unexpected elements: 46,\n" 422013481Sgiacomo.travaglini@arm.com "and doesn't have these expected elements: 5", 422113481Sgiacomo.travaglini@arm.com Explain(m, test_set)); 422213481Sgiacomo.travaglini@arm.com} 422313481Sgiacomo.travaglini@arm.com 422413481Sgiacomo.travaglini@arm.com// Tests duplicated value -- expect no explanation. 422513481Sgiacomo.travaglini@arm.comTYPED_TEST(ContainerEqTest, DuplicateDifference) { 422613481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 422713481Sgiacomo.travaglini@arm.com static const int test_vals[] = {1, 2, 3, 5, 8}; 422813481Sgiacomo.travaglini@arm.com TypeParam my_set(vals, vals + 6); 422913481Sgiacomo.travaglini@arm.com TypeParam test_set(test_vals, test_vals + 5); 423013481Sgiacomo.travaglini@arm.com const Matcher<const TypeParam&> m = ContainerEq(my_set); 423113481Sgiacomo.travaglini@arm.com // Depending on the container, match may be true or false 423213481Sgiacomo.travaglini@arm.com // But in any case there should be no explanation. 423313481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, test_set)); 423413481Sgiacomo.travaglini@arm.com} 423513481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_TYPED_TEST 423613481Sgiacomo.travaglini@arm.com 423713481Sgiacomo.travaglini@arm.com// Tests that mutliple missing values are reported. 423813481Sgiacomo.travaglini@arm.com// Using just vector here, so order is predicatble. 423913481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, MultipleValuesMissing) { 424013481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 424113481Sgiacomo.travaglini@arm.com static const int test_vals[] = {2, 1, 5}; 424213481Sgiacomo.travaglini@arm.com vector<int> my_set(vals, vals + 6); 424313481Sgiacomo.travaglini@arm.com vector<int> test_set(test_vals, test_vals + 3); 424413481Sgiacomo.travaglini@arm.com const Matcher<vector<int> > m = ContainerEq(my_set); 424513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_set)); 424613481Sgiacomo.travaglini@arm.com EXPECT_EQ("which doesn't have these expected elements: 3, 8", 424713481Sgiacomo.travaglini@arm.com Explain(m, test_set)); 424813481Sgiacomo.travaglini@arm.com} 424913481Sgiacomo.travaglini@arm.com 425013481Sgiacomo.travaglini@arm.com// Tests that added values are reported. 425113481Sgiacomo.travaglini@arm.com// Using just vector here, so order is predicatble. 425213481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, MultipleValuesAdded) { 425313481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 425413481Sgiacomo.travaglini@arm.com static const int test_vals[] = {1, 2, 92, 3, 5, 8, 46}; 425513481Sgiacomo.travaglini@arm.com list<size_t> my_set(vals, vals + 6); 425613481Sgiacomo.travaglini@arm.com list<size_t> test_set(test_vals, test_vals + 7); 425713481Sgiacomo.travaglini@arm.com const Matcher<const list<size_t>&> m = ContainerEq(my_set); 425813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_set)); 425913481Sgiacomo.travaglini@arm.com EXPECT_EQ("which has these unexpected elements: 92, 46", 426013481Sgiacomo.travaglini@arm.com Explain(m, test_set)); 426113481Sgiacomo.travaglini@arm.com} 426213481Sgiacomo.travaglini@arm.com 426313481Sgiacomo.travaglini@arm.com// Tests that added and missing values are reported together. 426413481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, MultipleValuesAddedAndRemoved) { 426513481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 426613481Sgiacomo.travaglini@arm.com static const int test_vals[] = {1, 2, 3, 92, 46}; 426713481Sgiacomo.travaglini@arm.com list<size_t> my_set(vals, vals + 6); 426813481Sgiacomo.travaglini@arm.com list<size_t> test_set(test_vals, test_vals + 5); 426913481Sgiacomo.travaglini@arm.com const Matcher<const list<size_t> > m = ContainerEq(my_set); 427013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_set)); 427113481Sgiacomo.travaglini@arm.com EXPECT_EQ("which has these unexpected elements: 92, 46,\n" 427213481Sgiacomo.travaglini@arm.com "and doesn't have these expected elements: 5, 8", 427313481Sgiacomo.travaglini@arm.com Explain(m, test_set)); 427413481Sgiacomo.travaglini@arm.com} 427513481Sgiacomo.travaglini@arm.com 427613481Sgiacomo.travaglini@arm.com// Tests to see that duplicate elements are detected, 427713481Sgiacomo.travaglini@arm.com// but (as above) not reported in the explanation. 427813481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, MultiSetOfIntDuplicateDifference) { 427913481Sgiacomo.travaglini@arm.com static const int vals[] = {1, 1, 2, 3, 5, 8}; 428013481Sgiacomo.travaglini@arm.com static const int test_vals[] = {1, 2, 3, 5, 8}; 428113481Sgiacomo.travaglini@arm.com vector<int> my_set(vals, vals + 6); 428213481Sgiacomo.travaglini@arm.com vector<int> test_set(test_vals, test_vals + 5); 428313481Sgiacomo.travaglini@arm.com const Matcher<vector<int> > m = ContainerEq(my_set); 428413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(my_set)); 428513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_set)); 428613481Sgiacomo.travaglini@arm.com // There is nothing to report when both sets contain all the same values. 428713481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, test_set)); 428813481Sgiacomo.travaglini@arm.com} 428913481Sgiacomo.travaglini@arm.com 429013481Sgiacomo.travaglini@arm.com// Tests that ContainerEq works for non-trivial associative containers, 429113481Sgiacomo.travaglini@arm.com// like maps. 429213481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, WorksForMaps) { 429313481Sgiacomo.travaglini@arm.com map<int, std::string> my_map; 429413481Sgiacomo.travaglini@arm.com my_map[0] = "a"; 429513481Sgiacomo.travaglini@arm.com my_map[1] = "b"; 429613481Sgiacomo.travaglini@arm.com 429713481Sgiacomo.travaglini@arm.com map<int, std::string> test_map; 429813481Sgiacomo.travaglini@arm.com test_map[0] = "aa"; 429913481Sgiacomo.travaglini@arm.com test_map[1] = "b"; 430013481Sgiacomo.travaglini@arm.com 430113481Sgiacomo.travaglini@arm.com const Matcher<const map<int, std::string>&> m = ContainerEq(my_map); 430213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(my_map)); 430313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_map)); 430413481Sgiacomo.travaglini@arm.com 430513481Sgiacomo.travaglini@arm.com EXPECT_EQ("which has these unexpected elements: (0, \"aa\"),\n" 430613481Sgiacomo.travaglini@arm.com "and doesn't have these expected elements: (0, \"a\")", 430713481Sgiacomo.travaglini@arm.com Explain(m, test_map)); 430813481Sgiacomo.travaglini@arm.com} 430913481Sgiacomo.travaglini@arm.com 431013481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, WorksForNativeArray) { 431113481Sgiacomo.travaglini@arm.com int a1[] = {1, 2, 3}; 431213481Sgiacomo.travaglini@arm.com int a2[] = {1, 2, 3}; 431313481Sgiacomo.travaglini@arm.com int b[] = {1, 2, 4}; 431413481Sgiacomo.travaglini@arm.com 431513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, ContainerEq(a2)); 431613481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, Not(ContainerEq(b))); 431713481Sgiacomo.travaglini@arm.com} 431813481Sgiacomo.travaglini@arm.com 431913481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, WorksForTwoDimensionalNativeArray) { 432013481Sgiacomo.travaglini@arm.com const char a1[][3] = {"hi", "lo"}; 432113481Sgiacomo.travaglini@arm.com const char a2[][3] = {"hi", "lo"}; 432213481Sgiacomo.travaglini@arm.com const char b[][3] = {"lo", "hi"}; 432313481Sgiacomo.travaglini@arm.com 432413481Sgiacomo.travaglini@arm.com // Tests using ContainerEq() in the first dimension. 432513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, ContainerEq(a2)); 432613481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, Not(ContainerEq(b))); 432713481Sgiacomo.travaglini@arm.com 432813481Sgiacomo.travaglini@arm.com // Tests using ContainerEq() in the second dimension. 432913481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, ElementsAre(ContainerEq(a2[0]), ContainerEq(a2[1]))); 433013481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, ElementsAre(Not(ContainerEq(b[0])), ContainerEq(a2[1]))); 433113481Sgiacomo.travaglini@arm.com} 433213481Sgiacomo.travaglini@arm.com 433313481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, WorksForNativeArrayAsTuple) { 433413481Sgiacomo.travaglini@arm.com const int a1[] = {1, 2, 3}; 433513481Sgiacomo.travaglini@arm.com const int a2[] = {1, 2, 3}; 433613481Sgiacomo.travaglini@arm.com const int b[] = {1, 2, 3, 4}; 433713481Sgiacomo.travaglini@arm.com 433813481Sgiacomo.travaglini@arm.com const int* const p1 = a1; 433913481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(p1, 3), ContainerEq(a2)); 434013481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(b))); 434113481Sgiacomo.travaglini@arm.com 434213481Sgiacomo.travaglini@arm.com const int c[] = {1, 3, 2}; 434313481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(p1, 3), Not(ContainerEq(c))); 434413481Sgiacomo.travaglini@arm.com} 434513481Sgiacomo.travaglini@arm.com 434613481Sgiacomo.travaglini@arm.comTEST(ContainerEqExtraTest, CopiesNativeArrayParameter) { 434713481Sgiacomo.travaglini@arm.com std::string a1[][3] = { 434813481Sgiacomo.travaglini@arm.com {"hi", "hello", "ciao"}, 434913481Sgiacomo.travaglini@arm.com {"bye", "see you", "ciao"} 435013481Sgiacomo.travaglini@arm.com }; 435113481Sgiacomo.travaglini@arm.com 435213481Sgiacomo.travaglini@arm.com std::string a2[][3] = { 435313481Sgiacomo.travaglini@arm.com {"hi", "hello", "ciao"}, 435413481Sgiacomo.travaglini@arm.com {"bye", "see you", "ciao"} 435513481Sgiacomo.travaglini@arm.com }; 435613481Sgiacomo.travaglini@arm.com 435713481Sgiacomo.travaglini@arm.com const Matcher<const std::string(&)[2][3]> m = ContainerEq(a2); 435813481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, m); 435913481Sgiacomo.travaglini@arm.com 436013481Sgiacomo.travaglini@arm.com a2[0][0] = "ha"; 436113481Sgiacomo.travaglini@arm.com EXPECT_THAT(a1, m); 436213481Sgiacomo.travaglini@arm.com} 436313481Sgiacomo.travaglini@arm.com 436413481Sgiacomo.travaglini@arm.comTEST(WhenSortedByTest, WorksForEmptyContainer) { 436513481Sgiacomo.travaglini@arm.com const vector<int> numbers; 436613481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre())); 436713481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1)))); 436813481Sgiacomo.travaglini@arm.com} 436913481Sgiacomo.travaglini@arm.com 437013481Sgiacomo.travaglini@arm.comTEST(WhenSortedByTest, WorksForNonEmptyContainer) { 437113481Sgiacomo.travaglini@arm.com vector<unsigned> numbers; 437213481Sgiacomo.travaglini@arm.com numbers.push_back(3); 437313481Sgiacomo.travaglini@arm.com numbers.push_back(1); 437413481Sgiacomo.travaglini@arm.com numbers.push_back(2); 437513481Sgiacomo.travaglini@arm.com numbers.push_back(2); 437613481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, WhenSortedBy(greater<unsigned>(), 437713481Sgiacomo.travaglini@arm.com ElementsAre(3, 2, 2, 1))); 437813481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, Not(WhenSortedBy(greater<unsigned>(), 437913481Sgiacomo.travaglini@arm.com ElementsAre(1, 2, 2, 3)))); 438013481Sgiacomo.travaglini@arm.com} 438113481Sgiacomo.travaglini@arm.com 438213481Sgiacomo.travaglini@arm.comTEST(WhenSortedByTest, WorksForNonVectorContainer) { 438313481Sgiacomo.travaglini@arm.com list<string> words; 438413481Sgiacomo.travaglini@arm.com words.push_back("say"); 438513481Sgiacomo.travaglini@arm.com words.push_back("hello"); 438613481Sgiacomo.travaglini@arm.com words.push_back("world"); 438713481Sgiacomo.travaglini@arm.com EXPECT_THAT(words, WhenSortedBy(less<string>(), 438813481Sgiacomo.travaglini@arm.com ElementsAre("hello", "say", "world"))); 438913481Sgiacomo.travaglini@arm.com EXPECT_THAT(words, Not(WhenSortedBy(less<string>(), 439013481Sgiacomo.travaglini@arm.com ElementsAre("say", "hello", "world")))); 439113481Sgiacomo.travaglini@arm.com} 439213481Sgiacomo.travaglini@arm.com 439313481Sgiacomo.travaglini@arm.comTEST(WhenSortedByTest, WorksForNativeArray) { 439413481Sgiacomo.travaglini@arm.com const int numbers[] = {1, 3, 2, 4}; 439513481Sgiacomo.travaglini@arm.com const int sorted_numbers[] = {1, 2, 3, 4}; 439613481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, WhenSortedBy(less<int>(), ElementsAre(1, 2, 3, 4))); 439713481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, WhenSortedBy(less<int>(), 439813481Sgiacomo.travaglini@arm.com ElementsAreArray(sorted_numbers))); 439913481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, Not(WhenSortedBy(less<int>(), ElementsAre(1, 3, 2, 4)))); 440013481Sgiacomo.travaglini@arm.com} 440113481Sgiacomo.travaglini@arm.com 440213481Sgiacomo.travaglini@arm.comTEST(WhenSortedByTest, CanDescribeSelf) { 440313481Sgiacomo.travaglini@arm.com const Matcher<vector<int> > m = WhenSortedBy(less<int>(), ElementsAre(1, 2)); 440413481Sgiacomo.travaglini@arm.com EXPECT_EQ("(when sorted) has 2 elements where\n" 440513481Sgiacomo.travaglini@arm.com "element #0 is equal to 1,\n" 440613481Sgiacomo.travaglini@arm.com "element #1 is equal to 2", 440713481Sgiacomo.travaglini@arm.com Describe(m)); 440813481Sgiacomo.travaglini@arm.com EXPECT_EQ("(when sorted) doesn't have 2 elements, or\n" 440913481Sgiacomo.travaglini@arm.com "element #0 isn't equal to 1, or\n" 441013481Sgiacomo.travaglini@arm.com "element #1 isn't equal to 2", 441113481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 441213481Sgiacomo.travaglini@arm.com} 441313481Sgiacomo.travaglini@arm.com 441413481Sgiacomo.travaglini@arm.comTEST(WhenSortedByTest, ExplainsMatchResult) { 441513481Sgiacomo.travaglini@arm.com const int a[] = {2, 1}; 441613481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is { 1, 2 } when sorted, whose element #0 doesn't match", 441713481Sgiacomo.travaglini@arm.com Explain(WhenSortedBy(less<int>(), ElementsAre(2, 3)), a)); 441813481Sgiacomo.travaglini@arm.com EXPECT_EQ("which is { 1, 2 } when sorted", 441913481Sgiacomo.travaglini@arm.com Explain(WhenSortedBy(less<int>(), ElementsAre(1, 2)), a)); 442013481Sgiacomo.travaglini@arm.com} 442113481Sgiacomo.travaglini@arm.com 442213481Sgiacomo.travaglini@arm.com// WhenSorted() is a simple wrapper on WhenSortedBy(). Hence we don't 442313481Sgiacomo.travaglini@arm.com// need to test it as exhaustively as we test the latter. 442413481Sgiacomo.travaglini@arm.com 442513481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForEmptyContainer) { 442613481Sgiacomo.travaglini@arm.com const vector<int> numbers; 442713481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, WhenSorted(ElementsAre())); 442813481Sgiacomo.travaglini@arm.com EXPECT_THAT(numbers, Not(WhenSorted(ElementsAre(1)))); 442913481Sgiacomo.travaglini@arm.com} 443013481Sgiacomo.travaglini@arm.com 443113481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForNonEmptyContainer) { 443213481Sgiacomo.travaglini@arm.com list<string> words; 443313481Sgiacomo.travaglini@arm.com words.push_back("3"); 443413481Sgiacomo.travaglini@arm.com words.push_back("1"); 443513481Sgiacomo.travaglini@arm.com words.push_back("2"); 443613481Sgiacomo.travaglini@arm.com words.push_back("2"); 443713481Sgiacomo.travaglini@arm.com EXPECT_THAT(words, WhenSorted(ElementsAre("1", "2", "2", "3"))); 443813481Sgiacomo.travaglini@arm.com EXPECT_THAT(words, Not(WhenSorted(ElementsAre("3", "1", "2", "2")))); 443913481Sgiacomo.travaglini@arm.com} 444013481Sgiacomo.travaglini@arm.com 444113481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForMapTypes) { 444213481Sgiacomo.travaglini@arm.com map<string, int> word_counts; 444313481Sgiacomo.travaglini@arm.com word_counts["and"] = 1; 444413481Sgiacomo.travaglini@arm.com word_counts["the"] = 1; 444513481Sgiacomo.travaglini@arm.com word_counts["buffalo"] = 2; 444613481Sgiacomo.travaglini@arm.com EXPECT_THAT(word_counts, WhenSorted(ElementsAre( 444713481Sgiacomo.travaglini@arm.com Pair("and", 1), Pair("buffalo", 2), Pair("the", 1)))); 444813481Sgiacomo.travaglini@arm.com EXPECT_THAT(word_counts, Not(WhenSorted(ElementsAre( 444913481Sgiacomo.travaglini@arm.com Pair("and", 1), Pair("the", 1), Pair("buffalo", 2))))); 445013481Sgiacomo.travaglini@arm.com} 445113481Sgiacomo.travaglini@arm.com 445213481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForMultiMapTypes) { 445313481Sgiacomo.travaglini@arm.com multimap<int, int> ifib; 445413481Sgiacomo.travaglini@arm.com ifib.insert(make_pair(8, 6)); 445513481Sgiacomo.travaglini@arm.com ifib.insert(make_pair(2, 3)); 445613481Sgiacomo.travaglini@arm.com ifib.insert(make_pair(1, 1)); 445713481Sgiacomo.travaglini@arm.com ifib.insert(make_pair(3, 4)); 445813481Sgiacomo.travaglini@arm.com ifib.insert(make_pair(1, 2)); 445913481Sgiacomo.travaglini@arm.com ifib.insert(make_pair(5, 5)); 446013481Sgiacomo.travaglini@arm.com EXPECT_THAT(ifib, WhenSorted(ElementsAre(Pair(1, 1), 446113481Sgiacomo.travaglini@arm.com Pair(1, 2), 446213481Sgiacomo.travaglini@arm.com Pair(2, 3), 446313481Sgiacomo.travaglini@arm.com Pair(3, 4), 446413481Sgiacomo.travaglini@arm.com Pair(5, 5), 446513481Sgiacomo.travaglini@arm.com Pair(8, 6)))); 446613481Sgiacomo.travaglini@arm.com EXPECT_THAT(ifib, Not(WhenSorted(ElementsAre(Pair(8, 6), 446713481Sgiacomo.travaglini@arm.com Pair(2, 3), 446813481Sgiacomo.travaglini@arm.com Pair(1, 1), 446913481Sgiacomo.travaglini@arm.com Pair(3, 4), 447013481Sgiacomo.travaglini@arm.com Pair(1, 2), 447113481Sgiacomo.travaglini@arm.com Pair(5, 5))))); 447213481Sgiacomo.travaglini@arm.com} 447313481Sgiacomo.travaglini@arm.com 447413481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForPolymorphicMatcher) { 447513481Sgiacomo.travaglini@arm.com std::deque<int> d; 447613481Sgiacomo.travaglini@arm.com d.push_back(2); 447713481Sgiacomo.travaglini@arm.com d.push_back(1); 447813481Sgiacomo.travaglini@arm.com EXPECT_THAT(d, WhenSorted(ElementsAre(1, 2))); 447913481Sgiacomo.travaglini@arm.com EXPECT_THAT(d, Not(WhenSorted(ElementsAre(2, 1)))); 448013481Sgiacomo.travaglini@arm.com} 448113481Sgiacomo.travaglini@arm.com 448213481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForVectorConstRefMatcher) { 448313481Sgiacomo.travaglini@arm.com std::deque<int> d; 448413481Sgiacomo.travaglini@arm.com d.push_back(2); 448513481Sgiacomo.travaglini@arm.com d.push_back(1); 448613481Sgiacomo.travaglini@arm.com Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2); 448713481Sgiacomo.travaglini@arm.com EXPECT_THAT(d, WhenSorted(vector_match)); 448813481Sgiacomo.travaglini@arm.com Matcher<const std::vector<int>&> not_vector_match = ElementsAre(2, 1); 448913481Sgiacomo.travaglini@arm.com EXPECT_THAT(d, Not(WhenSorted(not_vector_match))); 449013481Sgiacomo.travaglini@arm.com} 449113481Sgiacomo.travaglini@arm.com 449213481Sgiacomo.travaglini@arm.com// Deliberately bare pseudo-container. 449313481Sgiacomo.travaglini@arm.com// Offers only begin() and end() accessors, yielding InputIterator. 449413481Sgiacomo.travaglini@arm.comtemplate <typename T> 449513481Sgiacomo.travaglini@arm.comclass Streamlike { 449613481Sgiacomo.travaglini@arm.com private: 449713481Sgiacomo.travaglini@arm.com class ConstIter; 449813481Sgiacomo.travaglini@arm.com public: 449913481Sgiacomo.travaglini@arm.com typedef ConstIter const_iterator; 450013481Sgiacomo.travaglini@arm.com typedef T value_type; 450113481Sgiacomo.travaglini@arm.com 450213481Sgiacomo.travaglini@arm.com template <typename InIter> 450313481Sgiacomo.travaglini@arm.com Streamlike(InIter first, InIter last) : remainder_(first, last) {} 450413481Sgiacomo.travaglini@arm.com 450513481Sgiacomo.travaglini@arm.com const_iterator begin() const { 450613481Sgiacomo.travaglini@arm.com return const_iterator(this, remainder_.begin()); 450713481Sgiacomo.travaglini@arm.com } 450813481Sgiacomo.travaglini@arm.com const_iterator end() const { 450913481Sgiacomo.travaglini@arm.com return const_iterator(this, remainder_.end()); 451013481Sgiacomo.travaglini@arm.com } 451113481Sgiacomo.travaglini@arm.com 451213481Sgiacomo.travaglini@arm.com private: 451313481Sgiacomo.travaglini@arm.com class ConstIter : public std::iterator<std::input_iterator_tag, 451413481Sgiacomo.travaglini@arm.com value_type, 451513481Sgiacomo.travaglini@arm.com ptrdiff_t, 451613481Sgiacomo.travaglini@arm.com const value_type*, 451713481Sgiacomo.travaglini@arm.com const value_type&> { 451813481Sgiacomo.travaglini@arm.com public: 451913481Sgiacomo.travaglini@arm.com ConstIter(const Streamlike* s, 452013481Sgiacomo.travaglini@arm.com typename std::list<value_type>::iterator pos) 452113481Sgiacomo.travaglini@arm.com : s_(s), pos_(pos) {} 452213481Sgiacomo.travaglini@arm.com 452313481Sgiacomo.travaglini@arm.com const value_type& operator*() const { return *pos_; } 452413481Sgiacomo.travaglini@arm.com const value_type* operator->() const { return &*pos_; } 452513481Sgiacomo.travaglini@arm.com ConstIter& operator++() { 452613481Sgiacomo.travaglini@arm.com s_->remainder_.erase(pos_++); 452713481Sgiacomo.travaglini@arm.com return *this; 452813481Sgiacomo.travaglini@arm.com } 452913481Sgiacomo.travaglini@arm.com 453013481Sgiacomo.travaglini@arm.com // *iter++ is required to work (see std::istreambuf_iterator). 453113481Sgiacomo.travaglini@arm.com // (void)iter++ is also required to work. 453213481Sgiacomo.travaglini@arm.com class PostIncrProxy { 453313481Sgiacomo.travaglini@arm.com public: 453413481Sgiacomo.travaglini@arm.com explicit PostIncrProxy(const value_type& value) : value_(value) {} 453513481Sgiacomo.travaglini@arm.com value_type operator*() const { return value_; } 453613481Sgiacomo.travaglini@arm.com private: 453713481Sgiacomo.travaglini@arm.com value_type value_; 453813481Sgiacomo.travaglini@arm.com }; 453913481Sgiacomo.travaglini@arm.com PostIncrProxy operator++(int) { 454013481Sgiacomo.travaglini@arm.com PostIncrProxy proxy(**this); 454113481Sgiacomo.travaglini@arm.com ++(*this); 454213481Sgiacomo.travaglini@arm.com return proxy; 454313481Sgiacomo.travaglini@arm.com } 454413481Sgiacomo.travaglini@arm.com 454513481Sgiacomo.travaglini@arm.com friend bool operator==(const ConstIter& a, const ConstIter& b) { 454613481Sgiacomo.travaglini@arm.com return a.s_ == b.s_ && a.pos_ == b.pos_; 454713481Sgiacomo.travaglini@arm.com } 454813481Sgiacomo.travaglini@arm.com friend bool operator!=(const ConstIter& a, const ConstIter& b) { 454913481Sgiacomo.travaglini@arm.com return !(a == b); 455013481Sgiacomo.travaglini@arm.com } 455113481Sgiacomo.travaglini@arm.com 455213481Sgiacomo.travaglini@arm.com private: 455313481Sgiacomo.travaglini@arm.com const Streamlike* s_; 455413481Sgiacomo.travaglini@arm.com typename std::list<value_type>::iterator pos_; 455513481Sgiacomo.travaglini@arm.com }; 455613481Sgiacomo.travaglini@arm.com 455713481Sgiacomo.travaglini@arm.com friend std::ostream& operator<<(std::ostream& os, const Streamlike& s) { 455813481Sgiacomo.travaglini@arm.com os << "["; 455913481Sgiacomo.travaglini@arm.com typedef typename std::list<value_type>::const_iterator Iter; 456013481Sgiacomo.travaglini@arm.com const char* sep = ""; 456113481Sgiacomo.travaglini@arm.com for (Iter it = s.remainder_.begin(); it != s.remainder_.end(); ++it) { 456213481Sgiacomo.travaglini@arm.com os << sep << *it; 456313481Sgiacomo.travaglini@arm.com sep = ","; 456413481Sgiacomo.travaglini@arm.com } 456513481Sgiacomo.travaglini@arm.com os << "]"; 456613481Sgiacomo.travaglini@arm.com return os; 456713481Sgiacomo.travaglini@arm.com } 456813481Sgiacomo.travaglini@arm.com 456913481Sgiacomo.travaglini@arm.com mutable std::list<value_type> remainder_; // modified by iteration 457013481Sgiacomo.travaglini@arm.com}; 457113481Sgiacomo.travaglini@arm.com 457213481Sgiacomo.travaglini@arm.comTEST(StreamlikeTest, Iteration) { 457313481Sgiacomo.travaglini@arm.com const int a[5] = {2, 1, 4, 5, 3}; 457413481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + 5); 457513481Sgiacomo.travaglini@arm.com Streamlike<int>::const_iterator it = s.begin(); 457613481Sgiacomo.travaglini@arm.com const int* ip = a; 457713481Sgiacomo.travaglini@arm.com while (it != s.end()) { 457813481Sgiacomo.travaglini@arm.com SCOPED_TRACE(ip - a); 457913481Sgiacomo.travaglini@arm.com EXPECT_EQ(*ip++, *it++); 458013481Sgiacomo.travaglini@arm.com } 458113481Sgiacomo.travaglini@arm.com} 458213481Sgiacomo.travaglini@arm.com 458313481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FORWARD_LIST_ 458413481Sgiacomo.travaglini@arm.comTEST(BeginEndDistanceIsTest, WorksWithForwardList) { 458513481Sgiacomo.travaglini@arm.com std::forward_list<int> container; 458613481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, BeginEndDistanceIs(0)); 458713481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(BeginEndDistanceIs(1))); 458813481Sgiacomo.travaglini@arm.com container.push_front(0); 458913481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(BeginEndDistanceIs(0))); 459013481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, BeginEndDistanceIs(1)); 459113481Sgiacomo.travaglini@arm.com container.push_front(0); 459213481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, Not(BeginEndDistanceIs(0))); 459313481Sgiacomo.travaglini@arm.com EXPECT_THAT(container, BeginEndDistanceIs(2)); 459413481Sgiacomo.travaglini@arm.com} 459513481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_FORWARD_LIST_ 459613481Sgiacomo.travaglini@arm.com 459713481Sgiacomo.travaglini@arm.comTEST(BeginEndDistanceIsTest, WorksWithNonStdList) { 459813481Sgiacomo.travaglini@arm.com const int a[5] = {1, 2, 3, 4, 5}; 459913481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + 5); 460013481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, BeginEndDistanceIs(5)); 460113481Sgiacomo.travaglini@arm.com} 460213481Sgiacomo.travaglini@arm.com 460313481Sgiacomo.travaglini@arm.comTEST(BeginEndDistanceIsTest, CanDescribeSelf) { 460413481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = BeginEndDistanceIs(2); 460513481Sgiacomo.travaglini@arm.com EXPECT_EQ("distance between begin() and end() is equal to 2", Describe(m)); 460613481Sgiacomo.travaglini@arm.com EXPECT_EQ("distance between begin() and end() isn't equal to 2", 460713481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 460813481Sgiacomo.travaglini@arm.com} 460913481Sgiacomo.travaglini@arm.com 461013481Sgiacomo.travaglini@arm.comTEST(BeginEndDistanceIsTest, ExplainsResult) { 461113481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m1 = BeginEndDistanceIs(2); 461213481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m2 = BeginEndDistanceIs(Lt(2)); 461313481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m3 = BeginEndDistanceIs(AnyOf(0, 3)); 461413481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m4 = BeginEndDistanceIs(GreaterThan(1)); 461513481Sgiacomo.travaglini@arm.com vector<int> container; 461613481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose distance between begin() and end() 0 doesn't match", 461713481Sgiacomo.travaglini@arm.com Explain(m1, container)); 461813481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose distance between begin() and end() 0 matches", 461913481Sgiacomo.travaglini@arm.com Explain(m2, container)); 462013481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose distance between begin() and end() 0 matches", 462113481Sgiacomo.travaglini@arm.com Explain(m3, container)); 462213481Sgiacomo.travaglini@arm.com EXPECT_EQ( 462313481Sgiacomo.travaglini@arm.com "whose distance between begin() and end() 0 doesn't match, which is 1 " 462413481Sgiacomo.travaglini@arm.com "less than 1", 462513481Sgiacomo.travaglini@arm.com Explain(m4, container)); 462613481Sgiacomo.travaglini@arm.com container.push_back(0); 462713481Sgiacomo.travaglini@arm.com container.push_back(0); 462813481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose distance between begin() and end() 2 matches", 462913481Sgiacomo.travaglini@arm.com Explain(m1, container)); 463013481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose distance between begin() and end() 2 doesn't match", 463113481Sgiacomo.travaglini@arm.com Explain(m2, container)); 463213481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose distance between begin() and end() 2 doesn't match", 463313481Sgiacomo.travaglini@arm.com Explain(m3, container)); 463413481Sgiacomo.travaglini@arm.com EXPECT_EQ( 463513481Sgiacomo.travaglini@arm.com "whose distance between begin() and end() 2 matches, which is 1 more " 463613481Sgiacomo.travaglini@arm.com "than 1", 463713481Sgiacomo.travaglini@arm.com Explain(m4, container)); 463813481Sgiacomo.travaglini@arm.com} 463913481Sgiacomo.travaglini@arm.com 464013481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForStreamlike) { 464113481Sgiacomo.travaglini@arm.com // Streamlike 'container' provides only minimal iterator support. 464213481Sgiacomo.travaglini@arm.com // Its iterators are tagged with input_iterator_tag. 464313481Sgiacomo.travaglini@arm.com const int a[5] = {2, 1, 4, 5, 3}; 464413481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 464513481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, WhenSorted(ElementsAre(1, 2, 3, 4, 5))); 464613481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3)))); 464713481Sgiacomo.travaglini@arm.com} 464813481Sgiacomo.travaglini@arm.com 464913481Sgiacomo.travaglini@arm.comTEST(WhenSortedTest, WorksForVectorConstRefMatcherOnStreamlike) { 465013481Sgiacomo.travaglini@arm.com const int a[] = {2, 1, 4, 5, 3}; 465113481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 465213481Sgiacomo.travaglini@arm.com Matcher<const std::vector<int>&> vector_match = ElementsAre(1, 2, 3, 4, 5); 465313481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, WhenSorted(vector_match)); 465413481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, Not(WhenSorted(ElementsAre(2, 1, 4, 5, 3)))); 465513481Sgiacomo.travaglini@arm.com} 465613481Sgiacomo.travaglini@arm.com 465713481Sgiacomo.travaglini@arm.com// Tests using ElementsAre() and ElementsAreArray() with stream-like 465813481Sgiacomo.travaglini@arm.com// "containers". 465913481Sgiacomo.travaglini@arm.com 466013481Sgiacomo.travaglini@arm.comTEST(ElemensAreStreamTest, WorksForStreamlike) { 466113481Sgiacomo.travaglini@arm.com const int a[5] = {1, 2, 3, 4, 5}; 466213481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 466313481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, ElementsAre(1, 2, 3, 4, 5)); 466413481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, Not(ElementsAre(2, 1, 4, 5, 3))); 466513481Sgiacomo.travaglini@arm.com} 466613481Sgiacomo.travaglini@arm.com 466713481Sgiacomo.travaglini@arm.comTEST(ElemensAreArrayStreamTest, WorksForStreamlike) { 466813481Sgiacomo.travaglini@arm.com const int a[5] = {1, 2, 3, 4, 5}; 466913481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 467013481Sgiacomo.travaglini@arm.com 467113481Sgiacomo.travaglini@arm.com vector<int> expected; 467213481Sgiacomo.travaglini@arm.com expected.push_back(1); 467313481Sgiacomo.travaglini@arm.com expected.push_back(2); 467413481Sgiacomo.travaglini@arm.com expected.push_back(3); 467513481Sgiacomo.travaglini@arm.com expected.push_back(4); 467613481Sgiacomo.travaglini@arm.com expected.push_back(5); 467713481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, ElementsAreArray(expected)); 467813481Sgiacomo.travaglini@arm.com 467913481Sgiacomo.travaglini@arm.com expected[3] = 0; 468013481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, Not(ElementsAreArray(expected))); 468113481Sgiacomo.travaglini@arm.com} 468213481Sgiacomo.travaglini@arm.com 468313481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, WorksWithUncopyable) { 468413481Sgiacomo.travaglini@arm.com Uncopyable objs[2]; 468513481Sgiacomo.travaglini@arm.com objs[0].set_value(-3); 468613481Sgiacomo.travaglini@arm.com objs[1].set_value(1); 468713481Sgiacomo.travaglini@arm.com EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive))); 468813481Sgiacomo.travaglini@arm.com} 468913481Sgiacomo.travaglini@arm.com 469013481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, TakesStlContainer) { 469113481Sgiacomo.travaglini@arm.com const int actual[] = {3, 1, 2}; 469213481Sgiacomo.travaglini@arm.com 469313481Sgiacomo.travaglini@arm.com ::std::list<int> expected; 469413481Sgiacomo.travaglini@arm.com expected.push_back(3); 469513481Sgiacomo.travaglini@arm.com expected.push_back(1); 469613481Sgiacomo.travaglini@arm.com expected.push_back(2); 469713481Sgiacomo.travaglini@arm.com EXPECT_THAT(actual, ElementsAreArray(expected)); 469813481Sgiacomo.travaglini@arm.com 469913481Sgiacomo.travaglini@arm.com expected.push_back(4); 470013481Sgiacomo.travaglini@arm.com EXPECT_THAT(actual, Not(ElementsAreArray(expected))); 470113481Sgiacomo.travaglini@arm.com} 470213481Sgiacomo.travaglini@arm.com 470313481Sgiacomo.travaglini@arm.com// Tests for UnorderedElementsAreArray() 470413481Sgiacomo.travaglini@arm.com 470513481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) { 470613481Sgiacomo.travaglini@arm.com const int a[] = {0, 1, 2, 3, 4}; 470713481Sgiacomo.travaglini@arm.com std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 470813481Sgiacomo.travaglini@arm.com do { 470913481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 471013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(a), 471113481Sgiacomo.travaglini@arm.com s, &listener)) << listener.str(); 471213481Sgiacomo.travaglini@arm.com } while (std::next_permutation(s.begin(), s.end())); 471313481Sgiacomo.travaglini@arm.com} 471413481Sgiacomo.travaglini@arm.com 471513481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, VectorBool) { 471613481Sgiacomo.travaglini@arm.com const bool a[] = {0, 1, 0, 1, 1}; 471713481Sgiacomo.travaglini@arm.com const bool b[] = {1, 0, 1, 1, 0}; 471813481Sgiacomo.travaglini@arm.com std::vector<bool> expected(a, a + GTEST_ARRAY_SIZE_(a)); 471913481Sgiacomo.travaglini@arm.com std::vector<bool> actual(b, b + GTEST_ARRAY_SIZE_(b)); 472013481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 472113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(expected), 472213481Sgiacomo.travaglini@arm.com actual, &listener)) << listener.str(); 472313481Sgiacomo.travaglini@arm.com} 472413481Sgiacomo.travaglini@arm.com 472513481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, WorksForStreamlike) { 472613481Sgiacomo.travaglini@arm.com // Streamlike 'container' provides only minimal iterator support. 472713481Sgiacomo.travaglini@arm.com // Its iterators are tagged with input_iterator_tag, and it has no 472813481Sgiacomo.travaglini@arm.com // size() or empty() methods. 472913481Sgiacomo.travaglini@arm.com const int a[5] = {2, 1, 4, 5, 3}; 473013481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 473113481Sgiacomo.travaglini@arm.com 473213481Sgiacomo.travaglini@arm.com ::std::vector<int> expected; 473313481Sgiacomo.travaglini@arm.com expected.push_back(1); 473413481Sgiacomo.travaglini@arm.com expected.push_back(2); 473513481Sgiacomo.travaglini@arm.com expected.push_back(3); 473613481Sgiacomo.travaglini@arm.com expected.push_back(4); 473713481Sgiacomo.travaglini@arm.com expected.push_back(5); 473813481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, UnorderedElementsAreArray(expected)); 473913481Sgiacomo.travaglini@arm.com 474013481Sgiacomo.travaglini@arm.com expected.push_back(6); 474113481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, Not(UnorderedElementsAreArray(expected))); 474213481Sgiacomo.travaglini@arm.com} 474313481Sgiacomo.travaglini@arm.com 474413481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, TakesStlContainer) { 474513481Sgiacomo.travaglini@arm.com const int actual[] = {3, 1, 2}; 474613481Sgiacomo.travaglini@arm.com 474713481Sgiacomo.travaglini@arm.com ::std::list<int> expected; 474813481Sgiacomo.travaglini@arm.com expected.push_back(1); 474913481Sgiacomo.travaglini@arm.com expected.push_back(2); 475013481Sgiacomo.travaglini@arm.com expected.push_back(3); 475113481Sgiacomo.travaglini@arm.com EXPECT_THAT(actual, UnorderedElementsAreArray(expected)); 475213481Sgiacomo.travaglini@arm.com 475313481Sgiacomo.travaglini@arm.com expected.push_back(4); 475413481Sgiacomo.travaglini@arm.com EXPECT_THAT(actual, Not(UnorderedElementsAreArray(expected))); 475513481Sgiacomo.travaglini@arm.com} 475613481Sgiacomo.travaglini@arm.com 475713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_INITIALIZER_LIST_ 475813481Sgiacomo.travaglini@arm.com 475913481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, TakesInitializerList) { 476013481Sgiacomo.travaglini@arm.com const int a[5] = {2, 1, 4, 5, 3}; 476113481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, UnorderedElementsAreArray({1, 2, 3, 4, 5})); 476213481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(UnorderedElementsAreArray({1, 2, 3, 4, 6}))); 476313481Sgiacomo.travaglini@arm.com} 476413481Sgiacomo.travaglini@arm.com 476513481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfCStrings) { 476613481Sgiacomo.travaglini@arm.com const string a[5] = {"a", "b", "c", "d", "e"}; 476713481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, UnorderedElementsAreArray({"a", "b", "c", "d", "e"})); 476813481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(UnorderedElementsAreArray({"a", "b", "c", "d", "ef"}))); 476913481Sgiacomo.travaglini@arm.com} 477013481Sgiacomo.travaglini@arm.com 477113481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) { 477213481Sgiacomo.travaglini@arm.com const int a[5] = {2, 1, 4, 5, 3}; 477313481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, UnorderedElementsAreArray( 477413481Sgiacomo.travaglini@arm.com {Eq(1), Eq(2), Eq(3), Eq(4), Eq(5)})); 477513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(UnorderedElementsAreArray( 477613481Sgiacomo.travaglini@arm.com {Eq(1), Eq(2), Eq(3), Eq(4), Eq(6)}))); 477713481Sgiacomo.travaglini@arm.com} 477813481Sgiacomo.travaglini@arm.com 477913481Sgiacomo.travaglini@arm.comTEST(UnorderedElementsAreArrayTest, 478013481Sgiacomo.travaglini@arm.com TakesInitializerListOfDifferentTypedMatchers) { 478113481Sgiacomo.travaglini@arm.com const int a[5] = {2, 1, 4, 5, 3}; 478213481Sgiacomo.travaglini@arm.com // The compiler cannot infer the type of the initializer list if its 478313481Sgiacomo.travaglini@arm.com // elements have different types. We must explicitly specify the 478413481Sgiacomo.travaglini@arm.com // unified element type in this case. 478513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, UnorderedElementsAreArray<Matcher<int> >( 478613481Sgiacomo.travaglini@arm.com {Eq(1), Ne(-2), Ge(3), Le(4), Eq(5)})); 478713481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(UnorderedElementsAreArray<Matcher<int> >( 478813481Sgiacomo.travaglini@arm.com {Eq(1), Ne(-2), Ge(3), Le(4), Eq(6)}))); 478913481Sgiacomo.travaglini@arm.com} 479013481Sgiacomo.travaglini@arm.com 479113481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_INITIALIZER_LIST_ 479213481Sgiacomo.travaglini@arm.com 479313481Sgiacomo.travaglini@arm.comclass UnorderedElementsAreTest : public testing::Test { 479413481Sgiacomo.travaglini@arm.com protected: 479513481Sgiacomo.travaglini@arm.com typedef std::vector<int> IntVec; 479613481Sgiacomo.travaglini@arm.com}; 479713481Sgiacomo.travaglini@arm.com 479813481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, WorksWithUncopyable) { 479913481Sgiacomo.travaglini@arm.com Uncopyable objs[2]; 480013481Sgiacomo.travaglini@arm.com objs[0].set_value(-3); 480113481Sgiacomo.travaglini@arm.com objs[1].set_value(1); 480213481Sgiacomo.travaglini@arm.com EXPECT_THAT(objs, 480313481Sgiacomo.travaglini@arm.com UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3))); 480413481Sgiacomo.travaglini@arm.com} 480513481Sgiacomo.travaglini@arm.com 480613481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) { 480713481Sgiacomo.travaglini@arm.com const int a[] = {1, 2, 3}; 480813481Sgiacomo.travaglini@arm.com std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 480913481Sgiacomo.travaglini@arm.com do { 481013481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 481113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), 481213481Sgiacomo.travaglini@arm.com s, &listener)) << listener.str(); 481313481Sgiacomo.travaglini@arm.com } while (std::next_permutation(s.begin(), s.end())); 481413481Sgiacomo.travaglini@arm.com} 481513481Sgiacomo.travaglini@arm.com 481613481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, FailsWhenAnElementMatchesNoMatcher) { 481713481Sgiacomo.travaglini@arm.com const int a[] = {1, 2, 3}; 481813481Sgiacomo.travaglini@arm.com std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 481913481Sgiacomo.travaglini@arm.com std::vector<Matcher<int> > mv; 482013481Sgiacomo.travaglini@arm.com mv.push_back(1); 482113481Sgiacomo.travaglini@arm.com mv.push_back(2); 482213481Sgiacomo.travaglini@arm.com mv.push_back(2); 482313481Sgiacomo.travaglini@arm.com // The element with value '3' matches nothing: fail fast. 482413481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 482513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAreArray(mv), 482613481Sgiacomo.travaglini@arm.com s, &listener)) << listener.str(); 482713481Sgiacomo.travaglini@arm.com} 482813481Sgiacomo.travaglini@arm.com 482913481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, WorksForStreamlike) { 483013481Sgiacomo.travaglini@arm.com // Streamlike 'container' provides only minimal iterator support. 483113481Sgiacomo.travaglini@arm.com // Its iterators are tagged with input_iterator_tag, and it has no 483213481Sgiacomo.travaglini@arm.com // size() or empty() methods. 483313481Sgiacomo.travaglini@arm.com const int a[5] = {2, 1, 4, 5, 3}; 483413481Sgiacomo.travaglini@arm.com Streamlike<int> s(a, a + GTEST_ARRAY_SIZE_(a)); 483513481Sgiacomo.travaglini@arm.com 483613481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5)); 483713481Sgiacomo.travaglini@arm.com EXPECT_THAT(s, Not(UnorderedElementsAre(2, 2, 3, 4, 5))); 483813481Sgiacomo.travaglini@arm.com} 483913481Sgiacomo.travaglini@arm.com 484013481Sgiacomo.travaglini@arm.com// One naive implementation of the matcher runs in O(N!) time, which is too 484113481Sgiacomo.travaglini@arm.com// slow for many real-world inputs. This test shows that our matcher can match 484213481Sgiacomo.travaglini@arm.com// 100 inputs very quickly (a few milliseconds). An O(100!) is 10^158 484313481Sgiacomo.travaglini@arm.com// iterations and obviously effectively incomputable. 484413481Sgiacomo.travaglini@arm.com// [ RUN ] UnorderedElementsAreTest.Performance 484513481Sgiacomo.travaglini@arm.com// [ OK ] UnorderedElementsAreTest.Performance (4 ms) 484613481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, Performance) { 484713481Sgiacomo.travaglini@arm.com std::vector<int> s; 484813481Sgiacomo.travaglini@arm.com std::vector<Matcher<int> > mv; 484913481Sgiacomo.travaglini@arm.com for (int i = 0; i < 100; ++i) { 485013481Sgiacomo.travaglini@arm.com s.push_back(i); 485113481Sgiacomo.travaglini@arm.com mv.push_back(_); 485213481Sgiacomo.travaglini@arm.com } 485313481Sgiacomo.travaglini@arm.com mv[50] = Eq(0); 485413481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 485513481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv), 485613481Sgiacomo.travaglini@arm.com s, &listener)) << listener.str(); 485713481Sgiacomo.travaglini@arm.com} 485813481Sgiacomo.travaglini@arm.com 485913481Sgiacomo.travaglini@arm.com// Another variant of 'Performance' with similar expectations. 486013481Sgiacomo.travaglini@arm.com// [ RUN ] UnorderedElementsAreTest.PerformanceHalfStrict 486113481Sgiacomo.travaglini@arm.com// [ OK ] UnorderedElementsAreTest.PerformanceHalfStrict (4 ms) 486213481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, PerformanceHalfStrict) { 486313481Sgiacomo.travaglini@arm.com std::vector<int> s; 486413481Sgiacomo.travaglini@arm.com std::vector<Matcher<int> > mv; 486513481Sgiacomo.travaglini@arm.com for (int i = 0; i < 100; ++i) { 486613481Sgiacomo.travaglini@arm.com s.push_back(i); 486713481Sgiacomo.travaglini@arm.com if (i & 1) { 486813481Sgiacomo.travaglini@arm.com mv.push_back(_); 486913481Sgiacomo.travaglini@arm.com } else { 487013481Sgiacomo.travaglini@arm.com mv.push_back(i); 487113481Sgiacomo.travaglini@arm.com } 487213481Sgiacomo.travaglini@arm.com } 487313481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 487413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(ExplainMatchResult(UnorderedElementsAreArray(mv), 487513481Sgiacomo.travaglini@arm.com s, &listener)) << listener.str(); 487613481Sgiacomo.travaglini@arm.com} 487713481Sgiacomo.travaglini@arm.com 487813481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, FailMessageCountWrong) { 487913481Sgiacomo.travaglini@arm.com std::vector<int> v; 488013481Sgiacomo.travaglini@arm.com v.push_back(4); 488113481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 488213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), 488313481Sgiacomo.travaglini@arm.com v, &listener)) << listener.str(); 488413481Sgiacomo.travaglini@arm.com EXPECT_THAT(listener.str(), Eq("which has 1 element")); 488513481Sgiacomo.travaglini@arm.com} 488613481Sgiacomo.travaglini@arm.com 488713481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, FailMessageCountWrongZero) { 488813481Sgiacomo.travaglini@arm.com std::vector<int> v; 488913481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 489013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2, 3), 489113481Sgiacomo.travaglini@arm.com v, &listener)) << listener.str(); 489213481Sgiacomo.travaglini@arm.com EXPECT_THAT(listener.str(), Eq("")); 489313481Sgiacomo.travaglini@arm.com} 489413481Sgiacomo.travaglini@arm.com 489513481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatchers) { 489613481Sgiacomo.travaglini@arm.com std::vector<int> v; 489713481Sgiacomo.travaglini@arm.com v.push_back(1); 489813481Sgiacomo.travaglini@arm.com v.push_back(1); 489913481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 490013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2), 490113481Sgiacomo.travaglini@arm.com v, &listener)) << listener.str(); 490213481Sgiacomo.travaglini@arm.com EXPECT_THAT( 490313481Sgiacomo.travaglini@arm.com listener.str(), 490413481Sgiacomo.travaglini@arm.com Eq("where the following matchers don't match any elements:\n" 490513481Sgiacomo.travaglini@arm.com "matcher #1: is equal to 2")); 490613481Sgiacomo.travaglini@arm.com} 490713481Sgiacomo.travaglini@arm.com 490813481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedElements) { 490913481Sgiacomo.travaglini@arm.com std::vector<int> v; 491013481Sgiacomo.travaglini@arm.com v.push_back(1); 491113481Sgiacomo.travaglini@arm.com v.push_back(2); 491213481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 491313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 1), 491413481Sgiacomo.travaglini@arm.com v, &listener)) << listener.str(); 491513481Sgiacomo.travaglini@arm.com EXPECT_THAT( 491613481Sgiacomo.travaglini@arm.com listener.str(), 491713481Sgiacomo.travaglini@arm.com Eq("where the following elements don't match any matchers:\n" 491813481Sgiacomo.travaglini@arm.com "element #1: 2")); 491913481Sgiacomo.travaglini@arm.com} 492013481Sgiacomo.travaglini@arm.com 492113481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, FailMessageUnmatchedMatcherAndElement) { 492213481Sgiacomo.travaglini@arm.com std::vector<int> v; 492313481Sgiacomo.travaglini@arm.com v.push_back(2); 492413481Sgiacomo.travaglini@arm.com v.push_back(3); 492513481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 492613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult(UnorderedElementsAre(1, 2), 492713481Sgiacomo.travaglini@arm.com v, &listener)) << listener.str(); 492813481Sgiacomo.travaglini@arm.com EXPECT_THAT( 492913481Sgiacomo.travaglini@arm.com listener.str(), 493013481Sgiacomo.travaglini@arm.com Eq("where" 493113481Sgiacomo.travaglini@arm.com " the following matchers don't match any elements:\n" 493213481Sgiacomo.travaglini@arm.com "matcher #0: is equal to 1\n" 493313481Sgiacomo.travaglini@arm.com "and" 493413481Sgiacomo.travaglini@arm.com " where" 493513481Sgiacomo.travaglini@arm.com " the following elements don't match any matchers:\n" 493613481Sgiacomo.travaglini@arm.com "element #1: 3")); 493713481Sgiacomo.travaglini@arm.com} 493813481Sgiacomo.travaglini@arm.com 493913481Sgiacomo.travaglini@arm.com// Test helper for formatting element, matcher index pairs in expectations. 494013481Sgiacomo.travaglini@arm.comstatic string EMString(int element, int matcher) { 494113481Sgiacomo.travaglini@arm.com stringstream ss; 494213481Sgiacomo.travaglini@arm.com ss << "(element #" << element << ", matcher #" << matcher << ")"; 494313481Sgiacomo.travaglini@arm.com return ss.str(); 494413481Sgiacomo.travaglini@arm.com} 494513481Sgiacomo.travaglini@arm.com 494613481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, FailMessageImperfectMatchOnly) { 494713481Sgiacomo.travaglini@arm.com // A situation where all elements and matchers have a match 494813481Sgiacomo.travaglini@arm.com // associated with them, but the max matching is not perfect. 494913481Sgiacomo.travaglini@arm.com std::vector<string> v; 495013481Sgiacomo.travaglini@arm.com v.push_back("a"); 495113481Sgiacomo.travaglini@arm.com v.push_back("b"); 495213481Sgiacomo.travaglini@arm.com v.push_back("c"); 495313481Sgiacomo.travaglini@arm.com StringMatchResultListener listener; 495413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(ExplainMatchResult( 495513481Sgiacomo.travaglini@arm.com UnorderedElementsAre("a", "a", AnyOf("b", "c")), v, &listener)) 495613481Sgiacomo.travaglini@arm.com << listener.str(); 495713481Sgiacomo.travaglini@arm.com 495813481Sgiacomo.travaglini@arm.com string prefix = 495913481Sgiacomo.travaglini@arm.com "where no permutation of the elements can satisfy all matchers, " 496013481Sgiacomo.travaglini@arm.com "and the closest match is 2 of 3 matchers with the " 496113481Sgiacomo.travaglini@arm.com "pairings:\n"; 496213481Sgiacomo.travaglini@arm.com 496313481Sgiacomo.travaglini@arm.com // We have to be a bit loose here, because there are 4 valid max matches. 496413481Sgiacomo.travaglini@arm.com EXPECT_THAT( 496513481Sgiacomo.travaglini@arm.com listener.str(), 496613481Sgiacomo.travaglini@arm.com AnyOf(prefix + "{\n " + EMString(0, 0) + 496713481Sgiacomo.travaglini@arm.com ",\n " + EMString(1, 2) + "\n}", 496813481Sgiacomo.travaglini@arm.com prefix + "{\n " + EMString(0, 1) + 496913481Sgiacomo.travaglini@arm.com ",\n " + EMString(1, 2) + "\n}", 497013481Sgiacomo.travaglini@arm.com prefix + "{\n " + EMString(0, 0) + 497113481Sgiacomo.travaglini@arm.com ",\n " + EMString(2, 2) + "\n}", 497213481Sgiacomo.travaglini@arm.com prefix + "{\n " + EMString(0, 1) + 497313481Sgiacomo.travaglini@arm.com ",\n " + EMString(2, 2) + "\n}")); 497413481Sgiacomo.travaglini@arm.com} 497513481Sgiacomo.travaglini@arm.com 497613481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, Describe) { 497713481Sgiacomo.travaglini@arm.com EXPECT_THAT(Describe<IntVec>(UnorderedElementsAre()), 497813481Sgiacomo.travaglini@arm.com Eq("is empty")); 497913481Sgiacomo.travaglini@arm.com EXPECT_THAT( 498013481Sgiacomo.travaglini@arm.com Describe<IntVec>(UnorderedElementsAre(345)), 498113481Sgiacomo.travaglini@arm.com Eq("has 1 element and that element is equal to 345")); 498213481Sgiacomo.travaglini@arm.com EXPECT_THAT( 498313481Sgiacomo.travaglini@arm.com Describe<IntVec>(UnorderedElementsAre(111, 222, 333)), 498413481Sgiacomo.travaglini@arm.com Eq("has 3 elements and there exists some permutation " 498513481Sgiacomo.travaglini@arm.com "of elements such that:\n" 498613481Sgiacomo.travaglini@arm.com " - element #0 is equal to 111, and\n" 498713481Sgiacomo.travaglini@arm.com " - element #1 is equal to 222, and\n" 498813481Sgiacomo.travaglini@arm.com " - element #2 is equal to 333")); 498913481Sgiacomo.travaglini@arm.com} 499013481Sgiacomo.travaglini@arm.com 499113481Sgiacomo.travaglini@arm.comTEST_F(UnorderedElementsAreTest, DescribeNegation) { 499213481Sgiacomo.travaglini@arm.com EXPECT_THAT(DescribeNegation<IntVec>(UnorderedElementsAre()), 499313481Sgiacomo.travaglini@arm.com Eq("isn't empty")); 499413481Sgiacomo.travaglini@arm.com EXPECT_THAT( 499513481Sgiacomo.travaglini@arm.com DescribeNegation<IntVec>(UnorderedElementsAre(345)), 499613481Sgiacomo.travaglini@arm.com Eq("doesn't have 1 element, or has 1 element that isn't equal to 345")); 499713481Sgiacomo.travaglini@arm.com EXPECT_THAT( 499813481Sgiacomo.travaglini@arm.com DescribeNegation<IntVec>(UnorderedElementsAre(123, 234, 345)), 499913481Sgiacomo.travaglini@arm.com Eq("doesn't have 3 elements, or there exists no permutation " 500013481Sgiacomo.travaglini@arm.com "of elements such that:\n" 500113481Sgiacomo.travaglini@arm.com " - element #0 is equal to 123, and\n" 500213481Sgiacomo.travaglini@arm.com " - element #1 is equal to 234, and\n" 500313481Sgiacomo.travaglini@arm.com " - element #2 is equal to 345")); 500413481Sgiacomo.travaglini@arm.com} 500513481Sgiacomo.travaglini@arm.com 500613481Sgiacomo.travaglini@arm.comnamespace { 500713481Sgiacomo.travaglini@arm.com 500813481Sgiacomo.travaglini@arm.com// Used as a check on the more complex max flow method used in the 500913481Sgiacomo.travaglini@arm.com// real testing::internal::FindMaxBipartiteMatching. This method is 501013481Sgiacomo.travaglini@arm.com// compatible but runs in worst-case factorial time, so we only 501113481Sgiacomo.travaglini@arm.com// use it in testing for small problem sizes. 501213481Sgiacomo.travaglini@arm.comtemplate <typename Graph> 501313481Sgiacomo.travaglini@arm.comclass BacktrackingMaxBPMState { 501413481Sgiacomo.travaglini@arm.com public: 501513481Sgiacomo.travaglini@arm.com // Does not take ownership of 'g'. 501613481Sgiacomo.travaglini@arm.com explicit BacktrackingMaxBPMState(const Graph* g) : graph_(g) { } 501713481Sgiacomo.travaglini@arm.com 501813481Sgiacomo.travaglini@arm.com ElementMatcherPairs Compute() { 501913481Sgiacomo.travaglini@arm.com if (graph_->LhsSize() == 0 || graph_->RhsSize() == 0) { 502013481Sgiacomo.travaglini@arm.com return best_so_far_; 502113481Sgiacomo.travaglini@arm.com } 502213481Sgiacomo.travaglini@arm.com lhs_used_.assign(graph_->LhsSize(), kUnused); 502313481Sgiacomo.travaglini@arm.com rhs_used_.assign(graph_->RhsSize(), kUnused); 502413481Sgiacomo.travaglini@arm.com for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) { 502513481Sgiacomo.travaglini@arm.com matches_.clear(); 502613481Sgiacomo.travaglini@arm.com RecurseInto(irhs); 502713481Sgiacomo.travaglini@arm.com if (best_so_far_.size() == graph_->RhsSize()) 502813481Sgiacomo.travaglini@arm.com break; 502913481Sgiacomo.travaglini@arm.com } 503013481Sgiacomo.travaglini@arm.com return best_so_far_; 503113481Sgiacomo.travaglini@arm.com } 503213481Sgiacomo.travaglini@arm.com 503313481Sgiacomo.travaglini@arm.com private: 503413481Sgiacomo.travaglini@arm.com static const size_t kUnused = static_cast<size_t>(-1); 503513481Sgiacomo.travaglini@arm.com 503613481Sgiacomo.travaglini@arm.com void PushMatch(size_t lhs, size_t rhs) { 503713481Sgiacomo.travaglini@arm.com matches_.push_back(ElementMatcherPair(lhs, rhs)); 503813481Sgiacomo.travaglini@arm.com lhs_used_[lhs] = rhs; 503913481Sgiacomo.travaglini@arm.com rhs_used_[rhs] = lhs; 504013481Sgiacomo.travaglini@arm.com if (matches_.size() > best_so_far_.size()) { 504113481Sgiacomo.travaglini@arm.com best_so_far_ = matches_; 504213481Sgiacomo.travaglini@arm.com } 504313481Sgiacomo.travaglini@arm.com } 504413481Sgiacomo.travaglini@arm.com 504513481Sgiacomo.travaglini@arm.com void PopMatch() { 504613481Sgiacomo.travaglini@arm.com const ElementMatcherPair& back = matches_.back(); 504713481Sgiacomo.travaglini@arm.com lhs_used_[back.first] = kUnused; 504813481Sgiacomo.travaglini@arm.com rhs_used_[back.second] = kUnused; 504913481Sgiacomo.travaglini@arm.com matches_.pop_back(); 505013481Sgiacomo.travaglini@arm.com } 505113481Sgiacomo.travaglini@arm.com 505213481Sgiacomo.travaglini@arm.com bool RecurseInto(size_t irhs) { 505313481Sgiacomo.travaglini@arm.com if (rhs_used_[irhs] != kUnused) { 505413481Sgiacomo.travaglini@arm.com return true; 505513481Sgiacomo.travaglini@arm.com } 505613481Sgiacomo.travaglini@arm.com for (size_t ilhs = 0; ilhs < graph_->LhsSize(); ++ilhs) { 505713481Sgiacomo.travaglini@arm.com if (lhs_used_[ilhs] != kUnused) { 505813481Sgiacomo.travaglini@arm.com continue; 505913481Sgiacomo.travaglini@arm.com } 506013481Sgiacomo.travaglini@arm.com if (!graph_->HasEdge(ilhs, irhs)) { 506113481Sgiacomo.travaglini@arm.com continue; 506213481Sgiacomo.travaglini@arm.com } 506313481Sgiacomo.travaglini@arm.com PushMatch(ilhs, irhs); 506413481Sgiacomo.travaglini@arm.com if (best_so_far_.size() == graph_->RhsSize()) { 506513481Sgiacomo.travaglini@arm.com return false; 506613481Sgiacomo.travaglini@arm.com } 506713481Sgiacomo.travaglini@arm.com for (size_t mi = irhs + 1; mi < graph_->RhsSize(); ++mi) { 506813481Sgiacomo.travaglini@arm.com if (!RecurseInto(mi)) return false; 506913481Sgiacomo.travaglini@arm.com } 507013481Sgiacomo.travaglini@arm.com PopMatch(); 507113481Sgiacomo.travaglini@arm.com } 507213481Sgiacomo.travaglini@arm.com return true; 507313481Sgiacomo.travaglini@arm.com } 507413481Sgiacomo.travaglini@arm.com 507513481Sgiacomo.travaglini@arm.com const Graph* graph_; // not owned 507613481Sgiacomo.travaglini@arm.com std::vector<size_t> lhs_used_; 507713481Sgiacomo.travaglini@arm.com std::vector<size_t> rhs_used_; 507813481Sgiacomo.travaglini@arm.com ElementMatcherPairs matches_; 507913481Sgiacomo.travaglini@arm.com ElementMatcherPairs best_so_far_; 508013481Sgiacomo.travaglini@arm.com}; 508113481Sgiacomo.travaglini@arm.com 508213481Sgiacomo.travaglini@arm.comtemplate <typename Graph> 508313481Sgiacomo.travaglini@arm.comconst size_t BacktrackingMaxBPMState<Graph>::kUnused; 508413481Sgiacomo.travaglini@arm.com 508513481Sgiacomo.travaglini@arm.com} // namespace 508613481Sgiacomo.travaglini@arm.com 508713481Sgiacomo.travaglini@arm.com// Implement a simple backtracking algorithm to determine if it is possible 508813481Sgiacomo.travaglini@arm.com// to find one element per matcher, without reusing elements. 508913481Sgiacomo.travaglini@arm.comtemplate <typename Graph> 509013481Sgiacomo.travaglini@arm.comElementMatcherPairs 509113481Sgiacomo.travaglini@arm.comFindBacktrackingMaxBPM(const Graph& g) { 509213481Sgiacomo.travaglini@arm.com return BacktrackingMaxBPMState<Graph>(&g).Compute(); 509313481Sgiacomo.travaglini@arm.com} 509413481Sgiacomo.travaglini@arm.com 509513481Sgiacomo.travaglini@arm.comclass BacktrackingBPMTest : public ::testing::Test { }; 509613481Sgiacomo.travaglini@arm.com 509713481Sgiacomo.travaglini@arm.com// Tests the MaxBipartiteMatching algorithm with square matrices. 509813481Sgiacomo.travaglini@arm.com// The single int param is the # of nodes on each of the left and right sides. 509913481Sgiacomo.travaglini@arm.comclass BipartiteTest : public ::testing::TestWithParam<int> { }; 510013481Sgiacomo.travaglini@arm.com 510113481Sgiacomo.travaglini@arm.com// Verify all match graphs up to some moderate number of edges. 510213481Sgiacomo.travaglini@arm.comTEST_P(BipartiteTest, Exhaustive) { 510313481Sgiacomo.travaglini@arm.com int nodes = GetParam(); 510413481Sgiacomo.travaglini@arm.com MatchMatrix graph(nodes, nodes); 510513481Sgiacomo.travaglini@arm.com do { 510613481Sgiacomo.travaglini@arm.com ElementMatcherPairs matches = 510713481Sgiacomo.travaglini@arm.com internal::FindMaxBipartiteMatching(graph); 510813481Sgiacomo.travaglini@arm.com EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), matches.size()) 510913481Sgiacomo.travaglini@arm.com << "graph: " << graph.DebugString(); 511013481Sgiacomo.travaglini@arm.com // Check that all elements of matches are in the graph. 511113481Sgiacomo.travaglini@arm.com // Check that elements of first and second are unique. 511213481Sgiacomo.travaglini@arm.com std::vector<bool> seen_element(graph.LhsSize()); 511313481Sgiacomo.travaglini@arm.com std::vector<bool> seen_matcher(graph.RhsSize()); 511413481Sgiacomo.travaglini@arm.com SCOPED_TRACE(PrintToString(matches)); 511513481Sgiacomo.travaglini@arm.com for (size_t i = 0; i < matches.size(); ++i) { 511613481Sgiacomo.travaglini@arm.com size_t ilhs = matches[i].first; 511713481Sgiacomo.travaglini@arm.com size_t irhs = matches[i].second; 511813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(graph.HasEdge(ilhs, irhs)); 511913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(seen_element[ilhs]); 512013481Sgiacomo.travaglini@arm.com EXPECT_FALSE(seen_matcher[irhs]); 512113481Sgiacomo.travaglini@arm.com seen_element[ilhs] = true; 512213481Sgiacomo.travaglini@arm.com seen_matcher[irhs] = true; 512313481Sgiacomo.travaglini@arm.com } 512413481Sgiacomo.travaglini@arm.com } while (graph.NextGraph()); 512513481Sgiacomo.travaglini@arm.com} 512613481Sgiacomo.travaglini@arm.com 512713481Sgiacomo.travaglini@arm.comINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteTest, 512813481Sgiacomo.travaglini@arm.com ::testing::Range(0, 5)); 512913481Sgiacomo.travaglini@arm.com 513013481Sgiacomo.travaglini@arm.com// Parameterized by a pair interpreted as (LhsSize, RhsSize). 513113481Sgiacomo.travaglini@arm.comclass BipartiteNonSquareTest 513213481Sgiacomo.travaglini@arm.com : public ::testing::TestWithParam<std::pair<size_t, size_t> > { 513313481Sgiacomo.travaglini@arm.com}; 513413481Sgiacomo.travaglini@arm.com 513513481Sgiacomo.travaglini@arm.comTEST_F(BipartiteNonSquareTest, SimpleBacktracking) { 513613481Sgiacomo.travaglini@arm.com // ....... 513713481Sgiacomo.travaglini@arm.com // 0:-----\ : 513813481Sgiacomo.travaglini@arm.com // 1:---\ | : 513913481Sgiacomo.travaglini@arm.com // 2:---\ | : 514013481Sgiacomo.travaglini@arm.com // 3:-\ | | : 514113481Sgiacomo.travaglini@arm.com // :.......: 514213481Sgiacomo.travaglini@arm.com // 0 1 2 514313481Sgiacomo.travaglini@arm.com MatchMatrix g(4, 3); 514413481Sgiacomo.travaglini@arm.com static const int kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}}; 514513481Sgiacomo.travaglini@arm.com for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) { 514613481Sgiacomo.travaglini@arm.com g.SetEdge(kEdges[i][0], kEdges[i][1], true); 514713481Sgiacomo.travaglini@arm.com } 514813481Sgiacomo.travaglini@arm.com EXPECT_THAT(FindBacktrackingMaxBPM(g), 514913481Sgiacomo.travaglini@arm.com ElementsAre(Pair(3, 0), 515013481Sgiacomo.travaglini@arm.com Pair(AnyOf(1, 2), 1), 515113481Sgiacomo.travaglini@arm.com Pair(0, 2))) << g.DebugString(); 515213481Sgiacomo.travaglini@arm.com} 515313481Sgiacomo.travaglini@arm.com 515413481Sgiacomo.travaglini@arm.com// Verify a few nonsquare matrices. 515513481Sgiacomo.travaglini@arm.comTEST_P(BipartiteNonSquareTest, Exhaustive) { 515613481Sgiacomo.travaglini@arm.com size_t nlhs = GetParam().first; 515713481Sgiacomo.travaglini@arm.com size_t nrhs = GetParam().second; 515813481Sgiacomo.travaglini@arm.com MatchMatrix graph(nlhs, nrhs); 515913481Sgiacomo.travaglini@arm.com do { 516013481Sgiacomo.travaglini@arm.com EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), 516113481Sgiacomo.travaglini@arm.com internal::FindMaxBipartiteMatching(graph).size()) 516213481Sgiacomo.travaglini@arm.com << "graph: " << graph.DebugString() 516313481Sgiacomo.travaglini@arm.com << "\nbacktracking: " 516413481Sgiacomo.travaglini@arm.com << PrintToString(FindBacktrackingMaxBPM(graph)) 516513481Sgiacomo.travaglini@arm.com << "\nmax flow: " 516613481Sgiacomo.travaglini@arm.com << PrintToString(internal::FindMaxBipartiteMatching(graph)); 516713481Sgiacomo.travaglini@arm.com } while (graph.NextGraph()); 516813481Sgiacomo.travaglini@arm.com} 516913481Sgiacomo.travaglini@arm.com 517013481Sgiacomo.travaglini@arm.comINSTANTIATE_TEST_CASE_P(AllGraphs, BipartiteNonSquareTest, 517113481Sgiacomo.travaglini@arm.com testing::Values( 517213481Sgiacomo.travaglini@arm.com std::make_pair(1, 2), 517313481Sgiacomo.travaglini@arm.com std::make_pair(2, 1), 517413481Sgiacomo.travaglini@arm.com std::make_pair(3, 2), 517513481Sgiacomo.travaglini@arm.com std::make_pair(2, 3), 517613481Sgiacomo.travaglini@arm.com std::make_pair(4, 1), 517713481Sgiacomo.travaglini@arm.com std::make_pair(1, 4), 517813481Sgiacomo.travaglini@arm.com std::make_pair(4, 3), 517913481Sgiacomo.travaglini@arm.com std::make_pair(3, 4))); 518013481Sgiacomo.travaglini@arm.com 518113481Sgiacomo.travaglini@arm.comclass BipartiteRandomTest 518213481Sgiacomo.travaglini@arm.com : public ::testing::TestWithParam<std::pair<int, int> > { 518313481Sgiacomo.travaglini@arm.com}; 518413481Sgiacomo.travaglini@arm.com 518513481Sgiacomo.travaglini@arm.com// Verifies a large sample of larger graphs. 518613481Sgiacomo.travaglini@arm.comTEST_P(BipartiteRandomTest, LargerNets) { 518713481Sgiacomo.travaglini@arm.com int nodes = GetParam().first; 518813481Sgiacomo.travaglini@arm.com int iters = GetParam().second; 518913481Sgiacomo.travaglini@arm.com MatchMatrix graph(nodes, nodes); 519013481Sgiacomo.travaglini@arm.com 519113481Sgiacomo.travaglini@arm.com testing::internal::Int32 seed = GTEST_FLAG(random_seed); 519213481Sgiacomo.travaglini@arm.com if (seed == 0) { 519313481Sgiacomo.travaglini@arm.com seed = static_cast<testing::internal::Int32>(time(NULL)); 519413481Sgiacomo.travaglini@arm.com } 519513481Sgiacomo.travaglini@arm.com 519613481Sgiacomo.travaglini@arm.com for (; iters > 0; --iters, ++seed) { 519713481Sgiacomo.travaglini@arm.com srand(static_cast<int>(seed)); 519813481Sgiacomo.travaglini@arm.com graph.Randomize(); 519913481Sgiacomo.travaglini@arm.com EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), 520013481Sgiacomo.travaglini@arm.com internal::FindMaxBipartiteMatching(graph).size()) 520113481Sgiacomo.travaglini@arm.com << " graph: " << graph.DebugString() 520213481Sgiacomo.travaglini@arm.com << "\nTo reproduce the failure, rerun the test with the flag" 520313481Sgiacomo.travaglini@arm.com " --" << GTEST_FLAG_PREFIX_ << "random_seed=" << seed; 520413481Sgiacomo.travaglini@arm.com } 520513481Sgiacomo.travaglini@arm.com} 520613481Sgiacomo.travaglini@arm.com 520713481Sgiacomo.travaglini@arm.com// Test argument is a std::pair<int, int> representing (nodes, iters). 520813481Sgiacomo.travaglini@arm.comINSTANTIATE_TEST_CASE_P(Samples, BipartiteRandomTest, 520913481Sgiacomo.travaglini@arm.com testing::Values( 521013481Sgiacomo.travaglini@arm.com std::make_pair(5, 10000), 521113481Sgiacomo.travaglini@arm.com std::make_pair(6, 5000), 521213481Sgiacomo.travaglini@arm.com std::make_pair(7, 2000), 521313481Sgiacomo.travaglini@arm.com std::make_pair(8, 500), 521413481Sgiacomo.travaglini@arm.com std::make_pair(9, 100))); 521513481Sgiacomo.travaglini@arm.com 521613481Sgiacomo.travaglini@arm.com// Tests IsReadableTypeName(). 521713481Sgiacomo.travaglini@arm.com 521813481Sgiacomo.travaglini@arm.comTEST(IsReadableTypeNameTest, ReturnsTrueForShortNames) { 521913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(IsReadableTypeName("int")); 522013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(IsReadableTypeName("const unsigned char*")); 522113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(IsReadableTypeName("MyMap<int, void*>")); 522213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(IsReadableTypeName("void (*)(int, bool)")); 522313481Sgiacomo.travaglini@arm.com} 522413481Sgiacomo.travaglini@arm.com 522513481Sgiacomo.travaglini@arm.comTEST(IsReadableTypeNameTest, ReturnsTrueForLongNonTemplateNonFunctionNames) { 522613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(IsReadableTypeName("my_long_namespace::MyClassName")); 522713481Sgiacomo.travaglini@arm.com EXPECT_TRUE(IsReadableTypeName("int [5][6][7][8][9][10][11]")); 522813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(IsReadableTypeName("my_namespace::MyOuterClass::MyInnerClass")); 522913481Sgiacomo.travaglini@arm.com} 523013481Sgiacomo.travaglini@arm.com 523113481Sgiacomo.travaglini@arm.comTEST(IsReadableTypeNameTest, ReturnsFalseForLongTemplateNames) { 523213481Sgiacomo.travaglini@arm.com EXPECT_FALSE( 523313481Sgiacomo.travaglini@arm.com IsReadableTypeName("basic_string<char, std::char_traits<char> >")); 523413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(IsReadableTypeName("std::vector<int, std::alloc_traits<int> >")); 523513481Sgiacomo.travaglini@arm.com} 523613481Sgiacomo.travaglini@arm.com 523713481Sgiacomo.travaglini@arm.comTEST(IsReadableTypeNameTest, ReturnsFalseForLongFunctionTypeNames) { 523813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(IsReadableTypeName("void (&)(int, bool, char, float)")); 523913481Sgiacomo.travaglini@arm.com} 524013481Sgiacomo.travaglini@arm.com 524113481Sgiacomo.travaglini@arm.com// Tests JoinAsTuple(). 524213481Sgiacomo.travaglini@arm.com 524313481Sgiacomo.travaglini@arm.comTEST(JoinAsTupleTest, JoinsEmptyTuple) { 524413481Sgiacomo.travaglini@arm.com EXPECT_EQ("", JoinAsTuple(Strings())); 524513481Sgiacomo.travaglini@arm.com} 524613481Sgiacomo.travaglini@arm.com 524713481Sgiacomo.travaglini@arm.comTEST(JoinAsTupleTest, JoinsOneTuple) { 524813481Sgiacomo.travaglini@arm.com const char* fields[] = {"1"}; 524913481Sgiacomo.travaglini@arm.com EXPECT_EQ("1", JoinAsTuple(Strings(fields, fields + 1))); 525013481Sgiacomo.travaglini@arm.com} 525113481Sgiacomo.travaglini@arm.com 525213481Sgiacomo.travaglini@arm.comTEST(JoinAsTupleTest, JoinsTwoTuple) { 525313481Sgiacomo.travaglini@arm.com const char* fields[] = {"1", "a"}; 525413481Sgiacomo.travaglini@arm.com EXPECT_EQ("(1, a)", JoinAsTuple(Strings(fields, fields + 2))); 525513481Sgiacomo.travaglini@arm.com} 525613481Sgiacomo.travaglini@arm.com 525713481Sgiacomo.travaglini@arm.comTEST(JoinAsTupleTest, JoinsTenTuple) { 525813481Sgiacomo.travaglini@arm.com const char* fields[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; 525913481Sgiacomo.travaglini@arm.com EXPECT_EQ("(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)", 526013481Sgiacomo.travaglini@arm.com JoinAsTuple(Strings(fields, fields + 10))); 526113481Sgiacomo.travaglini@arm.com} 526213481Sgiacomo.travaglini@arm.com 526313481Sgiacomo.travaglini@arm.com// Tests FormatMatcherDescription(). 526413481Sgiacomo.travaglini@arm.com 526513481Sgiacomo.travaglini@arm.comTEST(FormatMatcherDescriptionTest, WorksForEmptyDescription) { 526613481Sgiacomo.travaglini@arm.com EXPECT_EQ("is even", 526713481Sgiacomo.travaglini@arm.com FormatMatcherDescription(false, "IsEven", Strings())); 526813481Sgiacomo.travaglini@arm.com EXPECT_EQ("not (is even)", 526913481Sgiacomo.travaglini@arm.com FormatMatcherDescription(true, "IsEven", Strings())); 527013481Sgiacomo.travaglini@arm.com 527113481Sgiacomo.travaglini@arm.com const char* params[] = {"5"}; 527213481Sgiacomo.travaglini@arm.com EXPECT_EQ("equals 5", 527313481Sgiacomo.travaglini@arm.com FormatMatcherDescription(false, "Equals", 527413481Sgiacomo.travaglini@arm.com Strings(params, params + 1))); 527513481Sgiacomo.travaglini@arm.com 527613481Sgiacomo.travaglini@arm.com const char* params2[] = {"5", "8"}; 527713481Sgiacomo.travaglini@arm.com EXPECT_EQ("is in range (5, 8)", 527813481Sgiacomo.travaglini@arm.com FormatMatcherDescription(false, "IsInRange", 527913481Sgiacomo.travaglini@arm.com Strings(params2, params2 + 2))); 528013481Sgiacomo.travaglini@arm.com} 528113481Sgiacomo.travaglini@arm.com 528213481Sgiacomo.travaglini@arm.com// Tests PolymorphicMatcher::mutable_impl(). 528313481Sgiacomo.travaglini@arm.comTEST(PolymorphicMatcherTest, CanAccessMutableImpl) { 528413481Sgiacomo.travaglini@arm.com PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 528513481Sgiacomo.travaglini@arm.com DivisibleByImpl& impl = m.mutable_impl(); 528613481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, impl.divider()); 528713481Sgiacomo.travaglini@arm.com 528813481Sgiacomo.travaglini@arm.com impl.set_divider(0); 528913481Sgiacomo.travaglini@arm.com EXPECT_EQ(0, m.mutable_impl().divider()); 529013481Sgiacomo.travaglini@arm.com} 529113481Sgiacomo.travaglini@arm.com 529213481Sgiacomo.travaglini@arm.com// Tests PolymorphicMatcher::impl(). 529313481Sgiacomo.travaglini@arm.comTEST(PolymorphicMatcherTest, CanAccessImpl) { 529413481Sgiacomo.travaglini@arm.com const PolymorphicMatcher<DivisibleByImpl> m(DivisibleByImpl(42)); 529513481Sgiacomo.travaglini@arm.com const DivisibleByImpl& impl = m.impl(); 529613481Sgiacomo.travaglini@arm.com EXPECT_EQ(42, impl.divider()); 529713481Sgiacomo.travaglini@arm.com} 529813481Sgiacomo.travaglini@arm.com 529913481Sgiacomo.travaglini@arm.comTEST(MatcherTupleTest, ExplainsMatchFailure) { 530013481Sgiacomo.travaglini@arm.com stringstream ss1; 530113481Sgiacomo.travaglini@arm.com ExplainMatchFailureTupleTo(make_tuple(Matcher<char>(Eq('a')), GreaterThan(5)), 530213481Sgiacomo.travaglini@arm.com make_tuple('a', 10), &ss1); 530313481Sgiacomo.travaglini@arm.com EXPECT_EQ("", ss1.str()); // Successful match. 530413481Sgiacomo.travaglini@arm.com 530513481Sgiacomo.travaglini@arm.com stringstream ss2; 530613481Sgiacomo.travaglini@arm.com ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))), 530713481Sgiacomo.travaglini@arm.com make_tuple(2, 'b'), &ss2); 530813481Sgiacomo.travaglini@arm.com EXPECT_EQ(" Expected arg #0: is > 5\n" 530913481Sgiacomo.travaglini@arm.com " Actual: 2, which is 3 less than 5\n" 531013481Sgiacomo.travaglini@arm.com " Expected arg #1: is equal to 'a' (97, 0x61)\n" 531113481Sgiacomo.travaglini@arm.com " Actual: 'b' (98, 0x62)\n", 531213481Sgiacomo.travaglini@arm.com ss2.str()); // Failed match where both arguments need explanation. 531313481Sgiacomo.travaglini@arm.com 531413481Sgiacomo.travaglini@arm.com stringstream ss3; 531513481Sgiacomo.travaglini@arm.com ExplainMatchFailureTupleTo(make_tuple(GreaterThan(5), Matcher<char>(Eq('a'))), 531613481Sgiacomo.travaglini@arm.com make_tuple(2, 'a'), &ss3); 531713481Sgiacomo.travaglini@arm.com EXPECT_EQ(" Expected arg #0: is > 5\n" 531813481Sgiacomo.travaglini@arm.com " Actual: 2, which is 3 less than 5\n", 531913481Sgiacomo.travaglini@arm.com ss3.str()); // Failed match where only one argument needs 532013481Sgiacomo.travaglini@arm.com // explanation. 532113481Sgiacomo.travaglini@arm.com} 532213481Sgiacomo.travaglini@arm.com 532313481Sgiacomo.travaglini@arm.com// Tests Each(). 532413481Sgiacomo.travaglini@arm.com 532513481Sgiacomo.travaglini@arm.comTEST(EachTest, ExplainsMatchResultCorrectly) { 532613481Sgiacomo.travaglini@arm.com set<int> a; // empty 532713481Sgiacomo.travaglini@arm.com 532813481Sgiacomo.travaglini@arm.com Matcher<set<int> > m = Each(2); 532913481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, a)); 533013481Sgiacomo.travaglini@arm.com 533113481Sgiacomo.travaglini@arm.com Matcher<const int(&)[1]> n = Each(1); // NOLINT 533213481Sgiacomo.travaglini@arm.com 533313481Sgiacomo.travaglini@arm.com const int b[1] = {1}; 533413481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(n, b)); 533513481Sgiacomo.travaglini@arm.com 533613481Sgiacomo.travaglini@arm.com n = Each(3); 533713481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose element #0 doesn't match", Explain(n, b)); 533813481Sgiacomo.travaglini@arm.com 533913481Sgiacomo.travaglini@arm.com a.insert(1); 534013481Sgiacomo.travaglini@arm.com a.insert(2); 534113481Sgiacomo.travaglini@arm.com a.insert(3); 534213481Sgiacomo.travaglini@arm.com m = Each(GreaterThan(0)); 534313481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, a)); 534413481Sgiacomo.travaglini@arm.com 534513481Sgiacomo.travaglini@arm.com m = Each(GreaterThan(10)); 534613481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose element #0 doesn't match, which is 9 less than 10", 534713481Sgiacomo.travaglini@arm.com Explain(m, a)); 534813481Sgiacomo.travaglini@arm.com} 534913481Sgiacomo.travaglini@arm.com 535013481Sgiacomo.travaglini@arm.comTEST(EachTest, DescribesItselfCorrectly) { 535113481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = Each(1); 535213481Sgiacomo.travaglini@arm.com EXPECT_EQ("only contains elements that is equal to 1", Describe(m)); 535313481Sgiacomo.travaglini@arm.com 535413481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m2 = Not(m); 535513481Sgiacomo.travaglini@arm.com EXPECT_EQ("contains some element that isn't equal to 1", Describe(m2)); 535613481Sgiacomo.travaglini@arm.com} 535713481Sgiacomo.travaglini@arm.com 535813481Sgiacomo.travaglini@arm.comTEST(EachTest, MatchesVectorWhenAllElementsMatch) { 535913481Sgiacomo.travaglini@arm.com vector<int> some_vector; 536013481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_vector, Each(1)); 536113481Sgiacomo.travaglini@arm.com some_vector.push_back(3); 536213481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_vector, Not(Each(1))); 536313481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_vector, Each(3)); 536413481Sgiacomo.travaglini@arm.com some_vector.push_back(1); 536513481Sgiacomo.travaglini@arm.com some_vector.push_back(2); 536613481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_vector, Not(Each(3))); 536713481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_vector, Each(Lt(3.5))); 536813481Sgiacomo.travaglini@arm.com 536913481Sgiacomo.travaglini@arm.com vector<string> another_vector; 537013481Sgiacomo.travaglini@arm.com another_vector.push_back("fee"); 537113481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_vector, Each(string("fee"))); 537213481Sgiacomo.travaglini@arm.com another_vector.push_back("fie"); 537313481Sgiacomo.travaglini@arm.com another_vector.push_back("foe"); 537413481Sgiacomo.travaglini@arm.com another_vector.push_back("fum"); 537513481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_vector, Not(Each(string("fee")))); 537613481Sgiacomo.travaglini@arm.com} 537713481Sgiacomo.travaglini@arm.com 537813481Sgiacomo.travaglini@arm.comTEST(EachTest, MatchesMapWhenAllElementsMatch) { 537913481Sgiacomo.travaglini@arm.com map<const char*, int> my_map; 538013481Sgiacomo.travaglini@arm.com const char* bar = "a string"; 538113481Sgiacomo.travaglini@arm.com my_map[bar] = 2; 538213481Sgiacomo.travaglini@arm.com EXPECT_THAT(my_map, Each(make_pair(bar, 2))); 538313481Sgiacomo.travaglini@arm.com 538413481Sgiacomo.travaglini@arm.com map<string, int> another_map; 538513481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1))); 538613481Sgiacomo.travaglini@arm.com another_map["fee"] = 1; 538713481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_map, Each(make_pair(string("fee"), 1))); 538813481Sgiacomo.travaglini@arm.com another_map["fie"] = 2; 538913481Sgiacomo.travaglini@arm.com another_map["foe"] = 3; 539013481Sgiacomo.travaglini@arm.com another_map["fum"] = 4; 539113481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_map, Not(Each(make_pair(string("fee"), 1)))); 539213481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_map, Not(Each(make_pair(string("fum"), 1)))); 539313481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_map, Each(Pair(_, Gt(0)))); 539413481Sgiacomo.travaglini@arm.com} 539513481Sgiacomo.travaglini@arm.com 539613481Sgiacomo.travaglini@arm.comTEST(EachTest, AcceptsMatcher) { 539713481Sgiacomo.travaglini@arm.com const int a[] = {1, 2, 3}; 539813481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Each(Gt(0))); 539913481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(Each(Gt(1)))); 540013481Sgiacomo.travaglini@arm.com} 540113481Sgiacomo.travaglini@arm.com 540213481Sgiacomo.travaglini@arm.comTEST(EachTest, WorksForNativeArrayAsTuple) { 540313481Sgiacomo.travaglini@arm.com const int a[] = {1, 2}; 540413481Sgiacomo.travaglini@arm.com const int* const pointer = a; 540513481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(pointer, 2), Each(Gt(0))); 540613481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(pointer, 2), Not(Each(Gt(1)))); 540713481Sgiacomo.travaglini@arm.com} 540813481Sgiacomo.travaglini@arm.com 540913481Sgiacomo.travaglini@arm.com// For testing Pointwise(). 541013481Sgiacomo.travaglini@arm.comclass IsHalfOfMatcher { 541113481Sgiacomo.travaglini@arm.com public: 541213481Sgiacomo.travaglini@arm.com template <typename T1, typename T2> 541313481Sgiacomo.travaglini@arm.com bool MatchAndExplain(const tuple<T1, T2>& a_pair, 541413481Sgiacomo.travaglini@arm.com MatchResultListener* listener) const { 541513481Sgiacomo.travaglini@arm.com if (get<0>(a_pair) == get<1>(a_pair)/2) { 541613481Sgiacomo.travaglini@arm.com *listener << "where the second is " << get<1>(a_pair); 541713481Sgiacomo.travaglini@arm.com return true; 541813481Sgiacomo.travaglini@arm.com } else { 541913481Sgiacomo.travaglini@arm.com *listener << "where the second/2 is " << get<1>(a_pair)/2; 542013481Sgiacomo.travaglini@arm.com return false; 542113481Sgiacomo.travaglini@arm.com } 542213481Sgiacomo.travaglini@arm.com } 542313481Sgiacomo.travaglini@arm.com 542413481Sgiacomo.travaglini@arm.com void DescribeTo(ostream* os) const { 542513481Sgiacomo.travaglini@arm.com *os << "are a pair where the first is half of the second"; 542613481Sgiacomo.travaglini@arm.com } 542713481Sgiacomo.travaglini@arm.com 542813481Sgiacomo.travaglini@arm.com void DescribeNegationTo(ostream* os) const { 542913481Sgiacomo.travaglini@arm.com *os << "are a pair where the first isn't half of the second"; 543013481Sgiacomo.travaglini@arm.com } 543113481Sgiacomo.travaglini@arm.com}; 543213481Sgiacomo.travaglini@arm.com 543313481Sgiacomo.travaglini@arm.comPolymorphicMatcher<IsHalfOfMatcher> IsHalfOf() { 543413481Sgiacomo.travaglini@arm.com return MakePolymorphicMatcher(IsHalfOfMatcher()); 543513481Sgiacomo.travaglini@arm.com} 543613481Sgiacomo.travaglini@arm.com 543713481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, DescribesSelf) { 543813481Sgiacomo.travaglini@arm.com vector<int> rhs; 543913481Sgiacomo.travaglini@arm.com rhs.push_back(1); 544013481Sgiacomo.travaglini@arm.com rhs.push_back(2); 544113481Sgiacomo.travaglini@arm.com rhs.push_back(3); 544213481Sgiacomo.travaglini@arm.com const Matcher<const vector<int>&> m = Pointwise(IsHalfOf(), rhs); 544313481Sgiacomo.travaglini@arm.com EXPECT_EQ("contains 3 values, where each value and its corresponding value " 544413481Sgiacomo.travaglini@arm.com "in { 1, 2, 3 } are a pair where the first is half of the second", 544513481Sgiacomo.travaglini@arm.com Describe(m)); 544613481Sgiacomo.travaglini@arm.com EXPECT_EQ("doesn't contain exactly 3 values, or contains a value x at some " 544713481Sgiacomo.travaglini@arm.com "index i where x and the i-th value of { 1, 2, 3 } are a pair " 544813481Sgiacomo.travaglini@arm.com "where the first isn't half of the second", 544913481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 545013481Sgiacomo.travaglini@arm.com} 545113481Sgiacomo.travaglini@arm.com 545213481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, MakesCopyOfRhs) { 545313481Sgiacomo.travaglini@arm.com list<signed char> rhs; 545413481Sgiacomo.travaglini@arm.com rhs.push_back(2); 545513481Sgiacomo.travaglini@arm.com rhs.push_back(4); 545613481Sgiacomo.travaglini@arm.com 545713481Sgiacomo.travaglini@arm.com int lhs[] = {1, 2}; 545813481Sgiacomo.travaglini@arm.com const Matcher<const int (&)[2]> m = Pointwise(IsHalfOf(), rhs); 545913481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, m); 546013481Sgiacomo.travaglini@arm.com 546113481Sgiacomo.travaglini@arm.com // Changing rhs now shouldn't affect m, which made a copy of rhs. 546213481Sgiacomo.travaglini@arm.com rhs.push_back(6); 546313481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, m); 546413481Sgiacomo.travaglini@arm.com} 546513481Sgiacomo.travaglini@arm.com 546613481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, WorksForLhsNativeArray) { 546713481Sgiacomo.travaglini@arm.com const int lhs[] = {1, 2, 3}; 546813481Sgiacomo.travaglini@arm.com vector<int> rhs; 546913481Sgiacomo.travaglini@arm.com rhs.push_back(2); 547013481Sgiacomo.travaglini@arm.com rhs.push_back(4); 547113481Sgiacomo.travaglini@arm.com rhs.push_back(6); 547213481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Pointwise(Lt(), rhs)); 547313481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 547413481Sgiacomo.travaglini@arm.com} 547513481Sgiacomo.travaglini@arm.com 547613481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, WorksForRhsNativeArray) { 547713481Sgiacomo.travaglini@arm.com const int rhs[] = {1, 2, 3}; 547813481Sgiacomo.travaglini@arm.com vector<int> lhs; 547913481Sgiacomo.travaglini@arm.com lhs.push_back(2); 548013481Sgiacomo.travaglini@arm.com lhs.push_back(4); 548113481Sgiacomo.travaglini@arm.com lhs.push_back(6); 548213481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Pointwise(Gt(), rhs)); 548313481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(Pointwise(Lt(), rhs))); 548413481Sgiacomo.travaglini@arm.com} 548513481Sgiacomo.travaglini@arm.com 548613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_INITIALIZER_LIST_ 548713481Sgiacomo.travaglini@arm.com 548813481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, WorksForRhsInitializerList) { 548913481Sgiacomo.travaglini@arm.com const vector<int> lhs{2, 4, 6}; 549013481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Pointwise(Gt(), {1, 2, 3})); 549113481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(Pointwise(Lt(), {3, 3, 7}))); 549213481Sgiacomo.travaglini@arm.com} 549313481Sgiacomo.travaglini@arm.com 549413481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_INITIALIZER_LIST_ 549513481Sgiacomo.travaglini@arm.com 549613481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, RejectsWrongSize) { 549713481Sgiacomo.travaglini@arm.com const double lhs[2] = {1, 2}; 549813481Sgiacomo.travaglini@arm.com const int rhs[1] = {0}; 549913481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs))); 550013481Sgiacomo.travaglini@arm.com EXPECT_EQ("which contains 2 values", 550113481Sgiacomo.travaglini@arm.com Explain(Pointwise(Gt(), rhs), lhs)); 550213481Sgiacomo.travaglini@arm.com 550313481Sgiacomo.travaglini@arm.com const int rhs2[3] = {0, 1, 2}; 550413481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(Pointwise(Gt(), rhs2))); 550513481Sgiacomo.travaglini@arm.com} 550613481Sgiacomo.travaglini@arm.com 550713481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, RejectsWrongContent) { 550813481Sgiacomo.travaglini@arm.com const double lhs[3] = {1, 2, 3}; 550913481Sgiacomo.travaglini@arm.com const int rhs[3] = {2, 6, 4}; 551013481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(Pointwise(IsHalfOf(), rhs))); 551113481Sgiacomo.travaglini@arm.com EXPECT_EQ("where the value pair (2, 6) at index #1 don't match, " 551213481Sgiacomo.travaglini@arm.com "where the second/2 is 3", 551313481Sgiacomo.travaglini@arm.com Explain(Pointwise(IsHalfOf(), rhs), lhs)); 551413481Sgiacomo.travaglini@arm.com} 551513481Sgiacomo.travaglini@arm.com 551613481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, AcceptsCorrectContent) { 551713481Sgiacomo.travaglini@arm.com const double lhs[3] = {1, 2, 3}; 551813481Sgiacomo.travaglini@arm.com const int rhs[3] = {2, 4, 6}; 551913481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Pointwise(IsHalfOf(), rhs)); 552013481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(Pointwise(IsHalfOf(), rhs), lhs)); 552113481Sgiacomo.travaglini@arm.com} 552213481Sgiacomo.travaglini@arm.com 552313481Sgiacomo.travaglini@arm.comTEST(PointwiseTest, AllowsMonomorphicInnerMatcher) { 552413481Sgiacomo.travaglini@arm.com const double lhs[3] = {1, 2, 3}; 552513481Sgiacomo.travaglini@arm.com const int rhs[3] = {2, 4, 6}; 552613481Sgiacomo.travaglini@arm.com const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf(); 552713481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Pointwise(m1, rhs)); 552813481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(Pointwise(m1, rhs), lhs)); 552913481Sgiacomo.travaglini@arm.com 553013481Sgiacomo.travaglini@arm.com // This type works as a tuple<const double&, const int&> can be 553113481Sgiacomo.travaglini@arm.com // implicitly cast to tuple<double, int>. 553213481Sgiacomo.travaglini@arm.com const Matcher<tuple<double, int> > m2 = IsHalfOf(); 553313481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Pointwise(m2, rhs)); 553413481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(Pointwise(m2, rhs), lhs)); 553513481Sgiacomo.travaglini@arm.com} 553613481Sgiacomo.travaglini@arm.com 553713481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, DescribesSelf) { 553813481Sgiacomo.travaglini@arm.com vector<int> rhs; 553913481Sgiacomo.travaglini@arm.com rhs.push_back(1); 554013481Sgiacomo.travaglini@arm.com rhs.push_back(2); 554113481Sgiacomo.travaglini@arm.com rhs.push_back(3); 554213481Sgiacomo.travaglini@arm.com const Matcher<const vector<int>&> m = UnorderedPointwise(IsHalfOf(), rhs); 554313481Sgiacomo.travaglini@arm.com EXPECT_EQ( 554413481Sgiacomo.travaglini@arm.com "has 3 elements and there exists some permutation of elements such " 554513481Sgiacomo.travaglini@arm.com "that:\n" 554613481Sgiacomo.travaglini@arm.com " - element #0 and 1 are a pair where the first is half of the second, " 554713481Sgiacomo.travaglini@arm.com "and\n" 554813481Sgiacomo.travaglini@arm.com " - element #1 and 2 are a pair where the first is half of the second, " 554913481Sgiacomo.travaglini@arm.com "and\n" 555013481Sgiacomo.travaglini@arm.com " - element #2 and 3 are a pair where the first is half of the second", 555113481Sgiacomo.travaglini@arm.com Describe(m)); 555213481Sgiacomo.travaglini@arm.com EXPECT_EQ( 555313481Sgiacomo.travaglini@arm.com "doesn't have 3 elements, or there exists no permutation of elements " 555413481Sgiacomo.travaglini@arm.com "such that:\n" 555513481Sgiacomo.travaglini@arm.com " - element #0 and 1 are a pair where the first is half of the second, " 555613481Sgiacomo.travaglini@arm.com "and\n" 555713481Sgiacomo.travaglini@arm.com " - element #1 and 2 are a pair where the first is half of the second, " 555813481Sgiacomo.travaglini@arm.com "and\n" 555913481Sgiacomo.travaglini@arm.com " - element #2 and 3 are a pair where the first is half of the second", 556013481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 556113481Sgiacomo.travaglini@arm.com} 556213481Sgiacomo.travaglini@arm.com 556313481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, MakesCopyOfRhs) { 556413481Sgiacomo.travaglini@arm.com list<signed char> rhs; 556513481Sgiacomo.travaglini@arm.com rhs.push_back(2); 556613481Sgiacomo.travaglini@arm.com rhs.push_back(4); 556713481Sgiacomo.travaglini@arm.com 556813481Sgiacomo.travaglini@arm.com int lhs[] = {2, 1}; 556913481Sgiacomo.travaglini@arm.com const Matcher<const int (&)[2]> m = UnorderedPointwise(IsHalfOf(), rhs); 557013481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, m); 557113481Sgiacomo.travaglini@arm.com 557213481Sgiacomo.travaglini@arm.com // Changing rhs now shouldn't affect m, which made a copy of rhs. 557313481Sgiacomo.travaglini@arm.com rhs.push_back(6); 557413481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, m); 557513481Sgiacomo.travaglini@arm.com} 557613481Sgiacomo.travaglini@arm.com 557713481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, WorksForLhsNativeArray) { 557813481Sgiacomo.travaglini@arm.com const int lhs[] = {1, 2, 3}; 557913481Sgiacomo.travaglini@arm.com vector<int> rhs; 558013481Sgiacomo.travaglini@arm.com rhs.push_back(4); 558113481Sgiacomo.travaglini@arm.com rhs.push_back(6); 558213481Sgiacomo.travaglini@arm.com rhs.push_back(2); 558313481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, UnorderedPointwise(Lt(), rhs)); 558413481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs))); 558513481Sgiacomo.travaglini@arm.com} 558613481Sgiacomo.travaglini@arm.com 558713481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, WorksForRhsNativeArray) { 558813481Sgiacomo.travaglini@arm.com const int rhs[] = {1, 2, 3}; 558913481Sgiacomo.travaglini@arm.com vector<int> lhs; 559013481Sgiacomo.travaglini@arm.com lhs.push_back(4); 559113481Sgiacomo.travaglini@arm.com lhs.push_back(2); 559213481Sgiacomo.travaglini@arm.com lhs.push_back(6); 559313481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, UnorderedPointwise(Gt(), rhs)); 559413481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), rhs))); 559513481Sgiacomo.travaglini@arm.com} 559613481Sgiacomo.travaglini@arm.com 559713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_INITIALIZER_LIST_ 559813481Sgiacomo.travaglini@arm.com 559913481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, WorksForRhsInitializerList) { 560013481Sgiacomo.travaglini@arm.com const vector<int> lhs{2, 4, 6}; 560113481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, UnorderedPointwise(Gt(), {5, 1, 3})); 560213481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(UnorderedPointwise(Lt(), {1, 1, 7}))); 560313481Sgiacomo.travaglini@arm.com} 560413481Sgiacomo.travaglini@arm.com 560513481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_INITIALIZER_LIST_ 560613481Sgiacomo.travaglini@arm.com 560713481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, RejectsWrongSize) { 560813481Sgiacomo.travaglini@arm.com const double lhs[2] = {1, 2}; 560913481Sgiacomo.travaglini@arm.com const int rhs[1] = {0}; 561013481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs))); 561113481Sgiacomo.travaglini@arm.com EXPECT_EQ("which has 2 elements", 561213481Sgiacomo.travaglini@arm.com Explain(UnorderedPointwise(Gt(), rhs), lhs)); 561313481Sgiacomo.travaglini@arm.com 561413481Sgiacomo.travaglini@arm.com const int rhs2[3] = {0, 1, 2}; 561513481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(UnorderedPointwise(Gt(), rhs2))); 561613481Sgiacomo.travaglini@arm.com} 561713481Sgiacomo.travaglini@arm.com 561813481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, RejectsWrongContent) { 561913481Sgiacomo.travaglini@arm.com const double lhs[3] = {1, 2, 3}; 562013481Sgiacomo.travaglini@arm.com const int rhs[3] = {2, 6, 6}; 562113481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, Not(UnorderedPointwise(IsHalfOf(), rhs))); 562213481Sgiacomo.travaglini@arm.com EXPECT_EQ("where the following elements don't match any matchers:\n" 562313481Sgiacomo.travaglini@arm.com "element #1: 2", 562413481Sgiacomo.travaglini@arm.com Explain(UnorderedPointwise(IsHalfOf(), rhs), lhs)); 562513481Sgiacomo.travaglini@arm.com} 562613481Sgiacomo.travaglini@arm.com 562713481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, AcceptsCorrectContentInSameOrder) { 562813481Sgiacomo.travaglini@arm.com const double lhs[3] = {1, 2, 3}; 562913481Sgiacomo.travaglini@arm.com const int rhs[3] = {2, 4, 6}; 563013481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs)); 563113481Sgiacomo.travaglini@arm.com} 563213481Sgiacomo.travaglini@arm.com 563313481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, AcceptsCorrectContentInDifferentOrder) { 563413481Sgiacomo.travaglini@arm.com const double lhs[3] = {1, 2, 3}; 563513481Sgiacomo.travaglini@arm.com const int rhs[3] = {6, 4, 2}; 563613481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, UnorderedPointwise(IsHalfOf(), rhs)); 563713481Sgiacomo.travaglini@arm.com} 563813481Sgiacomo.travaglini@arm.com 563913481Sgiacomo.travaglini@arm.comTEST(UnorderedPointwiseTest, AllowsMonomorphicInnerMatcher) { 564013481Sgiacomo.travaglini@arm.com const double lhs[3] = {1, 2, 3}; 564113481Sgiacomo.travaglini@arm.com const int rhs[3] = {4, 6, 2}; 564213481Sgiacomo.travaglini@arm.com const Matcher<tuple<const double&, const int&> > m1 = IsHalfOf(); 564313481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, UnorderedPointwise(m1, rhs)); 564413481Sgiacomo.travaglini@arm.com 564513481Sgiacomo.travaglini@arm.com // This type works as a tuple<const double&, const int&> can be 564613481Sgiacomo.travaglini@arm.com // implicitly cast to tuple<double, int>. 564713481Sgiacomo.travaglini@arm.com const Matcher<tuple<double, int> > m2 = IsHalfOf(); 564813481Sgiacomo.travaglini@arm.com EXPECT_THAT(lhs, UnorderedPointwise(m2, rhs)); 564913481Sgiacomo.travaglini@arm.com} 565013481Sgiacomo.travaglini@arm.com 565113481Sgiacomo.travaglini@arm.com} // namespace gmock_matchers_test 565213481Sgiacomo.travaglini@arm.com} // namespace testing 5653