1b89a7cc2SEnji Cooper // Copyright 2007, Google Inc.
2b89a7cc2SEnji Cooper // All rights reserved.
3b89a7cc2SEnji Cooper //
4b89a7cc2SEnji Cooper // Redistribution and use in source and binary forms, with or without
5b89a7cc2SEnji Cooper // modification, are permitted provided that the following conditions are
6b89a7cc2SEnji Cooper // met:
7b89a7cc2SEnji Cooper //
8b89a7cc2SEnji Cooper // * Redistributions of source code must retain the above copyright
9b89a7cc2SEnji Cooper // notice, this list of conditions and the following disclaimer.
10b89a7cc2SEnji Cooper // * Redistributions in binary form must reproduce the above
11b89a7cc2SEnji Cooper // copyright notice, this list of conditions and the following disclaimer
12b89a7cc2SEnji Cooper // in the documentation and/or other materials provided with the
13b89a7cc2SEnji Cooper // distribution.
14b89a7cc2SEnji Cooper // * Neither the name of Google Inc. nor the names of its
15b89a7cc2SEnji Cooper // contributors may be used to endorse or promote products derived from
16b89a7cc2SEnji Cooper // this software without specific prior written permission.
17b89a7cc2SEnji Cooper //
18b89a7cc2SEnji Cooper // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19b89a7cc2SEnji Cooper // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20b89a7cc2SEnji Cooper // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21b89a7cc2SEnji Cooper // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22b89a7cc2SEnji Cooper // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23b89a7cc2SEnji Cooper // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24b89a7cc2SEnji Cooper // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25b89a7cc2SEnji Cooper // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26b89a7cc2SEnji Cooper // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27b89a7cc2SEnji Cooper // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28b89a7cc2SEnji Cooper // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29b89a7cc2SEnji Cooper
30b89a7cc2SEnji Cooper // Google Mock - a framework for writing C++ mock classes.
31b89a7cc2SEnji Cooper //
32b89a7cc2SEnji Cooper // This file tests the built-in cardinalities.
33b89a7cc2SEnji Cooper
34*28f6c2f2SEnji Cooper #include <ostream>
35*28f6c2f2SEnji Cooper
36b89a7cc2SEnji Cooper #include "gmock/gmock.h"
37b89a7cc2SEnji Cooper #include "gtest/gtest-spi.h"
38*28f6c2f2SEnji Cooper #include "gtest/gtest.h"
39b89a7cc2SEnji Cooper
40b89a7cc2SEnji Cooper namespace {
41b89a7cc2SEnji Cooper
42b89a7cc2SEnji Cooper using std::stringstream;
43b89a7cc2SEnji Cooper using testing::AnyNumber;
44b89a7cc2SEnji Cooper using testing::AtLeast;
45b89a7cc2SEnji Cooper using testing::AtMost;
46b89a7cc2SEnji Cooper using testing::Between;
47b89a7cc2SEnji Cooper using testing::Cardinality;
48b89a7cc2SEnji Cooper using testing::CardinalityInterface;
49b89a7cc2SEnji Cooper using testing::Exactly;
50b89a7cc2SEnji Cooper using testing::IsSubstring;
51b89a7cc2SEnji Cooper using testing::MakeCardinality;
52b89a7cc2SEnji Cooper
53b89a7cc2SEnji Cooper class MockFoo {
54b89a7cc2SEnji Cooper public:
55*28f6c2f2SEnji Cooper MockFoo() = default;
56b89a7cc2SEnji Cooper MOCK_METHOD0(Bar, int()); // NOLINT
57b89a7cc2SEnji Cooper
58b89a7cc2SEnji Cooper private:
59*28f6c2f2SEnji Cooper MockFoo(const MockFoo&) = delete;
60*28f6c2f2SEnji Cooper MockFoo& operator=(const MockFoo&) = delete;
61b89a7cc2SEnji Cooper };
62b89a7cc2SEnji Cooper
63b89a7cc2SEnji Cooper // Tests that Cardinality objects can be default constructed.
TEST(CardinalityTest,IsDefaultConstructable)64*28f6c2f2SEnji Cooper TEST(CardinalityTest, IsDefaultConstructable) { Cardinality c; }
65b89a7cc2SEnji Cooper
66b89a7cc2SEnji Cooper // Tests that Cardinality objects are copyable.
TEST(CardinalityTest,IsCopyable)67b89a7cc2SEnji Cooper TEST(CardinalityTest, IsCopyable) {
68b89a7cc2SEnji Cooper // Tests the copy constructor.
69b89a7cc2SEnji Cooper Cardinality c = Exactly(1);
70b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
71b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
72b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(1));
73b89a7cc2SEnji Cooper
74b89a7cc2SEnji Cooper // Tests the assignment operator.
75b89a7cc2SEnji Cooper c = Exactly(2);
76b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
77b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
78b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(2));
79b89a7cc2SEnji Cooper }
80b89a7cc2SEnji Cooper
TEST(CardinalityTest,IsOverSaturatedByCallCountWorks)81b89a7cc2SEnji Cooper TEST(CardinalityTest, IsOverSaturatedByCallCountWorks) {
82b89a7cc2SEnji Cooper const Cardinality c = AtMost(5);
83b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsOverSaturatedByCallCount(4));
84b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsOverSaturatedByCallCount(5));
85b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsOverSaturatedByCallCount(6));
86b89a7cc2SEnji Cooper }
87b89a7cc2SEnji Cooper
88b89a7cc2SEnji Cooper // Tests that Cardinality::DescribeActualCallCountTo() creates the
89b89a7cc2SEnji Cooper // correct description.
TEST(CardinalityTest,CanDescribeActualCallCount)90b89a7cc2SEnji Cooper TEST(CardinalityTest, CanDescribeActualCallCount) {
91b89a7cc2SEnji Cooper stringstream ss0;
92b89a7cc2SEnji Cooper Cardinality::DescribeActualCallCountTo(0, &ss0);
93b89a7cc2SEnji Cooper EXPECT_EQ("never called", ss0.str());
94b89a7cc2SEnji Cooper
95b89a7cc2SEnji Cooper stringstream ss1;
96b89a7cc2SEnji Cooper Cardinality::DescribeActualCallCountTo(1, &ss1);
97b89a7cc2SEnji Cooper EXPECT_EQ("called once", ss1.str());
98b89a7cc2SEnji Cooper
99b89a7cc2SEnji Cooper stringstream ss2;
100b89a7cc2SEnji Cooper Cardinality::DescribeActualCallCountTo(2, &ss2);
101b89a7cc2SEnji Cooper EXPECT_EQ("called twice", ss2.str());
102b89a7cc2SEnji Cooper
103b89a7cc2SEnji Cooper stringstream ss3;
104b89a7cc2SEnji Cooper Cardinality::DescribeActualCallCountTo(3, &ss3);
105b89a7cc2SEnji Cooper EXPECT_EQ("called 3 times", ss3.str());
106b89a7cc2SEnji Cooper }
107b89a7cc2SEnji Cooper
108b89a7cc2SEnji Cooper // Tests AnyNumber()
TEST(AnyNumber,Works)109b89a7cc2SEnji Cooper TEST(AnyNumber, Works) {
110b89a7cc2SEnji Cooper const Cardinality c = AnyNumber();
111b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
112b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(0));
113b89a7cc2SEnji Cooper
114b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
115b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(1));
116b89a7cc2SEnji Cooper
117b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(9));
118b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(9));
119b89a7cc2SEnji Cooper
120b89a7cc2SEnji Cooper stringstream ss;
121b89a7cc2SEnji Cooper c.DescribeTo(&ss);
122*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called any number of times", ss.str());
123b89a7cc2SEnji Cooper }
124b89a7cc2SEnji Cooper
TEST(AnyNumberTest,HasCorrectBounds)125b89a7cc2SEnji Cooper TEST(AnyNumberTest, HasCorrectBounds) {
126b89a7cc2SEnji Cooper const Cardinality c = AnyNumber();
127b89a7cc2SEnji Cooper EXPECT_EQ(0, c.ConservativeLowerBound());
128b89a7cc2SEnji Cooper EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());
129b89a7cc2SEnji Cooper }
130b89a7cc2SEnji Cooper
131b89a7cc2SEnji Cooper // Tests AtLeast(n).
132b89a7cc2SEnji Cooper
TEST(AtLeastTest,OnNegativeNumber)133b89a7cc2SEnji Cooper TEST(AtLeastTest, OnNegativeNumber) {
134*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(
135*28f6c2f2SEnji Cooper { // NOLINT
136b89a7cc2SEnji Cooper AtLeast(-1);
137*28f6c2f2SEnji Cooper },
138*28f6c2f2SEnji Cooper "The invocation lower bound must be >= 0");
139b89a7cc2SEnji Cooper }
140b89a7cc2SEnji Cooper
TEST(AtLeastTest,OnZero)141b89a7cc2SEnji Cooper TEST(AtLeastTest, OnZero) {
142b89a7cc2SEnji Cooper const Cardinality c = AtLeast(0);
143b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
144b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(0));
145b89a7cc2SEnji Cooper
146b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
147b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(1));
148b89a7cc2SEnji Cooper
149b89a7cc2SEnji Cooper stringstream ss;
150b89a7cc2SEnji Cooper c.DescribeTo(&ss);
151*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "any number of times", ss.str());
152b89a7cc2SEnji Cooper }
153b89a7cc2SEnji Cooper
TEST(AtLeastTest,OnPositiveNumber)154b89a7cc2SEnji Cooper TEST(AtLeastTest, OnPositiveNumber) {
155b89a7cc2SEnji Cooper const Cardinality c = AtLeast(2);
156b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
157b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(0));
158b89a7cc2SEnji Cooper
159b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
160b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(1));
161b89a7cc2SEnji Cooper
162b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
163b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(2));
164b89a7cc2SEnji Cooper
165b89a7cc2SEnji Cooper stringstream ss1;
166b89a7cc2SEnji Cooper AtLeast(1).DescribeTo(&ss1);
167*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "at least once", ss1.str());
168b89a7cc2SEnji Cooper
169b89a7cc2SEnji Cooper stringstream ss2;
170b89a7cc2SEnji Cooper c.DescribeTo(&ss2);
171*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "at least twice", ss2.str());
172b89a7cc2SEnji Cooper
173b89a7cc2SEnji Cooper stringstream ss3;
174b89a7cc2SEnji Cooper AtLeast(3).DescribeTo(&ss3);
175*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "at least 3 times", ss3.str());
176b89a7cc2SEnji Cooper }
177b89a7cc2SEnji Cooper
TEST(AtLeastTest,HasCorrectBounds)178b89a7cc2SEnji Cooper TEST(AtLeastTest, HasCorrectBounds) {
179b89a7cc2SEnji Cooper const Cardinality c = AtLeast(2);
180b89a7cc2SEnji Cooper EXPECT_EQ(2, c.ConservativeLowerBound());
181b89a7cc2SEnji Cooper EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());
182b89a7cc2SEnji Cooper }
183b89a7cc2SEnji Cooper
184b89a7cc2SEnji Cooper // Tests AtMost(n).
185b89a7cc2SEnji Cooper
TEST(AtMostTest,OnNegativeNumber)186b89a7cc2SEnji Cooper TEST(AtMostTest, OnNegativeNumber) {
187*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(
188*28f6c2f2SEnji Cooper { // NOLINT
189b89a7cc2SEnji Cooper AtMost(-1);
190*28f6c2f2SEnji Cooper },
191*28f6c2f2SEnji Cooper "The invocation upper bound must be >= 0");
192b89a7cc2SEnji Cooper }
193b89a7cc2SEnji Cooper
TEST(AtMostTest,OnZero)194b89a7cc2SEnji Cooper TEST(AtMostTest, OnZero) {
195b89a7cc2SEnji Cooper const Cardinality c = AtMost(0);
196b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
197b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(0));
198b89a7cc2SEnji Cooper
199b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
200b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(1));
201b89a7cc2SEnji Cooper
202b89a7cc2SEnji Cooper stringstream ss;
203b89a7cc2SEnji Cooper c.DescribeTo(&ss);
204*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "never called", ss.str());
205b89a7cc2SEnji Cooper }
206b89a7cc2SEnji Cooper
TEST(AtMostTest,OnPositiveNumber)207b89a7cc2SEnji Cooper TEST(AtMostTest, OnPositiveNumber) {
208b89a7cc2SEnji Cooper const Cardinality c = AtMost(2);
209b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
210b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(0));
211b89a7cc2SEnji Cooper
212b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
213b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(1));
214b89a7cc2SEnji Cooper
215b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
216b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(2));
217b89a7cc2SEnji Cooper
218b89a7cc2SEnji Cooper stringstream ss1;
219b89a7cc2SEnji Cooper AtMost(1).DescribeTo(&ss1);
220*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called at most once", ss1.str());
221b89a7cc2SEnji Cooper
222b89a7cc2SEnji Cooper stringstream ss2;
223b89a7cc2SEnji Cooper c.DescribeTo(&ss2);
224*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", ss2.str());
225b89a7cc2SEnji Cooper
226b89a7cc2SEnji Cooper stringstream ss3;
227b89a7cc2SEnji Cooper AtMost(3).DescribeTo(&ss3);
228*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called at most 3 times", ss3.str());
229b89a7cc2SEnji Cooper }
230b89a7cc2SEnji Cooper
TEST(AtMostTest,HasCorrectBounds)231b89a7cc2SEnji Cooper TEST(AtMostTest, HasCorrectBounds) {
232b89a7cc2SEnji Cooper const Cardinality c = AtMost(2);
233b89a7cc2SEnji Cooper EXPECT_EQ(0, c.ConservativeLowerBound());
234b89a7cc2SEnji Cooper EXPECT_EQ(2, c.ConservativeUpperBound());
235b89a7cc2SEnji Cooper }
236b89a7cc2SEnji Cooper
237b89a7cc2SEnji Cooper // Tests Between(m, n).
238b89a7cc2SEnji Cooper
TEST(BetweenTest,OnNegativeStart)239b89a7cc2SEnji Cooper TEST(BetweenTest, OnNegativeStart) {
240*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(
241*28f6c2f2SEnji Cooper { // NOLINT
242b89a7cc2SEnji Cooper Between(-1, 2);
243*28f6c2f2SEnji Cooper },
244*28f6c2f2SEnji Cooper "The invocation lower bound must be >= 0, but is actually -1");
245b89a7cc2SEnji Cooper }
246b89a7cc2SEnji Cooper
TEST(BetweenTest,OnNegativeEnd)247b89a7cc2SEnji Cooper TEST(BetweenTest, OnNegativeEnd) {
248*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(
249*28f6c2f2SEnji Cooper { // NOLINT
250b89a7cc2SEnji Cooper Between(1, -2);
251*28f6c2f2SEnji Cooper },
252*28f6c2f2SEnji Cooper "The invocation upper bound must be >= 0, but is actually -2");
253b89a7cc2SEnji Cooper }
254b89a7cc2SEnji Cooper
TEST(BetweenTest,OnStartBiggerThanEnd)255b89a7cc2SEnji Cooper TEST(BetweenTest, OnStartBiggerThanEnd) {
256*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(
257*28f6c2f2SEnji Cooper { // NOLINT
258b89a7cc2SEnji Cooper Between(2, 1);
259*28f6c2f2SEnji Cooper },
260*28f6c2f2SEnji Cooper "The invocation upper bound (1) must be >= "
261b89a7cc2SEnji Cooper "the invocation lower bound (2)");
262b89a7cc2SEnji Cooper }
263b89a7cc2SEnji Cooper
TEST(BetweenTest,OnZeroStartAndZeroEnd)264b89a7cc2SEnji Cooper TEST(BetweenTest, OnZeroStartAndZeroEnd) {
265b89a7cc2SEnji Cooper const Cardinality c = Between(0, 0);
266b89a7cc2SEnji Cooper
267b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
268b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(0));
269b89a7cc2SEnji Cooper
270b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
271b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(1));
272b89a7cc2SEnji Cooper
273b89a7cc2SEnji Cooper stringstream ss;
274b89a7cc2SEnji Cooper c.DescribeTo(&ss);
275*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "never called", ss.str());
276b89a7cc2SEnji Cooper }
277b89a7cc2SEnji Cooper
TEST(BetweenTest,OnZeroStartAndNonZeroEnd)278b89a7cc2SEnji Cooper TEST(BetweenTest, OnZeroStartAndNonZeroEnd) {
279b89a7cc2SEnji Cooper const Cardinality c = Between(0, 2);
280b89a7cc2SEnji Cooper
281b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
282b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(0));
283b89a7cc2SEnji Cooper
284b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
285b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(2));
286b89a7cc2SEnji Cooper
287b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(4));
288b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(4));
289b89a7cc2SEnji Cooper
290b89a7cc2SEnji Cooper stringstream ss;
291b89a7cc2SEnji Cooper c.DescribeTo(&ss);
292*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", ss.str());
293b89a7cc2SEnji Cooper }
294b89a7cc2SEnji Cooper
TEST(BetweenTest,OnSameStartAndEnd)295b89a7cc2SEnji Cooper TEST(BetweenTest, OnSameStartAndEnd) {
296b89a7cc2SEnji Cooper const Cardinality c = Between(3, 3);
297b89a7cc2SEnji Cooper
298b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(2));
299b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(2));
300b89a7cc2SEnji Cooper
301b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(3));
302b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(3));
303b89a7cc2SEnji Cooper
304b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(4));
305b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(4));
306b89a7cc2SEnji Cooper
307b89a7cc2SEnji Cooper stringstream ss;
308b89a7cc2SEnji Cooper c.DescribeTo(&ss);
309*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", ss.str());
310b89a7cc2SEnji Cooper }
311b89a7cc2SEnji Cooper
TEST(BetweenTest,OnDifferentStartAndEnd)312b89a7cc2SEnji Cooper TEST(BetweenTest, OnDifferentStartAndEnd) {
313b89a7cc2SEnji Cooper const Cardinality c = Between(3, 5);
314b89a7cc2SEnji Cooper
315b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(2));
316b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(2));
317b89a7cc2SEnji Cooper
318b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(3));
319b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(3));
320b89a7cc2SEnji Cooper
321b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(5));
322b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(5));
323b89a7cc2SEnji Cooper
324b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(6));
325b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(6));
326b89a7cc2SEnji Cooper
327b89a7cc2SEnji Cooper stringstream ss;
328b89a7cc2SEnji Cooper c.DescribeTo(&ss);
329*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called between 3 and 5 times", ss.str());
330b89a7cc2SEnji Cooper }
331b89a7cc2SEnji Cooper
TEST(BetweenTest,HasCorrectBounds)332b89a7cc2SEnji Cooper TEST(BetweenTest, HasCorrectBounds) {
333b89a7cc2SEnji Cooper const Cardinality c = Between(3, 5);
334b89a7cc2SEnji Cooper EXPECT_EQ(3, c.ConservativeLowerBound());
335b89a7cc2SEnji Cooper EXPECT_EQ(5, c.ConservativeUpperBound());
336b89a7cc2SEnji Cooper }
337b89a7cc2SEnji Cooper
338b89a7cc2SEnji Cooper // Tests Exactly(n).
339b89a7cc2SEnji Cooper
TEST(ExactlyTest,OnNegativeNumber)340b89a7cc2SEnji Cooper TEST(ExactlyTest, OnNegativeNumber) {
341*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(
342*28f6c2f2SEnji Cooper { // NOLINT
343b89a7cc2SEnji Cooper Exactly(-1);
344*28f6c2f2SEnji Cooper },
345*28f6c2f2SEnji Cooper "The invocation lower bound must be >= 0");
346b89a7cc2SEnji Cooper }
347b89a7cc2SEnji Cooper
TEST(ExactlyTest,OnZero)348b89a7cc2SEnji Cooper TEST(ExactlyTest, OnZero) {
349b89a7cc2SEnji Cooper const Cardinality c = Exactly(0);
350b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
351b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(0));
352b89a7cc2SEnji Cooper
353b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
354b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(1));
355b89a7cc2SEnji Cooper
356b89a7cc2SEnji Cooper stringstream ss;
357b89a7cc2SEnji Cooper c.DescribeTo(&ss);
358*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "never called", ss.str());
359b89a7cc2SEnji Cooper }
360b89a7cc2SEnji Cooper
TEST(ExactlyTest,OnPositiveNumber)361b89a7cc2SEnji Cooper TEST(ExactlyTest, OnPositiveNumber) {
362b89a7cc2SEnji Cooper const Cardinality c = Exactly(2);
363b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
364b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(0));
365b89a7cc2SEnji Cooper
366b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
367b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSaturatedByCallCount(2));
368b89a7cc2SEnji Cooper
369b89a7cc2SEnji Cooper stringstream ss1;
370b89a7cc2SEnji Cooper Exactly(1).DescribeTo(&ss1);
371*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called once", ss1.str());
372b89a7cc2SEnji Cooper
373b89a7cc2SEnji Cooper stringstream ss2;
374b89a7cc2SEnji Cooper c.DescribeTo(&ss2);
375*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called twice", ss2.str());
376b89a7cc2SEnji Cooper
377b89a7cc2SEnji Cooper stringstream ss3;
378b89a7cc2SEnji Cooper Exactly(3).DescribeTo(&ss3);
379*28f6c2f2SEnji Cooper EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", ss3.str());
380b89a7cc2SEnji Cooper }
381b89a7cc2SEnji Cooper
TEST(ExactlyTest,HasCorrectBounds)382b89a7cc2SEnji Cooper TEST(ExactlyTest, HasCorrectBounds) {
383b89a7cc2SEnji Cooper const Cardinality c = Exactly(3);
384b89a7cc2SEnji Cooper EXPECT_EQ(3, c.ConservativeLowerBound());
385b89a7cc2SEnji Cooper EXPECT_EQ(3, c.ConservativeUpperBound());
386b89a7cc2SEnji Cooper }
387b89a7cc2SEnji Cooper
388b89a7cc2SEnji Cooper // Tests that a user can make their own cardinality by implementing
389b89a7cc2SEnji Cooper // CardinalityInterface and calling MakeCardinality().
390b89a7cc2SEnji Cooper
391b89a7cc2SEnji Cooper class EvenCardinality : public CardinalityInterface {
392b89a7cc2SEnji Cooper public:
393*28f6c2f2SEnji Cooper // Returns true if and only if call_count calls will satisfy this
394*28f6c2f2SEnji Cooper // cardinality.
IsSatisfiedByCallCount(int call_count) const395*28f6c2f2SEnji Cooper bool IsSatisfiedByCallCount(int call_count) const override {
396b89a7cc2SEnji Cooper return (call_count % 2 == 0);
397b89a7cc2SEnji Cooper }
398b89a7cc2SEnji Cooper
399*28f6c2f2SEnji Cooper // Returns true if and only if call_count calls will saturate this
400*28f6c2f2SEnji Cooper // cardinality.
IsSaturatedByCallCount(int) const401*28f6c2f2SEnji Cooper bool IsSaturatedByCallCount(int /* call_count */) const override {
402b89a7cc2SEnji Cooper return false;
403b89a7cc2SEnji Cooper }
404b89a7cc2SEnji Cooper
405b89a7cc2SEnji Cooper // Describes self to an ostream.
DescribeTo(::std::ostream * ss) const406*28f6c2f2SEnji Cooper void DescribeTo(::std::ostream* ss) const override {
407b89a7cc2SEnji Cooper *ss << "called even number of times";
408b89a7cc2SEnji Cooper }
409b89a7cc2SEnji Cooper };
410b89a7cc2SEnji Cooper
TEST(MakeCardinalityTest,ConstructsCardinalityFromInterface)411b89a7cc2SEnji Cooper TEST(MakeCardinalityTest, ConstructsCardinalityFromInterface) {
412b89a7cc2SEnji Cooper const Cardinality c = MakeCardinality(new EvenCardinality);
413b89a7cc2SEnji Cooper
414b89a7cc2SEnji Cooper EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
415b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSatisfiedByCallCount(3));
416b89a7cc2SEnji Cooper
417b89a7cc2SEnji Cooper EXPECT_FALSE(c.IsSaturatedByCallCount(10000));
418b89a7cc2SEnji Cooper
419b89a7cc2SEnji Cooper stringstream ss;
420b89a7cc2SEnji Cooper c.DescribeTo(&ss);
421b89a7cc2SEnji Cooper EXPECT_EQ("called even number of times", ss.str());
422b89a7cc2SEnji Cooper }
423b89a7cc2SEnji Cooper
424b89a7cc2SEnji Cooper } // Unnamed namespace
425