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