113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com// 3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3113481Sgiacomo.travaglini@arm.com 3213481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes. 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This file implements some commonly used cardinalities. More 3513481Sgiacomo.travaglini@arm.com// cardinalities can be defined by the user implementing the 3613481Sgiacomo.travaglini@arm.com// CardinalityInterface interface if necessary. 3713481Sgiacomo.travaglini@arm.com 3813481Sgiacomo.travaglini@arm.com#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ 3913481Sgiacomo.travaglini@arm.com#define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ 4013481Sgiacomo.travaglini@arm.com 4113481Sgiacomo.travaglini@arm.com#include <limits.h> 4213481Sgiacomo.travaglini@arm.com#include <ostream> // NOLINT 4313481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h" 4413481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 4513481Sgiacomo.travaglini@arm.com 4613481Sgiacomo.travaglini@arm.comnamespace testing { 4713481Sgiacomo.travaglini@arm.com 4813481Sgiacomo.travaglini@arm.com// To implement a cardinality Foo, define: 4913481Sgiacomo.travaglini@arm.com// 1. a class FooCardinality that implements the 5013481Sgiacomo.travaglini@arm.com// CardinalityInterface interface, and 5113481Sgiacomo.travaglini@arm.com// 2. a factory function that creates a Cardinality object from a 5213481Sgiacomo.travaglini@arm.com// const FooCardinality*. 5313481Sgiacomo.travaglini@arm.com// 5413481Sgiacomo.travaglini@arm.com// The two-level delegation design follows that of Matcher, providing 5513481Sgiacomo.travaglini@arm.com// consistency for extension developers. It also eases ownership 5613481Sgiacomo.travaglini@arm.com// management as Cardinality objects can now be copied like plain values. 5713481Sgiacomo.travaglini@arm.com 5813481Sgiacomo.travaglini@arm.com// The implementation of a cardinality. 5913481Sgiacomo.travaglini@arm.comclass CardinalityInterface { 6013481Sgiacomo.travaglini@arm.com public: 6113481Sgiacomo.travaglini@arm.com virtual ~CardinalityInterface() {} 6213481Sgiacomo.travaglini@arm.com 6313481Sgiacomo.travaglini@arm.com // Conservative estimate on the lower/upper bound of the number of 6413481Sgiacomo.travaglini@arm.com // calls allowed. 6513481Sgiacomo.travaglini@arm.com virtual int ConservativeLowerBound() const { return 0; } 6613481Sgiacomo.travaglini@arm.com virtual int ConservativeUpperBound() const { return INT_MAX; } 6713481Sgiacomo.travaglini@arm.com 6813481Sgiacomo.travaglini@arm.com // Returns true iff call_count calls will satisfy this cardinality. 6913481Sgiacomo.travaglini@arm.com virtual bool IsSatisfiedByCallCount(int call_count) const = 0; 7013481Sgiacomo.travaglini@arm.com 7113481Sgiacomo.travaglini@arm.com // Returns true iff call_count calls will saturate this cardinality. 7213481Sgiacomo.travaglini@arm.com virtual bool IsSaturatedByCallCount(int call_count) const = 0; 7313481Sgiacomo.travaglini@arm.com 7413481Sgiacomo.travaglini@arm.com // Describes self to an ostream. 7513481Sgiacomo.travaglini@arm.com virtual void DescribeTo(::std::ostream* os) const = 0; 7613481Sgiacomo.travaglini@arm.com}; 7713481Sgiacomo.travaglini@arm.com 7813481Sgiacomo.travaglini@arm.com// A Cardinality is a copyable and IMMUTABLE (except by assignment) 7913481Sgiacomo.travaglini@arm.com// object that specifies how many times a mock function is expected to 8013481Sgiacomo.travaglini@arm.com// be called. The implementation of Cardinality is just a linked_ptr 8113481Sgiacomo.travaglini@arm.com// to const CardinalityInterface, so copying is fairly cheap. 8213481Sgiacomo.travaglini@arm.com// Don't inherit from Cardinality! 8313481Sgiacomo.travaglini@arm.comclass GTEST_API_ Cardinality { 8413481Sgiacomo.travaglini@arm.com public: 8513481Sgiacomo.travaglini@arm.com // Constructs a null cardinality. Needed for storing Cardinality 8613481Sgiacomo.travaglini@arm.com // objects in STL containers. 8713481Sgiacomo.travaglini@arm.com Cardinality() {} 8813481Sgiacomo.travaglini@arm.com 8913481Sgiacomo.travaglini@arm.com // Constructs a Cardinality from its implementation. 9013481Sgiacomo.travaglini@arm.com explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} 9113481Sgiacomo.travaglini@arm.com 9213481Sgiacomo.travaglini@arm.com // Conservative estimate on the lower/upper bound of the number of 9313481Sgiacomo.travaglini@arm.com // calls allowed. 9413481Sgiacomo.travaglini@arm.com int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } 9513481Sgiacomo.travaglini@arm.com int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } 9613481Sgiacomo.travaglini@arm.com 9713481Sgiacomo.travaglini@arm.com // Returns true iff call_count calls will satisfy this cardinality. 9813481Sgiacomo.travaglini@arm.com bool IsSatisfiedByCallCount(int call_count) const { 9913481Sgiacomo.travaglini@arm.com return impl_->IsSatisfiedByCallCount(call_count); 10013481Sgiacomo.travaglini@arm.com } 10113481Sgiacomo.travaglini@arm.com 10213481Sgiacomo.travaglini@arm.com // Returns true iff call_count calls will saturate this cardinality. 10313481Sgiacomo.travaglini@arm.com bool IsSaturatedByCallCount(int call_count) const { 10413481Sgiacomo.travaglini@arm.com return impl_->IsSaturatedByCallCount(call_count); 10513481Sgiacomo.travaglini@arm.com } 10613481Sgiacomo.travaglini@arm.com 10713481Sgiacomo.travaglini@arm.com // Returns true iff call_count calls will over-saturate this 10813481Sgiacomo.travaglini@arm.com // cardinality, i.e. exceed the maximum number of allowed calls. 10913481Sgiacomo.travaglini@arm.com bool IsOverSaturatedByCallCount(int call_count) const { 11013481Sgiacomo.travaglini@arm.com return impl_->IsSaturatedByCallCount(call_count) && 11113481Sgiacomo.travaglini@arm.com !impl_->IsSatisfiedByCallCount(call_count); 11213481Sgiacomo.travaglini@arm.com } 11313481Sgiacomo.travaglini@arm.com 11413481Sgiacomo.travaglini@arm.com // Describes self to an ostream 11513481Sgiacomo.travaglini@arm.com void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } 11613481Sgiacomo.travaglini@arm.com 11713481Sgiacomo.travaglini@arm.com // Describes the given actual call count to an ostream. 11813481Sgiacomo.travaglini@arm.com static void DescribeActualCallCountTo(int actual_call_count, 11913481Sgiacomo.travaglini@arm.com ::std::ostream* os); 12013481Sgiacomo.travaglini@arm.com 12113481Sgiacomo.travaglini@arm.com private: 12213481Sgiacomo.travaglini@arm.com internal::linked_ptr<const CardinalityInterface> impl_; 12313481Sgiacomo.travaglini@arm.com}; 12413481Sgiacomo.travaglini@arm.com 12513481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows at least n calls. 12613481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality AtLeast(int n); 12713481Sgiacomo.travaglini@arm.com 12813481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows at most n calls. 12913481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality AtMost(int n); 13013481Sgiacomo.travaglini@arm.com 13113481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows any number of calls. 13213481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality AnyNumber(); 13313481Sgiacomo.travaglini@arm.com 13413481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows between min and max calls. 13513481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality Between(int min, int max); 13613481Sgiacomo.travaglini@arm.com 13713481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows exactly n calls. 13813481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality Exactly(int n); 13913481Sgiacomo.travaglini@arm.com 14013481Sgiacomo.travaglini@arm.com// Creates a cardinality from its implementation. 14113481Sgiacomo.travaglini@arm.cominline Cardinality MakeCardinality(const CardinalityInterface* c) { 14213481Sgiacomo.travaglini@arm.com return Cardinality(c); 14313481Sgiacomo.travaglini@arm.com} 14413481Sgiacomo.travaglini@arm.com 14513481Sgiacomo.travaglini@arm.com} // namespace testing 14613481Sgiacomo.travaglini@arm.com 14713481Sgiacomo.travaglini@arm.com#endif // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ 148