1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2005, Google Inc. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// All rights reserved. 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Redistribution and use in source and binary forms, with or without 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// modification, are permitted provided that the following conditions are 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// met: 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Redistributions of source code must retain the above copyright 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// notice, this list of conditions and the following disclaimer. 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Redistributions in binary form must reproduce the above 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// copyright notice, this list of conditions and the following disclaimer 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in the documentation and/or other materials provided with the 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distribution. 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Neither the name of Google Inc. nor the names of its 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// contributors may be used to endorse or promote products derived from 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// this software without specific prior written permission. 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The Google C++ Testing Framework (Google Test) 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This header file declares functions and macros used internally by 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test. They are subject to change without notice. 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/internal/gtest-port.h> 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_LINUX 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdlib.h> 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h> 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/wait.h> 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <unistd.h> 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_LINUX 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <iomanip> // NOLINT 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <limits> // NOLINT 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/internal/gtest-string.h> 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/internal/gtest-filepath.h> 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Due to C++ preprocessor weirdness, we need double indirection to 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// concatenate two tokens when one of them is __LINE__. Writing 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// foo ## __LINE__ 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// will result in the token foo__LINE__, instead of foo followed by 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the current line number. For more details, see 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_CONCAT_TOKEN(foo, bar) GTEST_CONCAT_TOKEN_IMPL(foo, bar) 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_CONCAT_TOKEN_IMPL(foo, bar) foo ## bar 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test defines the testing::Message class to allow construction of 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// test messages via the << operator. The idea is that anything 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// streamable to std::ostream can be streamed to a testing::Message. 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This allows a user to use his own types in Google Test assertions by 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// overloading the << operator. 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// util/gtl/stl_logging-inl.h overloads << for STL containers. These 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// overloads cannot be defined in the std namespace, as that will be 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// undefined behavior. Therefore, they are defined in the global 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace instead. 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// C++'s symbol lookup rule (i.e. Koenig lookup) says that these 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// overloads are visible in either the std namespace or the global 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace, but not other namespaces, including the testing 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace which Google Test's Message class is in. 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// To allow STL containers (and other types that has a << operator 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// defined in the global namespace) to be used in Google Test assertions, 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// testing::Message must access the custom << operator from the global 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// namespace. Hence this helper function. 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Note: Jeffrey Yasskin suggested an alternative fix by "using 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ::operator<<;" in the definition of Message's operator<<. That fix 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// doesn't require a helper function, but unfortunately doesn't 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compile with MSVC. 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline void GTestStreamToHelper(std::ostream* os, const T& val) { 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *os << val; 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace testing { 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Forward declaration of classes. 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Message; // Represents a failure message. 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestCase; // A collection of related tests. 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResult; // Result of a test part. 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestInfo; // Information about a test. 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTest; // A collection of test cases. 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTestEventListenerInterface; // Listens to Google Test events. 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass AssertionResult; // Result of an assertion. 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct TraceInfo; // Information about a trace point. 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ScopedTrace; // Implements scoped trace. 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestInfoImpl; // Opaque implementation of TestInfo 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestResult; // Result of a single Test. 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass UnitTestImpl; // Opaque implementation of UnitTest 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename E> class List; // A generic list. 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename E> class ListNode; // A node in a generic list. 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A secret type that Google Test users don't know about. It has no 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// definition on purpose. Therefore it's impossible to create a 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Secret object, which is what we want. 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Secret; 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Two overloaded helpers for checking at compile time whether an 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// expression is a null pointer literal (i.e. NULL or any 0-valued 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compile-time integral constant). Their return values have 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// different sizes, so we can use sizeof() to test which version is 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// picked by the compiler. These helpers have no implementations, as 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// we only need their signatures. 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Given IsNullLiteralHelper(x), the compiler will pick the first 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// version if x can be implicitly converted to Secret*, and pick the 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// second version otherwise. Since Secret is a secret and incomplete 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// type, the only expression a user can write that has type Secret* is 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a null pointer literal. Therefore, we know that x is a null 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// pointer literal if and only if the first version is picked by the 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compiler. 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottchar IsNullLiteralHelper(Secret* p); 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottchar (&IsNullLiteralHelper(...))[2]; // NOLINT 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A compile-time bool constant that is true if and only if x is a 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// null pointer literal (i.e. NULL or any 0-valued compile-time 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// integral constant). 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __SYMBIAN32__ // Symbian 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Passing non-POD classes through ellipsis (...) crashes the ARM compiler. 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The Nokia Symbian compiler tries to instantiate a copy constructor for 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// objects passed through ellipsis (...), failing for uncopyable objects. 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Hence we define this to false (and lose support for NULL detection). 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_IS_NULL_LITERAL(x) false 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else // ! __SYMBIAN32__ 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_IS_NULL_LITERAL(x) \ 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // __SYMBIAN32__ 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Appends the user-supplied message to the Google-Test-generated message. 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString AppendUserMessage(const String& gtest_msg, 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Message& user_msg); 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A helper class for creating scoped traces in user programs. 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ScopedTrace { 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The c'tor pushes the given source file location and message onto 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // a trace stack maintained by Google Test. 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ScopedTrace(const char* file, int line, const Message& message); 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The d'tor pops the info pushed by the c'tor. 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Note that the d'tor is not virtual in order to be efficient. 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Don't inherit from ScopedTrace! 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ~ScopedTrace(); 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_DISALLOW_COPY_AND_ASSIGN(ScopedTrace); 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} GTEST_ATTRIBUTE_UNUSED; // A ScopedTrace object does its job in its 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // c'tor and d'tor. Therefore it doesn't 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // need to be used otherwise. 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Converts a streamable value to a String. A NULL pointer is 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// converted to "(null)". When the input value is a ::string, 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ::std::string, ::wstring, or ::std::wstring object, each NUL 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// character in it is replaced with "\\0". 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Declared here but defined in gtest.h, so that it has access 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to the definition of the Message class, required by the ARM 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// compiler. 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString StreamableToString(const T& streamable); 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Formats a value to be used in a failure message. 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __SYMBIAN32__ 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These are needed as the Nokia Symbian Compiler cannot decide between 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// const T& and const T* in a function template. The Nokia compiler _can_ 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// decide between class template specializations for T and T*, so a 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// tr1::type_traits-like is_pointer works, and we can overload on that. 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This overload makes sure that all pointers (including 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// those to char or wchar_t) are printed as raw pointers. 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatValueForFailureMessage(internal::true_type dummy, 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott T* pointer) { 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return StreamableToString(static_cast<const void*>(pointer)); 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatValueForFailureMessage(internal::false_type dummy, 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const T& value) { 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return StreamableToString(value); 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForFailureMessage(const T& value) { 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return FormatValueForFailureMessage( 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typename internal::is_pointer<T>::type(), value); 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForFailureMessage(const T& value) { 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return StreamableToString(value); 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This overload makes sure that all pointers (including 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// those to char or wchar_t) are printed as raw pointers. 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForFailureMessage(T* pointer) { 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return StreamableToString(static_cast<const void*>(pointer)); 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // __SYMBIAN32__ 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These overloaded versions handle narrow and wide characters. 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString FormatForFailureMessage(char ch); 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottString FormatForFailureMessage(wchar_t wchar); 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// When this operand is a const char* or char*, and the other operand 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is a ::std::string or ::string, we print this operand as a C string 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// rather than a pointer. We do the same for wide strings. 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This internal macro is used to avoid duplicated code. 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_FORMAT_IMPL(operand2_type, operand1_printer)\ 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForComparisonFailureMessage(\ 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott operand2_type::value_type* str, const operand2_type& /*operand2*/) {\ 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return operand1_printer(str);\ 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}\ 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline String FormatForComparisonFailureMessage(\ 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const operand2_type::value_type* str, const operand2_type& /*operand2*/) {\ 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return operand1_printer(str);\ 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_STRING 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::std::string, String::ShowCStringQuoted) 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_STRING 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_STD_WSTRING 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::std::wstring, String::ShowWideCStringQuoted) 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_STD_WSTRING 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_GLOBAL_STRING 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::string, String::ShowCStringQuoted) 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_GLOBAL_STRING 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if GTEST_HAS_GLOBAL_WSTRING 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottGTEST_FORMAT_IMPL(::wstring, String::ShowWideCStringQuoted) 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_HAS_GLOBAL_WSTRING 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef GTEST_FORMAT_IMPL 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Constructs and returns the message for an equality assertion 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The first four parameters are the expressions used in the assertion 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// and their values, as strings. For example, for ASSERT_EQ(foo, bar) 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// where foo is 5 and bar is 6, we have: 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// expected_expression: "foo" 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// actual_expression: "bar" 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// expected_value: "5" 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// actual_value: "6" 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The ignoring_case parameter is true iff the assertion is a 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// be inserted into the message. 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult EqFailure(const char* expected_expression, 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* actual_expression, 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String& expected_value, 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String& actual_value, 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool ignoring_case); 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This template class represents an IEEE floating-point number 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (either single-precision or double-precision, depending on the 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// template parameters). 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The purpose of this class is to do more sophisticated number 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// comparison. (Due to round-off error, etc, it's very unlikely that 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// two floating-points will be equal exactly. Hence a naive 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// comparison by the == operation often doesn't work.) 298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Format of IEEE floating-point: 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The most-significant bit being the leftmost, an IEEE 302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// floating-point looks like 303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// sign_bit exponent_bits fraction_bits 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Here, sign_bit is a single bit that designates the sign of the 307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// number. 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For float, there are 8 exponent bits and 23 fraction bits. 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For double, there are 11 exponent bits and 52 fraction bits. 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// More details can be found at 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// http://en.wikipedia.org/wiki/IEEE_floating-point_standard. 315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Template parameter: 317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// RawType: the raw floating-point type (either float or double) 319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename RawType> 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FloatingPoint { 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Defines the unsigned integer type that has the same size as the 323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // floating point number. 324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits; 325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Constants. 327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // # of bits in a number. 329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const size_t kBitCount = 8*sizeof(RawType); 330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // # of fraction bits in a number. 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const size_t kFractionBitCount = 333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::numeric_limits<RawType>::digits - 1; 334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // # of exponent bits in a number. 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The mask for the sign bit. 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1); 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The mask for the fraction bits. 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const Bits kFractionBitMask = 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ~static_cast<Bits>(0) >> (kExponentBitCount + 1); 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The mask for the exponent bits. 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // How many ULP's (Units in the Last Place) we want to tolerate when 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // comparing two numbers. The larger the value, the more error we 350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // allow. A 0 value means that two numbers must be exactly the same 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // to be considered equal. 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The maximum error of a single floating-point operation is 0.5 354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // units in the last place. On Intel CPU's, all floating-point 355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // calculations are done with 80-bit precision, while double has 64 356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // bits. Therefore, 4 should be enough for ordinary use. 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // See the following article for more details on ULP: 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm. 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const size_t kMaxUlps = 4; 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Constructs a FloatingPoint from a raw floating-point number. 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // On an Intel CPU, passing a non-normalized NAN (Not a Number) 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // around may change its bits, although the new value is guaranteed 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // to be also a NAN. Therefore, don't expect this constructor to 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // preserve the bits in x when x is a NAN. 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit FloatingPoint(const RawType& x) : value_(x) {} 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Static methods 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Reinterprets a bit pattern as a floating-point number. 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This function is needed to test the AlmostEquals() method. 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static RawType ReinterpretBits(const Bits bits) { 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FloatingPoint fp(0); 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fp.bits_ = bits; 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return fp.value_; 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the floating-point number that represent positive infinity. 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static RawType Infinity() { 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ReinterpretBits(kExponentBitMask); 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Non-static methods 387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the bits that represents this number. 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Bits &bits() const { return bits_; } 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the exponent bits of this number. 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bits exponent_bits() const { return kExponentBitMask & bits_; } 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the fraction bits of this number. 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bits fraction_bits() const { return kFractionBitMask & bits_; } 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the sign bit of this number. 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bits sign_bit() const { return kSignBitMask & bits_; } 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff this is NAN (not a number). 401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_nan() const { 402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // It's a NAN if the exponent bits are all ones and the fraction 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // bits are not entirely zeros. 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); 405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff this number is at most kMaxUlps ULP's away from 408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // rhs. In particular, this function: 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // - returns false if either number is (or both are) NAN. 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // - treats really large numbers as almost equal to infinity. 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // - thinks +0.0 and -0.0 are 0 DLP's apart. 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool AlmostEquals(const FloatingPoint& rhs) const { 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The IEEE standard says that any comparison operation involving 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // a NAN must return false. 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (is_nan() || rhs.is_nan()) return false; 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return DistanceBetweenSignAndMagnitudeNumbers(bits_, rhs.bits_) <= kMaxUlps; 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Converts an integer from the sign-and-magnitude representation to 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the biased representation. More precisely, let N be 2 to the 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // power of (kBitCount - 1), an integer x is represented by the 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // unsigned number x + N. 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // For instance, 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // -N + 1 (the most negative number representable using 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // sign-and-magnitude) is represented by 1; 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 0 is represented by N; and 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // N - 1 (the biggest number representable using 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // sign-and-magnitude) is represented by 2N - 1. 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Read http://en.wikipedia.org/wiki/Signed_number_representations 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // for more details on signed number representations. 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bits SignAndMagnitudeToBiased(const Bits &sam) { 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (kSignBitMask & sam) { 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // sam represents a negative number. 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ~sam + 1; 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // sam represents a positive number. 443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return kSignBitMask | sam; 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Given two numbers in the sign-and-magnitude representation, 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // returns the distance between them as an unsigned number. 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Bits &sam2) { 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Bits biased1 = SignAndMagnitudeToBiased(sam1); 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Bits biased2 = SignAndMagnitudeToBiased(sam2); 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); 454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott union { 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RawType value_; // The raw floating-point number. 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bits bits_; // The bits that represent the number. 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Typedefs the instances of the FloatingPoint template class that we 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// care to use. 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef FloatingPoint<float> Float; 465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef FloatingPoint<double> Double; 466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// In order to catch the mistake of putting tests that use different 468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// test fixture classes in the same test case, we need to assign 469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// unique IDs to fixture classes and compare them. The TypeId type is 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// used to hold such IDs. The user should treat TypeId as an opaque 471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// type: the only operation allowed on TypeId values is to compare 472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// them for equality using the == operator. 473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef void* TypeId; 474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// GetTypeId<T>() returns the ID of type T. Different values will be 476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// returned for different types. Calling the function twice with the 477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// same type argument is guaranteed to return the same ID. 478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename T> 479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TypeId GetTypeId() { 480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static bool dummy = false; 481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The compiler is required to create an instance of the static 482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // variable dummy for each T used to instantiate the template. 483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Therefore, the address of dummy is guaranteed to be unique. 484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return &dummy; 485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_OS_WINDOWS 488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Predicate-formatters for implementing the HRESULT checking macros 490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} 491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We pass a long instead of HRESULT to avoid causing an 492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// include dependency for the HRESULT type. 493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsHRESULTSuccess(const char* expr, long hr); // NOLINT 494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottAssertionResult IsHRESULTFailure(const char* expr, long hr); // NOLINT 495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_OS_WINDOWS 497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace testing 500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_MESSAGE(message, result_type) \ 502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::internal::AssertHelper(result_type, __FILE__, __LINE__, message) \ 503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott = ::testing::Message() 504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_FATAL_FAILURE(message) \ 506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return GTEST_MESSAGE(message, ::testing::TPRT_FATAL_FAILURE) 507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_NONFATAL_FAILURE(message) \ 509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_MESSAGE(message, ::testing::TPRT_NONFATAL_FAILURE) 510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_SUCCESS(message) \ 512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_MESSAGE(message, ::testing::TPRT_SUCCESS) 513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_TEST_BOOLEAN(boolexpr, booltext, actual, expected, fail) \ 515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_AMBIGUOUS_ELSE_BLOCKER \ 516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (boolexpr) \ 517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ; \ 518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else \ 519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fail("Value of: " booltext "\n Actual: " #actual "\nExpected: " #expected) 520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Helper macro for defining tests. 522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_TEST(test_case_name, test_name, parent_class)\ 523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass test_case_name##_##test_name##_Test : public parent_class {\ 524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:\ 525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_name##_##test_name##_Test() {}\ 526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ::testing::Test* NewTest() {\ 527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return new test_case_name##_##test_name##_Test;\ 528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }\ 529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:\ 530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void TestBody();\ 531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ::testing::TestInfo* const test_info_;\ 532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_DISALLOW_COPY_AND_ASSIGN(test_case_name##_##test_name##_Test);\ 533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};\ 534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott\ 535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott::testing::TestInfo* const test_case_name##_##test_name##_Test::test_info_ =\ 536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::TestInfo::MakeAndRegisterInstance(\ 537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott #test_case_name, \ 538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott #test_name, \ 539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::internal::GetTypeId< parent_class >(), \ 540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parent_class::SetUpTestCase, \ 541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott parent_class::TearDownTestCase, \ 542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_case_name##_##test_name##_Test::NewTest);\ 543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid test_case_name##_##test_name##_Test::TestBody() 544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 547