xref: /aosp_15_r20/external/googletest/googlemock/include/gmock/gmock-cardinalities.h (revision 481dde660366d6f317d242b6974ef1b20adb843c)
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