gmock-cardinalities.cc revision 13481
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 cardinalities. 3513481Sgiacomo.travaglini@arm.com 3613481Sgiacomo.travaglini@arm.com#include "gmock/gmock-cardinalities.h" 3713481Sgiacomo.travaglini@arm.com 3813481Sgiacomo.travaglini@arm.com#include <limits.h> 3913481Sgiacomo.travaglini@arm.com#include <ostream> // NOLINT 4013481Sgiacomo.travaglini@arm.com#include <sstream> 4113481Sgiacomo.travaglini@arm.com#include <string> 4213481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-internal-utils.h" 4313481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 4413481Sgiacomo.travaglini@arm.com 4513481Sgiacomo.travaglini@arm.comnamespace testing { 4613481Sgiacomo.travaglini@arm.com 4713481Sgiacomo.travaglini@arm.comnamespace { 4813481Sgiacomo.travaglini@arm.com 4913481Sgiacomo.travaglini@arm.com// Implements the Between(m, n) cardinality. 5013481Sgiacomo.travaglini@arm.comclass BetweenCardinalityImpl : public CardinalityInterface { 5113481Sgiacomo.travaglini@arm.com public: 5213481Sgiacomo.travaglini@arm.com BetweenCardinalityImpl(int min, int max) 5313481Sgiacomo.travaglini@arm.com : min_(min >= 0 ? min : 0), 5413481Sgiacomo.travaglini@arm.com max_(max >= min_ ? max : min_) { 5513481Sgiacomo.travaglini@arm.com std::stringstream ss; 5613481Sgiacomo.travaglini@arm.com if (min < 0) { 5713481Sgiacomo.travaglini@arm.com ss << "The invocation lower bound must be >= 0, " 5813481Sgiacomo.travaglini@arm.com << "but is actually " << min << "."; 5913481Sgiacomo.travaglini@arm.com internal::Expect(false, __FILE__, __LINE__, ss.str()); 6013481Sgiacomo.travaglini@arm.com } else if (max < 0) { 6113481Sgiacomo.travaglini@arm.com ss << "The invocation upper bound must be >= 0, " 6213481Sgiacomo.travaglini@arm.com << "but is actually " << max << "."; 6313481Sgiacomo.travaglini@arm.com internal::Expect(false, __FILE__, __LINE__, ss.str()); 6413481Sgiacomo.travaglini@arm.com } else if (min > max) { 6513481Sgiacomo.travaglini@arm.com ss << "The invocation upper bound (" << max 6613481Sgiacomo.travaglini@arm.com << ") must be >= the invocation lower bound (" << min 6713481Sgiacomo.travaglini@arm.com << ")."; 6813481Sgiacomo.travaglini@arm.com internal::Expect(false, __FILE__, __LINE__, ss.str()); 6913481Sgiacomo.travaglini@arm.com } 7013481Sgiacomo.travaglini@arm.com } 7113481Sgiacomo.travaglini@arm.com 7213481Sgiacomo.travaglini@arm.com // Conservative estimate on the lower/upper bound of the number of 7313481Sgiacomo.travaglini@arm.com // calls allowed. 7413481Sgiacomo.travaglini@arm.com virtual int ConservativeLowerBound() const { return min_; } 7513481Sgiacomo.travaglini@arm.com virtual int ConservativeUpperBound() const { return max_; } 7613481Sgiacomo.travaglini@arm.com 7713481Sgiacomo.travaglini@arm.com virtual bool IsSatisfiedByCallCount(int call_count) const { 7813481Sgiacomo.travaglini@arm.com return min_ <= call_count && call_count <= max_; 7913481Sgiacomo.travaglini@arm.com } 8013481Sgiacomo.travaglini@arm.com 8113481Sgiacomo.travaglini@arm.com virtual bool IsSaturatedByCallCount(int call_count) const { 8213481Sgiacomo.travaglini@arm.com return call_count >= max_; 8313481Sgiacomo.travaglini@arm.com } 8413481Sgiacomo.travaglini@arm.com 8513481Sgiacomo.travaglini@arm.com virtual void DescribeTo(::std::ostream* os) const; 8613481Sgiacomo.travaglini@arm.com 8713481Sgiacomo.travaglini@arm.com private: 8813481Sgiacomo.travaglini@arm.com const int min_; 8913481Sgiacomo.travaglini@arm.com const int max_; 9013481Sgiacomo.travaglini@arm.com 9113481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(BetweenCardinalityImpl); 9213481Sgiacomo.travaglini@arm.com}; 9313481Sgiacomo.travaglini@arm.com 9413481Sgiacomo.travaglini@arm.com// Formats "n times" in a human-friendly way. 9513481Sgiacomo.travaglini@arm.cominline internal::string FormatTimes(int n) { 9613481Sgiacomo.travaglini@arm.com if (n == 1) { 9713481Sgiacomo.travaglini@arm.com return "once"; 9813481Sgiacomo.travaglini@arm.com } else if (n == 2) { 9913481Sgiacomo.travaglini@arm.com return "twice"; 10013481Sgiacomo.travaglini@arm.com } else { 10113481Sgiacomo.travaglini@arm.com std::stringstream ss; 10213481Sgiacomo.travaglini@arm.com ss << n << " times"; 10313481Sgiacomo.travaglini@arm.com return ss.str(); 10413481Sgiacomo.travaglini@arm.com } 10513481Sgiacomo.travaglini@arm.com} 10613481Sgiacomo.travaglini@arm.com 10713481Sgiacomo.travaglini@arm.com// Describes the Between(m, n) cardinality in human-friendly text. 10813481Sgiacomo.travaglini@arm.comvoid BetweenCardinalityImpl::DescribeTo(::std::ostream* os) const { 10913481Sgiacomo.travaglini@arm.com if (min_ == 0) { 11013481Sgiacomo.travaglini@arm.com if (max_ == 0) { 11113481Sgiacomo.travaglini@arm.com *os << "never called"; 11213481Sgiacomo.travaglini@arm.com } else if (max_ == INT_MAX) { 11313481Sgiacomo.travaglini@arm.com *os << "called any number of times"; 11413481Sgiacomo.travaglini@arm.com } else { 11513481Sgiacomo.travaglini@arm.com *os << "called at most " << FormatTimes(max_); 11613481Sgiacomo.travaglini@arm.com } 11713481Sgiacomo.travaglini@arm.com } else if (min_ == max_) { 11813481Sgiacomo.travaglini@arm.com *os << "called " << FormatTimes(min_); 11913481Sgiacomo.travaglini@arm.com } else if (max_ == INT_MAX) { 12013481Sgiacomo.travaglini@arm.com *os << "called at least " << FormatTimes(min_); 12113481Sgiacomo.travaglini@arm.com } else { 12213481Sgiacomo.travaglini@arm.com // 0 < min_ < max_ < INT_MAX 12313481Sgiacomo.travaglini@arm.com *os << "called between " << min_ << " and " << max_ << " times"; 12413481Sgiacomo.travaglini@arm.com } 12513481Sgiacomo.travaglini@arm.com} 12613481Sgiacomo.travaglini@arm.com 12713481Sgiacomo.travaglini@arm.com} // Unnamed namespace 12813481Sgiacomo.travaglini@arm.com 12913481Sgiacomo.travaglini@arm.com// Describes the given call count to an ostream. 13013481Sgiacomo.travaglini@arm.comvoid Cardinality::DescribeActualCallCountTo(int actual_call_count, 13113481Sgiacomo.travaglini@arm.com ::std::ostream* os) { 13213481Sgiacomo.travaglini@arm.com if (actual_call_count > 0) { 13313481Sgiacomo.travaglini@arm.com *os << "called " << FormatTimes(actual_call_count); 13413481Sgiacomo.travaglini@arm.com } else { 13513481Sgiacomo.travaglini@arm.com *os << "never called"; 13613481Sgiacomo.travaglini@arm.com } 13713481Sgiacomo.travaglini@arm.com} 13813481Sgiacomo.travaglini@arm.com 13913481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows at least n calls. 14013481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality AtLeast(int n) { return Between(n, INT_MAX); } 14113481Sgiacomo.travaglini@arm.com 14213481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows at most n calls. 14313481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality AtMost(int n) { return Between(0, n); } 14413481Sgiacomo.travaglini@arm.com 14513481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows any number of calls. 14613481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality AnyNumber() { return AtLeast(0); } 14713481Sgiacomo.travaglini@arm.com 14813481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows between min and max calls. 14913481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality Between(int min, int max) { 15013481Sgiacomo.travaglini@arm.com return Cardinality(new BetweenCardinalityImpl(min, max)); 15113481Sgiacomo.travaglini@arm.com} 15213481Sgiacomo.travaglini@arm.com 15313481Sgiacomo.travaglini@arm.com// Creates a cardinality that allows exactly n calls. 15413481Sgiacomo.travaglini@arm.comGTEST_API_ Cardinality Exactly(int n) { return Between(n, n); } 15513481Sgiacomo.travaglini@arm.com 15613481Sgiacomo.travaglini@arm.com} // namespace testing 157