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