gmock-internal-utils.h 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 defines some utilities useful for implementing Google 3513481Sgiacomo.travaglini@arm.com// Mock. They are subject to change without notice, so please DO NOT 3613481Sgiacomo.travaglini@arm.com// USE THEM IN USER CODE. 3713481Sgiacomo.travaglini@arm.com 3813481Sgiacomo.travaglini@arm.com#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ 3913481Sgiacomo.travaglini@arm.com#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ 4013481Sgiacomo.travaglini@arm.com 4113481Sgiacomo.travaglini@arm.com#include <stdio.h> 4213481Sgiacomo.travaglini@arm.com#include <ostream> // NOLINT 4313481Sgiacomo.travaglini@arm.com#include <string> 4413481Sgiacomo.travaglini@arm.com 4513481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-generated-internal-utils.h" 4613481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h" 4713481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" 4813481Sgiacomo.travaglini@arm.com 4913481Sgiacomo.travaglini@arm.comnamespace testing { 5013481Sgiacomo.travaglini@arm.comnamespace internal { 5113481Sgiacomo.travaglini@arm.com 5213481Sgiacomo.travaglini@arm.com// Converts an identifier name to a space-separated list of lower-case 5313481Sgiacomo.travaglini@arm.com// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is 5413481Sgiacomo.travaglini@arm.com// treated as one word. For example, both "FooBar123" and 5513481Sgiacomo.travaglini@arm.com// "foo_bar_123" are converted to "foo bar 123". 5613481Sgiacomo.travaglini@arm.comGTEST_API_ string ConvertIdentifierNameToWords(const char* id_name); 5713481Sgiacomo.travaglini@arm.com 5813481Sgiacomo.travaglini@arm.com// PointeeOf<Pointer>::type is the type of a value pointed to by a 5913481Sgiacomo.travaglini@arm.com// Pointer, which can be either a smart pointer or a raw pointer. The 6013481Sgiacomo.travaglini@arm.com// following default implementation is for the case where Pointer is a 6113481Sgiacomo.travaglini@arm.com// smart pointer. 6213481Sgiacomo.travaglini@arm.comtemplate <typename Pointer> 6313481Sgiacomo.travaglini@arm.comstruct PointeeOf { 6413481Sgiacomo.travaglini@arm.com // Smart pointer classes define type element_type as the type of 6513481Sgiacomo.travaglini@arm.com // their pointees. 6613481Sgiacomo.travaglini@arm.com typedef typename Pointer::element_type type; 6713481Sgiacomo.travaglini@arm.com}; 6813481Sgiacomo.travaglini@arm.com// This specialization is for the raw pointer case. 6913481Sgiacomo.travaglini@arm.comtemplate <typename T> 7013481Sgiacomo.travaglini@arm.comstruct PointeeOf<T*> { typedef T type; }; // NOLINT 7113481Sgiacomo.travaglini@arm.com 7213481Sgiacomo.travaglini@arm.com// GetRawPointer(p) returns the raw pointer underlying p when p is a 7313481Sgiacomo.travaglini@arm.com// smart pointer, or returns p itself when p is already a raw pointer. 7413481Sgiacomo.travaglini@arm.com// The following default implementation is for the smart pointer case. 7513481Sgiacomo.travaglini@arm.comtemplate <typename Pointer> 7613481Sgiacomo.travaglini@arm.cominline const typename Pointer::element_type* GetRawPointer(const Pointer& p) { 7713481Sgiacomo.travaglini@arm.com return p.get(); 7813481Sgiacomo.travaglini@arm.com} 7913481Sgiacomo.travaglini@arm.com// This overloaded version is for the raw pointer case. 8013481Sgiacomo.travaglini@arm.comtemplate <typename Element> 8113481Sgiacomo.travaglini@arm.cominline Element* GetRawPointer(Element* p) { return p; } 8213481Sgiacomo.travaglini@arm.com 8313481Sgiacomo.travaglini@arm.com// This comparator allows linked_ptr to be stored in sets. 8413481Sgiacomo.travaglini@arm.comtemplate <typename T> 8513481Sgiacomo.travaglini@arm.comstruct LinkedPtrLessThan { 8613481Sgiacomo.travaglini@arm.com bool operator()(const ::testing::internal::linked_ptr<T>& lhs, 8713481Sgiacomo.travaglini@arm.com const ::testing::internal::linked_ptr<T>& rhs) const { 8813481Sgiacomo.travaglini@arm.com return lhs.get() < rhs.get(); 8913481Sgiacomo.travaglini@arm.com } 9013481Sgiacomo.travaglini@arm.com}; 9113481Sgiacomo.travaglini@arm.com 9213481Sgiacomo.travaglini@arm.com// Symbian compilation can be done with wchar_t being either a native 9313481Sgiacomo.travaglini@arm.com// type or a typedef. Using Google Mock with OpenC without wchar_t 9413481Sgiacomo.travaglini@arm.com// should require the definition of _STLP_NO_WCHAR_T. 9513481Sgiacomo.travaglini@arm.com// 9613481Sgiacomo.travaglini@arm.com// MSVC treats wchar_t as a native type usually, but treats it as the 9713481Sgiacomo.travaglini@arm.com// same as unsigned short when the compiler option /Zc:wchar_t- is 9813481Sgiacomo.travaglini@arm.com// specified. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t 9913481Sgiacomo.travaglini@arm.com// is a native type. 10013481Sgiacomo.travaglini@arm.com#if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \ 10113481Sgiacomo.travaglini@arm.com (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)) 10213481Sgiacomo.travaglini@arm.com// wchar_t is a typedef. 10313481Sgiacomo.travaglini@arm.com#else 10413481Sgiacomo.travaglini@arm.com# define GMOCK_WCHAR_T_IS_NATIVE_ 1 10513481Sgiacomo.travaglini@arm.com#endif 10613481Sgiacomo.travaglini@arm.com 10713481Sgiacomo.travaglini@arm.com// signed wchar_t and unsigned wchar_t are NOT in the C++ standard. 10813481Sgiacomo.travaglini@arm.com// Using them is a bad practice and not portable. So DON'T use them. 10913481Sgiacomo.travaglini@arm.com// 11013481Sgiacomo.travaglini@arm.com// Still, Google Mock is designed to work even if the user uses signed 11113481Sgiacomo.travaglini@arm.com// wchar_t or unsigned wchar_t (obviously, assuming the compiler 11213481Sgiacomo.travaglini@arm.com// supports them). 11313481Sgiacomo.travaglini@arm.com// 11413481Sgiacomo.travaglini@arm.com// To gcc, 11513481Sgiacomo.travaglini@arm.com// wchar_t == signed wchar_t != unsigned wchar_t == unsigned int 11613481Sgiacomo.travaglini@arm.com#ifdef __GNUC__ 11713481Sgiacomo.travaglini@arm.com// signed/unsigned wchar_t are valid types. 11813481Sgiacomo.travaglini@arm.com# define GMOCK_HAS_SIGNED_WCHAR_T_ 1 11913481Sgiacomo.travaglini@arm.com#endif 12013481Sgiacomo.travaglini@arm.com 12113481Sgiacomo.travaglini@arm.com// In what follows, we use the term "kind" to indicate whether a type 12213481Sgiacomo.travaglini@arm.com// is bool, an integer type (excluding bool), a floating-point type, 12313481Sgiacomo.travaglini@arm.com// or none of them. This categorization is useful for determining 12413481Sgiacomo.travaglini@arm.com// when a matcher argument type can be safely converted to another 12513481Sgiacomo.travaglini@arm.com// type in the implementation of SafeMatcherCast. 12613481Sgiacomo.travaglini@arm.comenum TypeKind { 12713481Sgiacomo.travaglini@arm.com kBool, kInteger, kFloatingPoint, kOther 12813481Sgiacomo.travaglini@arm.com}; 12913481Sgiacomo.travaglini@arm.com 13013481Sgiacomo.travaglini@arm.com// KindOf<T>::value is the kind of type T. 13113481Sgiacomo.travaglini@arm.comtemplate <typename T> struct KindOf { 13213481Sgiacomo.travaglini@arm.com enum { value = kOther }; // The default kind. 13313481Sgiacomo.travaglini@arm.com}; 13413481Sgiacomo.travaglini@arm.com 13513481Sgiacomo.travaglini@arm.com// This macro declares that the kind of 'type' is 'kind'. 13613481Sgiacomo.travaglini@arm.com#define GMOCK_DECLARE_KIND_(type, kind) \ 13713481Sgiacomo.travaglini@arm.com template <> struct KindOf<type> { enum { value = kind }; } 13813481Sgiacomo.travaglini@arm.com 13913481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(bool, kBool); 14013481Sgiacomo.travaglini@arm.com 14113481Sgiacomo.travaglini@arm.com// All standard integer types. 14213481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(char, kInteger); 14313481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(signed char, kInteger); 14413481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(unsigned char, kInteger); 14513481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(short, kInteger); // NOLINT 14613481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(unsigned short, kInteger); // NOLINT 14713481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(int, kInteger); 14813481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(unsigned int, kInteger); 14913481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(long, kInteger); // NOLINT 15013481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(unsigned long, kInteger); // NOLINT 15113481Sgiacomo.travaglini@arm.com 15213481Sgiacomo.travaglini@arm.com#if GMOCK_WCHAR_T_IS_NATIVE_ 15313481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(wchar_t, kInteger); 15413481Sgiacomo.travaglini@arm.com#endif 15513481Sgiacomo.travaglini@arm.com 15613481Sgiacomo.travaglini@arm.com// Non-standard integer types. 15713481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(Int64, kInteger); 15813481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(UInt64, kInteger); 15913481Sgiacomo.travaglini@arm.com 16013481Sgiacomo.travaglini@arm.com// All standard floating-point types. 16113481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(float, kFloatingPoint); 16213481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(double, kFloatingPoint); 16313481Sgiacomo.travaglini@arm.comGMOCK_DECLARE_KIND_(long double, kFloatingPoint); 16413481Sgiacomo.travaglini@arm.com 16513481Sgiacomo.travaglini@arm.com#undef GMOCK_DECLARE_KIND_ 16613481Sgiacomo.travaglini@arm.com 16713481Sgiacomo.travaglini@arm.com// Evaluates to the kind of 'type'. 16813481Sgiacomo.travaglini@arm.com#define GMOCK_KIND_OF_(type) \ 16913481Sgiacomo.travaglini@arm.com static_cast< ::testing::internal::TypeKind>( \ 17013481Sgiacomo.travaglini@arm.com ::testing::internal::KindOf<type>::value) 17113481Sgiacomo.travaglini@arm.com 17213481Sgiacomo.travaglini@arm.com// Evaluates to true iff integer type T is signed. 17313481Sgiacomo.travaglini@arm.com#define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0) 17413481Sgiacomo.travaglini@arm.com 17513481Sgiacomo.travaglini@arm.com// LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value 17613481Sgiacomo.travaglini@arm.com// is true iff arithmetic type From can be losslessly converted to 17713481Sgiacomo.travaglini@arm.com// arithmetic type To. 17813481Sgiacomo.travaglini@arm.com// 17913481Sgiacomo.travaglini@arm.com// It's the user's responsibility to ensure that both From and To are 18013481Sgiacomo.travaglini@arm.com// raw (i.e. has no CV modifier, is not a pointer, and is not a 18113481Sgiacomo.travaglini@arm.com// reference) built-in arithmetic types, kFromKind is the kind of 18213481Sgiacomo.travaglini@arm.com// From, and kToKind is the kind of To; the value is 18313481Sgiacomo.travaglini@arm.com// implementation-defined when the above pre-condition is violated. 18413481Sgiacomo.travaglini@arm.comtemplate <TypeKind kFromKind, typename From, TypeKind kToKind, typename To> 18513481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl : public false_type {}; 18613481Sgiacomo.travaglini@arm.com 18713481Sgiacomo.travaglini@arm.com// Converting bool to bool is lossless. 18813481Sgiacomo.travaglini@arm.comtemplate <> 18913481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool> 19013481Sgiacomo.travaglini@arm.com : public true_type {}; // NOLINT 19113481Sgiacomo.travaglini@arm.com 19213481Sgiacomo.travaglini@arm.com// Converting bool to any integer type is lossless. 19313481Sgiacomo.travaglini@arm.comtemplate <typename To> 19413481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To> 19513481Sgiacomo.travaglini@arm.com : public true_type {}; // NOLINT 19613481Sgiacomo.travaglini@arm.com 19713481Sgiacomo.travaglini@arm.com// Converting bool to any floating-point type is lossless. 19813481Sgiacomo.travaglini@arm.comtemplate <typename To> 19913481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To> 20013481Sgiacomo.travaglini@arm.com : public true_type {}; // NOLINT 20113481Sgiacomo.travaglini@arm.com 20213481Sgiacomo.travaglini@arm.com// Converting an integer to bool is lossy. 20313481Sgiacomo.travaglini@arm.comtemplate <typename From> 20413481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool> 20513481Sgiacomo.travaglini@arm.com : public false_type {}; // NOLINT 20613481Sgiacomo.travaglini@arm.com 20713481Sgiacomo.travaglini@arm.com// Converting an integer to another non-bool integer is lossless iff 20813481Sgiacomo.travaglini@arm.com// the target type's range encloses the source type's range. 20913481Sgiacomo.travaglini@arm.comtemplate <typename From, typename To> 21013481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To> 21113481Sgiacomo.travaglini@arm.com : public bool_constant< 21213481Sgiacomo.travaglini@arm.com // When converting from a smaller size to a larger size, we are 21313481Sgiacomo.travaglini@arm.com // fine as long as we are not converting from signed to unsigned. 21413481Sgiacomo.travaglini@arm.com ((sizeof(From) < sizeof(To)) && 21513481Sgiacomo.travaglini@arm.com (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) || 21613481Sgiacomo.travaglini@arm.com // When converting between the same size, the signedness must match. 21713481Sgiacomo.travaglini@arm.com ((sizeof(From) == sizeof(To)) && 21813481Sgiacomo.travaglini@arm.com (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {}; // NOLINT 21913481Sgiacomo.travaglini@arm.com 22013481Sgiacomo.travaglini@arm.com#undef GMOCK_IS_SIGNED_ 22113481Sgiacomo.travaglini@arm.com 22213481Sgiacomo.travaglini@arm.com// Converting an integer to a floating-point type may be lossy, since 22313481Sgiacomo.travaglini@arm.com// the format of a floating-point number is implementation-defined. 22413481Sgiacomo.travaglini@arm.comtemplate <typename From, typename To> 22513481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To> 22613481Sgiacomo.travaglini@arm.com : public false_type {}; // NOLINT 22713481Sgiacomo.travaglini@arm.com 22813481Sgiacomo.travaglini@arm.com// Converting a floating-point to bool is lossy. 22913481Sgiacomo.travaglini@arm.comtemplate <typename From> 23013481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool> 23113481Sgiacomo.travaglini@arm.com : public false_type {}; // NOLINT 23213481Sgiacomo.travaglini@arm.com 23313481Sgiacomo.travaglini@arm.com// Converting a floating-point to an integer is lossy. 23413481Sgiacomo.travaglini@arm.comtemplate <typename From, typename To> 23513481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To> 23613481Sgiacomo.travaglini@arm.com : public false_type {}; // NOLINT 23713481Sgiacomo.travaglini@arm.com 23813481Sgiacomo.travaglini@arm.com// Converting a floating-point to another floating-point is lossless 23913481Sgiacomo.travaglini@arm.com// iff the target type is at least as big as the source type. 24013481Sgiacomo.travaglini@arm.comtemplate <typename From, typename To> 24113481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertibleImpl< 24213481Sgiacomo.travaglini@arm.com kFloatingPoint, From, kFloatingPoint, To> 24313481Sgiacomo.travaglini@arm.com : public bool_constant<sizeof(From) <= sizeof(To)> {}; // NOLINT 24413481Sgiacomo.travaglini@arm.com 24513481Sgiacomo.travaglini@arm.com// LosslessArithmeticConvertible<From, To>::value is true iff arithmetic 24613481Sgiacomo.travaglini@arm.com// type From can be losslessly converted to arithmetic type To. 24713481Sgiacomo.travaglini@arm.com// 24813481Sgiacomo.travaglini@arm.com// It's the user's responsibility to ensure that both From and To are 24913481Sgiacomo.travaglini@arm.com// raw (i.e. has no CV modifier, is not a pointer, and is not a 25013481Sgiacomo.travaglini@arm.com// reference) built-in arithmetic types; the value is 25113481Sgiacomo.travaglini@arm.com// implementation-defined when the above pre-condition is violated. 25213481Sgiacomo.travaglini@arm.comtemplate <typename From, typename To> 25313481Sgiacomo.travaglini@arm.comstruct LosslessArithmeticConvertible 25413481Sgiacomo.travaglini@arm.com : public LosslessArithmeticConvertibleImpl< 25513481Sgiacomo.travaglini@arm.com GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {}; // NOLINT 25613481Sgiacomo.travaglini@arm.com 25713481Sgiacomo.travaglini@arm.com// This interface knows how to report a Google Mock failure (either 25813481Sgiacomo.travaglini@arm.com// non-fatal or fatal). 25913481Sgiacomo.travaglini@arm.comclass FailureReporterInterface { 26013481Sgiacomo.travaglini@arm.com public: 26113481Sgiacomo.travaglini@arm.com // The type of a failure (either non-fatal or fatal). 26213481Sgiacomo.travaglini@arm.com enum FailureType { 26313481Sgiacomo.travaglini@arm.com kNonfatal, kFatal 26413481Sgiacomo.travaglini@arm.com }; 26513481Sgiacomo.travaglini@arm.com 26613481Sgiacomo.travaglini@arm.com virtual ~FailureReporterInterface() {} 26713481Sgiacomo.travaglini@arm.com 26813481Sgiacomo.travaglini@arm.com // Reports a failure that occurred at the given source file location. 26913481Sgiacomo.travaglini@arm.com virtual void ReportFailure(FailureType type, const char* file, int line, 27013481Sgiacomo.travaglini@arm.com const string& message) = 0; 27113481Sgiacomo.travaglini@arm.com}; 27213481Sgiacomo.travaglini@arm.com 27313481Sgiacomo.travaglini@arm.com// Returns the failure reporter used by Google Mock. 27413481Sgiacomo.travaglini@arm.comGTEST_API_ FailureReporterInterface* GetFailureReporter(); 27513481Sgiacomo.travaglini@arm.com 27613481Sgiacomo.travaglini@arm.com// Asserts that condition is true; aborts the process with the given 27713481Sgiacomo.travaglini@arm.com// message if condition is false. We cannot use LOG(FATAL) or CHECK() 27813481Sgiacomo.travaglini@arm.com// as Google Mock might be used to mock the log sink itself. We 27913481Sgiacomo.travaglini@arm.com// inline this function to prevent it from showing up in the stack 28013481Sgiacomo.travaglini@arm.com// trace. 28113481Sgiacomo.travaglini@arm.cominline void Assert(bool condition, const char* file, int line, 28213481Sgiacomo.travaglini@arm.com const string& msg) { 28313481Sgiacomo.travaglini@arm.com if (!condition) { 28413481Sgiacomo.travaglini@arm.com GetFailureReporter()->ReportFailure(FailureReporterInterface::kFatal, 28513481Sgiacomo.travaglini@arm.com file, line, msg); 28613481Sgiacomo.travaglini@arm.com } 28713481Sgiacomo.travaglini@arm.com} 28813481Sgiacomo.travaglini@arm.cominline void Assert(bool condition, const char* file, int line) { 28913481Sgiacomo.travaglini@arm.com Assert(condition, file, line, "Assertion failed."); 29013481Sgiacomo.travaglini@arm.com} 29113481Sgiacomo.travaglini@arm.com 29213481Sgiacomo.travaglini@arm.com// Verifies that condition is true; generates a non-fatal failure if 29313481Sgiacomo.travaglini@arm.com// condition is false. 29413481Sgiacomo.travaglini@arm.cominline void Expect(bool condition, const char* file, int line, 29513481Sgiacomo.travaglini@arm.com const string& msg) { 29613481Sgiacomo.travaglini@arm.com if (!condition) { 29713481Sgiacomo.travaglini@arm.com GetFailureReporter()->ReportFailure(FailureReporterInterface::kNonfatal, 29813481Sgiacomo.travaglini@arm.com file, line, msg); 29913481Sgiacomo.travaglini@arm.com } 30013481Sgiacomo.travaglini@arm.com} 30113481Sgiacomo.travaglini@arm.cominline void Expect(bool condition, const char* file, int line) { 30213481Sgiacomo.travaglini@arm.com Expect(condition, file, line, "Expectation failed."); 30313481Sgiacomo.travaglini@arm.com} 30413481Sgiacomo.travaglini@arm.com 30513481Sgiacomo.travaglini@arm.com// Severity level of a log. 30613481Sgiacomo.travaglini@arm.comenum LogSeverity { 30713481Sgiacomo.travaglini@arm.com kInfo = 0, 30813481Sgiacomo.travaglini@arm.com kWarning = 1 30913481Sgiacomo.travaglini@arm.com}; 31013481Sgiacomo.travaglini@arm.com 31113481Sgiacomo.travaglini@arm.com// Valid values for the --gmock_verbose flag. 31213481Sgiacomo.travaglini@arm.com 31313481Sgiacomo.travaglini@arm.com// All logs (informational and warnings) are printed. 31413481Sgiacomo.travaglini@arm.comconst char kInfoVerbosity[] = "info"; 31513481Sgiacomo.travaglini@arm.com// Only warnings are printed. 31613481Sgiacomo.travaglini@arm.comconst char kWarningVerbosity[] = "warning"; 31713481Sgiacomo.travaglini@arm.com// No logs are printed. 31813481Sgiacomo.travaglini@arm.comconst char kErrorVerbosity[] = "error"; 31913481Sgiacomo.travaglini@arm.com 32013481Sgiacomo.travaglini@arm.com// Returns true iff a log with the given severity is visible according 32113481Sgiacomo.travaglini@arm.com// to the --gmock_verbose flag. 32213481Sgiacomo.travaglini@arm.comGTEST_API_ bool LogIsVisible(LogSeverity severity); 32313481Sgiacomo.travaglini@arm.com 32413481Sgiacomo.travaglini@arm.com// Prints the given message to stdout iff 'severity' >= the level 32513481Sgiacomo.travaglini@arm.com// specified by the --gmock_verbose flag. If stack_frames_to_skip >= 32613481Sgiacomo.travaglini@arm.com// 0, also prints the stack trace excluding the top 32713481Sgiacomo.travaglini@arm.com// stack_frames_to_skip frames. In opt mode, any positive 32813481Sgiacomo.travaglini@arm.com// stack_frames_to_skip is treated as 0, since we don't know which 32913481Sgiacomo.travaglini@arm.com// function calls will be inlined by the compiler and need to be 33013481Sgiacomo.travaglini@arm.com// conservative. 33113481Sgiacomo.travaglini@arm.comGTEST_API_ void Log(LogSeverity severity, 33213481Sgiacomo.travaglini@arm.com const string& message, 33313481Sgiacomo.travaglini@arm.com int stack_frames_to_skip); 33413481Sgiacomo.travaglini@arm.com 33513481Sgiacomo.travaglini@arm.com// TODO(wan@google.com): group all type utilities together. 33613481Sgiacomo.travaglini@arm.com 33713481Sgiacomo.travaglini@arm.com// Type traits. 33813481Sgiacomo.travaglini@arm.com 33913481Sgiacomo.travaglini@arm.com// is_reference<T>::value is non-zero iff T is a reference type. 34013481Sgiacomo.travaglini@arm.comtemplate <typename T> struct is_reference : public false_type {}; 34113481Sgiacomo.travaglini@arm.comtemplate <typename T> struct is_reference<T&> : public true_type {}; 34213481Sgiacomo.travaglini@arm.com 34313481Sgiacomo.travaglini@arm.com// type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type. 34413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2> struct type_equals : public false_type {}; 34513481Sgiacomo.travaglini@arm.comtemplate <typename T> struct type_equals<T, T> : public true_type {}; 34613481Sgiacomo.travaglini@arm.com 34713481Sgiacomo.travaglini@arm.com// remove_reference<T>::type removes the reference from type T, if any. 34813481Sgiacomo.travaglini@arm.comtemplate <typename T> struct remove_reference { typedef T type; }; // NOLINT 34913481Sgiacomo.travaglini@arm.comtemplate <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT 35013481Sgiacomo.travaglini@arm.com 35113481Sgiacomo.travaglini@arm.com// DecayArray<T>::type turns an array type U[N] to const U* and preserves 35213481Sgiacomo.travaglini@arm.com// other types. Useful for saving a copy of a function argument. 35313481Sgiacomo.travaglini@arm.comtemplate <typename T> struct DecayArray { typedef T type; }; // NOLINT 35413481Sgiacomo.travaglini@arm.comtemplate <typename T, size_t N> struct DecayArray<T[N]> { 35513481Sgiacomo.travaglini@arm.com typedef const T* type; 35613481Sgiacomo.travaglini@arm.com}; 35713481Sgiacomo.travaglini@arm.com// Sometimes people use arrays whose size is not available at the use site 35813481Sgiacomo.travaglini@arm.com// (e.g. extern const char kNamePrefix[]). This specialization covers that 35913481Sgiacomo.travaglini@arm.com// case. 36013481Sgiacomo.travaglini@arm.comtemplate <typename T> struct DecayArray<T[]> { 36113481Sgiacomo.travaglini@arm.com typedef const T* type; 36213481Sgiacomo.travaglini@arm.com}; 36313481Sgiacomo.travaglini@arm.com 36413481Sgiacomo.travaglini@arm.com// Disable MSVC warnings for infinite recursion, since in this case the 36513481Sgiacomo.travaglini@arm.com// the recursion is unreachable. 36613481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER 36713481Sgiacomo.travaglini@arm.com# pragma warning(push) 36813481Sgiacomo.travaglini@arm.com# pragma warning(disable:4717) 36913481Sgiacomo.travaglini@arm.com#endif 37013481Sgiacomo.travaglini@arm.com 37113481Sgiacomo.travaglini@arm.com// Invalid<T>() is usable as an expression of type T, but will terminate 37213481Sgiacomo.travaglini@arm.com// the program with an assertion failure if actually run. This is useful 37313481Sgiacomo.travaglini@arm.com// when a value of type T is needed for compilation, but the statement 37413481Sgiacomo.travaglini@arm.com// will not really be executed (or we don't care if the statement 37513481Sgiacomo.travaglini@arm.com// crashes). 37613481Sgiacomo.travaglini@arm.comtemplate <typename T> 37713481Sgiacomo.travaglini@arm.cominline T Invalid() { 37813481Sgiacomo.travaglini@arm.com Assert(false, "", -1, "Internal error: attempt to return invalid value"); 37913481Sgiacomo.travaglini@arm.com // This statement is unreachable, and would never terminate even if it 38013481Sgiacomo.travaglini@arm.com // could be reached. It is provided only to placate compiler warnings 38113481Sgiacomo.travaglini@arm.com // about missing return statements. 38213481Sgiacomo.travaglini@arm.com return Invalid<T>(); 38313481Sgiacomo.travaglini@arm.com} 38413481Sgiacomo.travaglini@arm.com 38513481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER 38613481Sgiacomo.travaglini@arm.com# pragma warning(pop) 38713481Sgiacomo.travaglini@arm.com#endif 38813481Sgiacomo.travaglini@arm.com 38913481Sgiacomo.travaglini@arm.com// Given a raw type (i.e. having no top-level reference or const 39013481Sgiacomo.travaglini@arm.com// modifier) RawContainer that's either an STL-style container or a 39113481Sgiacomo.travaglini@arm.com// native array, class StlContainerView<RawContainer> has the 39213481Sgiacomo.travaglini@arm.com// following members: 39313481Sgiacomo.travaglini@arm.com// 39413481Sgiacomo.travaglini@arm.com// - type is a type that provides an STL-style container view to 39513481Sgiacomo.travaglini@arm.com// (i.e. implements the STL container concept for) RawContainer; 39613481Sgiacomo.travaglini@arm.com// - const_reference is a type that provides a reference to a const 39713481Sgiacomo.travaglini@arm.com// RawContainer; 39813481Sgiacomo.travaglini@arm.com// - ConstReference(raw_container) returns a const reference to an STL-style 39913481Sgiacomo.travaglini@arm.com// container view to raw_container, which is a RawContainer. 40013481Sgiacomo.travaglini@arm.com// - Copy(raw_container) returns an STL-style container view of a 40113481Sgiacomo.travaglini@arm.com// copy of raw_container, which is a RawContainer. 40213481Sgiacomo.travaglini@arm.com// 40313481Sgiacomo.travaglini@arm.com// This generic version is used when RawContainer itself is already an 40413481Sgiacomo.travaglini@arm.com// STL-style container. 40513481Sgiacomo.travaglini@arm.comtemplate <class RawContainer> 40613481Sgiacomo.travaglini@arm.comclass StlContainerView { 40713481Sgiacomo.travaglini@arm.com public: 40813481Sgiacomo.travaglini@arm.com typedef RawContainer type; 40913481Sgiacomo.travaglini@arm.com typedef const type& const_reference; 41013481Sgiacomo.travaglini@arm.com 41113481Sgiacomo.travaglini@arm.com static const_reference ConstReference(const RawContainer& container) { 41213481Sgiacomo.travaglini@arm.com // Ensures that RawContainer is not a const type. 41313481Sgiacomo.travaglini@arm.com testing::StaticAssertTypeEq<RawContainer, 41413481Sgiacomo.travaglini@arm.com GTEST_REMOVE_CONST_(RawContainer)>(); 41513481Sgiacomo.travaglini@arm.com return container; 41613481Sgiacomo.travaglini@arm.com } 41713481Sgiacomo.travaglini@arm.com static type Copy(const RawContainer& container) { return container; } 41813481Sgiacomo.travaglini@arm.com}; 41913481Sgiacomo.travaglini@arm.com 42013481Sgiacomo.travaglini@arm.com// This specialization is used when RawContainer is a native array type. 42113481Sgiacomo.travaglini@arm.comtemplate <typename Element, size_t N> 42213481Sgiacomo.travaglini@arm.comclass StlContainerView<Element[N]> { 42313481Sgiacomo.travaglini@arm.com public: 42413481Sgiacomo.travaglini@arm.com typedef GTEST_REMOVE_CONST_(Element) RawElement; 42513481Sgiacomo.travaglini@arm.com typedef internal::NativeArray<RawElement> type; 42613481Sgiacomo.travaglini@arm.com // NativeArray<T> can represent a native array either by value or by 42713481Sgiacomo.travaglini@arm.com // reference (selected by a constructor argument), so 'const type' 42813481Sgiacomo.travaglini@arm.com // can be used to reference a const native array. We cannot 42913481Sgiacomo.travaglini@arm.com // 'typedef const type& const_reference' here, as that would mean 43013481Sgiacomo.travaglini@arm.com // ConstReference() has to return a reference to a local variable. 43113481Sgiacomo.travaglini@arm.com typedef const type const_reference; 43213481Sgiacomo.travaglini@arm.com 43313481Sgiacomo.travaglini@arm.com static const_reference ConstReference(const Element (&array)[N]) { 43413481Sgiacomo.travaglini@arm.com // Ensures that Element is not a const type. 43513481Sgiacomo.travaglini@arm.com testing::StaticAssertTypeEq<Element, RawElement>(); 43613481Sgiacomo.travaglini@arm.com#if GTEST_OS_SYMBIAN 43713481Sgiacomo.travaglini@arm.com // The Nokia Symbian compiler confuses itself in template instantiation 43813481Sgiacomo.travaglini@arm.com // for this call without the cast to Element*: 43913481Sgiacomo.travaglini@arm.com // function call '[testing::internal::NativeArray<char *>].NativeArray( 44013481Sgiacomo.travaglini@arm.com // {lval} const char *[4], long, testing::internal::RelationToSource)' 44113481Sgiacomo.travaglini@arm.com // does not match 44213481Sgiacomo.travaglini@arm.com // 'testing::internal::NativeArray<char *>::NativeArray( 44313481Sgiacomo.travaglini@arm.com // char *const *, unsigned int, testing::internal::RelationToSource)' 44413481Sgiacomo.travaglini@arm.com // (instantiating: 'testing::internal::ContainsMatcherImpl 44513481Sgiacomo.travaglini@arm.com // <const char * (&)[4]>::Matches(const char * (&)[4]) const') 44613481Sgiacomo.travaglini@arm.com // (instantiating: 'testing::internal::StlContainerView<char *[4]>:: 44713481Sgiacomo.travaglini@arm.com // ConstReference(const char * (&)[4])') 44813481Sgiacomo.travaglini@arm.com // (and though the N parameter type is mismatched in the above explicit 44913481Sgiacomo.travaglini@arm.com // conversion of it doesn't help - only the conversion of the array). 45013481Sgiacomo.travaglini@arm.com return type(const_cast<Element*>(&array[0]), N, 45113481Sgiacomo.travaglini@arm.com RelationToSourceReference()); 45213481Sgiacomo.travaglini@arm.com#else 45313481Sgiacomo.travaglini@arm.com return type(array, N, RelationToSourceReference()); 45413481Sgiacomo.travaglini@arm.com#endif // GTEST_OS_SYMBIAN 45513481Sgiacomo.travaglini@arm.com } 45613481Sgiacomo.travaglini@arm.com static type Copy(const Element (&array)[N]) { 45713481Sgiacomo.travaglini@arm.com#if GTEST_OS_SYMBIAN 45813481Sgiacomo.travaglini@arm.com return type(const_cast<Element*>(&array[0]), N, RelationToSourceCopy()); 45913481Sgiacomo.travaglini@arm.com#else 46013481Sgiacomo.travaglini@arm.com return type(array, N, RelationToSourceCopy()); 46113481Sgiacomo.travaglini@arm.com#endif // GTEST_OS_SYMBIAN 46213481Sgiacomo.travaglini@arm.com } 46313481Sgiacomo.travaglini@arm.com}; 46413481Sgiacomo.travaglini@arm.com 46513481Sgiacomo.travaglini@arm.com// This specialization is used when RawContainer is a native array 46613481Sgiacomo.travaglini@arm.com// represented as a (pointer, size) tuple. 46713481Sgiacomo.travaglini@arm.comtemplate <typename ElementPointer, typename Size> 46813481Sgiacomo.travaglini@arm.comclass StlContainerView< ::testing::tuple<ElementPointer, Size> > { 46913481Sgiacomo.travaglini@arm.com public: 47013481Sgiacomo.travaglini@arm.com typedef GTEST_REMOVE_CONST_( 47113481Sgiacomo.travaglini@arm.com typename internal::PointeeOf<ElementPointer>::type) RawElement; 47213481Sgiacomo.travaglini@arm.com typedef internal::NativeArray<RawElement> type; 47313481Sgiacomo.travaglini@arm.com typedef const type const_reference; 47413481Sgiacomo.travaglini@arm.com 47513481Sgiacomo.travaglini@arm.com static const_reference ConstReference( 47613481Sgiacomo.travaglini@arm.com const ::testing::tuple<ElementPointer, Size>& array) { 47713481Sgiacomo.travaglini@arm.com return type(get<0>(array), get<1>(array), RelationToSourceReference()); 47813481Sgiacomo.travaglini@arm.com } 47913481Sgiacomo.travaglini@arm.com static type Copy(const ::testing::tuple<ElementPointer, Size>& array) { 48013481Sgiacomo.travaglini@arm.com return type(get<0>(array), get<1>(array), RelationToSourceCopy()); 48113481Sgiacomo.travaglini@arm.com } 48213481Sgiacomo.travaglini@arm.com}; 48313481Sgiacomo.travaglini@arm.com 48413481Sgiacomo.travaglini@arm.com// The following specialization prevents the user from instantiating 48513481Sgiacomo.travaglini@arm.com// StlContainer with a reference type. 48613481Sgiacomo.travaglini@arm.comtemplate <typename T> class StlContainerView<T&>; 48713481Sgiacomo.travaglini@arm.com 48813481Sgiacomo.travaglini@arm.com// A type transform to remove constness from the first part of a pair. 48913481Sgiacomo.travaglini@arm.com// Pairs like that are used as the value_type of associative containers, 49013481Sgiacomo.travaglini@arm.com// and this transform produces a similar but assignable pair. 49113481Sgiacomo.travaglini@arm.comtemplate <typename T> 49213481Sgiacomo.travaglini@arm.comstruct RemoveConstFromKey { 49313481Sgiacomo.travaglini@arm.com typedef T type; 49413481Sgiacomo.travaglini@arm.com}; 49513481Sgiacomo.travaglini@arm.com 49613481Sgiacomo.travaglini@arm.com// Partially specialized to remove constness from std::pair<const K, V>. 49713481Sgiacomo.travaglini@arm.comtemplate <typename K, typename V> 49813481Sgiacomo.travaglini@arm.comstruct RemoveConstFromKey<std::pair<const K, V> > { 49913481Sgiacomo.travaglini@arm.com typedef std::pair<K, V> type; 50013481Sgiacomo.travaglini@arm.com}; 50113481Sgiacomo.travaglini@arm.com 50213481Sgiacomo.travaglini@arm.com// Mapping from booleans to types. Similar to boost::bool_<kValue> and 50313481Sgiacomo.travaglini@arm.com// std::integral_constant<bool, kValue>. 50413481Sgiacomo.travaglini@arm.comtemplate <bool kValue> 50513481Sgiacomo.travaglini@arm.comstruct BooleanConstant {}; 50613481Sgiacomo.travaglini@arm.com 50713481Sgiacomo.travaglini@arm.com} // namespace internal 50813481Sgiacomo.travaglini@arm.com} // namespace testing 50913481Sgiacomo.travaglini@arm.com 51013481Sgiacomo.travaglini@arm.com#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ 51113481Sgiacomo.travaglini@arm.com 512