xref: /aosp_15_r20/external/googletest/googlemock/test/gmock-cardinalities_test.cc (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 tests the built-in cardinalities.
33*481dde66SAndroid Build Coastguard Worker 
34*481dde66SAndroid Build Coastguard Worker #include <ostream>
35*481dde66SAndroid Build Coastguard Worker 
36*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock.h"
37*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest-spi.h"
38*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest.h"
39*481dde66SAndroid Build Coastguard Worker 
40*481dde66SAndroid Build Coastguard Worker namespace {
41*481dde66SAndroid Build Coastguard Worker 
42*481dde66SAndroid Build Coastguard Worker using std::stringstream;
43*481dde66SAndroid Build Coastguard Worker using testing::AnyNumber;
44*481dde66SAndroid Build Coastguard Worker using testing::AtLeast;
45*481dde66SAndroid Build Coastguard Worker using testing::AtMost;
46*481dde66SAndroid Build Coastguard Worker using testing::Between;
47*481dde66SAndroid Build Coastguard Worker using testing::Cardinality;
48*481dde66SAndroid Build Coastguard Worker using testing::CardinalityInterface;
49*481dde66SAndroid Build Coastguard Worker using testing::Exactly;
50*481dde66SAndroid Build Coastguard Worker using testing::IsSubstring;
51*481dde66SAndroid Build Coastguard Worker using testing::MakeCardinality;
52*481dde66SAndroid Build Coastguard Worker 
53*481dde66SAndroid Build Coastguard Worker class MockFoo {
54*481dde66SAndroid Build Coastguard Worker  public:
55*481dde66SAndroid Build Coastguard Worker   MockFoo() = default;
56*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD0(Bar, int());  // NOLINT
57*481dde66SAndroid Build Coastguard Worker 
58*481dde66SAndroid Build Coastguard Worker  private:
59*481dde66SAndroid Build Coastguard Worker   MockFoo(const MockFoo&) = delete;
60*481dde66SAndroid Build Coastguard Worker   MockFoo& operator=(const MockFoo&) = delete;
61*481dde66SAndroid Build Coastguard Worker };
62*481dde66SAndroid Build Coastguard Worker 
63*481dde66SAndroid Build Coastguard Worker // Tests that Cardinality objects can be default constructed.
TEST(CardinalityTest,IsDefaultConstructable)64*481dde66SAndroid Build Coastguard Worker TEST(CardinalityTest, IsDefaultConstructable) { Cardinality c; }
65*481dde66SAndroid Build Coastguard Worker 
66*481dde66SAndroid Build Coastguard Worker // Tests that Cardinality objects are copyable.
TEST(CardinalityTest,IsCopyable)67*481dde66SAndroid Build Coastguard Worker TEST(CardinalityTest, IsCopyable) {
68*481dde66SAndroid Build Coastguard Worker   // Tests the copy constructor.
69*481dde66SAndroid Build Coastguard Worker   Cardinality c = Exactly(1);
70*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
71*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
72*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(1));
73*481dde66SAndroid Build Coastguard Worker 
74*481dde66SAndroid Build Coastguard Worker   // Tests the assignment operator.
75*481dde66SAndroid Build Coastguard Worker   c = Exactly(2);
76*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
77*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
78*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(2));
79*481dde66SAndroid Build Coastguard Worker }
80*481dde66SAndroid Build Coastguard Worker 
TEST(CardinalityTest,IsOverSaturatedByCallCountWorks)81*481dde66SAndroid Build Coastguard Worker TEST(CardinalityTest, IsOverSaturatedByCallCountWorks) {
82*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AtMost(5);
83*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsOverSaturatedByCallCount(4));
84*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsOverSaturatedByCallCount(5));
85*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsOverSaturatedByCallCount(6));
86*481dde66SAndroid Build Coastguard Worker }
87*481dde66SAndroid Build Coastguard Worker 
88*481dde66SAndroid Build Coastguard Worker // Tests that Cardinality::DescribeActualCallCountTo() creates the
89*481dde66SAndroid Build Coastguard Worker // correct description.
TEST(CardinalityTest,CanDescribeActualCallCount)90*481dde66SAndroid Build Coastguard Worker TEST(CardinalityTest, CanDescribeActualCallCount) {
91*481dde66SAndroid Build Coastguard Worker   stringstream ss0;
92*481dde66SAndroid Build Coastguard Worker   Cardinality::DescribeActualCallCountTo(0, &ss0);
93*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("never called", ss0.str());
94*481dde66SAndroid Build Coastguard Worker 
95*481dde66SAndroid Build Coastguard Worker   stringstream ss1;
96*481dde66SAndroid Build Coastguard Worker   Cardinality::DescribeActualCallCountTo(1, &ss1);
97*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("called once", ss1.str());
98*481dde66SAndroid Build Coastguard Worker 
99*481dde66SAndroid Build Coastguard Worker   stringstream ss2;
100*481dde66SAndroid Build Coastguard Worker   Cardinality::DescribeActualCallCountTo(2, &ss2);
101*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("called twice", ss2.str());
102*481dde66SAndroid Build Coastguard Worker 
103*481dde66SAndroid Build Coastguard Worker   stringstream ss3;
104*481dde66SAndroid Build Coastguard Worker   Cardinality::DescribeActualCallCountTo(3, &ss3);
105*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("called 3 times", ss3.str());
106*481dde66SAndroid Build Coastguard Worker }
107*481dde66SAndroid Build Coastguard Worker 
108*481dde66SAndroid Build Coastguard Worker // Tests AnyNumber()
TEST(AnyNumber,Works)109*481dde66SAndroid Build Coastguard Worker TEST(AnyNumber, Works) {
110*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AnyNumber();
111*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
112*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(0));
113*481dde66SAndroid Build Coastguard Worker 
114*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
115*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(1));
116*481dde66SAndroid Build Coastguard Worker 
117*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(9));
118*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(9));
119*481dde66SAndroid Build Coastguard Worker 
120*481dde66SAndroid Build Coastguard Worker   stringstream ss;
121*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
122*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called any number of times", ss.str());
123*481dde66SAndroid Build Coastguard Worker }
124*481dde66SAndroid Build Coastguard Worker 
TEST(AnyNumberTest,HasCorrectBounds)125*481dde66SAndroid Build Coastguard Worker TEST(AnyNumberTest, HasCorrectBounds) {
126*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AnyNumber();
127*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, c.ConservativeLowerBound());
128*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());
129*481dde66SAndroid Build Coastguard Worker }
130*481dde66SAndroid Build Coastguard Worker 
131*481dde66SAndroid Build Coastguard Worker // Tests AtLeast(n).
132*481dde66SAndroid Build Coastguard Worker 
TEST(AtLeastTest,OnNegativeNumber)133*481dde66SAndroid Build Coastguard Worker TEST(AtLeastTest, OnNegativeNumber) {
134*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
135*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
136*481dde66SAndroid Build Coastguard Worker         AtLeast(-1);
137*481dde66SAndroid Build Coastguard Worker       },
138*481dde66SAndroid Build Coastguard Worker       "The invocation lower bound must be >= 0");
139*481dde66SAndroid Build Coastguard Worker }
140*481dde66SAndroid Build Coastguard Worker 
TEST(AtLeastTest,OnZero)141*481dde66SAndroid Build Coastguard Worker TEST(AtLeastTest, OnZero) {
142*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AtLeast(0);
143*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
144*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(0));
145*481dde66SAndroid Build Coastguard Worker 
146*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
147*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(1));
148*481dde66SAndroid Build Coastguard Worker 
149*481dde66SAndroid Build Coastguard Worker   stringstream ss;
150*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
151*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "any number of times", ss.str());
152*481dde66SAndroid Build Coastguard Worker }
153*481dde66SAndroid Build Coastguard Worker 
TEST(AtLeastTest,OnPositiveNumber)154*481dde66SAndroid Build Coastguard Worker TEST(AtLeastTest, OnPositiveNumber) {
155*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AtLeast(2);
156*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
157*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(0));
158*481dde66SAndroid Build Coastguard Worker 
159*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
160*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(1));
161*481dde66SAndroid Build Coastguard Worker 
162*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
163*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(2));
164*481dde66SAndroid Build Coastguard Worker 
165*481dde66SAndroid Build Coastguard Worker   stringstream ss1;
166*481dde66SAndroid Build Coastguard Worker   AtLeast(1).DescribeTo(&ss1);
167*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "at least once", ss1.str());
168*481dde66SAndroid Build Coastguard Worker 
169*481dde66SAndroid Build Coastguard Worker   stringstream ss2;
170*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss2);
171*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "at least twice", ss2.str());
172*481dde66SAndroid Build Coastguard Worker 
173*481dde66SAndroid Build Coastguard Worker   stringstream ss3;
174*481dde66SAndroid Build Coastguard Worker   AtLeast(3).DescribeTo(&ss3);
175*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "at least 3 times", ss3.str());
176*481dde66SAndroid Build Coastguard Worker }
177*481dde66SAndroid Build Coastguard Worker 
TEST(AtLeastTest,HasCorrectBounds)178*481dde66SAndroid Build Coastguard Worker TEST(AtLeastTest, HasCorrectBounds) {
179*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AtLeast(2);
180*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, c.ConservativeLowerBound());
181*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());
182*481dde66SAndroid Build Coastguard Worker }
183*481dde66SAndroid Build Coastguard Worker 
184*481dde66SAndroid Build Coastguard Worker // Tests AtMost(n).
185*481dde66SAndroid Build Coastguard Worker 
TEST(AtMostTest,OnNegativeNumber)186*481dde66SAndroid Build Coastguard Worker TEST(AtMostTest, OnNegativeNumber) {
187*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
188*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
189*481dde66SAndroid Build Coastguard Worker         AtMost(-1);
190*481dde66SAndroid Build Coastguard Worker       },
191*481dde66SAndroid Build Coastguard Worker       "The invocation upper bound must be >= 0");
192*481dde66SAndroid Build Coastguard Worker }
193*481dde66SAndroid Build Coastguard Worker 
TEST(AtMostTest,OnZero)194*481dde66SAndroid Build Coastguard Worker TEST(AtMostTest, OnZero) {
195*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AtMost(0);
196*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
197*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(0));
198*481dde66SAndroid Build Coastguard Worker 
199*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
200*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(1));
201*481dde66SAndroid Build Coastguard Worker 
202*481dde66SAndroid Build Coastguard Worker   stringstream ss;
203*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
204*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "never called", ss.str());
205*481dde66SAndroid Build Coastguard Worker }
206*481dde66SAndroid Build Coastguard Worker 
TEST(AtMostTest,OnPositiveNumber)207*481dde66SAndroid Build Coastguard Worker TEST(AtMostTest, OnPositiveNumber) {
208*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AtMost(2);
209*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
210*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(0));
211*481dde66SAndroid Build Coastguard Worker 
212*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
213*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(1));
214*481dde66SAndroid Build Coastguard Worker 
215*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
216*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(2));
217*481dde66SAndroid Build Coastguard Worker 
218*481dde66SAndroid Build Coastguard Worker   stringstream ss1;
219*481dde66SAndroid Build Coastguard Worker   AtMost(1).DescribeTo(&ss1);
220*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called at most once", ss1.str());
221*481dde66SAndroid Build Coastguard Worker 
222*481dde66SAndroid Build Coastguard Worker   stringstream ss2;
223*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss2);
224*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", ss2.str());
225*481dde66SAndroid Build Coastguard Worker 
226*481dde66SAndroid Build Coastguard Worker   stringstream ss3;
227*481dde66SAndroid Build Coastguard Worker   AtMost(3).DescribeTo(&ss3);
228*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called at most 3 times", ss3.str());
229*481dde66SAndroid Build Coastguard Worker }
230*481dde66SAndroid Build Coastguard Worker 
TEST(AtMostTest,HasCorrectBounds)231*481dde66SAndroid Build Coastguard Worker TEST(AtMostTest, HasCorrectBounds) {
232*481dde66SAndroid Build Coastguard Worker   const Cardinality c = AtMost(2);
233*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, c.ConservativeLowerBound());
234*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, c.ConservativeUpperBound());
235*481dde66SAndroid Build Coastguard Worker }
236*481dde66SAndroid Build Coastguard Worker 
237*481dde66SAndroid Build Coastguard Worker // Tests Between(m, n).
238*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,OnNegativeStart)239*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, OnNegativeStart) {
240*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
241*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
242*481dde66SAndroid Build Coastguard Worker         Between(-1, 2);
243*481dde66SAndroid Build Coastguard Worker       },
244*481dde66SAndroid Build Coastguard Worker       "The invocation lower bound must be >= 0, but is actually -1");
245*481dde66SAndroid Build Coastguard Worker }
246*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,OnNegativeEnd)247*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, OnNegativeEnd) {
248*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
249*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
250*481dde66SAndroid Build Coastguard Worker         Between(1, -2);
251*481dde66SAndroid Build Coastguard Worker       },
252*481dde66SAndroid Build Coastguard Worker       "The invocation upper bound must be >= 0, but is actually -2");
253*481dde66SAndroid Build Coastguard Worker }
254*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,OnStartBiggerThanEnd)255*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, OnStartBiggerThanEnd) {
256*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
257*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
258*481dde66SAndroid Build Coastguard Worker         Between(2, 1);
259*481dde66SAndroid Build Coastguard Worker       },
260*481dde66SAndroid Build Coastguard Worker       "The invocation upper bound (1) must be >= "
261*481dde66SAndroid Build Coastguard Worker       "the invocation lower bound (2)");
262*481dde66SAndroid Build Coastguard Worker }
263*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,OnZeroStartAndZeroEnd)264*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, OnZeroStartAndZeroEnd) {
265*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Between(0, 0);
266*481dde66SAndroid Build Coastguard Worker 
267*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
268*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(0));
269*481dde66SAndroid Build Coastguard Worker 
270*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
271*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(1));
272*481dde66SAndroid Build Coastguard Worker 
273*481dde66SAndroid Build Coastguard Worker   stringstream ss;
274*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
275*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "never called", ss.str());
276*481dde66SAndroid Build Coastguard Worker }
277*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,OnZeroStartAndNonZeroEnd)278*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, OnZeroStartAndNonZeroEnd) {
279*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Between(0, 2);
280*481dde66SAndroid Build Coastguard Worker 
281*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
282*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(0));
283*481dde66SAndroid Build Coastguard Worker 
284*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
285*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(2));
286*481dde66SAndroid Build Coastguard Worker 
287*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(4));
288*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(4));
289*481dde66SAndroid Build Coastguard Worker 
290*481dde66SAndroid Build Coastguard Worker   stringstream ss;
291*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
292*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", ss.str());
293*481dde66SAndroid Build Coastguard Worker }
294*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,OnSameStartAndEnd)295*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, OnSameStartAndEnd) {
296*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Between(3, 3);
297*481dde66SAndroid Build Coastguard Worker 
298*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(2));
299*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(2));
300*481dde66SAndroid Build Coastguard Worker 
301*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(3));
302*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(3));
303*481dde66SAndroid Build Coastguard Worker 
304*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(4));
305*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(4));
306*481dde66SAndroid Build Coastguard Worker 
307*481dde66SAndroid Build Coastguard Worker   stringstream ss;
308*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
309*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", ss.str());
310*481dde66SAndroid Build Coastguard Worker }
311*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,OnDifferentStartAndEnd)312*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, OnDifferentStartAndEnd) {
313*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Between(3, 5);
314*481dde66SAndroid Build Coastguard Worker 
315*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(2));
316*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(2));
317*481dde66SAndroid Build Coastguard Worker 
318*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(3));
319*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(3));
320*481dde66SAndroid Build Coastguard Worker 
321*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(5));
322*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(5));
323*481dde66SAndroid Build Coastguard Worker 
324*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(6));
325*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(6));
326*481dde66SAndroid Build Coastguard Worker 
327*481dde66SAndroid Build Coastguard Worker   stringstream ss;
328*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
329*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called between 3 and 5 times", ss.str());
330*481dde66SAndroid Build Coastguard Worker }
331*481dde66SAndroid Build Coastguard Worker 
TEST(BetweenTest,HasCorrectBounds)332*481dde66SAndroid Build Coastguard Worker TEST(BetweenTest, HasCorrectBounds) {
333*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Between(3, 5);
334*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(3, c.ConservativeLowerBound());
335*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(5, c.ConservativeUpperBound());
336*481dde66SAndroid Build Coastguard Worker }
337*481dde66SAndroid Build Coastguard Worker 
338*481dde66SAndroid Build Coastguard Worker // Tests Exactly(n).
339*481dde66SAndroid Build Coastguard Worker 
TEST(ExactlyTest,OnNegativeNumber)340*481dde66SAndroid Build Coastguard Worker TEST(ExactlyTest, OnNegativeNumber) {
341*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
342*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
343*481dde66SAndroid Build Coastguard Worker         Exactly(-1);
344*481dde66SAndroid Build Coastguard Worker       },
345*481dde66SAndroid Build Coastguard Worker       "The invocation lower bound must be >= 0");
346*481dde66SAndroid Build Coastguard Worker }
347*481dde66SAndroid Build Coastguard Worker 
TEST(ExactlyTest,OnZero)348*481dde66SAndroid Build Coastguard Worker TEST(ExactlyTest, OnZero) {
349*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Exactly(0);
350*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
351*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(0));
352*481dde66SAndroid Build Coastguard Worker 
353*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
354*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(1));
355*481dde66SAndroid Build Coastguard Worker 
356*481dde66SAndroid Build Coastguard Worker   stringstream ss;
357*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
358*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "never called", ss.str());
359*481dde66SAndroid Build Coastguard Worker }
360*481dde66SAndroid Build Coastguard Worker 
TEST(ExactlyTest,OnPositiveNumber)361*481dde66SAndroid Build Coastguard Worker TEST(ExactlyTest, OnPositiveNumber) {
362*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Exactly(2);
363*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
364*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(0));
365*481dde66SAndroid Build Coastguard Worker 
366*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
367*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSaturatedByCallCount(2));
368*481dde66SAndroid Build Coastguard Worker 
369*481dde66SAndroid Build Coastguard Worker   stringstream ss1;
370*481dde66SAndroid Build Coastguard Worker   Exactly(1).DescribeTo(&ss1);
371*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called once", ss1.str());
372*481dde66SAndroid Build Coastguard Worker 
373*481dde66SAndroid Build Coastguard Worker   stringstream ss2;
374*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss2);
375*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called twice", ss2.str());
376*481dde66SAndroid Build Coastguard Worker 
377*481dde66SAndroid Build Coastguard Worker   stringstream ss3;
378*481dde66SAndroid Build Coastguard Worker   Exactly(3).DescribeTo(&ss3);
379*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", ss3.str());
380*481dde66SAndroid Build Coastguard Worker }
381*481dde66SAndroid Build Coastguard Worker 
TEST(ExactlyTest,HasCorrectBounds)382*481dde66SAndroid Build Coastguard Worker TEST(ExactlyTest, HasCorrectBounds) {
383*481dde66SAndroid Build Coastguard Worker   const Cardinality c = Exactly(3);
384*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(3, c.ConservativeLowerBound());
385*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(3, c.ConservativeUpperBound());
386*481dde66SAndroid Build Coastguard Worker }
387*481dde66SAndroid Build Coastguard Worker 
388*481dde66SAndroid Build Coastguard Worker // Tests that a user can make their own cardinality by implementing
389*481dde66SAndroid Build Coastguard Worker // CardinalityInterface and calling MakeCardinality().
390*481dde66SAndroid Build Coastguard Worker 
391*481dde66SAndroid Build Coastguard Worker class EvenCardinality : public CardinalityInterface {
392*481dde66SAndroid Build Coastguard Worker  public:
393*481dde66SAndroid Build Coastguard Worker   // Returns true if and only if call_count calls will satisfy this
394*481dde66SAndroid Build Coastguard Worker   // cardinality.
IsSatisfiedByCallCount(int call_count) const395*481dde66SAndroid Build Coastguard Worker   bool IsSatisfiedByCallCount(int call_count) const override {
396*481dde66SAndroid Build Coastguard Worker     return (call_count % 2 == 0);
397*481dde66SAndroid Build Coastguard Worker   }
398*481dde66SAndroid Build Coastguard Worker 
399*481dde66SAndroid Build Coastguard Worker   // Returns true if and only if call_count calls will saturate this
400*481dde66SAndroid Build Coastguard Worker   // cardinality.
IsSaturatedByCallCount(int) const401*481dde66SAndroid Build Coastguard Worker   bool IsSaturatedByCallCount(int /* call_count */) const override {
402*481dde66SAndroid Build Coastguard Worker     return false;
403*481dde66SAndroid Build Coastguard Worker   }
404*481dde66SAndroid Build Coastguard Worker 
405*481dde66SAndroid Build Coastguard Worker   // Describes self to an ostream.
DescribeTo(::std::ostream * ss) const406*481dde66SAndroid Build Coastguard Worker   void DescribeTo(::std::ostream* ss) const override {
407*481dde66SAndroid Build Coastguard Worker     *ss << "called even number of times";
408*481dde66SAndroid Build Coastguard Worker   }
409*481dde66SAndroid Build Coastguard Worker };
410*481dde66SAndroid Build Coastguard Worker 
TEST(MakeCardinalityTest,ConstructsCardinalityFromInterface)411*481dde66SAndroid Build Coastguard Worker TEST(MakeCardinalityTest, ConstructsCardinalityFromInterface) {
412*481dde66SAndroid Build Coastguard Worker   const Cardinality c = MakeCardinality(new EvenCardinality);
413*481dde66SAndroid Build Coastguard Worker 
414*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
415*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSatisfiedByCallCount(3));
416*481dde66SAndroid Build Coastguard Worker 
417*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(c.IsSaturatedByCallCount(10000));
418*481dde66SAndroid Build Coastguard Worker 
419*481dde66SAndroid Build Coastguard Worker   stringstream ss;
420*481dde66SAndroid Build Coastguard Worker   c.DescribeTo(&ss);
421*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ("called even number of times", ss.str());
422*481dde66SAndroid Build Coastguard Worker }
423*481dde66SAndroid Build Coastguard Worker 
424*481dde66SAndroid Build Coastguard Worker }  // Unnamed namespace
425