1*481dde66SAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
2*481dde66SAndroid Build Coastguard Worker // All rights reserved.
3*481dde66SAndroid Build Coastguard Worker //
4*481dde66SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
5*481dde66SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
6*481dde66SAndroid Build Coastguard Worker // met:
7*481dde66SAndroid Build Coastguard Worker //
8*481dde66SAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright
9*481dde66SAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
10*481dde66SAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above
11*481dde66SAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12*481dde66SAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
13*481dde66SAndroid Build Coastguard Worker // distribution.
14*481dde66SAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its
15*481dde66SAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
16*481dde66SAndroid Build Coastguard Worker // this software without specific prior written permission.
17*481dde66SAndroid Build Coastguard Worker //
18*481dde66SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*481dde66SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*481dde66SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21*481dde66SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*481dde66SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*481dde66SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*481dde66SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*481dde66SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*481dde66SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*481dde66SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*481dde66SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*481dde66SAndroid Build Coastguard Worker
30*481dde66SAndroid Build Coastguard Worker // Google Mock - a framework for writing C++ mock classes.
31*481dde66SAndroid Build Coastguard Worker //
32*481dde66SAndroid Build Coastguard Worker // This file tests some commonly used argument matchers.
33*481dde66SAndroid Build Coastguard Worker
34*481dde66SAndroid Build Coastguard Worker #ifndef GOOGLEMOCK_TEST_GMOCK_MATCHERS_TEST_H_
35*481dde66SAndroid Build Coastguard Worker #define GOOGLEMOCK_TEST_GMOCK_MATCHERS_TEST_H_
36*481dde66SAndroid Build Coastguard Worker
37*481dde66SAndroid Build Coastguard Worker #include <string.h>
38*481dde66SAndroid Build Coastguard Worker #include <time.h>
39*481dde66SAndroid Build Coastguard Worker
40*481dde66SAndroid Build Coastguard Worker #include <array>
41*481dde66SAndroid Build Coastguard Worker #include <cstdint>
42*481dde66SAndroid Build Coastguard Worker #include <deque>
43*481dde66SAndroid Build Coastguard Worker #include <forward_list>
44*481dde66SAndroid Build Coastguard Worker #include <functional>
45*481dde66SAndroid Build Coastguard Worker #include <iostream>
46*481dde66SAndroid Build Coastguard Worker #include <iterator>
47*481dde66SAndroid Build Coastguard Worker #include <limits>
48*481dde66SAndroid Build Coastguard Worker #include <list>
49*481dde66SAndroid Build Coastguard Worker #include <map>
50*481dde66SAndroid Build Coastguard Worker #include <memory>
51*481dde66SAndroid Build Coastguard Worker #include <set>
52*481dde66SAndroid Build Coastguard Worker #include <sstream>
53*481dde66SAndroid Build Coastguard Worker #include <string>
54*481dde66SAndroid Build Coastguard Worker #include <type_traits>
55*481dde66SAndroid Build Coastguard Worker #include <unordered_map>
56*481dde66SAndroid Build Coastguard Worker #include <unordered_set>
57*481dde66SAndroid Build Coastguard Worker #include <utility>
58*481dde66SAndroid Build Coastguard Worker #include <vector>
59*481dde66SAndroid Build Coastguard Worker
60*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock-matchers.h"
61*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock-more-matchers.h"
62*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock.h"
63*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest-spi.h"
64*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest.h"
65*481dde66SAndroid Build Coastguard Worker
66*481dde66SAndroid Build Coastguard Worker namespace testing {
67*481dde66SAndroid Build Coastguard Worker namespace gmock_matchers_test {
68*481dde66SAndroid Build Coastguard Worker
69*481dde66SAndroid Build Coastguard Worker using std::greater;
70*481dde66SAndroid Build Coastguard Worker using std::less;
71*481dde66SAndroid Build Coastguard Worker using std::list;
72*481dde66SAndroid Build Coastguard Worker using std::make_pair;
73*481dde66SAndroid Build Coastguard Worker using std::map;
74*481dde66SAndroid Build Coastguard Worker using std::multimap;
75*481dde66SAndroid Build Coastguard Worker using std::multiset;
76*481dde66SAndroid Build Coastguard Worker using std::ostream;
77*481dde66SAndroid Build Coastguard Worker using std::pair;
78*481dde66SAndroid Build Coastguard Worker using std::set;
79*481dde66SAndroid Build Coastguard Worker using std::stringstream;
80*481dde66SAndroid Build Coastguard Worker using std::vector;
81*481dde66SAndroid Build Coastguard Worker using testing::internal::DummyMatchResultListener;
82*481dde66SAndroid Build Coastguard Worker using testing::internal::ElementMatcherPair;
83*481dde66SAndroid Build Coastguard Worker using testing::internal::ElementMatcherPairs;
84*481dde66SAndroid Build Coastguard Worker using testing::internal::ElementsAreArrayMatcher;
85*481dde66SAndroid Build Coastguard Worker using testing::internal::ExplainMatchFailureTupleTo;
86*481dde66SAndroid Build Coastguard Worker using testing::internal::FloatingEqMatcher;
87*481dde66SAndroid Build Coastguard Worker using testing::internal::FormatMatcherDescription;
88*481dde66SAndroid Build Coastguard Worker using testing::internal::IsReadableTypeName;
89*481dde66SAndroid Build Coastguard Worker using testing::internal::MatchMatrix;
90*481dde66SAndroid Build Coastguard Worker using testing::internal::PredicateFormatterFromMatcher;
91*481dde66SAndroid Build Coastguard Worker using testing::internal::RE;
92*481dde66SAndroid Build Coastguard Worker using testing::internal::StreamMatchResultListener;
93*481dde66SAndroid Build Coastguard Worker using testing::internal::Strings;
94*481dde66SAndroid Build Coastguard Worker
95*481dde66SAndroid Build Coastguard Worker // Helper for testing container-valued matchers in mock method context. It is
96*481dde66SAndroid Build Coastguard Worker // important to test matchers in this context, since it requires additional type
97*481dde66SAndroid Build Coastguard Worker // deduction beyond what EXPECT_THAT does, thus making it more restrictive.
98*481dde66SAndroid Build Coastguard Worker struct ContainerHelper {
99*481dde66SAndroid Build Coastguard Worker MOCK_METHOD1(Call, void(std::vector<std::unique_ptr<int>>));
100*481dde66SAndroid Build Coastguard Worker };
101*481dde66SAndroid Build Coastguard Worker
102*481dde66SAndroid Build Coastguard Worker // For testing ExplainMatchResultTo().
103*481dde66SAndroid Build Coastguard Worker template <typename T>
104*481dde66SAndroid Build Coastguard Worker struct GtestGreaterThanMatcher {
105*481dde66SAndroid Build Coastguard Worker using is_gtest_matcher = void;
106*481dde66SAndroid Build Coastguard Worker
DescribeToGtestGreaterThanMatcher107*481dde66SAndroid Build Coastguard Worker void DescribeTo(ostream* os) const { *os << "is > " << rhs; }
DescribeNegationToGtestGreaterThanMatcher108*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(ostream* os) const { *os << "is <= " << rhs; }
109*481dde66SAndroid Build Coastguard Worker
MatchAndExplainGtestGreaterThanMatcher110*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T lhs, MatchResultListener* listener) const {
111*481dde66SAndroid Build Coastguard Worker if (lhs > rhs) {
112*481dde66SAndroid Build Coastguard Worker *listener << "which is " << (lhs - rhs) << " more than " << rhs;
113*481dde66SAndroid Build Coastguard Worker } else if (lhs == rhs) {
114*481dde66SAndroid Build Coastguard Worker *listener << "which is the same as " << rhs;
115*481dde66SAndroid Build Coastguard Worker } else {
116*481dde66SAndroid Build Coastguard Worker *listener << "which is " << (rhs - lhs) << " less than " << rhs;
117*481dde66SAndroid Build Coastguard Worker }
118*481dde66SAndroid Build Coastguard Worker
119*481dde66SAndroid Build Coastguard Worker return lhs > rhs;
120*481dde66SAndroid Build Coastguard Worker }
121*481dde66SAndroid Build Coastguard Worker
122*481dde66SAndroid Build Coastguard Worker T rhs;
123*481dde66SAndroid Build Coastguard Worker };
124*481dde66SAndroid Build Coastguard Worker
125*481dde66SAndroid Build Coastguard Worker template <typename T>
GtestGreaterThan(T && rhs)126*481dde66SAndroid Build Coastguard Worker GtestGreaterThanMatcher<typename std::decay<T>::type> GtestGreaterThan(
127*481dde66SAndroid Build Coastguard Worker T&& rhs) {
128*481dde66SAndroid Build Coastguard Worker return {rhs};
129*481dde66SAndroid Build Coastguard Worker }
130*481dde66SAndroid Build Coastguard Worker
131*481dde66SAndroid Build Coastguard Worker // As the matcher above, but using the base class with virtual functions.
132*481dde66SAndroid Build Coastguard Worker template <typename T>
133*481dde66SAndroid Build Coastguard Worker class GreaterThanMatcher : public MatcherInterface<T> {
134*481dde66SAndroid Build Coastguard Worker public:
GreaterThanMatcher(T rhs)135*481dde66SAndroid Build Coastguard Worker explicit GreaterThanMatcher(T rhs) : impl_{rhs} {}
136*481dde66SAndroid Build Coastguard Worker
DescribeTo(ostream * os)137*481dde66SAndroid Build Coastguard Worker void DescribeTo(ostream* os) const override { impl_.DescribeTo(os); }
DescribeNegationTo(ostream * os)138*481dde66SAndroid Build Coastguard Worker void DescribeNegationTo(ostream* os) const override {
139*481dde66SAndroid Build Coastguard Worker impl_.DescribeNegationTo(os);
140*481dde66SAndroid Build Coastguard Worker }
141*481dde66SAndroid Build Coastguard Worker
MatchAndExplain(T lhs,MatchResultListener * listener)142*481dde66SAndroid Build Coastguard Worker bool MatchAndExplain(T lhs, MatchResultListener* listener) const override {
143*481dde66SAndroid Build Coastguard Worker return impl_.MatchAndExplain(lhs, listener);
144*481dde66SAndroid Build Coastguard Worker }
145*481dde66SAndroid Build Coastguard Worker
146*481dde66SAndroid Build Coastguard Worker private:
147*481dde66SAndroid Build Coastguard Worker const GtestGreaterThanMatcher<T> impl_;
148*481dde66SAndroid Build Coastguard Worker };
149*481dde66SAndroid Build Coastguard Worker
150*481dde66SAndroid Build Coastguard Worker // Names and instantiates a new instance of GTestMatcherTestP.
151*481dde66SAndroid Build Coastguard Worker #define INSTANTIATE_GTEST_MATCHER_TEST_P(TestSuite) \
152*481dde66SAndroid Build Coastguard Worker using TestSuite##P = GTestMatcherTestP; \
153*481dde66SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MatcherInterface, TestSuite##P, Values(false)); \
154*481dde66SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(GtestMatcher, TestSuite##P, Values(true))
155*481dde66SAndroid Build Coastguard Worker
156*481dde66SAndroid Build Coastguard Worker class GTestMatcherTestP : public testing::TestWithParam<bool> {
157*481dde66SAndroid Build Coastguard Worker public:
158*481dde66SAndroid Build Coastguard Worker template <typename T>
GreaterThan(T n)159*481dde66SAndroid Build Coastguard Worker Matcher<T> GreaterThan(T n) {
160*481dde66SAndroid Build Coastguard Worker if (use_gtest_matcher_) {
161*481dde66SAndroid Build Coastguard Worker return GtestGreaterThan(n);
162*481dde66SAndroid Build Coastguard Worker } else {
163*481dde66SAndroid Build Coastguard Worker return MakeMatcher(new GreaterThanMatcher<T>(n));
164*481dde66SAndroid Build Coastguard Worker }
165*481dde66SAndroid Build Coastguard Worker }
166*481dde66SAndroid Build Coastguard Worker const bool use_gtest_matcher_ = GetParam();
167*481dde66SAndroid Build Coastguard Worker };
168*481dde66SAndroid Build Coastguard Worker
169*481dde66SAndroid Build Coastguard Worker // Returns the description of the given matcher.
170*481dde66SAndroid Build Coastguard Worker template <typename T>
Describe(const Matcher<T> & m)171*481dde66SAndroid Build Coastguard Worker std::string Describe(const Matcher<T>& m) {
172*481dde66SAndroid Build Coastguard Worker return DescribeMatcher<T>(m);
173*481dde66SAndroid Build Coastguard Worker }
174*481dde66SAndroid Build Coastguard Worker
175*481dde66SAndroid Build Coastguard Worker // Returns the description of the negation of the given matcher.
176*481dde66SAndroid Build Coastguard Worker template <typename T>
DescribeNegation(const Matcher<T> & m)177*481dde66SAndroid Build Coastguard Worker std::string DescribeNegation(const Matcher<T>& m) {
178*481dde66SAndroid Build Coastguard Worker return DescribeMatcher<T>(m, true);
179*481dde66SAndroid Build Coastguard Worker }
180*481dde66SAndroid Build Coastguard Worker
181*481dde66SAndroid Build Coastguard Worker // Returns the reason why x matches, or doesn't match, m.
182*481dde66SAndroid Build Coastguard Worker template <typename MatcherType, typename Value>
Explain(const MatcherType & m,const Value & x)183*481dde66SAndroid Build Coastguard Worker std::string Explain(const MatcherType& m, const Value& x) {
184*481dde66SAndroid Build Coastguard Worker StringMatchResultListener listener;
185*481dde66SAndroid Build Coastguard Worker ExplainMatchResult(m, x, &listener);
186*481dde66SAndroid Build Coastguard Worker return listener.str();
187*481dde66SAndroid Build Coastguard Worker }
188*481dde66SAndroid Build Coastguard Worker
189*481dde66SAndroid Build Coastguard Worker } // namespace gmock_matchers_test
190*481dde66SAndroid Build Coastguard Worker } // namespace testing
191*481dde66SAndroid Build Coastguard Worker
192*481dde66SAndroid Build Coastguard Worker #endif // GOOGLEMOCK_TEST_GMOCK_MATCHERS_TEST_H_
193