113481Sgiacomo.travaglini@arm.com// Copyright 2008, 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// Google Mock - a framework for writing C++ mock classes. 3113481Sgiacomo.travaglini@arm.com// 3213481Sgiacomo.travaglini@arm.com// This file tests the built-in matchers generated by a script. 3313481Sgiacomo.travaglini@arm.com 3413481Sgiacomo.travaglini@arm.com#include "gmock/gmock-generated-matchers.h" 3513481Sgiacomo.travaglini@arm.com 3613481Sgiacomo.travaglini@arm.com#include <list> 3713481Sgiacomo.travaglini@arm.com#include <map> 3813481Sgiacomo.travaglini@arm.com#include <set> 3913481Sgiacomo.travaglini@arm.com#include <sstream> 4013481Sgiacomo.travaglini@arm.com#include <string> 4113481Sgiacomo.travaglini@arm.com#include <utility> 4213481Sgiacomo.travaglini@arm.com#include <vector> 4313481Sgiacomo.travaglini@arm.com 4413481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h" 4513481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 4613481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h" 4713481Sgiacomo.travaglini@arm.com 4813481Sgiacomo.travaglini@arm.comnamespace { 4913481Sgiacomo.travaglini@arm.com 5013481Sgiacomo.travaglini@arm.comusing std::list; 5113481Sgiacomo.travaglini@arm.comusing std::map; 5213481Sgiacomo.travaglini@arm.comusing std::pair; 5313481Sgiacomo.travaglini@arm.comusing std::set; 5413481Sgiacomo.travaglini@arm.comusing std::stringstream; 5513481Sgiacomo.travaglini@arm.comusing std::vector; 5613481Sgiacomo.travaglini@arm.comusing testing::get; 5713481Sgiacomo.travaglini@arm.comusing testing::make_tuple; 5813481Sgiacomo.travaglini@arm.comusing testing::tuple; 5913481Sgiacomo.travaglini@arm.comusing testing::_; 6013481Sgiacomo.travaglini@arm.comusing testing::Args; 6113481Sgiacomo.travaglini@arm.comusing testing::Contains; 6213481Sgiacomo.travaglini@arm.comusing testing::ElementsAre; 6313481Sgiacomo.travaglini@arm.comusing testing::ElementsAreArray; 6413481Sgiacomo.travaglini@arm.comusing testing::Eq; 6513481Sgiacomo.travaglini@arm.comusing testing::Ge; 6613481Sgiacomo.travaglini@arm.comusing testing::Gt; 6713481Sgiacomo.travaglini@arm.comusing testing::Le; 6813481Sgiacomo.travaglini@arm.comusing testing::Lt; 6913481Sgiacomo.travaglini@arm.comusing testing::MakeMatcher; 7013481Sgiacomo.travaglini@arm.comusing testing::Matcher; 7113481Sgiacomo.travaglini@arm.comusing testing::MatcherInterface; 7213481Sgiacomo.travaglini@arm.comusing testing::MatchResultListener; 7313481Sgiacomo.travaglini@arm.comusing testing::Ne; 7413481Sgiacomo.travaglini@arm.comusing testing::Not; 7513481Sgiacomo.travaglini@arm.comusing testing::Pointee; 7613481Sgiacomo.travaglini@arm.comusing testing::PrintToString; 7713481Sgiacomo.travaglini@arm.comusing testing::Ref; 7813481Sgiacomo.travaglini@arm.comusing testing::StaticAssertTypeEq; 7913481Sgiacomo.travaglini@arm.comusing testing::StrEq; 8013481Sgiacomo.travaglini@arm.comusing testing::Value; 8113481Sgiacomo.travaglini@arm.comusing testing::internal::ElementsAreArrayMatcher; 8213481Sgiacomo.travaglini@arm.comusing testing::internal::string; 8313481Sgiacomo.travaglini@arm.com 8413481Sgiacomo.travaglini@arm.com// Returns the description of the given matcher. 8513481Sgiacomo.travaglini@arm.comtemplate <typename T> 8613481Sgiacomo.travaglini@arm.comstring Describe(const Matcher<T>& m) { 8713481Sgiacomo.travaglini@arm.com stringstream ss; 8813481Sgiacomo.travaglini@arm.com m.DescribeTo(&ss); 8913481Sgiacomo.travaglini@arm.com return ss.str(); 9013481Sgiacomo.travaglini@arm.com} 9113481Sgiacomo.travaglini@arm.com 9213481Sgiacomo.travaglini@arm.com// Returns the description of the negation of the given matcher. 9313481Sgiacomo.travaglini@arm.comtemplate <typename T> 9413481Sgiacomo.travaglini@arm.comstring DescribeNegation(const Matcher<T>& m) { 9513481Sgiacomo.travaglini@arm.com stringstream ss; 9613481Sgiacomo.travaglini@arm.com m.DescribeNegationTo(&ss); 9713481Sgiacomo.travaglini@arm.com return ss.str(); 9813481Sgiacomo.travaglini@arm.com} 9913481Sgiacomo.travaglini@arm.com 10013481Sgiacomo.travaglini@arm.com// Returns the reason why x matches, or doesn't match, m. 10113481Sgiacomo.travaglini@arm.comtemplate <typename MatcherType, typename Value> 10213481Sgiacomo.travaglini@arm.comstring Explain(const MatcherType& m, const Value& x) { 10313481Sgiacomo.travaglini@arm.com stringstream ss; 10413481Sgiacomo.travaglini@arm.com m.ExplainMatchResultTo(x, &ss); 10513481Sgiacomo.travaglini@arm.com return ss.str(); 10613481Sgiacomo.travaglini@arm.com} 10713481Sgiacomo.travaglini@arm.com 10813481Sgiacomo.travaglini@arm.com// Tests Args<k0, ..., kn>(m). 10913481Sgiacomo.travaglini@arm.com 11013481Sgiacomo.travaglini@arm.comTEST(ArgsTest, AcceptsZeroTemplateArg) { 11113481Sgiacomo.travaglini@arm.com const tuple<int, bool> t(5, true); 11213481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Args<>(Eq(tuple<>()))); 11313481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Not(Args<>(Ne(tuple<>())))); 11413481Sgiacomo.travaglini@arm.com} 11513481Sgiacomo.travaglini@arm.com 11613481Sgiacomo.travaglini@arm.comTEST(ArgsTest, AcceptsOneTemplateArg) { 11713481Sgiacomo.travaglini@arm.com const tuple<int, bool> t(5, true); 11813481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Args<0>(Eq(make_tuple(5)))); 11913481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Args<1>(Eq(make_tuple(true)))); 12013481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Not(Args<1>(Eq(make_tuple(false))))); 12113481Sgiacomo.travaglini@arm.com} 12213481Sgiacomo.travaglini@arm.com 12313481Sgiacomo.travaglini@arm.comTEST(ArgsTest, AcceptsTwoTemplateArgs) { 12413481Sgiacomo.travaglini@arm.com const tuple<short, int, long> t(4, 5, 6L); // NOLINT 12513481Sgiacomo.travaglini@arm.com 12613481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, (Args<0, 1>(Lt()))); 12713481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, (Args<1, 2>(Lt()))); 12813481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Not(Args<0, 2>(Gt()))); 12913481Sgiacomo.travaglini@arm.com} 13013481Sgiacomo.travaglini@arm.com 13113481Sgiacomo.travaglini@arm.comTEST(ArgsTest, AcceptsRepeatedTemplateArgs) { 13213481Sgiacomo.travaglini@arm.com const tuple<short, int, long> t(4, 5, 6L); // NOLINT 13313481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, (Args<0, 0>(Eq()))); 13413481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Not(Args<1, 1>(Ne()))); 13513481Sgiacomo.travaglini@arm.com} 13613481Sgiacomo.travaglini@arm.com 13713481Sgiacomo.travaglini@arm.comTEST(ArgsTest, AcceptsDecreasingTemplateArgs) { 13813481Sgiacomo.travaglini@arm.com const tuple<short, int, long> t(4, 5, 6L); // NOLINT 13913481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, (Args<2, 0>(Gt()))); 14013481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, Not(Args<2, 1>(Lt()))); 14113481Sgiacomo.travaglini@arm.com} 14213481Sgiacomo.travaglini@arm.com 14313481Sgiacomo.travaglini@arm.com// The MATCHER*() macros trigger warning C4100 (unreferenced formal 14413481Sgiacomo.travaglini@arm.com// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in 14513481Sgiacomo.travaglini@arm.com// the macro definition, as the warnings are generated when the macro 14613481Sgiacomo.travaglini@arm.com// is expanded and macro expansion cannot contain #pragma. Therefore 14713481Sgiacomo.travaglini@arm.com// we suppress them here. 14813481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER 14913481Sgiacomo.travaglini@arm.com# pragma warning(push) 15013481Sgiacomo.travaglini@arm.com# pragma warning(disable:4100) 15113481Sgiacomo.travaglini@arm.com#endif 15213481Sgiacomo.travaglini@arm.com 15313481Sgiacomo.travaglini@arm.comMATCHER(SumIsZero, "") { 15413481Sgiacomo.travaglini@arm.com return get<0>(arg) + get<1>(arg) + get<2>(arg) == 0; 15513481Sgiacomo.travaglini@arm.com} 15613481Sgiacomo.travaglini@arm.com 15713481Sgiacomo.travaglini@arm.comTEST(ArgsTest, AcceptsMoreTemplateArgsThanArityOfOriginalTuple) { 15813481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(-1, 2), (Args<0, 0, 1>(SumIsZero()))); 15913481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(1, 2), Not(Args<0, 0, 1>(SumIsZero()))); 16013481Sgiacomo.travaglini@arm.com} 16113481Sgiacomo.travaglini@arm.com 16213481Sgiacomo.travaglini@arm.comTEST(ArgsTest, CanBeNested) { 16313481Sgiacomo.travaglini@arm.com const tuple<short, int, long, int> t(4, 5, 6L, 6); // NOLINT 16413481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, (Args<1, 2, 3>(Args<1, 2>(Eq())))); 16513481Sgiacomo.travaglini@arm.com EXPECT_THAT(t, (Args<0, 1, 3>(Args<0, 2>(Lt())))); 16613481Sgiacomo.travaglini@arm.com} 16713481Sgiacomo.travaglini@arm.com 16813481Sgiacomo.travaglini@arm.comTEST(ArgsTest, CanMatchTupleByValue) { 16913481Sgiacomo.travaglini@arm.com typedef tuple<char, int, int> Tuple3; 17013481Sgiacomo.travaglini@arm.com const Matcher<Tuple3> m = Args<1, 2>(Lt()); 17113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple3('a', 1, 2))); 17213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple3('b', 2, 2))); 17313481Sgiacomo.travaglini@arm.com} 17413481Sgiacomo.travaglini@arm.com 17513481Sgiacomo.travaglini@arm.comTEST(ArgsTest, CanMatchTupleByReference) { 17613481Sgiacomo.travaglini@arm.com typedef tuple<char, char, int> Tuple3; 17713481Sgiacomo.travaglini@arm.com const Matcher<const Tuple3&> m = Args<0, 1>(Lt()); 17813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(Tuple3('a', 'b', 2))); 17913481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(Tuple3('b', 'b', 2))); 18013481Sgiacomo.travaglini@arm.com} 18113481Sgiacomo.travaglini@arm.com 18213481Sgiacomo.travaglini@arm.com// Validates that arg is printed as str. 18313481Sgiacomo.travaglini@arm.comMATCHER_P(PrintsAs, str, "") { 18413481Sgiacomo.travaglini@arm.com return testing::PrintToString(arg) == str; 18513481Sgiacomo.travaglini@arm.com} 18613481Sgiacomo.travaglini@arm.com 18713481Sgiacomo.travaglini@arm.comTEST(ArgsTest, AcceptsTenTemplateArgs) { 18813481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(0, 1L, 2, 3L, 4, 5, 6, 7, 8, 9), 18913481Sgiacomo.travaglini@arm.com (Args<9, 8, 7, 6, 5, 4, 3, 2, 1, 0>( 19013481Sgiacomo.travaglini@arm.com PrintsAs("(9, 8, 7, 6, 5, 4, 3, 2, 1, 0)")))); 19113481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(0, 1L, 2, 3L, 4, 5, 6, 7, 8, 9), 19213481Sgiacomo.travaglini@arm.com Not(Args<9, 8, 7, 6, 5, 4, 3, 2, 1, 0>( 19313481Sgiacomo.travaglini@arm.com PrintsAs("(0, 8, 7, 6, 5, 4, 3, 2, 1, 0)")))); 19413481Sgiacomo.travaglini@arm.com} 19513481Sgiacomo.travaglini@arm.com 19613481Sgiacomo.travaglini@arm.comTEST(ArgsTest, DescirbesSelfCorrectly) { 19713481Sgiacomo.travaglini@arm.com const Matcher<tuple<int, bool, char> > m = Args<2, 0>(Lt()); 19813481Sgiacomo.travaglini@arm.com EXPECT_EQ("are a tuple whose fields (#2, #0) are a pair where " 19913481Sgiacomo.travaglini@arm.com "the first < the second", 20013481Sgiacomo.travaglini@arm.com Describe(m)); 20113481Sgiacomo.travaglini@arm.com} 20213481Sgiacomo.travaglini@arm.com 20313481Sgiacomo.travaglini@arm.comTEST(ArgsTest, DescirbesNestedArgsCorrectly) { 20413481Sgiacomo.travaglini@arm.com const Matcher<const tuple<int, bool, char, int>&> m = 20513481Sgiacomo.travaglini@arm.com Args<0, 2, 3>(Args<2, 0>(Lt())); 20613481Sgiacomo.travaglini@arm.com EXPECT_EQ("are a tuple whose fields (#0, #2, #3) are a tuple " 20713481Sgiacomo.travaglini@arm.com "whose fields (#2, #0) are a pair where the first < the second", 20813481Sgiacomo.travaglini@arm.com Describe(m)); 20913481Sgiacomo.travaglini@arm.com} 21013481Sgiacomo.travaglini@arm.com 21113481Sgiacomo.travaglini@arm.comTEST(ArgsTest, DescribesNegationCorrectly) { 21213481Sgiacomo.travaglini@arm.com const Matcher<tuple<int, char> > m = Args<1, 0>(Gt()); 21313481Sgiacomo.travaglini@arm.com EXPECT_EQ("are a tuple whose fields (#1, #0) aren't a pair " 21413481Sgiacomo.travaglini@arm.com "where the first > the second", 21513481Sgiacomo.travaglini@arm.com DescribeNegation(m)); 21613481Sgiacomo.travaglini@arm.com} 21713481Sgiacomo.travaglini@arm.com 21813481Sgiacomo.travaglini@arm.comTEST(ArgsTest, ExplainsMatchResultWithoutInnerExplanation) { 21913481Sgiacomo.travaglini@arm.com const Matcher<tuple<bool, int, int> > m = Args<1, 2>(Eq()); 22013481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose fields (#1, #2) are (42, 42)", 22113481Sgiacomo.travaglini@arm.com Explain(m, make_tuple(false, 42, 42))); 22213481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose fields (#1, #2) are (42, 43)", 22313481Sgiacomo.travaglini@arm.com Explain(m, make_tuple(false, 42, 43))); 22413481Sgiacomo.travaglini@arm.com} 22513481Sgiacomo.travaglini@arm.com 22613481Sgiacomo.travaglini@arm.com// For testing Args<>'s explanation. 22713481Sgiacomo.travaglini@arm.comclass LessThanMatcher : public MatcherInterface<tuple<char, int> > { 22813481Sgiacomo.travaglini@arm.com public: 22913481Sgiacomo.travaglini@arm.com virtual void DescribeTo(::std::ostream* os) const {} 23013481Sgiacomo.travaglini@arm.com 23113481Sgiacomo.travaglini@arm.com virtual bool MatchAndExplain(tuple<char, int> value, 23213481Sgiacomo.travaglini@arm.com MatchResultListener* listener) const { 23313481Sgiacomo.travaglini@arm.com const int diff = get<0>(value) - get<1>(value); 23413481Sgiacomo.travaglini@arm.com if (diff > 0) { 23513481Sgiacomo.travaglini@arm.com *listener << "where the first value is " << diff 23613481Sgiacomo.travaglini@arm.com << " more than the second"; 23713481Sgiacomo.travaglini@arm.com } 23813481Sgiacomo.travaglini@arm.com return diff < 0; 23913481Sgiacomo.travaglini@arm.com } 24013481Sgiacomo.travaglini@arm.com}; 24113481Sgiacomo.travaglini@arm.com 24213481Sgiacomo.travaglini@arm.comMatcher<tuple<char, int> > LessThan() { 24313481Sgiacomo.travaglini@arm.com return MakeMatcher(new LessThanMatcher); 24413481Sgiacomo.travaglini@arm.com} 24513481Sgiacomo.travaglini@arm.com 24613481Sgiacomo.travaglini@arm.comTEST(ArgsTest, ExplainsMatchResultWithInnerExplanation) { 24713481Sgiacomo.travaglini@arm.com const Matcher<tuple<char, int, int> > m = Args<0, 2>(LessThan()); 24813481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose fields (#0, #2) are ('a' (97, 0x61), 42), " 24913481Sgiacomo.travaglini@arm.com "where the first value is 55 more than the second", 25013481Sgiacomo.travaglini@arm.com Explain(m, make_tuple('a', 42, 42))); 25113481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose fields (#0, #2) are ('\\0', 43)", 25213481Sgiacomo.travaglini@arm.com Explain(m, make_tuple('\0', 42, 43))); 25313481Sgiacomo.travaglini@arm.com} 25413481Sgiacomo.travaglini@arm.com 25513481Sgiacomo.travaglini@arm.com// For testing ExplainMatchResultTo(). 25613481Sgiacomo.travaglini@arm.comclass GreaterThanMatcher : public MatcherInterface<int> { 25713481Sgiacomo.travaglini@arm.com public: 25813481Sgiacomo.travaglini@arm.com explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} 25913481Sgiacomo.travaglini@arm.com 26013481Sgiacomo.travaglini@arm.com virtual void DescribeTo(::std::ostream* os) const { 26113481Sgiacomo.travaglini@arm.com *os << "is greater than " << rhs_; 26213481Sgiacomo.travaglini@arm.com } 26313481Sgiacomo.travaglini@arm.com 26413481Sgiacomo.travaglini@arm.com virtual bool MatchAndExplain(int lhs, 26513481Sgiacomo.travaglini@arm.com MatchResultListener* listener) const { 26613481Sgiacomo.travaglini@arm.com const int diff = lhs - rhs_; 26713481Sgiacomo.travaglini@arm.com if (diff > 0) { 26813481Sgiacomo.travaglini@arm.com *listener << "which is " << diff << " more than " << rhs_; 26913481Sgiacomo.travaglini@arm.com } else if (diff == 0) { 27013481Sgiacomo.travaglini@arm.com *listener << "which is the same as " << rhs_; 27113481Sgiacomo.travaglini@arm.com } else { 27213481Sgiacomo.travaglini@arm.com *listener << "which is " << -diff << " less than " << rhs_; 27313481Sgiacomo.travaglini@arm.com } 27413481Sgiacomo.travaglini@arm.com 27513481Sgiacomo.travaglini@arm.com return lhs > rhs_; 27613481Sgiacomo.travaglini@arm.com } 27713481Sgiacomo.travaglini@arm.com 27813481Sgiacomo.travaglini@arm.com private: 27913481Sgiacomo.travaglini@arm.com int rhs_; 28013481Sgiacomo.travaglini@arm.com}; 28113481Sgiacomo.travaglini@arm.com 28213481Sgiacomo.travaglini@arm.comMatcher<int> GreaterThan(int n) { 28313481Sgiacomo.travaglini@arm.com return MakeMatcher(new GreaterThanMatcher(n)); 28413481Sgiacomo.travaglini@arm.com} 28513481Sgiacomo.travaglini@arm.com 28613481Sgiacomo.travaglini@arm.com// Tests for ElementsAre(). 28713481Sgiacomo.travaglini@arm.com 28813481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanDescribeExpectingNoElement) { 28913481Sgiacomo.travaglini@arm.com Matcher<const vector<int>&> m = ElementsAre(); 29013481Sgiacomo.travaglini@arm.com EXPECT_EQ("is empty", Describe(m)); 29113481Sgiacomo.travaglini@arm.com} 29213481Sgiacomo.travaglini@arm.com 29313481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanDescribeExpectingOneElement) { 29413481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = ElementsAre(Gt(5)); 29513481Sgiacomo.travaglini@arm.com EXPECT_EQ("has 1 element that is > 5", Describe(m)); 29613481Sgiacomo.travaglini@arm.com} 29713481Sgiacomo.travaglini@arm.com 29813481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanDescribeExpectingManyElements) { 29913481Sgiacomo.travaglini@arm.com Matcher<list<string> > m = ElementsAre(StrEq("one"), "two"); 30013481Sgiacomo.travaglini@arm.com EXPECT_EQ("has 2 elements where\n" 30113481Sgiacomo.travaglini@arm.com "element #0 is equal to \"one\",\n" 30213481Sgiacomo.travaglini@arm.com "element #1 is equal to \"two\"", Describe(m)); 30313481Sgiacomo.travaglini@arm.com} 30413481Sgiacomo.travaglini@arm.com 30513481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanDescribeNegationOfExpectingNoElement) { 30613481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = ElementsAre(); 30713481Sgiacomo.travaglini@arm.com EXPECT_EQ("isn't empty", DescribeNegation(m)); 30813481Sgiacomo.travaglini@arm.com} 30913481Sgiacomo.travaglini@arm.com 31013481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanDescribeNegationOfExpectingOneElment) { 31113481Sgiacomo.travaglini@arm.com Matcher<const list<int>& > m = ElementsAre(Gt(5)); 31213481Sgiacomo.travaglini@arm.com EXPECT_EQ("doesn't have 1 element, or\n" 31313481Sgiacomo.travaglini@arm.com "element #0 isn't > 5", DescribeNegation(m)); 31413481Sgiacomo.travaglini@arm.com} 31513481Sgiacomo.travaglini@arm.com 31613481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanDescribeNegationOfExpectingManyElements) { 31713481Sgiacomo.travaglini@arm.com Matcher<const list<string>& > m = ElementsAre("one", "two"); 31813481Sgiacomo.travaglini@arm.com EXPECT_EQ("doesn't have 2 elements, or\n" 31913481Sgiacomo.travaglini@arm.com "element #0 isn't equal to \"one\", or\n" 32013481Sgiacomo.travaglini@arm.com "element #1 isn't equal to \"two\"", DescribeNegation(m)); 32113481Sgiacomo.travaglini@arm.com} 32213481Sgiacomo.travaglini@arm.com 32313481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, DoesNotExplainTrivialMatch) { 32413481Sgiacomo.travaglini@arm.com Matcher<const list<int>& > m = ElementsAre(1, Ne(2)); 32513481Sgiacomo.travaglini@arm.com 32613481Sgiacomo.travaglini@arm.com list<int> test_list; 32713481Sgiacomo.travaglini@arm.com test_list.push_back(1); 32813481Sgiacomo.travaglini@arm.com test_list.push_back(3); 32913481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, test_list)); // No need to explain anything. 33013481Sgiacomo.travaglini@arm.com} 33113481Sgiacomo.travaglini@arm.com 33213481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, ExplainsNonTrivialMatch) { 33313481Sgiacomo.travaglini@arm.com Matcher<const vector<int>& > m = 33413481Sgiacomo.travaglini@arm.com ElementsAre(GreaterThan(1), 0, GreaterThan(2)); 33513481Sgiacomo.travaglini@arm.com 33613481Sgiacomo.travaglini@arm.com const int a[] = { 10, 0, 100 }; 33713481Sgiacomo.travaglini@arm.com vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 33813481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose element #0 matches, which is 9 more than 1,\n" 33913481Sgiacomo.travaglini@arm.com "and whose element #2 matches, which is 98 more than 2", 34013481Sgiacomo.travaglini@arm.com Explain(m, test_vector)); 34113481Sgiacomo.travaglini@arm.com} 34213481Sgiacomo.travaglini@arm.com 34313481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanExplainMismatchWrongSize) { 34413481Sgiacomo.travaglini@arm.com Matcher<const list<int>& > m = ElementsAre(1, 3); 34513481Sgiacomo.travaglini@arm.com 34613481Sgiacomo.travaglini@arm.com list<int> test_list; 34713481Sgiacomo.travaglini@arm.com // No need to explain when the container is empty. 34813481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, test_list)); 34913481Sgiacomo.travaglini@arm.com 35013481Sgiacomo.travaglini@arm.com test_list.push_back(1); 35113481Sgiacomo.travaglini@arm.com EXPECT_EQ("which has 1 element", Explain(m, test_list)); 35213481Sgiacomo.travaglini@arm.com} 35313481Sgiacomo.travaglini@arm.com 35413481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, CanExplainMismatchRightSize) { 35513481Sgiacomo.travaglini@arm.com Matcher<const vector<int>& > m = ElementsAre(1, GreaterThan(5)); 35613481Sgiacomo.travaglini@arm.com 35713481Sgiacomo.travaglini@arm.com vector<int> v; 35813481Sgiacomo.travaglini@arm.com v.push_back(2); 35913481Sgiacomo.travaglini@arm.com v.push_back(1); 36013481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose element #0 doesn't match", Explain(m, v)); 36113481Sgiacomo.travaglini@arm.com 36213481Sgiacomo.travaglini@arm.com v[0] = 1; 36313481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose element #1 doesn't match, which is 4 less than 5", 36413481Sgiacomo.travaglini@arm.com Explain(m, v)); 36513481Sgiacomo.travaglini@arm.com} 36613481Sgiacomo.travaglini@arm.com 36713481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesOneElementVector) { 36813481Sgiacomo.travaglini@arm.com vector<string> test_vector; 36913481Sgiacomo.travaglini@arm.com test_vector.push_back("test string"); 37013481Sgiacomo.travaglini@arm.com 37113481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAre(StrEq("test string"))); 37213481Sgiacomo.travaglini@arm.com} 37313481Sgiacomo.travaglini@arm.com 37413481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesOneElementList) { 37513481Sgiacomo.travaglini@arm.com list<string> test_list; 37613481Sgiacomo.travaglini@arm.com test_list.push_back("test string"); 37713481Sgiacomo.travaglini@arm.com 37813481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_list, ElementsAre("test string")); 37913481Sgiacomo.travaglini@arm.com} 38013481Sgiacomo.travaglini@arm.com 38113481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesThreeElementVector) { 38213481Sgiacomo.travaglini@arm.com vector<string> test_vector; 38313481Sgiacomo.travaglini@arm.com test_vector.push_back("one"); 38413481Sgiacomo.travaglini@arm.com test_vector.push_back("two"); 38513481Sgiacomo.travaglini@arm.com test_vector.push_back("three"); 38613481Sgiacomo.travaglini@arm.com 38713481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAre("one", StrEq("two"), _)); 38813481Sgiacomo.travaglini@arm.com} 38913481Sgiacomo.travaglini@arm.com 39013481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesOneElementEqMatcher) { 39113481Sgiacomo.travaglini@arm.com vector<int> test_vector; 39213481Sgiacomo.travaglini@arm.com test_vector.push_back(4); 39313481Sgiacomo.travaglini@arm.com 39413481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAre(Eq(4))); 39513481Sgiacomo.travaglini@arm.com} 39613481Sgiacomo.travaglini@arm.com 39713481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesOneElementAnyMatcher) { 39813481Sgiacomo.travaglini@arm.com vector<int> test_vector; 39913481Sgiacomo.travaglini@arm.com test_vector.push_back(4); 40013481Sgiacomo.travaglini@arm.com 40113481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAre(_)); 40213481Sgiacomo.travaglini@arm.com} 40313481Sgiacomo.travaglini@arm.com 40413481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesOneElementValue) { 40513481Sgiacomo.travaglini@arm.com vector<int> test_vector; 40613481Sgiacomo.travaglini@arm.com test_vector.push_back(4); 40713481Sgiacomo.travaglini@arm.com 40813481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAre(4)); 40913481Sgiacomo.travaglini@arm.com} 41013481Sgiacomo.travaglini@arm.com 41113481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesThreeElementsMixedMatchers) { 41213481Sgiacomo.travaglini@arm.com vector<int> test_vector; 41313481Sgiacomo.travaglini@arm.com test_vector.push_back(1); 41413481Sgiacomo.travaglini@arm.com test_vector.push_back(2); 41513481Sgiacomo.travaglini@arm.com test_vector.push_back(3); 41613481Sgiacomo.travaglini@arm.com 41713481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAre(1, Eq(2), _)); 41813481Sgiacomo.travaglini@arm.com} 41913481Sgiacomo.travaglini@arm.com 42013481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MatchesTenElementVector) { 42113481Sgiacomo.travaglini@arm.com const int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 42213481Sgiacomo.travaglini@arm.com vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 42313481Sgiacomo.travaglini@arm.com 42413481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, 42513481Sgiacomo.travaglini@arm.com // The element list can contain values and/or matchers 42613481Sgiacomo.travaglini@arm.com // of different types. 42713481Sgiacomo.travaglini@arm.com ElementsAre(0, Ge(0), _, 3, 4, Ne(2), Eq(6), 7, 8, _)); 42813481Sgiacomo.travaglini@arm.com} 42913481Sgiacomo.travaglini@arm.com 43013481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, DoesNotMatchWrongSize) { 43113481Sgiacomo.travaglini@arm.com vector<string> test_vector; 43213481Sgiacomo.travaglini@arm.com test_vector.push_back("test string"); 43313481Sgiacomo.travaglini@arm.com test_vector.push_back("test string"); 43413481Sgiacomo.travaglini@arm.com 43513481Sgiacomo.travaglini@arm.com Matcher<vector<string> > m = ElementsAre(StrEq("test string")); 43613481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_vector)); 43713481Sgiacomo.travaglini@arm.com} 43813481Sgiacomo.travaglini@arm.com 43913481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, DoesNotMatchWrongValue) { 44013481Sgiacomo.travaglini@arm.com vector<string> test_vector; 44113481Sgiacomo.travaglini@arm.com test_vector.push_back("other string"); 44213481Sgiacomo.travaglini@arm.com 44313481Sgiacomo.travaglini@arm.com Matcher<vector<string> > m = ElementsAre(StrEq("test string")); 44413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_vector)); 44513481Sgiacomo.travaglini@arm.com} 44613481Sgiacomo.travaglini@arm.com 44713481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, DoesNotMatchWrongOrder) { 44813481Sgiacomo.travaglini@arm.com vector<string> test_vector; 44913481Sgiacomo.travaglini@arm.com test_vector.push_back("one"); 45013481Sgiacomo.travaglini@arm.com test_vector.push_back("three"); 45113481Sgiacomo.travaglini@arm.com test_vector.push_back("two"); 45213481Sgiacomo.travaglini@arm.com 45313481Sgiacomo.travaglini@arm.com Matcher<vector<string> > m = ElementsAre( 45413481Sgiacomo.travaglini@arm.com StrEq("one"), StrEq("two"), StrEq("three")); 45513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(test_vector)); 45613481Sgiacomo.travaglini@arm.com} 45713481Sgiacomo.travaglini@arm.com 45813481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, WorksForNestedContainer) { 45913481Sgiacomo.travaglini@arm.com const char* strings[] = { 46013481Sgiacomo.travaglini@arm.com "Hi", 46113481Sgiacomo.travaglini@arm.com "world" 46213481Sgiacomo.travaglini@arm.com }; 46313481Sgiacomo.travaglini@arm.com 46413481Sgiacomo.travaglini@arm.com vector<list<char> > nested; 46513481Sgiacomo.travaglini@arm.com for (size_t i = 0; i < GTEST_ARRAY_SIZE_(strings); i++) { 46613481Sgiacomo.travaglini@arm.com nested.push_back(list<char>(strings[i], strings[i] + strlen(strings[i]))); 46713481Sgiacomo.travaglini@arm.com } 46813481Sgiacomo.travaglini@arm.com 46913481Sgiacomo.travaglini@arm.com EXPECT_THAT(nested, ElementsAre(ElementsAre('H', Ne('e')), 47013481Sgiacomo.travaglini@arm.com ElementsAre('w', 'o', _, _, 'd'))); 47113481Sgiacomo.travaglini@arm.com EXPECT_THAT(nested, Not(ElementsAre(ElementsAre('H', 'e'), 47213481Sgiacomo.travaglini@arm.com ElementsAre('w', 'o', _, _, 'd')))); 47313481Sgiacomo.travaglini@arm.com} 47413481Sgiacomo.travaglini@arm.com 47513481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, WorksWithByRefElementMatchers) { 47613481Sgiacomo.travaglini@arm.com int a[] = { 0, 1, 2 }; 47713481Sgiacomo.travaglini@arm.com vector<int> v(a, a + GTEST_ARRAY_SIZE_(a)); 47813481Sgiacomo.travaglini@arm.com 47913481Sgiacomo.travaglini@arm.com EXPECT_THAT(v, ElementsAre(Ref(v[0]), Ref(v[1]), Ref(v[2]))); 48013481Sgiacomo.travaglini@arm.com EXPECT_THAT(v, Not(ElementsAre(Ref(v[0]), Ref(v[1]), Ref(a[2])))); 48113481Sgiacomo.travaglini@arm.com} 48213481Sgiacomo.travaglini@arm.com 48313481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, WorksWithContainerPointerUsingPointee) { 48413481Sgiacomo.travaglini@arm.com int a[] = { 0, 1, 2 }; 48513481Sgiacomo.travaglini@arm.com vector<int> v(a, a + GTEST_ARRAY_SIZE_(a)); 48613481Sgiacomo.travaglini@arm.com 48713481Sgiacomo.travaglini@arm.com EXPECT_THAT(&v, Pointee(ElementsAre(0, 1, _))); 48813481Sgiacomo.travaglini@arm.com EXPECT_THAT(&v, Not(Pointee(ElementsAre(0, _, 3)))); 48913481Sgiacomo.travaglini@arm.com} 49013481Sgiacomo.travaglini@arm.com 49113481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, WorksWithNativeArrayPassedByReference) { 49213481Sgiacomo.travaglini@arm.com int array[] = { 0, 1, 2 }; 49313481Sgiacomo.travaglini@arm.com EXPECT_THAT(array, ElementsAre(0, 1, _)); 49413481Sgiacomo.travaglini@arm.com EXPECT_THAT(array, Not(ElementsAre(1, _, _))); 49513481Sgiacomo.travaglini@arm.com EXPECT_THAT(array, Not(ElementsAre(0, _))); 49613481Sgiacomo.travaglini@arm.com} 49713481Sgiacomo.travaglini@arm.com 49813481Sgiacomo.travaglini@arm.comclass NativeArrayPassedAsPointerAndSize { 49913481Sgiacomo.travaglini@arm.com public: 50013481Sgiacomo.travaglini@arm.com NativeArrayPassedAsPointerAndSize() {} 50113481Sgiacomo.travaglini@arm.com 50213481Sgiacomo.travaglini@arm.com MOCK_METHOD2(Helper, void(int* array, int size)); 50313481Sgiacomo.travaglini@arm.com 50413481Sgiacomo.travaglini@arm.com private: 50513481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(NativeArrayPassedAsPointerAndSize); 50613481Sgiacomo.travaglini@arm.com}; 50713481Sgiacomo.travaglini@arm.com 50813481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, WorksWithNativeArrayPassedAsPointerAndSize) { 50913481Sgiacomo.travaglini@arm.com int array[] = { 0, 1 }; 51013481Sgiacomo.travaglini@arm.com ::testing::tuple<int*, size_t> array_as_tuple(array, 2); 51113481Sgiacomo.travaglini@arm.com EXPECT_THAT(array_as_tuple, ElementsAre(0, 1)); 51213481Sgiacomo.travaglini@arm.com EXPECT_THAT(array_as_tuple, Not(ElementsAre(0))); 51313481Sgiacomo.travaglini@arm.com 51413481Sgiacomo.travaglini@arm.com NativeArrayPassedAsPointerAndSize helper; 51513481Sgiacomo.travaglini@arm.com EXPECT_CALL(helper, Helper(_, _)) 51613481Sgiacomo.travaglini@arm.com .With(ElementsAre(0, 1)); 51713481Sgiacomo.travaglini@arm.com helper.Helper(array, 2); 51813481Sgiacomo.travaglini@arm.com} 51913481Sgiacomo.travaglini@arm.com 52013481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, WorksWithTwoDimensionalNativeArray) { 52113481Sgiacomo.travaglini@arm.com const char a2[][3] = { "hi", "lo" }; 52213481Sgiacomo.travaglini@arm.com EXPECT_THAT(a2, ElementsAre(ElementsAre('h', 'i', '\0'), 52313481Sgiacomo.travaglini@arm.com ElementsAre('l', 'o', '\0'))); 52413481Sgiacomo.travaglini@arm.com EXPECT_THAT(a2, ElementsAre(StrEq("hi"), StrEq("lo"))); 52513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a2, ElementsAre(Not(ElementsAre('h', 'o', '\0')), 52613481Sgiacomo.travaglini@arm.com ElementsAre('l', 'o', '\0'))); 52713481Sgiacomo.travaglini@arm.com} 52813481Sgiacomo.travaglini@arm.com 52913481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, AcceptsStringLiteral) { 53013481Sgiacomo.travaglini@arm.com string array[] = { "hi", "one", "two" }; 53113481Sgiacomo.travaglini@arm.com EXPECT_THAT(array, ElementsAre("hi", "one", "two")); 53213481Sgiacomo.travaglini@arm.com EXPECT_THAT(array, Not(ElementsAre("hi", "one", "too"))); 53313481Sgiacomo.travaglini@arm.com} 53413481Sgiacomo.travaglini@arm.com 53513481Sgiacomo.travaglini@arm.com#ifndef _MSC_VER 53613481Sgiacomo.travaglini@arm.com 53713481Sgiacomo.travaglini@arm.com// The following test passes a value of type const char[] to a 53813481Sgiacomo.travaglini@arm.com// function template that expects const T&. Some versions of MSVC 53913481Sgiacomo.travaglini@arm.com// generates a compiler error C2665 for that. We believe it's a bug 54013481Sgiacomo.travaglini@arm.com// in MSVC. Therefore this test is #if-ed out for MSVC. 54113481Sgiacomo.travaglini@arm.com 54213481Sgiacomo.travaglini@arm.com// Declared here with the size unknown. Defined AFTER the following test. 54313481Sgiacomo.travaglini@arm.comextern const char kHi[]; 54413481Sgiacomo.travaglini@arm.com 54513481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, AcceptsArrayWithUnknownSize) { 54613481Sgiacomo.travaglini@arm.com // The size of kHi is not known in this test, but ElementsAre() should 54713481Sgiacomo.travaglini@arm.com // still accept it. 54813481Sgiacomo.travaglini@arm.com 54913481Sgiacomo.travaglini@arm.com string array1[] = { "hi" }; 55013481Sgiacomo.travaglini@arm.com EXPECT_THAT(array1, ElementsAre(kHi)); 55113481Sgiacomo.travaglini@arm.com 55213481Sgiacomo.travaglini@arm.com string array2[] = { "ho" }; 55313481Sgiacomo.travaglini@arm.com EXPECT_THAT(array2, Not(ElementsAre(kHi))); 55413481Sgiacomo.travaglini@arm.com} 55513481Sgiacomo.travaglini@arm.com 55613481Sgiacomo.travaglini@arm.comconst char kHi[] = "hi"; 55713481Sgiacomo.travaglini@arm.com 55813481Sgiacomo.travaglini@arm.com#endif // _MSC_VER 55913481Sgiacomo.travaglini@arm.com 56013481Sgiacomo.travaglini@arm.comTEST(ElementsAreTest, MakesCopyOfArguments) { 56113481Sgiacomo.travaglini@arm.com int x = 1; 56213481Sgiacomo.travaglini@arm.com int y = 2; 56313481Sgiacomo.travaglini@arm.com // This should make a copy of x and y. 56413481Sgiacomo.travaglini@arm.com ::testing::internal::ElementsAreMatcher<testing::tuple<int, int> > 56513481Sgiacomo.travaglini@arm.com polymorphic_matcher = ElementsAre(x, y); 56613481Sgiacomo.travaglini@arm.com // Changing x and y now shouldn't affect the meaning of the above matcher. 56713481Sgiacomo.travaglini@arm.com x = y = 0; 56813481Sgiacomo.travaglini@arm.com const int array1[] = { 1, 2 }; 56913481Sgiacomo.travaglini@arm.com EXPECT_THAT(array1, polymorphic_matcher); 57013481Sgiacomo.travaglini@arm.com const int array2[] = { 0, 0 }; 57113481Sgiacomo.travaglini@arm.com EXPECT_THAT(array2, Not(polymorphic_matcher)); 57213481Sgiacomo.travaglini@arm.com} 57313481Sgiacomo.travaglini@arm.com 57413481Sgiacomo.travaglini@arm.com 57513481Sgiacomo.travaglini@arm.com// Tests for ElementsAreArray(). Since ElementsAreArray() shares most 57613481Sgiacomo.travaglini@arm.com// of the implementation with ElementsAre(), we don't test it as 57713481Sgiacomo.travaglini@arm.com// thoroughly here. 57813481Sgiacomo.travaglini@arm.com 57913481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, CanBeCreatedWithValueArray) { 58013481Sgiacomo.travaglini@arm.com const int a[] = { 1, 2, 3 }; 58113481Sgiacomo.travaglini@arm.com 58213481Sgiacomo.travaglini@arm.com vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 58313481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(a)); 58413481Sgiacomo.travaglini@arm.com 58513481Sgiacomo.travaglini@arm.com test_vector[2] = 0; 58613481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(ElementsAreArray(a))); 58713481Sgiacomo.travaglini@arm.com} 58813481Sgiacomo.travaglini@arm.com 58913481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, CanBeCreatedWithArraySize) { 59013481Sgiacomo.travaglini@arm.com const char* a[] = { "one", "two", "three" }; 59113481Sgiacomo.travaglini@arm.com 59213481Sgiacomo.travaglini@arm.com vector<string> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 59313481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(a, GTEST_ARRAY_SIZE_(a))); 59413481Sgiacomo.travaglini@arm.com 59513481Sgiacomo.travaglini@arm.com const char** p = a; 59613481Sgiacomo.travaglini@arm.com test_vector[0] = "1"; 59713481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(ElementsAreArray(p, GTEST_ARRAY_SIZE_(a)))); 59813481Sgiacomo.travaglini@arm.com} 59913481Sgiacomo.travaglini@arm.com 60013481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, CanBeCreatedWithoutArraySize) { 60113481Sgiacomo.travaglini@arm.com const char* a[] = { "one", "two", "three" }; 60213481Sgiacomo.travaglini@arm.com 60313481Sgiacomo.travaglini@arm.com vector<string> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 60413481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(a)); 60513481Sgiacomo.travaglini@arm.com 60613481Sgiacomo.travaglini@arm.com test_vector[0] = "1"; 60713481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(ElementsAreArray(a))); 60813481Sgiacomo.travaglini@arm.com} 60913481Sgiacomo.travaglini@arm.com 61013481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, CanBeCreatedWithMatcherArray) { 61113481Sgiacomo.travaglini@arm.com const Matcher<string> kMatcherArray[] = 61213481Sgiacomo.travaglini@arm.com { StrEq("one"), StrEq("two"), StrEq("three") }; 61313481Sgiacomo.travaglini@arm.com 61413481Sgiacomo.travaglini@arm.com vector<string> test_vector; 61513481Sgiacomo.travaglini@arm.com test_vector.push_back("one"); 61613481Sgiacomo.travaglini@arm.com test_vector.push_back("two"); 61713481Sgiacomo.travaglini@arm.com test_vector.push_back("three"); 61813481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(kMatcherArray)); 61913481Sgiacomo.travaglini@arm.com 62013481Sgiacomo.travaglini@arm.com test_vector.push_back("three"); 62113481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(ElementsAreArray(kMatcherArray))); 62213481Sgiacomo.travaglini@arm.com} 62313481Sgiacomo.travaglini@arm.com 62413481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, CanBeCreatedWithVector) { 62513481Sgiacomo.travaglini@arm.com const int a[] = { 1, 2, 3 }; 62613481Sgiacomo.travaglini@arm.com vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 62713481Sgiacomo.travaglini@arm.com const vector<int> expected(a, a + GTEST_ARRAY_SIZE_(a)); 62813481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(expected)); 62913481Sgiacomo.travaglini@arm.com test_vector.push_back(4); 63013481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(ElementsAreArray(expected))); 63113481Sgiacomo.travaglini@arm.com} 63213481Sgiacomo.travaglini@arm.com 63313481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_INITIALIZER_LIST_ 63413481Sgiacomo.travaglini@arm.com 63513481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, TakesInitializerList) { 63613481Sgiacomo.travaglini@arm.com const int a[5] = { 1, 2, 3, 4, 5 }; 63713481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, ElementsAreArray({ 1, 2, 3, 4, 5 })); 63813481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(ElementsAreArray({ 1, 2, 3, 5, 4 }))); 63913481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(ElementsAreArray({ 1, 2, 3, 4, 6 }))); 64013481Sgiacomo.travaglini@arm.com} 64113481Sgiacomo.travaglini@arm.com 64213481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, TakesInitializerListOfCStrings) { 64313481Sgiacomo.travaglini@arm.com const string a[5] = { "a", "b", "c", "d", "e" }; 64413481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, ElementsAreArray({ "a", "b", "c", "d", "e" })); 64513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(ElementsAreArray({ "a", "b", "c", "e", "d" }))); 64613481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(ElementsAreArray({ "a", "b", "c", "d", "ef" }))); 64713481Sgiacomo.travaglini@arm.com} 64813481Sgiacomo.travaglini@arm.com 64913481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, TakesInitializerListOfSameTypedMatchers) { 65013481Sgiacomo.travaglini@arm.com const int a[5] = { 1, 2, 3, 4, 5 }; 65113481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, ElementsAreArray( 65213481Sgiacomo.travaglini@arm.com { Eq(1), Eq(2), Eq(3), Eq(4), Eq(5) })); 65313481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(ElementsAreArray( 65413481Sgiacomo.travaglini@arm.com { Eq(1), Eq(2), Eq(3), Eq(4), Eq(6) }))); 65513481Sgiacomo.travaglini@arm.com} 65613481Sgiacomo.travaglini@arm.com 65713481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, 65813481Sgiacomo.travaglini@arm.com TakesInitializerListOfDifferentTypedMatchers) { 65913481Sgiacomo.travaglini@arm.com const int a[5] = { 1, 2, 3, 4, 5 }; 66013481Sgiacomo.travaglini@arm.com // The compiler cannot infer the type of the initializer list if its 66113481Sgiacomo.travaglini@arm.com // elements have different types. We must explicitly specify the 66213481Sgiacomo.travaglini@arm.com // unified element type in this case. 66313481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, ElementsAreArray<Matcher<int> >( 66413481Sgiacomo.travaglini@arm.com { Eq(1), Ne(-2), Ge(3), Le(4), Eq(5) })); 66513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(ElementsAreArray<Matcher<int> >( 66613481Sgiacomo.travaglini@arm.com { Eq(1), Ne(-2), Ge(3), Le(4), Eq(6) }))); 66713481Sgiacomo.travaglini@arm.com} 66813481Sgiacomo.travaglini@arm.com 66913481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_STD_INITIALIZER_LIST_ 67013481Sgiacomo.travaglini@arm.com 67113481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, CanBeCreatedWithMatcherVector) { 67213481Sgiacomo.travaglini@arm.com const int a[] = { 1, 2, 3 }; 67313481Sgiacomo.travaglini@arm.com const Matcher<int> kMatchers[] = { Eq(1), Eq(2), Eq(3) }; 67413481Sgiacomo.travaglini@arm.com vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 67513481Sgiacomo.travaglini@arm.com const vector<Matcher<int> > expected( 67613481Sgiacomo.travaglini@arm.com kMatchers, kMatchers + GTEST_ARRAY_SIZE_(kMatchers)); 67713481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(expected)); 67813481Sgiacomo.travaglini@arm.com test_vector.push_back(4); 67913481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(ElementsAreArray(expected))); 68013481Sgiacomo.travaglini@arm.com} 68113481Sgiacomo.travaglini@arm.com 68213481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, CanBeCreatedWithIteratorRange) { 68313481Sgiacomo.travaglini@arm.com const int a[] = { 1, 2, 3 }; 68413481Sgiacomo.travaglini@arm.com const vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 68513481Sgiacomo.travaglini@arm.com const vector<int> expected(a, a + GTEST_ARRAY_SIZE_(a)); 68613481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(expected.begin(), expected.end())); 68713481Sgiacomo.travaglini@arm.com // Pointers are iterators, too. 68813481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, ElementsAreArray(a, a + GTEST_ARRAY_SIZE_(a))); 68913481Sgiacomo.travaglini@arm.com // The empty range of NULL pointers should also be okay. 69013481Sgiacomo.travaglini@arm.com int* const null_int = NULL; 69113481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(ElementsAreArray(null_int, null_int))); 69213481Sgiacomo.travaglini@arm.com EXPECT_THAT((vector<int>()), ElementsAreArray(null_int, null_int)); 69313481Sgiacomo.travaglini@arm.com} 69413481Sgiacomo.travaglini@arm.com 69513481Sgiacomo.travaglini@arm.com// Since ElementsAre() and ElementsAreArray() share much of the 69613481Sgiacomo.travaglini@arm.com// implementation, we only do a sanity test for native arrays here. 69713481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, WorksWithNativeArray) { 69813481Sgiacomo.travaglini@arm.com ::std::string a[] = { "hi", "ho" }; 69913481Sgiacomo.travaglini@arm.com ::std::string b[] = { "hi", "ho" }; 70013481Sgiacomo.travaglini@arm.com 70113481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, ElementsAreArray(b)); 70213481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, ElementsAreArray(b, 2)); 70313481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(ElementsAreArray(b, 1))); 70413481Sgiacomo.travaglini@arm.com} 70513481Sgiacomo.travaglini@arm.com 70613481Sgiacomo.travaglini@arm.comTEST(ElementsAreArrayTest, SourceLifeSpan) { 70713481Sgiacomo.travaglini@arm.com const int a[] = { 1, 2, 3 }; 70813481Sgiacomo.travaglini@arm.com vector<int> test_vector(a, a + GTEST_ARRAY_SIZE_(a)); 70913481Sgiacomo.travaglini@arm.com vector<int> expect(a, a + GTEST_ARRAY_SIZE_(a)); 71013481Sgiacomo.travaglini@arm.com ElementsAreArrayMatcher<int> matcher_maker = 71113481Sgiacomo.travaglini@arm.com ElementsAreArray(expect.begin(), expect.end()); 71213481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, matcher_maker); 71313481Sgiacomo.travaglini@arm.com // Changing in place the values that initialized matcher_maker should not 71413481Sgiacomo.travaglini@arm.com // affect matcher_maker anymore. It should have made its own copy of them. 71513481Sgiacomo.travaglini@arm.com typedef vector<int>::iterator Iter; 71613481Sgiacomo.travaglini@arm.com for (Iter it = expect.begin(); it != expect.end(); ++it) { *it += 10; } 71713481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, matcher_maker); 71813481Sgiacomo.travaglini@arm.com test_vector.push_back(3); 71913481Sgiacomo.travaglini@arm.com EXPECT_THAT(test_vector, Not(matcher_maker)); 72013481Sgiacomo.travaglini@arm.com} 72113481Sgiacomo.travaglini@arm.com 72213481Sgiacomo.travaglini@arm.com// Tests for the MATCHER*() macro family. 72313481Sgiacomo.travaglini@arm.com 72413481Sgiacomo.travaglini@arm.com// Tests that a simple MATCHER() definition works. 72513481Sgiacomo.travaglini@arm.com 72613481Sgiacomo.travaglini@arm.comMATCHER(IsEven, "") { return (arg % 2) == 0; } 72713481Sgiacomo.travaglini@arm.com 72813481Sgiacomo.travaglini@arm.comTEST(MatcherMacroTest, Works) { 72913481Sgiacomo.travaglini@arm.com const Matcher<int> m = IsEven(); 73013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(6)); 73113481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(7)); 73213481Sgiacomo.travaglini@arm.com 73313481Sgiacomo.travaglini@arm.com EXPECT_EQ("is even", Describe(m)); 73413481Sgiacomo.travaglini@arm.com EXPECT_EQ("not (is even)", DescribeNegation(m)); 73513481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 6)); 73613481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 7)); 73713481Sgiacomo.travaglini@arm.com} 73813481Sgiacomo.travaglini@arm.com 73913481Sgiacomo.travaglini@arm.com// This also tests that the description string can reference 'negation'. 74013481Sgiacomo.travaglini@arm.comMATCHER(IsEven2, negation ? "is odd" : "is even") { 74113481Sgiacomo.travaglini@arm.com if ((arg % 2) == 0) { 74213481Sgiacomo.travaglini@arm.com // Verifies that we can stream to result_listener, a listener 74313481Sgiacomo.travaglini@arm.com // supplied by the MATCHER macro implicitly. 74413481Sgiacomo.travaglini@arm.com *result_listener << "OK"; 74513481Sgiacomo.travaglini@arm.com return true; 74613481Sgiacomo.travaglini@arm.com } else { 74713481Sgiacomo.travaglini@arm.com *result_listener << "% 2 == " << (arg % 2); 74813481Sgiacomo.travaglini@arm.com return false; 74913481Sgiacomo.travaglini@arm.com } 75013481Sgiacomo.travaglini@arm.com} 75113481Sgiacomo.travaglini@arm.com 75213481Sgiacomo.travaglini@arm.com// This also tests that the description string can reference matcher 75313481Sgiacomo.travaglini@arm.com// parameters. 75413481Sgiacomo.travaglini@arm.comMATCHER_P2(EqSumOf, x, y, 75513481Sgiacomo.travaglini@arm.com string(negation ? "doesn't equal" : "equals") + " the sum of " + 75613481Sgiacomo.travaglini@arm.com PrintToString(x) + " and " + PrintToString(y)) { 75713481Sgiacomo.travaglini@arm.com if (arg == (x + y)) { 75813481Sgiacomo.travaglini@arm.com *result_listener << "OK"; 75913481Sgiacomo.travaglini@arm.com return true; 76013481Sgiacomo.travaglini@arm.com } else { 76113481Sgiacomo.travaglini@arm.com // Verifies that we can stream to the underlying stream of 76213481Sgiacomo.travaglini@arm.com // result_listener. 76313481Sgiacomo.travaglini@arm.com if (result_listener->stream() != NULL) { 76413481Sgiacomo.travaglini@arm.com *result_listener->stream() << "diff == " << (x + y - arg); 76513481Sgiacomo.travaglini@arm.com } 76613481Sgiacomo.travaglini@arm.com return false; 76713481Sgiacomo.travaglini@arm.com } 76813481Sgiacomo.travaglini@arm.com} 76913481Sgiacomo.travaglini@arm.com 77013481Sgiacomo.travaglini@arm.com// Tests that the matcher description can reference 'negation' and the 77113481Sgiacomo.travaglini@arm.com// matcher parameters. 77213481Sgiacomo.travaglini@arm.comTEST(MatcherMacroTest, DescriptionCanReferenceNegationAndParameters) { 77313481Sgiacomo.travaglini@arm.com const Matcher<int> m1 = IsEven2(); 77413481Sgiacomo.travaglini@arm.com EXPECT_EQ("is even", Describe(m1)); 77513481Sgiacomo.travaglini@arm.com EXPECT_EQ("is odd", DescribeNegation(m1)); 77613481Sgiacomo.travaglini@arm.com 77713481Sgiacomo.travaglini@arm.com const Matcher<int> m2 = EqSumOf(5, 9); 77813481Sgiacomo.travaglini@arm.com EXPECT_EQ("equals the sum of 5 and 9", Describe(m2)); 77913481Sgiacomo.travaglini@arm.com EXPECT_EQ("doesn't equal the sum of 5 and 9", DescribeNegation(m2)); 78013481Sgiacomo.travaglini@arm.com} 78113481Sgiacomo.travaglini@arm.com 78213481Sgiacomo.travaglini@arm.com// Tests explaining match result in a MATCHER* macro. 78313481Sgiacomo.travaglini@arm.comTEST(MatcherMacroTest, CanExplainMatchResult) { 78413481Sgiacomo.travaglini@arm.com const Matcher<int> m1 = IsEven2(); 78513481Sgiacomo.travaglini@arm.com EXPECT_EQ("OK", Explain(m1, 4)); 78613481Sgiacomo.travaglini@arm.com EXPECT_EQ("% 2 == 1", Explain(m1, 5)); 78713481Sgiacomo.travaglini@arm.com 78813481Sgiacomo.travaglini@arm.com const Matcher<int> m2 = EqSumOf(1, 2); 78913481Sgiacomo.travaglini@arm.com EXPECT_EQ("OK", Explain(m2, 3)); 79013481Sgiacomo.travaglini@arm.com EXPECT_EQ("diff == -1", Explain(m2, 4)); 79113481Sgiacomo.travaglini@arm.com} 79213481Sgiacomo.travaglini@arm.com 79313481Sgiacomo.travaglini@arm.com// Tests that the body of MATCHER() can reference the type of the 79413481Sgiacomo.travaglini@arm.com// value being matched. 79513481Sgiacomo.travaglini@arm.com 79613481Sgiacomo.travaglini@arm.comMATCHER(IsEmptyString, "") { 79713481Sgiacomo.travaglini@arm.com StaticAssertTypeEq< ::std::string, arg_type>(); 79813481Sgiacomo.travaglini@arm.com return arg == ""; 79913481Sgiacomo.travaglini@arm.com} 80013481Sgiacomo.travaglini@arm.com 80113481Sgiacomo.travaglini@arm.comMATCHER(IsEmptyStringByRef, "") { 80213481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<const ::std::string&, arg_type>(); 80313481Sgiacomo.travaglini@arm.com return arg == ""; 80413481Sgiacomo.travaglini@arm.com} 80513481Sgiacomo.travaglini@arm.com 80613481Sgiacomo.travaglini@arm.comTEST(MatcherMacroTest, CanReferenceArgType) { 80713481Sgiacomo.travaglini@arm.com const Matcher< ::std::string> m1 = IsEmptyString(); 80813481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m1.Matches("")); 80913481Sgiacomo.travaglini@arm.com 81013481Sgiacomo.travaglini@arm.com const Matcher<const ::std::string&> m2 = IsEmptyStringByRef(); 81113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m2.Matches("")); 81213481Sgiacomo.travaglini@arm.com} 81313481Sgiacomo.travaglini@arm.com 81413481Sgiacomo.travaglini@arm.com// Tests that MATCHER() can be used in a namespace. 81513481Sgiacomo.travaglini@arm.com 81613481Sgiacomo.travaglini@arm.comnamespace matcher_test { 81713481Sgiacomo.travaglini@arm.comMATCHER(IsOdd, "") { return (arg % 2) != 0; } 81813481Sgiacomo.travaglini@arm.com} // namespace matcher_test 81913481Sgiacomo.travaglini@arm.com 82013481Sgiacomo.travaglini@arm.comTEST(MatcherMacroTest, WorksInNamespace) { 82113481Sgiacomo.travaglini@arm.com Matcher<int> m = matcher_test::IsOdd(); 82213481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(4)); 82313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(5)); 82413481Sgiacomo.travaglini@arm.com} 82513481Sgiacomo.travaglini@arm.com 82613481Sgiacomo.travaglini@arm.com// Tests that Value() can be used to compose matchers. 82713481Sgiacomo.travaglini@arm.comMATCHER(IsPositiveOdd, "") { 82813481Sgiacomo.travaglini@arm.com return Value(arg, matcher_test::IsOdd()) && arg > 0; 82913481Sgiacomo.travaglini@arm.com} 83013481Sgiacomo.travaglini@arm.com 83113481Sgiacomo.travaglini@arm.comTEST(MatcherMacroTest, CanBeComposedUsingValue) { 83213481Sgiacomo.travaglini@arm.com EXPECT_THAT(3, IsPositiveOdd()); 83313481Sgiacomo.travaglini@arm.com EXPECT_THAT(4, Not(IsPositiveOdd())); 83413481Sgiacomo.travaglini@arm.com EXPECT_THAT(-1, Not(IsPositiveOdd())); 83513481Sgiacomo.travaglini@arm.com} 83613481Sgiacomo.travaglini@arm.com 83713481Sgiacomo.travaglini@arm.com// Tests that a simple MATCHER_P() definition works. 83813481Sgiacomo.travaglini@arm.com 83913481Sgiacomo.travaglini@arm.comMATCHER_P(IsGreaterThan32And, n, "") { return arg > 32 && arg > n; } 84013481Sgiacomo.travaglini@arm.com 84113481Sgiacomo.travaglini@arm.comTEST(MatcherPMacroTest, Works) { 84213481Sgiacomo.travaglini@arm.com const Matcher<int> m = IsGreaterThan32And(5); 84313481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(36)); 84413481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(5)); 84513481Sgiacomo.travaglini@arm.com 84613481Sgiacomo.travaglini@arm.com EXPECT_EQ("is greater than 32 and 5", Describe(m)); 84713481Sgiacomo.travaglini@arm.com EXPECT_EQ("not (is greater than 32 and 5)", DescribeNegation(m)); 84813481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 36)); 84913481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 5)); 85013481Sgiacomo.travaglini@arm.com} 85113481Sgiacomo.travaglini@arm.com 85213481Sgiacomo.travaglini@arm.com// Tests that the description is calculated correctly from the matcher name. 85313481Sgiacomo.travaglini@arm.comMATCHER_P(_is_Greater_Than32and_, n, "") { return arg > 32 && arg > n; } 85413481Sgiacomo.travaglini@arm.com 85513481Sgiacomo.travaglini@arm.comTEST(MatcherPMacroTest, GeneratesCorrectDescription) { 85613481Sgiacomo.travaglini@arm.com const Matcher<int> m = _is_Greater_Than32and_(5); 85713481Sgiacomo.travaglini@arm.com 85813481Sgiacomo.travaglini@arm.com EXPECT_EQ("is greater than 32 and 5", Describe(m)); 85913481Sgiacomo.travaglini@arm.com EXPECT_EQ("not (is greater than 32 and 5)", DescribeNegation(m)); 86013481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 36)); 86113481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 5)); 86213481Sgiacomo.travaglini@arm.com} 86313481Sgiacomo.travaglini@arm.com 86413481Sgiacomo.travaglini@arm.com// Tests that a MATCHER_P matcher can be explicitly instantiated with 86513481Sgiacomo.travaglini@arm.com// a reference parameter type. 86613481Sgiacomo.travaglini@arm.com 86713481Sgiacomo.travaglini@arm.comclass UncopyableFoo { 86813481Sgiacomo.travaglini@arm.com public: 86913481Sgiacomo.travaglini@arm.com explicit UncopyableFoo(char value) : value_(value) {} 87013481Sgiacomo.travaglini@arm.com private: 87113481Sgiacomo.travaglini@arm.com UncopyableFoo(const UncopyableFoo&); 87213481Sgiacomo.travaglini@arm.com void operator=(const UncopyableFoo&); 87313481Sgiacomo.travaglini@arm.com 87413481Sgiacomo.travaglini@arm.com char value_; 87513481Sgiacomo.travaglini@arm.com}; 87613481Sgiacomo.travaglini@arm.com 87713481Sgiacomo.travaglini@arm.comMATCHER_P(ReferencesUncopyable, variable, "") { return &arg == &variable; } 87813481Sgiacomo.travaglini@arm.com 87913481Sgiacomo.travaglini@arm.comTEST(MatcherPMacroTest, WorksWhenExplicitlyInstantiatedWithReference) { 88013481Sgiacomo.travaglini@arm.com UncopyableFoo foo1('1'), foo2('2'); 88113481Sgiacomo.travaglini@arm.com const Matcher<const UncopyableFoo&> m = 88213481Sgiacomo.travaglini@arm.com ReferencesUncopyable<const UncopyableFoo&>(foo1); 88313481Sgiacomo.travaglini@arm.com 88413481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(foo1)); 88513481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(foo2)); 88613481Sgiacomo.travaglini@arm.com 88713481Sgiacomo.travaglini@arm.com // We don't want the address of the parameter printed, as most 88813481Sgiacomo.travaglini@arm.com // likely it will just annoy the user. If the address is 88913481Sgiacomo.travaglini@arm.com // interesting, the user should consider passing the parameter by 89013481Sgiacomo.travaglini@arm.com // pointer instead. 89113481Sgiacomo.travaglini@arm.com EXPECT_EQ("references uncopyable 1-byte object <31>", Describe(m)); 89213481Sgiacomo.travaglini@arm.com} 89313481Sgiacomo.travaglini@arm.com 89413481Sgiacomo.travaglini@arm.com 89513481Sgiacomo.travaglini@arm.com// Tests that the body of MATCHER_Pn() can reference the parameter 89613481Sgiacomo.travaglini@arm.com// types. 89713481Sgiacomo.travaglini@arm.com 89813481Sgiacomo.travaglini@arm.comMATCHER_P3(ParamTypesAreIntLongAndChar, foo, bar, baz, "") { 89913481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<int, foo_type>(); 90013481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<long, bar_type>(); // NOLINT 90113481Sgiacomo.travaglini@arm.com StaticAssertTypeEq<char, baz_type>(); 90213481Sgiacomo.travaglini@arm.com return arg == 0; 90313481Sgiacomo.travaglini@arm.com} 90413481Sgiacomo.travaglini@arm.com 90513481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, CanReferenceParamTypes) { 90613481Sgiacomo.travaglini@arm.com EXPECT_THAT(0, ParamTypesAreIntLongAndChar(10, 20L, 'a')); 90713481Sgiacomo.travaglini@arm.com} 90813481Sgiacomo.travaglini@arm.com 90913481Sgiacomo.travaglini@arm.com// Tests that a MATCHER_Pn matcher can be explicitly instantiated with 91013481Sgiacomo.travaglini@arm.com// reference parameter types. 91113481Sgiacomo.travaglini@arm.com 91213481Sgiacomo.travaglini@arm.comMATCHER_P2(ReferencesAnyOf, variable1, variable2, "") { 91313481Sgiacomo.travaglini@arm.com return &arg == &variable1 || &arg == &variable2; 91413481Sgiacomo.travaglini@arm.com} 91513481Sgiacomo.travaglini@arm.com 91613481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, WorksWhenExplicitlyInstantiatedWithReferences) { 91713481Sgiacomo.travaglini@arm.com UncopyableFoo foo1('1'), foo2('2'), foo3('3'); 91813481Sgiacomo.travaglini@arm.com const Matcher<const UncopyableFoo&> m = 91913481Sgiacomo.travaglini@arm.com ReferencesAnyOf<const UncopyableFoo&, const UncopyableFoo&>(foo1, foo2); 92013481Sgiacomo.travaglini@arm.com 92113481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(foo1)); 92213481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(foo2)); 92313481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(foo3)); 92413481Sgiacomo.travaglini@arm.com} 92513481Sgiacomo.travaglini@arm.com 92613481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, 92713481Sgiacomo.travaglini@arm.com GeneratesCorretDescriptionWhenExplicitlyInstantiatedWithReferences) { 92813481Sgiacomo.travaglini@arm.com UncopyableFoo foo1('1'), foo2('2'); 92913481Sgiacomo.travaglini@arm.com const Matcher<const UncopyableFoo&> m = 93013481Sgiacomo.travaglini@arm.com ReferencesAnyOf<const UncopyableFoo&, const UncopyableFoo&>(foo1, foo2); 93113481Sgiacomo.travaglini@arm.com 93213481Sgiacomo.travaglini@arm.com // We don't want the addresses of the parameters printed, as most 93313481Sgiacomo.travaglini@arm.com // likely they will just annoy the user. If the addresses are 93413481Sgiacomo.travaglini@arm.com // interesting, the user should consider passing the parameters by 93513481Sgiacomo.travaglini@arm.com // pointers instead. 93613481Sgiacomo.travaglini@arm.com EXPECT_EQ("references any of (1-byte object <31>, 1-byte object <32>)", 93713481Sgiacomo.travaglini@arm.com Describe(m)); 93813481Sgiacomo.travaglini@arm.com} 93913481Sgiacomo.travaglini@arm.com 94013481Sgiacomo.travaglini@arm.com// Tests that a simple MATCHER_P2() definition works. 94113481Sgiacomo.travaglini@arm.com 94213481Sgiacomo.travaglini@arm.comMATCHER_P2(IsNotInClosedRange, low, hi, "") { return arg < low || arg > hi; } 94313481Sgiacomo.travaglini@arm.com 94413481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, Works) { 94513481Sgiacomo.travaglini@arm.com const Matcher<const long&> m = IsNotInClosedRange(10, 20); // NOLINT 94613481Sgiacomo.travaglini@arm.com EXPECT_TRUE(m.Matches(36L)); 94713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(m.Matches(15L)); 94813481Sgiacomo.travaglini@arm.com 94913481Sgiacomo.travaglini@arm.com EXPECT_EQ("is not in closed range (10, 20)", Describe(m)); 95013481Sgiacomo.travaglini@arm.com EXPECT_EQ("not (is not in closed range (10, 20))", DescribeNegation(m)); 95113481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 36L)); 95213481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, 15L)); 95313481Sgiacomo.travaglini@arm.com} 95413481Sgiacomo.travaglini@arm.com 95513481Sgiacomo.travaglini@arm.com// Tests that MATCHER*() definitions can be overloaded on the number 95613481Sgiacomo.travaglini@arm.com// of parameters; also tests MATCHER_Pn() where n >= 3. 95713481Sgiacomo.travaglini@arm.com 95813481Sgiacomo.travaglini@arm.comMATCHER(EqualsSumOf, "") { return arg == 0; } 95913481Sgiacomo.travaglini@arm.comMATCHER_P(EqualsSumOf, a, "") { return arg == a; } 96013481Sgiacomo.travaglini@arm.comMATCHER_P2(EqualsSumOf, a, b, "") { return arg == a + b; } 96113481Sgiacomo.travaglini@arm.comMATCHER_P3(EqualsSumOf, a, b, c, "") { return arg == a + b + c; } 96213481Sgiacomo.travaglini@arm.comMATCHER_P4(EqualsSumOf, a, b, c, d, "") { return arg == a + b + c + d; } 96313481Sgiacomo.travaglini@arm.comMATCHER_P5(EqualsSumOf, a, b, c, d, e, "") { return arg == a + b + c + d + e; } 96413481Sgiacomo.travaglini@arm.comMATCHER_P6(EqualsSumOf, a, b, c, d, e, f, "") { 96513481Sgiacomo.travaglini@arm.com return arg == a + b + c + d + e + f; 96613481Sgiacomo.travaglini@arm.com} 96713481Sgiacomo.travaglini@arm.comMATCHER_P7(EqualsSumOf, a, b, c, d, e, f, g, "") { 96813481Sgiacomo.travaglini@arm.com return arg == a + b + c + d + e + f + g; 96913481Sgiacomo.travaglini@arm.com} 97013481Sgiacomo.travaglini@arm.comMATCHER_P8(EqualsSumOf, a, b, c, d, e, f, g, h, "") { 97113481Sgiacomo.travaglini@arm.com return arg == a + b + c + d + e + f + g + h; 97213481Sgiacomo.travaglini@arm.com} 97313481Sgiacomo.travaglini@arm.comMATCHER_P9(EqualsSumOf, a, b, c, d, e, f, g, h, i, "") { 97413481Sgiacomo.travaglini@arm.com return arg == a + b + c + d + e + f + g + h + i; 97513481Sgiacomo.travaglini@arm.com} 97613481Sgiacomo.travaglini@arm.comMATCHER_P10(EqualsSumOf, a, b, c, d, e, f, g, h, i, j, "") { 97713481Sgiacomo.travaglini@arm.com return arg == a + b + c + d + e + f + g + h + i + j; 97813481Sgiacomo.travaglini@arm.com} 97913481Sgiacomo.travaglini@arm.com 98013481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, CanBeOverloadedOnNumberOfParameters) { 98113481Sgiacomo.travaglini@arm.com EXPECT_THAT(0, EqualsSumOf()); 98213481Sgiacomo.travaglini@arm.com EXPECT_THAT(1, EqualsSumOf(1)); 98313481Sgiacomo.travaglini@arm.com EXPECT_THAT(12, EqualsSumOf(10, 2)); 98413481Sgiacomo.travaglini@arm.com EXPECT_THAT(123, EqualsSumOf(100, 20, 3)); 98513481Sgiacomo.travaglini@arm.com EXPECT_THAT(1234, EqualsSumOf(1000, 200, 30, 4)); 98613481Sgiacomo.travaglini@arm.com EXPECT_THAT(12345, EqualsSumOf(10000, 2000, 300, 40, 5)); 98713481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdef", 98813481Sgiacomo.travaglini@arm.com EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f')); 98913481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefg", 99013481Sgiacomo.travaglini@arm.com EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g')); 99113481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefgh", 99213481Sgiacomo.travaglini@arm.com EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 99313481Sgiacomo.travaglini@arm.com "h")); 99413481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefghi", 99513481Sgiacomo.travaglini@arm.com EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 99613481Sgiacomo.travaglini@arm.com "h", 'i')); 99713481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefghij", 99813481Sgiacomo.travaglini@arm.com EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 99913481Sgiacomo.travaglini@arm.com "h", 'i', ::std::string("j"))); 100013481Sgiacomo.travaglini@arm.com 100113481Sgiacomo.travaglini@arm.com EXPECT_THAT(1, Not(EqualsSumOf())); 100213481Sgiacomo.travaglini@arm.com EXPECT_THAT(-1, Not(EqualsSumOf(1))); 100313481Sgiacomo.travaglini@arm.com EXPECT_THAT(-12, Not(EqualsSumOf(10, 2))); 100413481Sgiacomo.travaglini@arm.com EXPECT_THAT(-123, Not(EqualsSumOf(100, 20, 3))); 100513481Sgiacomo.travaglini@arm.com EXPECT_THAT(-1234, Not(EqualsSumOf(1000, 200, 30, 4))); 100613481Sgiacomo.travaglini@arm.com EXPECT_THAT(-12345, Not(EqualsSumOf(10000, 2000, 300, 40, 5))); 100713481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdef ", 100813481Sgiacomo.travaglini@arm.com Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f'))); 100913481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefg ", 101013481Sgiacomo.travaglini@arm.com Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 101113481Sgiacomo.travaglini@arm.com 'g'))); 101213481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefgh ", 101313481Sgiacomo.travaglini@arm.com Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 101413481Sgiacomo.travaglini@arm.com "h"))); 101513481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefghi ", 101613481Sgiacomo.travaglini@arm.com Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 101713481Sgiacomo.travaglini@arm.com "h", 'i'))); 101813481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcdefghij ", 101913481Sgiacomo.travaglini@arm.com Not(EqualsSumOf(::std::string("a"), 'b', 'c', "d", "e", 'f', 'g', 102013481Sgiacomo.travaglini@arm.com "h", 'i', ::std::string("j")))); 102113481Sgiacomo.travaglini@arm.com} 102213481Sgiacomo.travaglini@arm.com 102313481Sgiacomo.travaglini@arm.com// Tests that a MATCHER_Pn() definition can be instantiated with any 102413481Sgiacomo.travaglini@arm.com// compatible parameter types. 102513481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, WorksForDifferentParameterTypes) { 102613481Sgiacomo.travaglini@arm.com EXPECT_THAT(123, EqualsSumOf(100L, 20, static_cast<char>(3))); 102713481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcd", EqualsSumOf(::std::string("a"), "b", 'c', "d")); 102813481Sgiacomo.travaglini@arm.com 102913481Sgiacomo.travaglini@arm.com EXPECT_THAT(124, Not(EqualsSumOf(100L, 20, static_cast<char>(3)))); 103013481Sgiacomo.travaglini@arm.com EXPECT_THAT("abcde", Not(EqualsSumOf(::std::string("a"), "b", 'c', "d"))); 103113481Sgiacomo.travaglini@arm.com} 103213481Sgiacomo.travaglini@arm.com 103313481Sgiacomo.travaglini@arm.com// Tests that the matcher body can promote the parameter types. 103413481Sgiacomo.travaglini@arm.com 103513481Sgiacomo.travaglini@arm.comMATCHER_P2(EqConcat, prefix, suffix, "") { 103613481Sgiacomo.travaglini@arm.com // The following lines promote the two parameters to desired types. 103713481Sgiacomo.travaglini@arm.com std::string prefix_str(prefix); 103813481Sgiacomo.travaglini@arm.com char suffix_char = static_cast<char>(suffix); 103913481Sgiacomo.travaglini@arm.com return arg == prefix_str + suffix_char; 104013481Sgiacomo.travaglini@arm.com} 104113481Sgiacomo.travaglini@arm.com 104213481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, SimpleTypePromotion) { 104313481Sgiacomo.travaglini@arm.com Matcher<std::string> no_promo = 104413481Sgiacomo.travaglini@arm.com EqConcat(std::string("foo"), 't'); 104513481Sgiacomo.travaglini@arm.com Matcher<const std::string&> promo = 104613481Sgiacomo.travaglini@arm.com EqConcat("foo", static_cast<int>('t')); 104713481Sgiacomo.travaglini@arm.com EXPECT_FALSE(no_promo.Matches("fool")); 104813481Sgiacomo.travaglini@arm.com EXPECT_FALSE(promo.Matches("fool")); 104913481Sgiacomo.travaglini@arm.com EXPECT_TRUE(no_promo.Matches("foot")); 105013481Sgiacomo.travaglini@arm.com EXPECT_TRUE(promo.Matches("foot")); 105113481Sgiacomo.travaglini@arm.com} 105213481Sgiacomo.travaglini@arm.com 105313481Sgiacomo.travaglini@arm.com// Verifies the type of a MATCHER*. 105413481Sgiacomo.travaglini@arm.com 105513481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, TypesAreCorrect) { 105613481Sgiacomo.travaglini@arm.com // EqualsSumOf() must be assignable to a EqualsSumOfMatcher variable. 105713481Sgiacomo.travaglini@arm.com EqualsSumOfMatcher a0 = EqualsSumOf(); 105813481Sgiacomo.travaglini@arm.com 105913481Sgiacomo.travaglini@arm.com // EqualsSumOf(1) must be assignable to a EqualsSumOfMatcherP variable. 106013481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP<int> a1 = EqualsSumOf(1); 106113481Sgiacomo.travaglini@arm.com 106213481Sgiacomo.travaglini@arm.com // EqualsSumOf(p1, ..., pk) must be assignable to a EqualsSumOfMatcherPk 106313481Sgiacomo.travaglini@arm.com // variable, and so on. 106413481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP2<int, char> a2 = EqualsSumOf(1, '2'); 106513481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP3<int, int, char> a3 = EqualsSumOf(1, 2, '3'); 106613481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP4<int, int, int, char> a4 = EqualsSumOf(1, 2, 3, '4'); 106713481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP5<int, int, int, int, char> a5 = 106813481Sgiacomo.travaglini@arm.com EqualsSumOf(1, 2, 3, 4, '5'); 106913481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP6<int, int, int, int, int, char> a6 = 107013481Sgiacomo.travaglini@arm.com EqualsSumOf(1, 2, 3, 4, 5, '6'); 107113481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP7<int, int, int, int, int, int, char> a7 = 107213481Sgiacomo.travaglini@arm.com EqualsSumOf(1, 2, 3, 4, 5, 6, '7'); 107313481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP8<int, int, int, int, int, int, int, char> a8 = 107413481Sgiacomo.travaglini@arm.com EqualsSumOf(1, 2, 3, 4, 5, 6, 7, '8'); 107513481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP9<int, int, int, int, int, int, int, int, char> a9 = 107613481Sgiacomo.travaglini@arm.com EqualsSumOf(1, 2, 3, 4, 5, 6, 7, 8, '9'); 107713481Sgiacomo.travaglini@arm.com EqualsSumOfMatcherP10<int, int, int, int, int, int, int, int, int, char> a10 = 107813481Sgiacomo.travaglini@arm.com EqualsSumOf(1, 2, 3, 4, 5, 6, 7, 8, 9, '0'); 107913481Sgiacomo.travaglini@arm.com 108013481Sgiacomo.travaglini@arm.com // Avoid "unused variable" warnings. 108113481Sgiacomo.travaglini@arm.com (void)a0; 108213481Sgiacomo.travaglini@arm.com (void)a1; 108313481Sgiacomo.travaglini@arm.com (void)a2; 108413481Sgiacomo.travaglini@arm.com (void)a3; 108513481Sgiacomo.travaglini@arm.com (void)a4; 108613481Sgiacomo.travaglini@arm.com (void)a5; 108713481Sgiacomo.travaglini@arm.com (void)a6; 108813481Sgiacomo.travaglini@arm.com (void)a7; 108913481Sgiacomo.travaglini@arm.com (void)a8; 109013481Sgiacomo.travaglini@arm.com (void)a9; 109113481Sgiacomo.travaglini@arm.com (void)a10; 109213481Sgiacomo.travaglini@arm.com} 109313481Sgiacomo.travaglini@arm.com 109413481Sgiacomo.travaglini@arm.com// Tests that matcher-typed parameters can be used in Value() inside a 109513481Sgiacomo.travaglini@arm.com// MATCHER_Pn definition. 109613481Sgiacomo.travaglini@arm.com 109713481Sgiacomo.travaglini@arm.com// Succeeds if arg matches exactly 2 of the 3 matchers. 109813481Sgiacomo.travaglini@arm.comMATCHER_P3(TwoOf, m1, m2, m3, "") { 109913481Sgiacomo.travaglini@arm.com const int count = static_cast<int>(Value(arg, m1)) 110013481Sgiacomo.travaglini@arm.com + static_cast<int>(Value(arg, m2)) + static_cast<int>(Value(arg, m3)); 110113481Sgiacomo.travaglini@arm.com return count == 2; 110213481Sgiacomo.travaglini@arm.com} 110313481Sgiacomo.travaglini@arm.com 110413481Sgiacomo.travaglini@arm.comTEST(MatcherPnMacroTest, CanUseMatcherTypedParameterInValue) { 110513481Sgiacomo.travaglini@arm.com EXPECT_THAT(42, TwoOf(Gt(0), Lt(50), Eq(10))); 110613481Sgiacomo.travaglini@arm.com EXPECT_THAT(0, Not(TwoOf(Gt(-1), Lt(1), Eq(0)))); 110713481Sgiacomo.travaglini@arm.com} 110813481Sgiacomo.travaglini@arm.com 110913481Sgiacomo.travaglini@arm.com// Tests Contains(). 111013481Sgiacomo.travaglini@arm.com 111113481Sgiacomo.travaglini@arm.comTEST(ContainsTest, ListMatchesWhenElementIsInContainer) { 111213481Sgiacomo.travaglini@arm.com list<int> some_list; 111313481Sgiacomo.travaglini@arm.com some_list.push_back(3); 111413481Sgiacomo.travaglini@arm.com some_list.push_back(1); 111513481Sgiacomo.travaglini@arm.com some_list.push_back(2); 111613481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_list, Contains(1)); 111713481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_list, Contains(Gt(2.5))); 111813481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_list, Contains(Eq(2.0f))); 111913481Sgiacomo.travaglini@arm.com 112013481Sgiacomo.travaglini@arm.com list<string> another_list; 112113481Sgiacomo.travaglini@arm.com another_list.push_back("fee"); 112213481Sgiacomo.travaglini@arm.com another_list.push_back("fie"); 112313481Sgiacomo.travaglini@arm.com another_list.push_back("foe"); 112413481Sgiacomo.travaglini@arm.com another_list.push_back("fum"); 112513481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_list, Contains(string("fee"))); 112613481Sgiacomo.travaglini@arm.com} 112713481Sgiacomo.travaglini@arm.com 112813481Sgiacomo.travaglini@arm.comTEST(ContainsTest, ListDoesNotMatchWhenElementIsNotInContainer) { 112913481Sgiacomo.travaglini@arm.com list<int> some_list; 113013481Sgiacomo.travaglini@arm.com some_list.push_back(3); 113113481Sgiacomo.travaglini@arm.com some_list.push_back(1); 113213481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_list, Not(Contains(4))); 113313481Sgiacomo.travaglini@arm.com} 113413481Sgiacomo.travaglini@arm.com 113513481Sgiacomo.travaglini@arm.comTEST(ContainsTest, SetMatchesWhenElementIsInContainer) { 113613481Sgiacomo.travaglini@arm.com set<int> some_set; 113713481Sgiacomo.travaglini@arm.com some_set.insert(3); 113813481Sgiacomo.travaglini@arm.com some_set.insert(1); 113913481Sgiacomo.travaglini@arm.com some_set.insert(2); 114013481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_set, Contains(Eq(1.0))); 114113481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_set, Contains(Eq(3.0f))); 114213481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_set, Contains(2)); 114313481Sgiacomo.travaglini@arm.com 114413481Sgiacomo.travaglini@arm.com set<const char*> another_set; 114513481Sgiacomo.travaglini@arm.com another_set.insert("fee"); 114613481Sgiacomo.travaglini@arm.com another_set.insert("fie"); 114713481Sgiacomo.travaglini@arm.com another_set.insert("foe"); 114813481Sgiacomo.travaglini@arm.com another_set.insert("fum"); 114913481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_set, Contains(Eq(string("fum")))); 115013481Sgiacomo.travaglini@arm.com} 115113481Sgiacomo.travaglini@arm.com 115213481Sgiacomo.travaglini@arm.comTEST(ContainsTest, SetDoesNotMatchWhenElementIsNotInContainer) { 115313481Sgiacomo.travaglini@arm.com set<int> some_set; 115413481Sgiacomo.travaglini@arm.com some_set.insert(3); 115513481Sgiacomo.travaglini@arm.com some_set.insert(1); 115613481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_set, Not(Contains(4))); 115713481Sgiacomo.travaglini@arm.com 115813481Sgiacomo.travaglini@arm.com set<const char*> c_string_set; 115913481Sgiacomo.travaglini@arm.com c_string_set.insert("hello"); 116013481Sgiacomo.travaglini@arm.com EXPECT_THAT(c_string_set, Not(Contains(string("hello").c_str()))); 116113481Sgiacomo.travaglini@arm.com} 116213481Sgiacomo.travaglini@arm.com 116313481Sgiacomo.travaglini@arm.comTEST(ContainsTest, ExplainsMatchResultCorrectly) { 116413481Sgiacomo.travaglini@arm.com const int a[2] = { 1, 2 }; 116513481Sgiacomo.travaglini@arm.com Matcher<const int (&)[2]> m = Contains(2); 116613481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose element #1 matches", Explain(m, a)); 116713481Sgiacomo.travaglini@arm.com 116813481Sgiacomo.travaglini@arm.com m = Contains(3); 116913481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, a)); 117013481Sgiacomo.travaglini@arm.com 117113481Sgiacomo.travaglini@arm.com m = Contains(GreaterThan(0)); 117213481Sgiacomo.travaglini@arm.com EXPECT_EQ("whose element #0 matches, which is 1 more than 0", Explain(m, a)); 117313481Sgiacomo.travaglini@arm.com 117413481Sgiacomo.travaglini@arm.com m = Contains(GreaterThan(10)); 117513481Sgiacomo.travaglini@arm.com EXPECT_EQ("", Explain(m, a)); 117613481Sgiacomo.travaglini@arm.com} 117713481Sgiacomo.travaglini@arm.com 117813481Sgiacomo.travaglini@arm.comTEST(ContainsTest, DescribesItselfCorrectly) { 117913481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m = Contains(1); 118013481Sgiacomo.travaglini@arm.com EXPECT_EQ("contains at least one element that is equal to 1", Describe(m)); 118113481Sgiacomo.travaglini@arm.com 118213481Sgiacomo.travaglini@arm.com Matcher<vector<int> > m2 = Not(m); 118313481Sgiacomo.travaglini@arm.com EXPECT_EQ("doesn't contain any element that is equal to 1", Describe(m2)); 118413481Sgiacomo.travaglini@arm.com} 118513481Sgiacomo.travaglini@arm.com 118613481Sgiacomo.travaglini@arm.comTEST(ContainsTest, MapMatchesWhenElementIsInContainer) { 118713481Sgiacomo.travaglini@arm.com map<const char*, int> my_map; 118813481Sgiacomo.travaglini@arm.com const char* bar = "a string"; 118913481Sgiacomo.travaglini@arm.com my_map[bar] = 2; 119013481Sgiacomo.travaglini@arm.com EXPECT_THAT(my_map, Contains(pair<const char* const, int>(bar, 2))); 119113481Sgiacomo.travaglini@arm.com 119213481Sgiacomo.travaglini@arm.com map<string, int> another_map; 119313481Sgiacomo.travaglini@arm.com another_map["fee"] = 1; 119413481Sgiacomo.travaglini@arm.com another_map["fie"] = 2; 119513481Sgiacomo.travaglini@arm.com another_map["foe"] = 3; 119613481Sgiacomo.travaglini@arm.com another_map["fum"] = 4; 119713481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_map, Contains(pair<const string, int>(string("fee"), 1))); 119813481Sgiacomo.travaglini@arm.com EXPECT_THAT(another_map, Contains(pair<const string, int>("fie", 2))); 119913481Sgiacomo.travaglini@arm.com} 120013481Sgiacomo.travaglini@arm.com 120113481Sgiacomo.travaglini@arm.comTEST(ContainsTest, MapDoesNotMatchWhenElementIsNotInContainer) { 120213481Sgiacomo.travaglini@arm.com map<int, int> some_map; 120313481Sgiacomo.travaglini@arm.com some_map[1] = 11; 120413481Sgiacomo.travaglini@arm.com some_map[2] = 22; 120513481Sgiacomo.travaglini@arm.com EXPECT_THAT(some_map, Not(Contains(pair<const int, int>(2, 23)))); 120613481Sgiacomo.travaglini@arm.com} 120713481Sgiacomo.travaglini@arm.com 120813481Sgiacomo.travaglini@arm.comTEST(ContainsTest, ArrayMatchesWhenElementIsInContainer) { 120913481Sgiacomo.travaglini@arm.com const char* string_array[] = { "fee", "fie", "foe", "fum" }; 121013481Sgiacomo.travaglini@arm.com EXPECT_THAT(string_array, Contains(Eq(string("fum")))); 121113481Sgiacomo.travaglini@arm.com} 121213481Sgiacomo.travaglini@arm.com 121313481Sgiacomo.travaglini@arm.comTEST(ContainsTest, ArrayDoesNotMatchWhenElementIsNotInContainer) { 121413481Sgiacomo.travaglini@arm.com int int_array[] = { 1, 2, 3, 4 }; 121513481Sgiacomo.travaglini@arm.com EXPECT_THAT(int_array, Not(Contains(5))); 121613481Sgiacomo.travaglini@arm.com} 121713481Sgiacomo.travaglini@arm.com 121813481Sgiacomo.travaglini@arm.comTEST(ContainsTest, AcceptsMatcher) { 121913481Sgiacomo.travaglini@arm.com const int a[] = { 1, 2, 3 }; 122013481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Contains(Gt(2))); 122113481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(Contains(Gt(4)))); 122213481Sgiacomo.travaglini@arm.com} 122313481Sgiacomo.travaglini@arm.com 122413481Sgiacomo.travaglini@arm.comTEST(ContainsTest, WorksForNativeArrayAsTuple) { 122513481Sgiacomo.travaglini@arm.com const int a[] = { 1, 2 }; 122613481Sgiacomo.travaglini@arm.com const int* const pointer = a; 122713481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(pointer, 2), Contains(1)); 122813481Sgiacomo.travaglini@arm.com EXPECT_THAT(make_tuple(pointer, 2), Not(Contains(Gt(3)))); 122913481Sgiacomo.travaglini@arm.com} 123013481Sgiacomo.travaglini@arm.com 123113481Sgiacomo.travaglini@arm.comTEST(ContainsTest, WorksForTwoDimensionalNativeArray) { 123213481Sgiacomo.travaglini@arm.com int a[][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; 123313481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Contains(ElementsAre(4, 5, 6))); 123413481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Contains(Contains(5))); 123513481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Not(Contains(ElementsAre(3, 4, 5)))); 123613481Sgiacomo.travaglini@arm.com EXPECT_THAT(a, Contains(Not(Contains(5)))); 123713481Sgiacomo.travaglini@arm.com} 123813481Sgiacomo.travaglini@arm.com 123913481Sgiacomo.travaglini@arm.comTEST(AllOfTest, HugeMatcher) { 124013481Sgiacomo.travaglini@arm.com // Verify that using AllOf with many arguments doesn't cause 124113481Sgiacomo.travaglini@arm.com // the compiler to exceed template instantiation depth limit. 124213481Sgiacomo.travaglini@arm.com EXPECT_THAT(0, testing::AllOf(_, _, _, _, _, _, _, _, _, 124313481Sgiacomo.travaglini@arm.com testing::AllOf(_, _, _, _, _, _, _, _, _, _))); 124413481Sgiacomo.travaglini@arm.com} 124513481Sgiacomo.travaglini@arm.com 124613481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, HugeMatcher) { 124713481Sgiacomo.travaglini@arm.com // Verify that using AnyOf with many arguments doesn't cause 124813481Sgiacomo.travaglini@arm.com // the compiler to exceed template instantiation depth limit. 124913481Sgiacomo.travaglini@arm.com EXPECT_THAT(0, testing::AnyOf(_, _, _, _, _, _, _, _, _, 125013481Sgiacomo.travaglini@arm.com testing::AnyOf(_, _, _, _, _, _, _, _, _, _))); 125113481Sgiacomo.travaglini@arm.com} 125213481Sgiacomo.travaglini@arm.com 125313481Sgiacomo.travaglini@arm.comnamespace adl_test { 125413481Sgiacomo.travaglini@arm.com 125513481Sgiacomo.travaglini@arm.com// Verifies that the implementation of ::testing::AllOf and ::testing::AnyOf 125613481Sgiacomo.travaglini@arm.com// don't issue unqualified recursive calls. If they do, the argument dependent 125713481Sgiacomo.travaglini@arm.com// name lookup will cause AllOf/AnyOf in the 'adl_test' namespace to be found 125813481Sgiacomo.travaglini@arm.com// as a candidate and the compilation will break due to an ambiguous overload. 125913481Sgiacomo.travaglini@arm.com 126013481Sgiacomo.travaglini@arm.com// The matcher must be in the same namespace as AllOf/AnyOf to make argument 126113481Sgiacomo.travaglini@arm.com// dependent lookup find those. 126213481Sgiacomo.travaglini@arm.comMATCHER(M, "") { return true; } 126313481Sgiacomo.travaglini@arm.com 126413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2> 126513481Sgiacomo.travaglini@arm.combool AllOf(const T1& t1, const T2& t2) { return true; } 126613481Sgiacomo.travaglini@arm.com 126713481Sgiacomo.travaglini@arm.comTEST(AllOfTest, DoesNotCallAllOfUnqualified) { 126813481Sgiacomo.travaglini@arm.com EXPECT_THAT(42, testing::AllOf( 126913481Sgiacomo.travaglini@arm.com M(), M(), M(), M(), M(), M(), M(), M(), M(), M())); 127013481Sgiacomo.travaglini@arm.com} 127113481Sgiacomo.travaglini@arm.com 127213481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2> bool 127313481Sgiacomo.travaglini@arm.comAnyOf(const T1& t1, const T2& t2) { return true; } 127413481Sgiacomo.travaglini@arm.com 127513481Sgiacomo.travaglini@arm.comTEST(AnyOfTest, DoesNotCallAnyOfUnqualified) { 127613481Sgiacomo.travaglini@arm.com EXPECT_THAT(42, testing::AnyOf( 127713481Sgiacomo.travaglini@arm.com M(), M(), M(), M(), M(), M(), M(), M(), M(), M())); 127813481Sgiacomo.travaglini@arm.com} 127913481Sgiacomo.travaglini@arm.com 128013481Sgiacomo.travaglini@arm.com} // namespace adl_test 128113481Sgiacomo.travaglini@arm.com 128213481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER 128313481Sgiacomo.travaglini@arm.com# pragma warning(pop) 128413481Sgiacomo.travaglini@arm.com#endif 128513481Sgiacomo.travaglini@arm.com 128613481Sgiacomo.travaglini@arm.com} // namespace 1287