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