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