1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2005, Google Inc. 2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved. 3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without 5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are 6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met: 7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions of source code must retain the above copyright 9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer. 10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Redistributions in binary form must reproduce the above 11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer 12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the 13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution. 14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// * Neither the name of Google Inc. nor the names of its 15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from 16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission. 17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) 31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The Google C++ Testing Framework (Google Test) 33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This header file declares functions and macros used internally by 35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Test. They are subject to change without notice. 36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 4046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-port.h" 41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_LINUX 4346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <stdlib.h> 4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <sys/types.h> 4546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <sys/wait.h> 4646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# include <unistd.h> 47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_OS_LINUX 48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <ctype.h> 50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string.h> 51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <iomanip> 52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <limits> 53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <set> 54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 5546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-string.h" 5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-filepath.h" 5746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-type-util.h" 58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Due to C++ preprocessor weirdness, we need double indirection to 60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// concatenate two tokens when one of them is __LINE__. Writing 61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// foo ## __LINE__ 63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// will result in the token foo__LINE__, instead of foo followed by 65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the current line number. For more details, see 66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) 68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar 69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Test defines the testing::Message class to allow construction of 71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test messages via the << operator. The idea is that anything 72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// streamable to std::ostream can be streamed to a testing::Message. 73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This allows a user to use his own types in Google Test assertions by 74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// overloading the << operator. 75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// util/gtl/stl_logging-inl.h overloads << for STL containers. These 77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// overloads cannot be defined in the std namespace, as that will be 78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// undefined behavior. Therefore, they are defined in the global 79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// namespace instead. 80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// C++'s symbol lookup rule (i.e. Koenig lookup) says that these 82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// overloads are visible in either the std namespace or the global 83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// namespace, but not other namespaces, including the testing 84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// namespace which Google Test's Message class is in. 85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// To allow STL containers (and other types that has a << operator 87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// defined in the global namespace) to be used in Google Test assertions, 88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// testing::Message must access the custom << operator from the global 89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// namespace. Hence this helper function. 90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Note: Jeffrey Yasskin suggested an alternative fix by "using 92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ::operator<<;" in the definition of Message's operator<<. That fix 93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// doesn't require a helper function, but unfortunately doesn't 94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// compile with MSVC. 95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline void GTestStreamToHelper(std::ostream* os, const T& val) { 97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter *os << val; 98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 10046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass ProtocolMessage; 10146108a219a4b812dd8f36fee479a0340ea5963f5Ben Channamespace proto2 { class Message; } 10246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing { 104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 10546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Forward declarations. 106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 10746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass AssertionResult; // Result of an assertion. 108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Message; // Represents a failure message. 109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Test; // Represents a test. 110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TestInfo; // Information about a test. 11146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass TestPartResult; // Result of a test part. 112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass UnitTest; // A collection of test cases. 11346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 11446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 11546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan::std::string PrintToString(const T& value); 116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal { 118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct TraceInfo; // Information about a trace point. 120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ScopedTrace; // Implements scoped trace. 121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TestInfoImpl; // Opaque implementation of TestInfo 122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass UnitTestImpl; // Opaque implementation of UnitTest 123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// How many times InitGoogleTest() has been called. 12546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ extern int g_init_gtest_count; 126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The text used in failure messages to indicate the start of the 128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// stack trace. 12946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ extern const char kStackTraceMarker[]; 130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A secret type that Google Test users don't know about. It has no 132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// definition on purpose. Therefore it's impossible to create a 133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Secret object, which is what we want. 134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Secret; 135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Two overloaded helpers for checking at compile time whether an 137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// expression is a null pointer literal (i.e. NULL or any 0-valued 138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// compile-time integral constant). Their return values have 139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// different sizes, so we can use sizeof() to test which version is 140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// picked by the compiler. These helpers have no implementations, as 141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// we only need their signatures. 142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Given IsNullLiteralHelper(x), the compiler will pick the first 144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// version if x can be implicitly converted to Secret*, and pick the 145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// second version otherwise. Since Secret is a secret and incomplete 146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// type, the only expression a user can write that has type Secret* is 147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a null pointer literal. Therefore, we know that x is a null 148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// pointer literal if and only if the first version is picked by the 149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// compiler. 150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterchar IsNullLiteralHelper(Secret* p); 151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterchar (&IsNullLiteralHelper(...))[2]; // NOLINT 152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A compile-time bool constant that is true if and only if x is a 154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// null pointer literal (i.e. NULL or any 0-valued compile-time 155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// integral constant). 15646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#ifdef GTEST_ELLIPSIS_NEEDS_POD_ 15746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// We lose support for NULL detection where the compiler doesn't like 15846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// passing non-POD classes through ellipsis (...). 15946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# define GTEST_IS_NULL_LITERAL_(x) false 160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#else 16146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# define GTEST_IS_NULL_LITERAL_(x) \ 162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) 16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif // GTEST_ELLIPSIS_NEEDS_POD_ 164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Appends the user-supplied message to the Google-Test-generated message. 16646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ String AppendUserMessage(const String& gtest_msg, 16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Message& user_msg); 168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A helper class for creating scoped traces in user programs. 17046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass GTEST_API_ ScopedTrace { 171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The c'tor pushes the given source file location and message onto 173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // a trace stack maintained by Google Test. 174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ScopedTrace(const char* file, int line, const Message& message); 175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The d'tor pops the info pushed by the c'tor. 177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Note that the d'tor is not virtual in order to be efficient. 179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Don't inherit from ScopedTrace! 180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ~ScopedTrace(); 181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); 184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its 185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // c'tor and d'tor. Therefore it doesn't 186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // need to be used otherwise. 187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Converts a streamable value to a String. A NULL pointer is 189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// converted to "(null)". When the input value is a ::string, 190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ::std::string, ::wstring, or ::std::wstring object, each NUL 191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// character in it is replaced with "\\0". 192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Declared here but defined in gtest.h, so that it has access 193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// to the definition of the Message class, required by the ARM 194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// compiler. 195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterString StreamableToString(const T& streamable); 197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 19846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The Symbian compiler has a bug that prevents it from selecting the 19946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// correct overload of FormatForComparisonFailureMessage (see below) 20046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// unless we pass the first argument by reference. If we do that, 20146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// however, Visual Age C++ 10.1 generates a compiler error. Therefore 20246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// we only apply the work-around for Symbian. 20346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if defined(__SYMBIAN32__) 20446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# define GTEST_CREF_WORKAROUND_ const& 205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#else 20646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# define GTEST_CREF_WORKAROUND_ 20746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif 208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 20946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// When this operand is a const char* or char*, if the other operand 210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is a ::std::string or ::string, we print this operand as a C string 21146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// rather than a pointer (we do the same for wide strings); otherwise 21246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// we print it as a pointer to be safe. 213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This internal macro is used to avoid duplicated code. 215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\ 216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline String FormatForComparisonFailureMessage(\ 21746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \ 21846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const operand2_type& /*operand2*/) {\ 219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return operand1_printer(str);\ 220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}\ 221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline String FormatForComparisonFailureMessage(\ 22246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \ 22346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const operand2_type& /*operand2*/) {\ 224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return operand1_printer(str);\ 225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterGTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted) 228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_STD_WSTRING 229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterGTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted) 230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_STD_WSTRING 231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_GLOBAL_STRING 233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterGTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted) 234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_GLOBAL_STRING 235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_GLOBAL_WSTRING 236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterGTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted) 237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_GLOBAL_WSTRING 238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#undef GTEST_FORMAT_IMPL_ 240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 24146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The next four overloads handle the case where the operand being 24246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// printed is a char/wchar_t pointer and the other operand is not a 24346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// string/wstring object. In such cases, we just print the operand as 24446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// a pointer to be safe. 24546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_FORMAT_CHAR_PTR_IMPL_(CharType) \ 24646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan template <typename T> \ 24746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan String FormatForComparisonFailureMessage(CharType* GTEST_CREF_WORKAROUND_ p, \ 24846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const T&) { \ 24946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return PrintToString(static_cast<const void*>(p)); \ 25046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 25146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 25246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_FORMAT_CHAR_PTR_IMPL_(char) 25346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_FORMAT_CHAR_PTR_IMPL_(const char) 25446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_FORMAT_CHAR_PTR_IMPL_(wchar_t) 25546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t) 25646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 25746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#undef GTEST_FORMAT_CHAR_PTR_IMPL_ 25846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Constructs and returns the message for an equality assertion 260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. 261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The first four parameters are the expressions used in the assertion 263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and their values, as strings. For example, for ASSERT_EQ(foo, bar) 264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// where foo is 5 and bar is 6, we have: 265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// expected_expression: "foo" 267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// actual_expression: "bar" 268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// expected_value: "5" 269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// actual_value: "6" 270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The ignoring_case parameter is true iff the assertion is a 272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will 273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// be inserted into the message. 27446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ AssertionResult EqFailure(const char* expected_expression, 27546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* actual_expression, 27646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const String& expected_value, 27746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const String& actual_value, 27846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan bool ignoring_case); 27946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 28046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. 28146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ String GetBoolAssertionFailureMessage( 28246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const AssertionResult& assertion_result, 28346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* expression_text, 28446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* actual_predicate_value, 28546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* expected_predicate_value); 286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This template class represents an IEEE floating-point number 288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (either single-precision or double-precision, depending on the 289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// template parameters). 290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The purpose of this class is to do more sophisticated number 292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// comparison. (Due to round-off error, etc, it's very unlikely that 293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// two floating-points will be equal exactly. Hence a naive 294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// comparison by the == operation often doesn't work.) 295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Format of IEEE floating-point: 297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The most-significant bit being the leftmost, an IEEE 299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// floating-point looks like 300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// sign_bit exponent_bits fraction_bits 302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Here, sign_bit is a single bit that designates the sign of the 304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// number. 305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For float, there are 8 exponent bits and 23 fraction bits. 307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For double, there are 11 exponent bits and 52 fraction bits. 309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// More details can be found at 311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// http://en.wikipedia.org/wiki/IEEE_floating-point_standard. 312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Template parameter: 314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// RawType: the raw floating-point type (either float or double) 316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename RawType> 317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass FloatingPoint { 318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Defines the unsigned integer type that has the same size as the 320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // floating point number. 321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits; 322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Constants. 324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // # of bits in a number. 326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const size_t kBitCount = 8*sizeof(RawType); 327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // # of fraction bits in a number. 329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const size_t kFractionBitCount = 330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter std::numeric_limits<RawType>::digits - 1; 331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // # of exponent bits in a number. 333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; 334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The mask for the sign bit. 336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1); 337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The mask for the fraction bits. 339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const Bits kFractionBitMask = 340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ~static_cast<Bits>(0) >> (kExponentBitCount + 1); 341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The mask for the exponent bits. 343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); 344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // How many ULP's (Units in the Last Place) we want to tolerate when 346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // comparing two numbers. The larger the value, the more error we 347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // allow. A 0 value means that two numbers must be exactly the same 348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // to be considered equal. 349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The maximum error of a single floating-point operation is 0.5 351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // units in the last place. On Intel CPU's, all floating-point 352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // calculations are done with 80-bit precision, while double has 64 353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // bits. Therefore, 4 should be enough for ordinary use. 354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // See the following article for more details on ULP: 356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm. 357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static const size_t kMaxUlps = 4; 358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Constructs a FloatingPoint from a raw floating-point number. 360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // On an Intel CPU, passing a non-normalized NAN (Not a Number) 362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // around may change its bits, although the new value is guaranteed 363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // to be also a NAN. Therefore, don't expect this constructor to 364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // preserve the bits in x when x is a NAN. 365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter explicit FloatingPoint(const RawType& x) { u_.value_ = x; } 366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Static methods 368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Reinterprets a bit pattern as a floating-point number. 370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // This function is needed to test the AlmostEquals() method. 372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType ReinterpretBits(const Bits bits) { 373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter FloatingPoint fp(0); 374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter fp.u_.bits_ = bits; 375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return fp.u_.value_; 376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Returns the floating-point number that represent positive infinity. 379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static RawType Infinity() { 380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return ReinterpretBits(kExponentBitMask); 381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Non-static methods 384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Returns the bits that represents this number. 386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Bits &bits() const { return u_.bits_; } 387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Returns the exponent bits of this number. 389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } 390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Returns the fraction bits of this number. 392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } 393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Returns the sign bit of this number. 395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Bits sign_bit() const { return kSignBitMask & u_.bits_; } 396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Returns true iff this is NAN (not a number). 398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool is_nan() const { 399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // It's a NAN if the exponent bits are all ones and the fraction 400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // bits are not entirely zeros. 401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); 402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Returns true iff this number is at most kMaxUlps ULP's away from 405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // rhs. In particular, this function: 406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // - returns false if either number is (or both are) NAN. 408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // - treats really large numbers as almost equal to infinity. 409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // - thinks +0.0 and -0.0 are 0 DLP's apart. 410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool AlmostEquals(const FloatingPoint& rhs) const { 411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The IEEE standard says that any comparison operation involving 412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // a NAN must return false. 413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (is_nan() || rhs.is_nan()) return false; 414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) 416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter <= kMaxUlps; 417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The data type used to store the actual floating-point number. 421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter union FloatingPointUnion { 422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter RawType value_; // The raw floating-point number. 423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter Bits bits_; // The bits that represent the number. 424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter }; 425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Converts an integer from the sign-and-magnitude representation to 427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // the biased representation. More precisely, let N be 2 to the 428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // power of (kBitCount - 1), an integer x is represented by the 429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // unsigned number x + N. 430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // For instance, 432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // -N + 1 (the most negative number representable using 434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // sign-and-magnitude) is represented by 1; 435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 0 is represented by N; and 436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // N - 1 (the biggest number representable using 437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // sign-and-magnitude) is represented by 2N - 1. 438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Read http://en.wikipedia.org/wiki/Signed_number_representations 440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // for more details on signed number representations. 441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static Bits SignAndMagnitudeToBiased(const Bits &sam) { 442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (kSignBitMask & sam) { 443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // sam represents a negative number. 444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return ~sam + 1; 445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } else { 446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // sam represents a positive number. 447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return kSignBitMask | sam; 448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Given two numbers in the sign-and-magnitude representation, 452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // returns the distance between them as an unsigned number. 453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, 454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Bits &sam2) { 455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Bits biased1 = SignAndMagnitudeToBiased(sam1); 456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const Bits biased2 = SignAndMagnitudeToBiased(sam2); 457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); 458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter FloatingPointUnion u_; 461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Typedefs the instances of the FloatingPoint template class that we 464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// care to use. 465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef FloatingPoint<float> Float; 466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef FloatingPoint<double> Double; 467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// In order to catch the mistake of putting tests that use different 469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test fixture classes in the same test case, we need to assign 470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// unique IDs to fixture classes and compare them. The TypeId type is 471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// used to hold such IDs. The user should treat TypeId as an opaque 472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// type: the only operation allowed on TypeId values is to compare 473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// them for equality using the == operator. 474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef const void* TypeId; 475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypeIdHelper { 478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // dummy_ must not have a const type. Otherwise an overly eager 480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // compiler (e.g. MSVC 7.1 & 8.0) may try to merge 481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // TypeIdHelper<T>::dummy_ for different Ts as an "optimization". 482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static bool dummy_; 483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterbool TypeIdHelper<T>::dummy_ = false; 487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// GetTypeId<T>() returns the ID of type T. Different values will be 489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returned for different types. Calling the function twice with the 490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// same type argument is guaranteed to return the same ID. 491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T> 492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTypeId GetTypeId() { 493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // The compiler is required to allocate a different 494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // TypeIdHelper<T>::dummy_ variable for each T used to instantiate 495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // the template. Therefore, the address of dummy_ is guaranteed to 496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // be unique. 497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return &(TypeIdHelper<T>::dummy_); 498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns the type ID of ::testing::Test. Always call this instead 501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of GetTypeId< ::testing::Test>() to get the type ID of 502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ::testing::Test, as the latter may give the wrong result due to a 503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// suspected linker bug when compiling Google Test as a Mac OS X 504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// framework. 50546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ TypeId GetTestTypeId(); 506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Defines the abstract factory interface that creates instances 508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of a Test object. 509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TestFactoryBase { 510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual ~TestFactoryBase() {} 512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Creates a test instance to run. The instance is both created and destroyed 514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // within TestInfoImpl::Run() 515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual Test* CreateTest() = 0; 516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected: 518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestFactoryBase() {} 519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); 522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This class provides implementation of TeastFactoryBase interface. 525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// It is used in TEST and TEST_F macros. 526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class TestClass> 527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TestFactoryImpl : public TestFactoryBase { 528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual Test* CreateTest() { return new TestClass; } 530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_OS_WINDOWS 533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Predicate-formatters for implementing the HRESULT checking macros 535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} 536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// We pass a long instead of HRESULT to avoid causing an 537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// include dependency for the HRESULT type. 53846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, 53946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan long hr); // NOLINT 54046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, 54146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan long hr); // NOLINT 542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_OS_WINDOWS 544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Types of SetUpTestCase() and TearDownTestCase() functions. 546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef void (*SetUpTestCaseFunc)(); 547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertypedef void (*TearDownTestCaseFunc)(); 548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Creates a new TestInfo object and registers it with Google Test; 550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns the created object. 551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Arguments: 553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// test_case_name: name of the test case 555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// name: name of the test 55646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// type_param the name of the test's type parameter, or NULL if 55746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// this is not a typed or a type-parameterized test. 55846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// value_param text representation of the test's value parameter, 55946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// or NULL if this is not a type-parameterized test. 560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// fixture_class_id: ID of the test fixture class 561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// set_up_tc: pointer to the function that sets up the test case 562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// tear_down_tc: pointer to the function that tears down the test case 563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// factory: pointer to the factory that creates a test object. 564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The newly created TestInfo instance will assume 565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ownership of the factory object. 56646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ TestInfo* MakeAndRegisterTestInfo( 567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* test_case_name, const char* name, 56846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* type_param, 56946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* value_param, 570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeId fixture_class_id, 571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter SetUpTestCaseFunc set_up_tc, 572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TearDownTestCaseFunc tear_down_tc, 573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestFactoryBase* factory); 574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 57546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// If *pstr starts with the given prefix, modifies *pstr to be right 57646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// past the prefix and returns true; otherwise leaves *pstr unchanged 57746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// and returns false. None of pstr, *pstr, and prefix can be NULL. 57846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); 57946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// State of the definition of a type-parameterized test case. 58346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass GTEST_API_ TypedTestCasePState { 584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypedTestCasePState() : registered_(false) {} 586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Adds the given test name to defined_test_names_ and return true 588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // if the test case hasn't been registered; otherwise aborts the 589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // program. 590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool AddTestName(const char* file, int line, const char* case_name, 591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* test_name) { 592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (registered_) { 593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter fprintf(stderr, "%s Test %s must be defined before " 594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n", 595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter FormatFileLocation(file, line).c_str(), test_name, case_name); 596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter fflush(stderr); 59746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan posix::Abort(); 598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter defined_test_names_.insert(test_name); 600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return true; 601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Verifies that registered_tests match the test names in 604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // defined_test_names_; returns registered_tests if successful, or 605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // aborts the program otherwise. 606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* VerifyRegisteredTestNames( 607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* file, int line, const char* registered_tests); 608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private: 610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool registered_; 611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::std::set<const char*> defined_test_names_; 612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Skips to the first non-space char after the first comma in 'str'; 615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// returns NULL if no comma is found in 'str'. 616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline const char* SkipComma(const char* str) { 617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* comma = strchr(str, ','); 618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (comma == NULL) { 619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return NULL; 620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 62146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan while (IsSpace(*(++comma))) {} 622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return comma; 623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns the prefix of 'str' before the first comma in it; returns 626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the entire string if it contains no comma. 627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline String GetPrefixUntilComma(const char* str) { 628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* comma = strchr(str, ','); 629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return comma == NULL ? String(str) : String(str, comma - str); 630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} 631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TypeParameterizedTest<Fixture, TestSel, Types>::Register() 633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// registers a list of type-parameterized tests with Google Test. The 634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// return value is insignificant - we just need to return something 635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// such that we can call this function in a namespace scope. 636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Implementation note: The GTEST_TEMPLATE_ macro declares a template 638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// template parameter. It's defined in gtest-type-util.h. 639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types> 640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypeParameterizedTest { 641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // 'index' is the index of the test in the type list 'Types' 643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase, 644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Types). Valid values for 'index' are [0, N - 1] where N is the 645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // length of Types. 646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static bool Register(const char* prefix, const char* case_name, 647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* test_names, int index) { 648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef typename Types::Head Type; 649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef Fixture<Type> FixtureClass; 650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef typename GTEST_BIND_(TestSel, Type) TestClass; 651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // First, registers the first type-parameterized test in the type 653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // list. 654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter MakeAndRegisterTestInfo( 655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/", 656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter case_name, index).c_str(), 657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GetPrefixUntilComma(test_names).c_str(), 65846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GetTypeName<Type>().c_str(), 65946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan NULL, // No value parameter. 660dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GetTypeId<FixtureClass>(), 661dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestClass::SetUpTestCase, 662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TestClass::TearDownTestCase, 663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter new TestFactoryImpl<TestClass>); 664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Next, recurses (at compile time) with the tail of the type list. 666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail> 667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::Register(prefix, case_name, test_names, index + 1); 668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The base case for the compile time recursion. 672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <GTEST_TEMPLATE_ Fixture, class TestSel> 673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypeParameterizedTest<Fixture, TestSel, Types0> { 674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static bool Register(const char* /*prefix*/, const char* /*case_name*/, 676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* /*test_names*/, int /*index*/) { 677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return true; 678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TypeParameterizedTestCase<Fixture, Tests, Types>::Register() 682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// registers *all combinations* of 'Tests' and 'Types' with Google 683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Test. The return value is insignificant - we just need to return 684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// something such that we can call this function in a namespace scope. 685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types> 686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypeParameterizedTestCase { 687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter static bool Register(const char* prefix, const char* case_name, 689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter const char* test_names) { 690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter typedef typename Tests::Head Head; 691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // First, register the first test in 'Test' for each type in 'Types'. 693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter TypeParameterizedTest<Fixture, Head, Types>::Register( 694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter prefix, case_name, test_names, 0); 695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter // Next, recurses (at compile time) with the tail of the test list. 697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types> 698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::Register(prefix, case_name, SkipComma(test_names)); 699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The base case for the compile time recursion. 703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <GTEST_TEMPLATE_ Fixture, typename Types> 704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TypeParameterizedTestCase<Fixture, Templates0, Types> { 705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public: 70646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static bool Register(const char* /*prefix*/, const char* /*case_name*/, 70746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* /*test_names*/) { 708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter return true; 709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } 710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}; 711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Returns the current OS stack trace as a String. 715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The maximum number of stack frames to be included is specified by 717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the gtest_stack_trace_depth flag. The skip_count parameter 718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// specifies the number of top frames to be skipped, which doesn't 719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// count against the number of frames to be included. 720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For example, if Foo() calls Bar(), which in turn calls 722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in 723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. 72446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test, 72546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan int skip_count); 72646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 72746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Helpers for suppressing warnings on unreachable code or constant 72846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// condition. 72946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 73046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Always returns true. 73146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ bool AlwaysTrue(); 73246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 73346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Always returns false. 73446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline bool AlwaysFalse() { return !AlwaysTrue(); } 73546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 73646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Helper for suppressing false warning from Clang on a const char* 73746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// variable declared in a conditional expression always being NULL in 73846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the else branch. 73946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct GTEST_API_ ConstCharPtr { 74046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ConstCharPtr(const char* str) : value(str) {} 74146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan operator bool() const { return true; } 74246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const char* value; 74346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 74446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 74546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A simple Linear Congruential Generator for generating random 74646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// numbers with a uniform distribution. Unlike rand() and srand(), it 74746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// doesn't use global state (and therefore can't interfere with user 74846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// code). Unlike rand_r(), it's portable. An LCG isn't very random, 74946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// but it's good enough for our purposes. 75046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass GTEST_API_ Random { 75146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 75246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static const UInt32 kMaxRange = 1u << 31; 75346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 75446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan explicit Random(UInt32 seed) : state_(seed) {} 75546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 75646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void Reseed(UInt32 seed) { state_ = seed; } 75746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 75846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Generates a random number from [0, range). Crashes if 'range' is 75946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // 0 or greater than kMaxRange. 76046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan UInt32 Generate(UInt32 range); 76146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 76246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 76346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan UInt32 state_; 76446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); 76546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 76646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 76746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a 76846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// compiler error iff T1 and T2 are different types. 76946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T1, typename T2> 77046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct CompileAssertTypesEqual; 77146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 77246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 77346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct CompileAssertTypesEqual<T, T> { 77446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 77546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 77646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Removes the reference from a type if it is a reference type, 77746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// otherwise leaves it unchanged. This is the same as 77846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// tr1::remove_reference, which is not widely available yet. 77946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 78046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct RemoveReference { typedef T type; }; // NOLINT 78146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 78246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct RemoveReference<T&> { typedef T type; }; // NOLINT 78346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 78446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A handy wrapper around RemoveReference that works when the argument 78546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// T depends on template parameters. 78646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_REMOVE_REFERENCE_(T) \ 78746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typename ::testing::internal::RemoveReference<T>::type 78846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 78946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Removes const from a type if it is a const type, otherwise leaves 79046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// it unchanged. This is the same as tr1::remove_const, which is not 79146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// widely available yet. 79246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 79346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct RemoveConst { typedef T type; }; // NOLINT 79446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 79546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct RemoveConst<const T> { typedef T type; }; // NOLINT 79646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 79746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above 79846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// definition to fail to remove the const in 'const int[3]' and 'const 79946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// char[3][4]'. The following specialization works around the bug. 80046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, size_t N> 80146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct RemoveConst<const T[N]> { 80246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typedef typename RemoveConst<T>::type type[N]; 80346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 80446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 80546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if defined(_MSC_VER) && _MSC_VER < 1400 80646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This is the only specialization that allows VC++ 7.1 to remove const in 80746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC 80846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// and thus needs to be conditionally compiled. 80946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, size_t N> 81046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct RemoveConst<T[N]> { 81146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typedef typename RemoveConst<T>::type type[N]; 81246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 81346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif 81446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 81546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A handy wrapper around RemoveConst that works when the argument 81646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// T depends on template parameters. 81746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_REMOVE_CONST_(T) \ 81846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typename ::testing::internal::RemoveConst<T>::type 81946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 82046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Turns const U&, U&, const U, and U all into U. 82146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ 82246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) 82346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 82446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Adds reference to a type if it is not a reference type, 82546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// otherwise leaves it unchanged. This is the same as 82646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// tr1::add_reference, which is not widely available yet. 82746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 82846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AddReference { typedef T& type; }; // NOLINT 82946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 83046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AddReference<T&> { typedef T& type; }; // NOLINT 83146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 83246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A handy wrapper around AddReference that works when the argument T 83346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// depends on template parameters. 83446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_ADD_REFERENCE_(T) \ 83546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typename ::testing::internal::AddReference<T>::type 83646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 83746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Adds a reference to const on top of T as necessary. For example, 83846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// it transforms 83946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 84046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// char ==> const char& 84146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// const char ==> const char& 84246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// char& ==> const char& 84346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// const char& ==> const char& 84446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 84546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The argument T must depend on some template parameters. 84646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_REFERENCE_TO_CONST_(T) \ 84746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T)) 84846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 84946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ImplicitlyConvertible<From, To>::value is a compile-time bool 85046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// constant that's true iff type From can be implicitly converted to 85146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// type To. 85246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename From, typename To> 85346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass ImplicitlyConvertible { 85446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 85546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // We need the following helper functions only for their types. 85646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // They have no implementations. 85746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 85846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // MakeFrom() is an expression whose type is From. We cannot simply 85946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // use From(), as the type From may not have a public default 86046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // constructor. 86146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static From MakeFrom(); 86246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 86346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // These two functions are overloaded. Given an expression 86446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Helper(x), the compiler will pick the first version if x can be 86546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // implicitly converted to type To; otherwise it will pick the 86646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // second version. 86746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // 86846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // The first version returns a value of size 1, and the second 86946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // version returns a value of size 2. Therefore, by checking the 87046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // size of Helper(x), which can be done at compile time, we can tell 87146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // which version of Helper() is used, and hence whether x can be 87246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // implicitly converted to type To. 87346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static char Helper(To); 87446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static char (&Helper(...))[2]; // NOLINT 87546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 87646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // We have to put the 'public' section after the 'private' section, 87746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // or MSVC refuses to compile the code. 87846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 87946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // MSVC warns about implicitly converting from double to int for 88046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // possible loss of data, so we need to temporarily disable the 88146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // warning. 88246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#ifdef _MSC_VER 88346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# pragma warning(push) // Saves the current warning state. 88446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# pragma warning(disable:4244) // Temporarily disables warning 4244. 88546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 88646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static const bool value = 88746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; 88846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# pragma warning(pop) // Restores the warning state. 88946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#elif defined(__BORLANDC__) 89046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // C++Builder cannot use member overload resolution during template 89146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // instantiation. The simplest workaround is to use its C++0x type traits 89246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // functions (C++Builder 2009 and above only). 89346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static const bool value = __is_convertible(From, To); 89446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#else 89546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static const bool value = 89646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; 89746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif // _MSV_VER 89846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 89946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename From, typename To> 90046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanconst bool ImplicitlyConvertible<From, To>::value; 90146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 90246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// IsAProtocolMessage<T>::value is a compile-time bool constant that's 90346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// true iff T is type ProtocolMessage, proto2::Message, or a subclass 90446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// of those. 90546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T> 90646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct IsAProtocolMessage 90746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan : public bool_constant< 90846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value || 90946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> { 91046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 91146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 91246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// When the compiler sees expression IsContainerTest<C>(0), if C is an 91346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// STL-style container class, the first overload of IsContainerTest 91446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// will be viable (since both C::iterator* and C::const_iterator* are 91546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// valid types and NULL can be implicitly converted to them). It will 91646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// be picked over the second overload as 'int' is a perfect match for 91746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the type of argument 0. If C::iterator or C::const_iterator is not 91846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// a valid type, the first overload is not viable, and the second 91946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// overload will be picked. Therefore, we can determine whether C is 92046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// a container class by checking the type of IsContainerTest<C>(0). 92146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The value of the expression is insignificant. 92246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 92346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Note that we look for both C::iterator and C::const_iterator. The 92446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// reason is that C++ injects the name of a class as a member of the 92546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// class itself (e.g. you can refer to class iterator as either 92646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 'iterator' or 'iterator::iterator'). If we look for C::iterator 92746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// only, for example, we would mistakenly think that a class named 92846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// iterator is an STL container. 92946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 93046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Also note that the simpler approach of overloading 93146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// IsContainerTest(typename C::const_iterator*) and 93246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. 93346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantypedef int IsContainer; 93446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <class C> 93546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanIsContainer IsContainerTest(int /* dummy */, 93646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typename C::iterator* /* it */ = NULL, 93746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typename C::const_iterator* /* const_it */ = NULL) { 93846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return 0; 93946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 94046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 94146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantypedef char IsNotContainer; 94246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <class C> 94346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanIsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } 944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 94546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// EnableIf<condition>::type is void when 'Cond' is true, and 94646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// undefined when 'Cond' is false. To use SFINAE to make a function 94746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// overload only apply when a particular expression is true, add 94846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// "typename EnableIf<expression>::type* = 0" as the last parameter. 94946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate<bool> struct EnableIf; 95046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate<> struct EnableIf<true> { typedef void type; }; // NOLINT 951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 95246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Utilities for native arrays. 95346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 95446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ArrayEq() compares two k-dimensional native arrays using the 95546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// elements' operator==, where k can be any integer >= 0. When k is 95646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 0, ArrayEq() degenerates into comparing a single pair of values. 95746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 95846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U> 95946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanbool ArrayEq(const T* lhs, size_t size, const U* rhs); 96046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 96146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This generic version is used when k is 0. 96246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U> 96346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } 96446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 96546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This overload is used when k >= 1. 96646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U, size_t N> 96746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { 96846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return internal::ArrayEq(lhs, N, rhs); 96946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 97046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 97146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This helper reduces code bloat. If we instead put its logic inside 97246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the previous ArrayEq() function, arrays with different sizes would 97346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// lead to different copies of the template code. 97446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U> 97546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanbool ArrayEq(const T* lhs, size_t size, const U* rhs) { 97646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan for (size_t i = 0; i != size; i++) { 97746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (!internal::ArrayEq(lhs[i], rhs[i])) 97846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return false; 97946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 98046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return true; 98146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 98246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 98346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Finds the first element in the iterator range [begin, end) that 98446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// equals elem. Element may be a native array type itself. 98546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename Iter, typename Element> 98646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { 98746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan for (Iter it = begin; it != end; ++it) { 98846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (internal::ArrayEq(*it, elem)) 98946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return it; 99046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 99146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return end; 99246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 99346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 99446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// CopyArray() copies a k-dimensional native array using the elements' 99546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// operator=, where k can be any integer >= 0. When k is 0, 99646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// CopyArray() degenerates into copying a single value. 99746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 99846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U> 99946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanvoid CopyArray(const T* from, size_t size, U* to); 100046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 100146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This generic version is used when k is 0. 100246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U> 100346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline void CopyArray(const T& from, U* to) { *to = from; } 100446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 100546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This overload is used when k >= 1. 100646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U, size_t N> 100746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline void CopyArray(const T(&from)[N], U(*to)[N]) { 100846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan internal::CopyArray(from, N, *to); 100946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 101046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 101146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This helper reduces code bloat. If we instead put its logic inside 101246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the previous CopyArray() function, arrays with different sizes 101346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// would lead to different copies of the template code. 101446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename T, typename U> 101546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanvoid CopyArray(const T* from, size_t size, U* to) { 101646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan for (size_t i = 0; i != size; i++) { 101746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan internal::CopyArray(from[i], to + i); 101846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 101946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan} 102046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 102146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The relation between an NativeArray object (see below) and the 102246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// native array it represents. 102346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanenum RelationToSource { 102446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan kReference, // The NativeArray references the native array. 102546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan kCopy // The NativeArray makes a copy of the native array and 102646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // owns the copy. 102746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 102846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 102946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Adapts a native array to a read-only STL-style container. Instead 103046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// of the complete STL container concept, this adaptor only implements 103146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// members useful for Google Mock's container matchers. New members 103246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// should be added as needed. To simplify the implementation, we only 103346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// support Element being a raw type (i.e. having no top-level const or 103446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// reference modifier). It's the client's responsibility to satisfy 103546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// this requirement. Element can be an array type itself (hence 103646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// multi-dimensional arrays are supported). 103746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename Element> 103846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass NativeArray { 103946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public: 104046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // STL-style container typedefs. 104146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typedef Element value_type; 104246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typedef Element* iterator; 104346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan typedef const Element* const_iterator; 104446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 104546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Constructs from a native array. 104646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan NativeArray(const Element* array, size_t count, RelationToSource relation) { 104746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Init(array, count, relation); 104846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 104946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 105046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Copy constructor. 105146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan NativeArray(const NativeArray& rhs) { 105246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Init(rhs.array_, rhs.size_, rhs.relation_to_source_); 105346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 105446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 105546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ~NativeArray() { 105646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Ensures that the user doesn't instantiate NativeArray with a 105746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // const or reference type. 105846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static_cast<void>(StaticAssertTypeEqHelper<Element, 105946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>()); 106046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (relation_to_source_ == kCopy) 106146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan delete[] array_; 106246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 106346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 106446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // STL-style container methods. 106546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan size_t size() const { return size_; } 106646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const_iterator begin() const { return array_; } 106746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const_iterator end() const { return array_ + size_; } 106846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan bool operator==(const NativeArray& rhs) const { 106946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return size() == rhs.size() && 107046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ArrayEq(begin(), size(), rhs.begin()); 107146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 107246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 107346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private: 107446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // Initializes this object; makes a copy of the input array if 107546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan // 'relation' is kCopy. 107646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan void Init(const Element* array, size_t a_size, RelationToSource relation) { 107746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (relation == kReference) { 107846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan array_ = array; 107946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } else { 108046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan Element* const copy = new Element[a_size]; 108146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan CopyArray(array, a_size, copy); 108246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan array_ = copy; 108346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 108446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan size_ = a_size; 108546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan relation_to_source_ = relation; 108646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan } 108746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 108846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan const Element* array_; 108946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan size_t size_; 109046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan RelationToSource relation_to_source_; 109146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 109246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_DISALLOW_ASSIGN_(NativeArray); 109346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}; 1094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace internal 1096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter} // namespace testing 1097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 109846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_MESSAGE_AT_(file, line, message, result_type) \ 109946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ::testing::internal::AssertHelper(result_type, file, line, message) \ 1100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter = ::testing::Message() 1101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 110246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_MESSAGE_(message, result_type) \ 110346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) 110446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan 1105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_FATAL_FAILURE_(message) \ 110646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) 1107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_NONFATAL_FAILURE_(message) \ 110946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) 1110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_SUCCESS_(message) \ 111246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) 1113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Suppresses MSVC warnings 4072 (unreachable code) for the code following 1115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// statement if it returns or throws (or doesn't return or throw in some 1116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// situations). 111746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ 1118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (::testing::internal::AlwaysTrue()) { statement; } 1119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ 1121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 112246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (::testing::internal::ConstCharPtr gtest_msg = "") { \ 1123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool gtest_caught_expected = false; \ 1124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter try { \ 112546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter catch (expected_exception const&) { \ 1128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter gtest_caught_expected = true; \ 1129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter catch (...) { \ 113146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan gtest_msg.value = \ 113246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Expected: " #statement " throws an exception of type " \ 113346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan #expected_exception ".\n Actual: it throws a different type."; \ 1134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 1135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (!gtest_caught_expected) { \ 113746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan gtest_msg.value = \ 113846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "Expected: " #statement " throws an exception of type " \ 113946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan #expected_exception ".\n Actual: it throws nothing."; \ 1140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 1141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } else \ 1143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ 114446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan fail(gtest_msg.value) 1145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_TEST_NO_THROW_(statement, fail) \ 1147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 114846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (::testing::internal::AlwaysTrue()) { \ 1149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter try { \ 115046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter catch (...) { \ 1153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ 1154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } else \ 1156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ 115746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan fail("Expected: " #statement " doesn't throw an exception.\n" \ 115846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: it throws.") 1159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_TEST_ANY_THROW_(statement, fail) \ 1161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 116246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (::testing::internal::AlwaysTrue()) { \ 1163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter bool gtest_caught_any = false; \ 1164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter try { \ 116546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter catch (...) { \ 1168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter gtest_caught_any = true; \ 1169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (!gtest_caught_any) { \ 1171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ 1172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } else \ 1174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ 117546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan fail("Expected: " #statement " throws an exception.\n" \ 117646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: it doesn't.") 1177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 117946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Implements Boolean test assertions such as EXPECT_TRUE. expression can be 118046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// either a boolean expression or an AssertionResult. text is a textual 118146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// represenation of expression as it was passed into the EXPECT_TRUE. 118246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ 1183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 118446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (const ::testing::AssertionResult gtest_ar_ = \ 118546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan ::testing::AssertionResult(expression)) \ 1186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ; \ 1187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter else \ 118846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan fail(::testing::internal::GetBoolAssertionFailureMessage(\ 118946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan gtest_ar_, text, #actual, #expected).c_str()) 1190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ 1192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 119346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan if (::testing::internal::AlwaysTrue()) { \ 1194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ 119546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ 1197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ 1198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } \ 1199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter } else \ 1200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ 120146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan fail("Expected: " #statement " doesn't generate new fatal " \ 120246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan "failures in the current thread.\n" \ 120346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan " Actual: it does.") 1204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Expands to the name of the class that implements the given test. 1206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ 1207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter test_case_name##_##test_name##_Test 1208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Helper macro for defining tests. 1210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ 1211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ 1212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:\ 1213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ 1214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:\ 1215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter virtual void TestBody();\ 121646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ 1217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_DISALLOW_COPY_AND_ASSIGN_(\ 1218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ 1219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};\ 1220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter\ 1221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ 1222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::test_info_ =\ 1223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter ::testing::internal::MakeAndRegisterTestInfo(\ 122446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan #test_case_name, #test_name, NULL, NULL, \ 1225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter (parent_id), \ 1226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter parent_class::SetUpTestCase, \ 1227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter parent_class::TearDownTestCase, \ 1228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter new ::testing::internal::TestFactoryImpl<\ 1229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ 1230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() 1231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter 1232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 1233