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 implements some commonly used cardinalities. More
33*481dde66SAndroid Build Coastguard Worker // cardinalities can be defined by the user implementing the
34*481dde66SAndroid Build Coastguard Worker // CardinalityInterface interface if necessary.
35*481dde66SAndroid Build Coastguard Worker
36*481dde66SAndroid Build Coastguard Worker // IWYU pragma: private, include "gmock/gmock.h"
37*481dde66SAndroid Build Coastguard Worker // IWYU pragma: friend gmock/.*
38*481dde66SAndroid Build Coastguard Worker
39*481dde66SAndroid Build Coastguard Worker #ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_
40*481dde66SAndroid Build Coastguard Worker #define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_
41*481dde66SAndroid Build Coastguard Worker
42*481dde66SAndroid Build Coastguard Worker #include <limits.h>
43*481dde66SAndroid Build Coastguard Worker
44*481dde66SAndroid Build Coastguard Worker #include <memory>
45*481dde66SAndroid Build Coastguard Worker #include <ostream> // NOLINT
46*481dde66SAndroid Build Coastguard Worker
47*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/gmock-port.h"
48*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest.h"
49*481dde66SAndroid Build Coastguard Worker
50*481dde66SAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \
51*481dde66SAndroid Build Coastguard Worker /* class A needs to have dll-interface to be used by clients of class B */)
52*481dde66SAndroid Build Coastguard Worker
53*481dde66SAndroid Build Coastguard Worker namespace testing {
54*481dde66SAndroid Build Coastguard Worker
55*481dde66SAndroid Build Coastguard Worker // To implement a cardinality Foo, define:
56*481dde66SAndroid Build Coastguard Worker // 1. a class FooCardinality that implements the
57*481dde66SAndroid Build Coastguard Worker // CardinalityInterface interface, and
58*481dde66SAndroid Build Coastguard Worker // 2. a factory function that creates a Cardinality object from a
59*481dde66SAndroid Build Coastguard Worker // const FooCardinality*.
60*481dde66SAndroid Build Coastguard Worker //
61*481dde66SAndroid Build Coastguard Worker // The two-level delegation design follows that of Matcher, providing
62*481dde66SAndroid Build Coastguard Worker // consistency for extension developers. It also eases ownership
63*481dde66SAndroid Build Coastguard Worker // management as Cardinality objects can now be copied like plain values.
64*481dde66SAndroid Build Coastguard Worker
65*481dde66SAndroid Build Coastguard Worker // The implementation of a cardinality.
66*481dde66SAndroid Build Coastguard Worker class CardinalityInterface {
67*481dde66SAndroid Build Coastguard Worker public:
68*481dde66SAndroid Build Coastguard Worker virtual ~CardinalityInterface() = default;
69*481dde66SAndroid Build Coastguard Worker
70*481dde66SAndroid Build Coastguard Worker // Conservative estimate on the lower/upper bound of the number of
71*481dde66SAndroid Build Coastguard Worker // calls allowed.
ConservativeLowerBound()72*481dde66SAndroid Build Coastguard Worker virtual int ConservativeLowerBound() const { return 0; }
ConservativeUpperBound()73*481dde66SAndroid Build Coastguard Worker virtual int ConservativeUpperBound() const { return INT_MAX; }
74*481dde66SAndroid Build Coastguard Worker
75*481dde66SAndroid Build Coastguard Worker // Returns true if and only if call_count calls will satisfy this
76*481dde66SAndroid Build Coastguard Worker // cardinality.
77*481dde66SAndroid Build Coastguard Worker virtual bool IsSatisfiedByCallCount(int call_count) const = 0;
78*481dde66SAndroid Build Coastguard Worker
79*481dde66SAndroid Build Coastguard Worker // Returns true if and only if call_count calls will saturate this
80*481dde66SAndroid Build Coastguard Worker // cardinality.
81*481dde66SAndroid Build Coastguard Worker virtual bool IsSaturatedByCallCount(int call_count) const = 0;
82*481dde66SAndroid Build Coastguard Worker
83*481dde66SAndroid Build Coastguard Worker // Describes self to an ostream.
84*481dde66SAndroid Build Coastguard Worker virtual void DescribeTo(::std::ostream* os) const = 0;
85*481dde66SAndroid Build Coastguard Worker };
86*481dde66SAndroid Build Coastguard Worker
87*481dde66SAndroid Build Coastguard Worker // A Cardinality is a copyable and IMMUTABLE (except by assignment)
88*481dde66SAndroid Build Coastguard Worker // object that specifies how many times a mock function is expected to
89*481dde66SAndroid Build Coastguard Worker // be called. The implementation of Cardinality is just a std::shared_ptr
90*481dde66SAndroid Build Coastguard Worker // to const CardinalityInterface. Don't inherit from Cardinality!
91*481dde66SAndroid Build Coastguard Worker class GTEST_API_ Cardinality {
92*481dde66SAndroid Build Coastguard Worker public:
93*481dde66SAndroid Build Coastguard Worker // Constructs a null cardinality. Needed for storing Cardinality
94*481dde66SAndroid Build Coastguard Worker // objects in STL containers.
95*481dde66SAndroid Build Coastguard Worker Cardinality() = default;
96*481dde66SAndroid Build Coastguard Worker
97*481dde66SAndroid Build Coastguard Worker // Constructs a Cardinality from its implementation.
Cardinality(const CardinalityInterface * impl)98*481dde66SAndroid Build Coastguard Worker explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {}
99*481dde66SAndroid Build Coastguard Worker
100*481dde66SAndroid Build Coastguard Worker // Conservative estimate on the lower/upper bound of the number of
101*481dde66SAndroid Build Coastguard Worker // calls allowed.
ConservativeLowerBound()102*481dde66SAndroid Build Coastguard Worker int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); }
ConservativeUpperBound()103*481dde66SAndroid Build Coastguard Worker int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); }
104*481dde66SAndroid Build Coastguard Worker
105*481dde66SAndroid Build Coastguard Worker // Returns true if and only if call_count calls will satisfy this
106*481dde66SAndroid Build Coastguard Worker // cardinality.
IsSatisfiedByCallCount(int call_count)107*481dde66SAndroid Build Coastguard Worker bool IsSatisfiedByCallCount(int call_count) const {
108*481dde66SAndroid Build Coastguard Worker return impl_->IsSatisfiedByCallCount(call_count);
109*481dde66SAndroid Build Coastguard Worker }
110*481dde66SAndroid Build Coastguard Worker
111*481dde66SAndroid Build Coastguard Worker // Returns true if and only if call_count calls will saturate this
112*481dde66SAndroid Build Coastguard Worker // cardinality.
IsSaturatedByCallCount(int call_count)113*481dde66SAndroid Build Coastguard Worker bool IsSaturatedByCallCount(int call_count) const {
114*481dde66SAndroid Build Coastguard Worker return impl_->IsSaturatedByCallCount(call_count);
115*481dde66SAndroid Build Coastguard Worker }
116*481dde66SAndroid Build Coastguard Worker
117*481dde66SAndroid Build Coastguard Worker // Returns true if and only if call_count calls will over-saturate this
118*481dde66SAndroid Build Coastguard Worker // cardinality, i.e. exceed the maximum number of allowed calls.
IsOverSaturatedByCallCount(int call_count)119*481dde66SAndroid Build Coastguard Worker bool IsOverSaturatedByCallCount(int call_count) const {
120*481dde66SAndroid Build Coastguard Worker return impl_->IsSaturatedByCallCount(call_count) &&
121*481dde66SAndroid Build Coastguard Worker !impl_->IsSatisfiedByCallCount(call_count);
122*481dde66SAndroid Build Coastguard Worker }
123*481dde66SAndroid Build Coastguard Worker
124*481dde66SAndroid Build Coastguard Worker // Describes self to an ostream
DescribeTo(::std::ostream * os)125*481dde66SAndroid Build Coastguard Worker void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }
126*481dde66SAndroid Build Coastguard Worker
127*481dde66SAndroid Build Coastguard Worker // Describes the given actual call count to an ostream.
128*481dde66SAndroid Build Coastguard Worker static void DescribeActualCallCountTo(int actual_call_count,
129*481dde66SAndroid Build Coastguard Worker ::std::ostream* os);
130*481dde66SAndroid Build Coastguard Worker
131*481dde66SAndroid Build Coastguard Worker private:
132*481dde66SAndroid Build Coastguard Worker std::shared_ptr<const CardinalityInterface> impl_;
133*481dde66SAndroid Build Coastguard Worker };
134*481dde66SAndroid Build Coastguard Worker
135*481dde66SAndroid Build Coastguard Worker // Creates a cardinality that allows at least n calls.
136*481dde66SAndroid Build Coastguard Worker GTEST_API_ Cardinality AtLeast(int n);
137*481dde66SAndroid Build Coastguard Worker
138*481dde66SAndroid Build Coastguard Worker // Creates a cardinality that allows at most n calls.
139*481dde66SAndroid Build Coastguard Worker GTEST_API_ Cardinality AtMost(int n);
140*481dde66SAndroid Build Coastguard Worker
141*481dde66SAndroid Build Coastguard Worker // Creates a cardinality that allows any number of calls.
142*481dde66SAndroid Build Coastguard Worker GTEST_API_ Cardinality AnyNumber();
143*481dde66SAndroid Build Coastguard Worker
144*481dde66SAndroid Build Coastguard Worker // Creates a cardinality that allows between min and max calls.
145*481dde66SAndroid Build Coastguard Worker GTEST_API_ Cardinality Between(int min, int max);
146*481dde66SAndroid Build Coastguard Worker
147*481dde66SAndroid Build Coastguard Worker // Creates a cardinality that allows exactly n calls.
148*481dde66SAndroid Build Coastguard Worker GTEST_API_ Cardinality Exactly(int n);
149*481dde66SAndroid Build Coastguard Worker
150*481dde66SAndroid Build Coastguard Worker // Creates a cardinality from its implementation.
MakeCardinality(const CardinalityInterface * c)151*481dde66SAndroid Build Coastguard Worker inline Cardinality MakeCardinality(const CardinalityInterface* c) {
152*481dde66SAndroid Build Coastguard Worker return Cardinality(c);
153*481dde66SAndroid Build Coastguard Worker }
154*481dde66SAndroid Build Coastguard Worker
155*481dde66SAndroid Build Coastguard Worker } // namespace testing
156*481dde66SAndroid Build Coastguard Worker
157*481dde66SAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
158*481dde66SAndroid Build Coastguard Worker
159*481dde66SAndroid Build Coastguard Worker #endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_
160