18b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Copyright 2005, Google Inc. 28b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// All rights reserved. 38b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 48b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Redistribution and use in source and binary forms, with or without 58b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// modification, are permitted provided that the following conditions are 68b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// met: 78b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 88b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// * Redistributions of source code must retain the above copyright 98b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// notice, this list of conditions and the following disclaimer. 108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// * Redistributions in binary form must reproduce the above 118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// copyright notice, this list of conditions and the following disclaimer 128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// in the documentation and/or other materials provided with the 138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// distribution. 148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// * Neither the name of Google Inc. nor the names of its 158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// contributors may be used to endorse or promote products derived from 168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// this software without specific prior written permission. 178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) 318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The Google C++ Testing Framework (Google Test) 338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This header file declares functions and macros used internally by 358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Google Test. They are subject to change without notice. 368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include "gtest/internal/gtest-port.h" 418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if GTEST_OS_LINUX 438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern# include <stdlib.h> 448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern# include <sys/types.h> 458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern# include <sys/wait.h> 468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern# include <unistd.h> 478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif // GTEST_OS_LINUX 488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if GTEST_HAS_EXCEPTIONS 508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern# include <stdexcept> 518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif 528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <ctype.h> 548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <float.h> 558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <string.h> 568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <iomanip> 578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <limits> 588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <map> 598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <set> 608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <string> 618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <vector> 628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include "gtest/gtest-message.h" 648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include "gtest/internal/gtest-string.h" 658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include "gtest/internal/gtest-filepath.h" 668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include "gtest/internal/gtest-type-util.h" 678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Due to C++ preprocessor weirdness, we need double indirection to 698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// concatenate two tokens when one of them is __LINE__. Writing 708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// foo ## __LINE__ 728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// will result in the token foo__LINE__, instead of foo followed by 748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the current line number. For more details, see 758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) 778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar 788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 798b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass ProtocolMessage; 808b92989c89bec8632aa47dc58dc162f199d62edcJames Zernnamespace proto2 { class Message; } 818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 828b92989c89bec8632aa47dc58dc162f199d62edcJames Zernnamespace testing { 838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Forward declarations. 858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 868b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass AssertionResult; // Result of an assertion. 878b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass Message; // Represents a failure message. 888b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass Test; // Represents a test. 898b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TestInfo; // Information about a test. 908b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TestPartResult; // Result of a test part. 918b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass UnitTest; // A collection of test cases. 928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 938b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern::std::string PrintToString(const T& value); 958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 968b92989c89bec8632aa47dc58dc162f199d62edcJames Zernnamespace internal { 978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 988b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct TraceInfo; // Information about a trace point. 998b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass ScopedTrace; // Implements scoped trace. 1008b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TestInfoImpl; // Opaque implementation of TestInfo 1018b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass UnitTestImpl; // Opaque implementation of UnitTest 1028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The text used in failure messages to indicate the start of the 1048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// stack trace. 1058b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ extern const char kStackTraceMarker[]; 1068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Two overloaded helpers for checking at compile time whether an 1088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// expression is a null pointer literal (i.e. NULL or any 0-valued 1098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// compile-time integral constant). Their return values have 1108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// different sizes, so we can use sizeof() to test which version is 1118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// picked by the compiler. These helpers have no implementations, as 1128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// we only need their signatures. 1138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 1148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Given IsNullLiteralHelper(x), the compiler will pick the first 1158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// version if x can be implicitly converted to Secret*, and pick the 1168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// second version otherwise. Since Secret is a secret and incomplete 1178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// type, the only expression a user can write that has type Secret* is 1188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// a null pointer literal. Therefore, we know that x is a null 1198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// pointer literal if and only if the first version is picked by the 1208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// compiler. 1218b92989c89bec8632aa47dc58dc162f199d62edcJames Zernchar IsNullLiteralHelper(Secret* p); 1228b92989c89bec8632aa47dc58dc162f199d62edcJames Zernchar (&IsNullLiteralHelper(...))[2]; // NOLINT 1238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A compile-time bool constant that is true if and only if x is a 1258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// null pointer literal (i.e. NULL or any 0-valued compile-time 1268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// integral constant). 1278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#ifdef GTEST_ELLIPSIS_NEEDS_POD_ 1288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// We lose support for NULL detection where the compiler doesn't like 1298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// passing non-POD classes through ellipsis (...). 1308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern# define GTEST_IS_NULL_LITERAL_(x) false 1318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#else 1328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern# define GTEST_IS_NULL_LITERAL_(x) \ 1338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) 1348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif // GTEST_ELLIPSIS_NEEDS_POD_ 1358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Appends the user-supplied message to the Google-Test-generated message. 1378b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ std::string AppendUserMessage( 1388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::string& gtest_msg, const Message& user_msg); 1398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if GTEST_HAS_EXCEPTIONS 1418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This exception is thrown by (and only by) a failed Google Test 1438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions 1448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// are enabled). We derive it from std::runtime_error, which is for 1458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// errors presumably detectable only at run time. Since 1468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// std::runtime_error inherits from std::exception, many testing 1478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// frameworks know how to extract and print the message inside it. 1488b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_API_ GoogleTestFailureException : public ::std::runtime_error { 1498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 1508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern explicit GoogleTestFailureException(const TestPartResult& failure); 1518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 1528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif // GTEST_HAS_EXCEPTIONS 1548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A helper class for creating scoped traces in user programs. 1568b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_API_ ScopedTrace { 1578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 1588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The c'tor pushes the given source file location and message onto 1598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // a trace stack maintained by Google Test. 1608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ScopedTrace(const char* file, int line, const Message& message); 1618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The d'tor pops the info pushed by the c'tor. 1638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 1648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Note that the d'tor is not virtual in order to be efficient. 1658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Don't inherit from ScopedTrace! 1668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ~ScopedTrace(); 1678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private: 1698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); 1708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its 1718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // c'tor and d'tor. Therefore it doesn't 1728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // need to be used otherwise. 1738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1748b92989c89bec8632aa47dc58dc162f199d62edcJames Zernnamespace edit_distance { 1758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Returns the optimal edits to go from 'left' to 'right'. 1768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// All edits cost the same, with replace having lower priority than 1778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// add/remove. 1788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Simple implementation of the Wagner–Fischer algorithm. 1798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm 1808b92989c89bec8632aa47dc58dc162f199d62edcJames Zernenum EditType { kMatch, kAdd, kRemove, kReplace }; 1818b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ std::vector<EditType> CalculateOptimalEdits( 1828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::vector<size_t>& left, const std::vector<size_t>& right); 1838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Same as above, but the input is represented as strings. 1858b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ std::vector<EditType> CalculateOptimalEdits( 1868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::vector<std::string>& left, 1878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::vector<std::string>& right); 1888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Create a diff of the input strings in Unified diff format. 1908b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ std::string CreateUnifiedDiff(const std::vector<std::string>& left, 1918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::vector<std::string>& right, 1928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern size_t context = 2); 1938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} // namespace edit_distance 1958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Calculate the diff between 'left' and 'right' and return it in unified diff 1978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// format. 1988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// If not null, stores in 'total_line_count' the total number of lines found 1998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// in left + right. 2008b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ std::string DiffStrings(const std::string& left, 2018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::string& right, 2028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern size_t* total_line_count); 2038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Constructs and returns the message for an equality assertion 2058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. 2068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The first four parameters are the expressions used in the assertion 2088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// and their values, as strings. For example, for ASSERT_EQ(foo, bar) 2098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// where foo is 5 and bar is 6, we have: 2108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// expected_expression: "foo" 2128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// actual_expression: "bar" 2138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// expected_value: "5" 2148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// actual_value: "6" 2158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The ignoring_case parameter is true iff the assertion is a 2178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will 2188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// be inserted into the message. 2198b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ AssertionResult EqFailure(const char* expected_expression, 2208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* actual_expression, 2218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::string& expected_value, 2228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const std::string& actual_value, 2238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool ignoring_case); 2248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. 2268b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ std::string GetBoolAssertionFailureMessage( 2278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const AssertionResult& assertion_result, 2288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* expression_text, 2298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* actual_predicate_value, 2308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* expected_predicate_value); 2318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This template class represents an IEEE floating-point number 2338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// (either single-precision or double-precision, depending on the 2348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// template parameters). 2358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The purpose of this class is to do more sophisticated number 2378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// comparison. (Due to round-off error, etc, it's very unlikely that 2388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// two floating-points will be equal exactly. Hence a naive 2398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// comparison by the == operation often doesn't work.) 2408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Format of IEEE floating-point: 2428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The most-significant bit being the leftmost, an IEEE 2448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// floating-point looks like 2458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// sign_bit exponent_bits fraction_bits 2478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Here, sign_bit is a single bit that designates the sign of the 2498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// number. 2508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// For float, there are 8 exponent bits and 23 fraction bits. 2528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// For double, there are 11 exponent bits and 52 fraction bits. 2548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// More details can be found at 2568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// http://en.wikipedia.org/wiki/IEEE_floating-point_standard. 2578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Template parameter: 2598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 2608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// RawType: the raw floating-point type (either float or double) 2618b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename RawType> 2628b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass FloatingPoint { 2638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 2648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Defines the unsigned integer type that has the same size as the 2658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // floating point number. 2668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits; 2678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Constants. 2698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // # of bits in a number. 2718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const size_t kBitCount = 8*sizeof(RawType); 2728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // # of fraction bits in a number. 2748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const size_t kFractionBitCount = 2758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern std::numeric_limits<RawType>::digits - 1; 2768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // # of exponent bits in a number. 2788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; 2798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The mask for the sign bit. 2818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1); 2828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The mask for the fraction bits. 2848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const Bits kFractionBitMask = 2858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ~static_cast<Bits>(0) >> (kExponentBitCount + 1); 2868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The mask for the exponent bits. 2888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); 2898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 2908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // How many ULP's (Units in the Last Place) we want to tolerate when 2918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // comparing two numbers. The larger the value, the more error we 2928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // allow. A 0 value means that two numbers must be exactly the same 2938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // to be considered equal. 2948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 2958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The maximum error of a single floating-point operation is 0.5 2968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // units in the last place. On Intel CPU's, all floating-point 2978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // calculations are done with 80-bit precision, while double has 64 2988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // bits. Therefore, 4 should be enough for ordinary use. 2998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 3008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // See the following article for more details on ULP: 3018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ 3028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const size_t kMaxUlps = 4; 3038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Constructs a FloatingPoint from a raw floating-point number. 3058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 3068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // On an Intel CPU, passing a non-normalized NAN (Not a Number) 3078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // around may change its bits, although the new value is guaranteed 3088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // to be also a NAN. Therefore, don't expect this constructor to 3098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // preserve the bits in x when x is a NAN. 3108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern explicit FloatingPoint(const RawType& x) { u_.value_ = x; } 3118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Static methods 3138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Reinterprets a bit pattern as a floating-point number. 3158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 3168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // This function is needed to test the AlmostEquals() method. 3178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static RawType ReinterpretBits(const Bits bits) { 3188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern FloatingPoint fp(0); 3198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fp.u_.bits_ = bits; 3208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return fp.u_.value_; 3218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 3228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns the floating-point number that represent positive infinity. 3248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static RawType Infinity() { 3258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return ReinterpretBits(kExponentBitMask); 3268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 3278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns the maximum representable finite floating-point number. 3298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static RawType Max(); 3308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Non-static methods 3328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns the bits that represents this number. 3348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const Bits &bits() const { return u_.bits_; } 3358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns the exponent bits of this number. 3378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } 3388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns the fraction bits of this number. 3408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } 3418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns the sign bit of this number. 3438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern Bits sign_bit() const { return kSignBitMask & u_.bits_; } 3448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns true iff this is NAN (not a number). 3468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool is_nan() const { 3478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // It's a NAN if the exponent bits are all ones and the fraction 3488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // bits are not entirely zeros. 3498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); 3508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 3518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Returns true iff this number is at most kMaxUlps ULP's away from 3538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // rhs. In particular, this function: 3548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 3558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // - returns false if either number is (or both are) NAN. 3568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // - treats really large numbers as almost equal to infinity. 3578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // - thinks +0.0 and -0.0 are 0 DLP's apart. 3588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool AlmostEquals(const FloatingPoint& rhs) const { 3598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The IEEE standard says that any comparison operation involving 3608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // a NAN must return false. 3618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (is_nan() || rhs.is_nan()) return false; 3628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) 3648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern <= kMaxUlps; 3658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 3668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private: 3688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The data type used to store the actual floating-point number. 3698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern union FloatingPointUnion { 3708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern RawType value_; // The raw floating-point number. 3718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern Bits bits_; // The bits that represent the number. 3728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern }; 3738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Converts an integer from the sign-and-magnitude representation to 3758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // the biased representation. More precisely, let N be 2 to the 3768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // power of (kBitCount - 1), an integer x is represented by the 3778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // unsigned number x + N. 3788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 3798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // For instance, 3808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 3818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // -N + 1 (the most negative number representable using 3828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // sign-and-magnitude) is represented by 1; 3838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 0 is represented by N; and 3848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // N - 1 (the biggest number representable using 3858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // sign-and-magnitude) is represented by 2N - 1. 3868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 3878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Read http://en.wikipedia.org/wiki/Signed_number_representations 3888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // for more details on signed number representations. 3898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static Bits SignAndMagnitudeToBiased(const Bits &sam) { 3908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (kSignBitMask & sam) { 3918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // sam represents a negative number. 3928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return ~sam + 1; 3938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } else { 3948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // sam represents a positive number. 3958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return kSignBitMask | sam; 3968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 3978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 3988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 3998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Given two numbers in the sign-and-magnitude representation, 4008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // returns the distance between them as an unsigned number. 4018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, 4028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const Bits &sam2) { 4038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const Bits biased1 = SignAndMagnitudeToBiased(sam1); 4048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const Bits biased2 = SignAndMagnitudeToBiased(sam2); 4058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); 4068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 4078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern FloatingPointUnion u_; 4098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 4108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// We cannot use std::numeric_limits<T>::max() as it clashes with the max() 4128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// macro defined by <windows.h>. 4138b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <> 4148b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline float FloatingPoint<float>::Max() { return FLT_MAX; } 4158b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <> 4168b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline double FloatingPoint<double>::Max() { return DBL_MAX; } 4178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Typedefs the instances of the FloatingPoint template class that we 4198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// care to use. 4208b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntypedef FloatingPoint<float> Float; 4218b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntypedef FloatingPoint<double> Double; 4228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// In order to catch the mistake of putting tests that use different 4248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// test fixture classes in the same test case, we need to assign 4258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// unique IDs to fixture classes and compare them. The TypeId type is 4268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// used to hold such IDs. The user should treat TypeId as an opaque 4278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// type: the only operation allowed on TypeId values is to compare 4288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// them for equality using the == operator. 4298b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntypedef const void* TypeId; 4308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4318b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 4328b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TypeIdHelper { 4338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 4348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // dummy_ must not have a const type. Otherwise an overly eager 4358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // compiler (e.g. MSVC 7.1 & 8.0) may try to merge 4368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // TypeIdHelper<T>::dummy_ for different Ts as an "optimization". 4378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static bool dummy_; 4388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 4398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4408b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 4418b92989c89bec8632aa47dc58dc162f199d62edcJames Zernbool TypeIdHelper<T>::dummy_ = false; 4428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// GetTypeId<T>() returns the ID of type T. Different values will be 4448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// returned for different types. Calling the function twice with the 4458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// same type argument is guaranteed to return the same ID. 4468b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 4478b92989c89bec8632aa47dc58dc162f199d62edcJames ZernTypeId GetTypeId() { 4488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The compiler is required to allocate a different 4498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // TypeIdHelper<T>::dummy_ variable for each T used to instantiate 4508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // the template. Therefore, the address of dummy_ is guaranteed to 4518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // be unique. 4528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return &(TypeIdHelper<T>::dummy_); 4538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 4548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Returns the type ID of ::testing::Test. Always call this instead 4568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// of GetTypeId< ::testing::Test>() to get the type ID of 4578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// ::testing::Test, as the latter may give the wrong result due to a 4588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// suspected linker bug when compiling Google Test as a Mac OS X 4598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// framework. 4608b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ TypeId GetTestTypeId(); 4618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Defines the abstract factory interface that creates instances 4638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// of a Test object. 4648b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TestFactoryBase { 4658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 4668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern virtual ~TestFactoryBase() {} 4678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Creates a test instance to run. The instance is both created and destroyed 4698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // within TestInfoImpl::Run() 4708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern virtual Test* CreateTest() = 0; 4718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern protected: 4738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TestFactoryBase() {} 4748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private: 4768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); 4778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 4788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This class provides implementation of TeastFactoryBase interface. 4808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// It is used in TEST and TEST_F macros. 4818b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <class TestClass> 4828b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TestFactoryImpl : public TestFactoryBase { 4838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 4848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern virtual Test* CreateTest() { return new TestClass; } 4858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 4868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if GTEST_OS_WINDOWS 4888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Predicate-formatters for implementing the HRESULT checking macros 4908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} 4918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// We pass a long instead of HRESULT to avoid causing an 4928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// include dependency for the HRESULT type. 4938b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, 4948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern long hr); // NOLINT 4958b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, 4968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern long hr); // NOLINT 4978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 4988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif // GTEST_OS_WINDOWS 4998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Types of SetUpTestCase() and TearDownTestCase() functions. 5018b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntypedef void (*SetUpTestCaseFunc)(); 5028b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntypedef void (*TearDownTestCaseFunc)(); 5038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5048b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct CodeLocation { 5058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern CodeLocation(const string& a_file, int a_line) : file(a_file), line(a_line) {} 5068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern string file; 5088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern int line; 5098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 5108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Creates a new TestInfo object and registers it with Google Test; 5128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// returns the created object. 5138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 5148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Arguments: 5158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 5168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// test_case_name: name of the test case 5178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// name: name of the test 5188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// type_param the name of the test's type parameter, or NULL if 5198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// this is not a typed or a type-parameterized test. 5208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// value_param text representation of the test's value parameter, 5218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// or NULL if this is not a type-parameterized test. 5228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// code_location: code location where the test is defined 5238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// fixture_class_id: ID of the test fixture class 5248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// set_up_tc: pointer to the function that sets up the test case 5258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// tear_down_tc: pointer to the function that tears down the test case 5268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// factory: pointer to the factory that creates a test object. 5278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The newly created TestInfo instance will assume 5288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// ownership of the factory object. 5298b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ TestInfo* MakeAndRegisterTestInfo( 5308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* test_case_name, 5318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* name, 5328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* type_param, 5338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* value_param, 5348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern CodeLocation code_location, 5358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TypeId fixture_class_id, 5368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern SetUpTestCaseFunc set_up_tc, 5378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TearDownTestCaseFunc tear_down_tc, 5388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TestFactoryBase* factory); 5398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// If *pstr starts with the given prefix, modifies *pstr to be right 5418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// past the prefix and returns true; otherwise leaves *pstr unchanged 5428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// and returns false. None of pstr, *pstr, and prefix can be NULL. 5438b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); 5448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 5468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// State of the definition of a type-parameterized test case. 5488b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_API_ TypedTestCasePState { 5498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 5508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TypedTestCasePState() : registered_(false) {} 5518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Adds the given test name to defined_test_names_ and return true 5538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // if the test case hasn't been registered; otherwise aborts the 5548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // program. 5558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool AddTestName(const char* file, int line, const char* case_name, 5568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* test_name) { 5578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (registered_) { 5588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fprintf(stderr, "%s Test %s must be defined before " 5598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n", 5608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern FormatFileLocation(file, line).c_str(), test_name, case_name); 5618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fflush(stderr); 5628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern posix::Abort(); 5638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 5648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern registered_tests_.insert( 5658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::std::make_pair(test_name, CodeLocation(file, line))); 5668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return true; 5678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 5688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool TestExists(const std::string& test_name) const { 5708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return registered_tests_.count(test_name) > 0; 5718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 5728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const CodeLocation& GetCodeLocation(const std::string& test_name) const { 5748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name); 5758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_CHECK_(it != registered_tests_.end()); 5768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return it->second; 5778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 5788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Verifies that registered_tests match the test names in 5808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // defined_test_names_; returns registered_tests if successful, or 5818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // aborts the program otherwise. 5828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* VerifyRegisteredTestNames( 5838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* file, int line, const char* registered_tests); 5848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private: 5868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef ::std::map<std::string, CodeLocation> RegisteredTestsMap; 5878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool registered_; 5898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern RegisteredTestsMap registered_tests_; 5908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 5918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 5928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Skips to the first non-space char after the first comma in 'str'; 5938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// returns NULL if no comma is found in 'str'. 5948b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline const char* SkipComma(const char* str) { 5958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* comma = strchr(str, ','); 5968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (comma == NULL) { 5978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return NULL; 5988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 5998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern while (IsSpace(*(++comma))) {} 6008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return comma; 6018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 6028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Returns the prefix of 'str' before the first comma in it; returns 6048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the entire string if it contains no comma. 6058b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline std::string GetPrefixUntilComma(const char* str) { 6068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* comma = strchr(str, ','); 6078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return comma == NULL ? str : std::string(str, comma); 6088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 6098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Splits a given string on a given delimiter, populating a given 6118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// vector with the fields. 6128b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid SplitString(const ::std::string& str, char delimiter, 6138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::std::vector< ::std::string>* dest); 6148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// TypeParameterizedTest<Fixture, TestSel, Types>::Register() 6168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// registers a list of type-parameterized tests with Google Test. The 6178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// return value is insignificant - we just need to return something 6188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// such that we can call this function in a namespace scope. 6198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 6208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Implementation note: The GTEST_TEMPLATE_ macro declares a template 6218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// template parameter. It's defined in gtest-type-util.h. 6228b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types> 6238b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TypeParameterizedTest { 6248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 6258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 'index' is the index of the test in the type list 'Types' 6268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase, 6278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Types). Valid values for 'index' are [0, N - 1] where N is the 6288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // length of Types. 6298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static bool Register(const char* prefix, 6308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern CodeLocation code_location, 6318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* case_name, const char* test_names, 6328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern int index) { 6338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef typename Types::Head Type; 6348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef Fixture<Type> FixtureClass; 6358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef typename GTEST_BIND_(TestSel, Type) TestClass; 6368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // First, registers the first type-parameterized test in the type 6388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // list. 6398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern MakeAndRegisterTestInfo( 6408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/" 6418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern + StreamableToString(index)).c_str(), 6428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(), 6438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GetTypeName<Type>().c_str(), 6448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern NULL, // No value parameter. 6458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern code_location, 6468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GetTypeId<FixtureClass>(), 6478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TestClass::SetUpTestCase, 6488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TestClass::TearDownTestCase, 6498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern new TestFactoryImpl<TestClass>); 6508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Next, recurses (at compile time) with the tail of the type list. 6528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail> 6538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::Register(prefix, code_location, case_name, test_names, index + 1); 6548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 6558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 6568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The base case for the compile time recursion. 6588b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <GTEST_TEMPLATE_ Fixture, class TestSel> 6598b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TypeParameterizedTest<Fixture, TestSel, Types0> { 6608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 6618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static bool Register(const char* /*prefix*/, CodeLocation, 6628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* /*case_name*/, const char* /*test_names*/, 6638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern int /*index*/) { 6648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return true; 6658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 6668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 6678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// TypeParameterizedTestCase<Fixture, Tests, Types>::Register() 6698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// registers *all combinations* of 'Tests' and 'Types' with Google 6708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Test. The return value is insignificant - we just need to return 6718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// something such that we can call this function in a namespace scope. 6728b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types> 6738b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TypeParameterizedTestCase { 6748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 6758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static bool Register(const char* prefix, CodeLocation code_location, 6768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const TypedTestCasePState* state, 6778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* case_name, const char* test_names) { 6788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern std::string test_name = StripTrailingSpaces( 6798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GetPrefixUntilComma(test_names)); 6808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (!state->TestExists(test_name)) { 6818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fprintf(stderr, "Failed to get code location for test %s.%s at %s.", 6828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern case_name, test_name.c_str(), 6838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern FormatFileLocation(code_location.file.c_str(), 6848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern code_location.line).c_str()); 6858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fflush(stderr); 6868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern posix::Abort(); 6878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 6888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const CodeLocation& test_location = state->GetCodeLocation(test_name); 6898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef typename Tests::Head Head; 6918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // First, register the first test in 'Test' for each type in 'Types'. 6938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern TypeParameterizedTest<Fixture, Head, Types>::Register( 6948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern prefix, test_location, case_name, test_names, 0); 6958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 6968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Next, recurses (at compile time) with the tail of the test list. 6978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types> 6988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::Register(prefix, code_location, state, 6998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern case_name, SkipComma(test_names)); 7008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 7018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 7028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The base case for the compile time recursion. 7048b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <GTEST_TEMPLATE_ Fixture, typename Types> 7058b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TypeParameterizedTestCase<Fixture, Templates0, Types> { 7068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 7078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static bool Register(const char* /*prefix*/, CodeLocation, 7088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const TypedTestCasePState* /*state*/, 7098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* /*case_name*/, const char* /*test_names*/) { 7108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return true; 7118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 7128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 7138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 7158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Returns the current OS stack trace as an std::string. 7178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 7188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The maximum number of stack frames to be included is specified by 7198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the gtest_stack_trace_depth flag. The skip_count parameter 7208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// specifies the number of top frames to be skipped, which doesn't 7218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// count against the number of frames to be included. 7228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 7238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// For example, if Foo() calls Bar(), which in turn calls 7248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in 7258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. 7268b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ std::string GetCurrentOsStackTraceExceptTop( 7278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern UnitTest* unit_test, int skip_count); 7288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Helpers for suppressing warnings on unreachable code or constant 7308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// condition. 7318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Always returns true. 7338b92989c89bec8632aa47dc58dc162f199d62edcJames ZernGTEST_API_ bool AlwaysTrue(); 7348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Always returns false. 7368b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline bool AlwaysFalse() { return !AlwaysTrue(); } 7378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Helper for suppressing false warning from Clang on a const char* 7398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// variable declared in a conditional expression always being NULL in 7408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the else branch. 7418b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct GTEST_API_ ConstCharPtr { 7428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ConstCharPtr(const char* str) : value(str) {} 7438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern operator bool() const { return true; } 7448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const char* value; 7458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 7468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A simple Linear Congruential Generator for generating random 7488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// numbers with a uniform distribution. Unlike rand() and srand(), it 7498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// doesn't use global state (and therefore can't interfere with user 7508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// code). Unlike rand_r(), it's portable. An LCG isn't very random, 7518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// but it's good enough for our purposes. 7528b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_API_ Random { 7538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 7548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const UInt32 kMaxRange = 1u << 31; 7558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern explicit Random(UInt32 seed) : state_(seed) {} 7578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern void Reseed(UInt32 seed) { state_ = seed; } 7598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Generates a random number from [0, range). Crashes if 'range' is 7618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 0 or greater than kMaxRange. 7628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern UInt32 Generate(UInt32 range); 7638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private: 7658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern UInt32 state_; 7668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); 7678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 7688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a 7708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// compiler error iff T1 and T2 are different types. 7718b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T1, typename T2> 7728b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct CompileAssertTypesEqual; 7738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7748b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 7758b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct CompileAssertTypesEqual<T, T> { 7768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 7778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Removes the reference from a type if it is a reference type, 7798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// otherwise leaves it unchanged. This is the same as 7808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// tr1::remove_reference, which is not widely available yet. 7818b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 7828b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RemoveReference { typedef T type; }; // NOLINT 7838b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 7848b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RemoveReference<T&> { typedef T type; }; // NOLINT 7858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A handy wrapper around RemoveReference that works when the argument 7878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// T depends on template parameters. 7888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_REMOVE_REFERENCE_(T) \ 7898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typename ::testing::internal::RemoveReference<T>::type 7908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Removes const from a type if it is a const type, otherwise leaves 7928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// it unchanged. This is the same as tr1::remove_const, which is not 7938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// widely available yet. 7948b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 7958b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RemoveConst { typedef T type; }; // NOLINT 7968b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 7978b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RemoveConst<const T> { typedef T type; }; // NOLINT 7988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 7998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above 8008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// definition to fail to remove the const in 'const int[3]' and 'const 8018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// char[3][4]'. The following specialization works around the bug. 8028b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, size_t N> 8038b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RemoveConst<const T[N]> { 8048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef typename RemoveConst<T>::type type[N]; 8058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 8068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if defined(_MSC_VER) && _MSC_VER < 1400 8088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This is the only specialization that allows VC++ 7.1 to remove const in 8098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC 8108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// and thus needs to be conditionally compiled. 8118b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, size_t N> 8128b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RemoveConst<T[N]> { 8138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef typename RemoveConst<T>::type type[N]; 8148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 8158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif 8168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A handy wrapper around RemoveConst that works when the argument 8188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// T depends on template parameters. 8198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_REMOVE_CONST_(T) \ 8208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typename ::testing::internal::RemoveConst<T>::type 8218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Turns const U&, U&, const U, and U all into U. 8238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ 8248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) 8258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Adds reference to a type if it is not a reference type, 8278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// otherwise leaves it unchanged. This is the same as 8288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// tr1::add_reference, which is not widely available yet. 8298b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 8308b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct AddReference { typedef T& type; }; // NOLINT 8318b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 8328b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct AddReference<T&> { typedef T& type; }; // NOLINT 8338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A handy wrapper around AddReference that works when the argument T 8358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// depends on template parameters. 8368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_ADD_REFERENCE_(T) \ 8378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typename ::testing::internal::AddReference<T>::type 8388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Adds a reference to const on top of T as necessary. For example, 8408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// it transforms 8418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 8428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// char ==> const char& 8438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// const char ==> const char& 8448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// char& ==> const char& 8458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// const char& ==> const char& 8468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 8478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The argument T must depend on some template parameters. 8488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_REFERENCE_TO_CONST_(T) \ 8498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T)) 8508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// ImplicitlyConvertible<From, To>::value is a compile-time bool 8528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// constant that's true iff type From can be implicitly converted to 8538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// type To. 8548b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename From, typename To> 8558b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass ImplicitlyConvertible { 8568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private: 8578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // We need the following helper functions only for their types. 8588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // They have no implementations. 8598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // MakeFrom() is an expression whose type is From. We cannot simply 8618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // use From(), as the type From may not have a public default 8628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // constructor. 8638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static typename AddReference<From>::type MakeFrom(); 8648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // These two functions are overloaded. Given an expression 8668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Helper(x), the compiler will pick the first version if x can be 8678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // implicitly converted to type To; otherwise it will pick the 8688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // second version. 8698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // 8708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // The first version returns a value of size 1, and the second 8718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // version returns a value of size 2. Therefore, by checking the 8728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // size of Helper(x), which can be done at compile time, we can tell 8738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // which version of Helper() is used, and hence whether x can be 8748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // implicitly converted to type To. 8758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static char Helper(To); 8768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static char (&Helper(...))[2]; // NOLINT 8778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // We have to put the 'public' section after the 'private' section, 8798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // or MSVC refuses to compile the code. 8808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 8818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#if defined(__BORLANDC__) 8828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // C++Builder cannot use member overload resolution during template 8838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // instantiation. The simplest workaround is to use its C++0x type traits 8848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // functions (C++Builder 2009 and above only). 8858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const bool value = __is_convertible(From, To); 8868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#else 8878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // MSVC warns about implicitly converting from double to int for 8888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // possible loss of data, so we need to temporarily disable the 8898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // warning. 8908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244) 8918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static const bool value = 8928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; 8938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_DISABLE_MSC_WARNINGS_POP_() 8948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif // __BORLANDC__ 8958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 8968b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename From, typename To> 8978b92989c89bec8632aa47dc58dc162f199d62edcJames Zernconst bool ImplicitlyConvertible<From, To>::value; 8988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 8998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// IsAProtocolMessage<T>::value is a compile-time bool constant that's 9008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// true iff T is type ProtocolMessage, proto2::Message, or a subclass 9018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// of those. 9028b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T> 9038b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct IsAProtocolMessage 9048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern : public bool_constant< 9058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value || 9068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> { 9078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 9088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// When the compiler sees expression IsContainerTest<C>(0), if C is an 9108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// STL-style container class, the first overload of IsContainerTest 9118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// will be viable (since both C::iterator* and C::const_iterator* are 9128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// valid types and NULL can be implicitly converted to them). It will 9138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// be picked over the second overload as 'int' is a perfect match for 9148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the type of argument 0. If C::iterator or C::const_iterator is not 9158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// a valid type, the first overload is not viable, and the second 9168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// overload will be picked. Therefore, we can determine whether C is 9178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// a container class by checking the type of IsContainerTest<C>(0). 9188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The value of the expression is insignificant. 9198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 9208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Note that we look for both C::iterator and C::const_iterator. The 9218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// reason is that C++ injects the name of a class as a member of the 9228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// class itself (e.g. you can refer to class iterator as either 9238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 'iterator' or 'iterator::iterator'). If we look for C::iterator 9248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// only, for example, we would mistakenly think that a class named 9258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// iterator is an STL container. 9268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 9278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Also note that the simpler approach of overloading 9288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// IsContainerTest(typename C::const_iterator*) and 9298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. 9308b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntypedef int IsContainer; 9318b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <class C> 9328b92989c89bec8632aa47dc58dc162f199d62edcJames ZernIsContainer IsContainerTest(int /* dummy */, 9338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typename C::iterator* /* it */ = NULL, 9348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typename C::const_iterator* /* const_it */ = NULL) { 9358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return 0; 9368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 9378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9388b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntypedef char IsNotContainer; 9398b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <class C> 9408b92989c89bec8632aa47dc58dc162f199d62edcJames ZernIsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } 9418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// EnableIf<condition>::type is void when 'Cond' is true, and 9438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// undefined when 'Cond' is false. To use SFINAE to make a function 9448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// overload only apply when a particular expression is true, add 9458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// "typename EnableIf<expression>::type* = 0" as the last parameter. 9468b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate<bool> struct EnableIf; 9478b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate<> struct EnableIf<true> { typedef void type; }; // NOLINT 9488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Utilities for native arrays. 9508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// ArrayEq() compares two k-dimensional native arrays using the 9528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// elements' operator==, where k can be any integer >= 0. When k is 9538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// 0, ArrayEq() degenerates into comparing a single pair of values. 9548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9558b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U> 9568b92989c89bec8632aa47dc58dc162f199d62edcJames Zernbool ArrayEq(const T* lhs, size_t size, const U* rhs); 9578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This generic version is used when k is 0. 9598b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U> 9608b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } 9618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This overload is used when k >= 1. 9638b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U, size_t N> 9648b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { 9658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return internal::ArrayEq(lhs, N, rhs); 9668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 9678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This helper reduces code bloat. If we instead put its logic inside 9698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the previous ArrayEq() function, arrays with different sizes would 9708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// lead to different copies of the template code. 9718b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U> 9728b92989c89bec8632aa47dc58dc162f199d62edcJames Zernbool ArrayEq(const T* lhs, size_t size, const U* rhs) { 9738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern for (size_t i = 0; i != size; i++) { 9748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (!internal::ArrayEq(lhs[i], rhs[i])) 9758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return false; 9768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 9778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return true; 9788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 9798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Finds the first element in the iterator range [begin, end) that 9818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// equals elem. Element may be a native array type itself. 9828b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename Iter, typename Element> 9838b92989c89bec8632aa47dc58dc162f199d62edcJames ZernIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { 9848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern for (Iter it = begin; it != end; ++it) { 9858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (internal::ArrayEq(*it, elem)) 9868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return it; 9878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 9888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return end; 9898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 9908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// CopyArray() copies a k-dimensional native array using the elements' 9928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// operator=, where k can be any integer >= 0. When k is 0, 9938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// CopyArray() degenerates into copying a single value. 9948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9958b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U> 9968b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid CopyArray(const T* from, size_t size, U* to); 9978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 9988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This generic version is used when k is 0. 9998b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U> 10008b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline void CopyArray(const T& from, U* to) { *to = from; } 10018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This overload is used when k >= 1. 10038b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U, size_t N> 10048b92989c89bec8632aa47dc58dc162f199d62edcJames Zerninline void CopyArray(const T(&from)[N], U(*to)[N]) { 10058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern internal::CopyArray(from, N, *to); 10068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 10078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This helper reduces code bloat. If we instead put its logic inside 10098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// the previous CopyArray() function, arrays with different sizes 10108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// would lead to different copies of the template code. 10118b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename T, typename U> 10128b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid CopyArray(const T* from, size_t size, U* to) { 10138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern for (size_t i = 0; i != size; i++) { 10148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern internal::CopyArray(from[i], to + i); 10158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} 10178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The relation between an NativeArray object (see below) and the 10198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// native array it represents. 10208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// We use 2 different structs to allow non-copyable types to be used, as long 10218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// as RelationToSourceReference() is passed. 10228b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RelationToSourceReference {}; 10238b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstruct RelationToSourceCopy {}; 10248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Adapts a native array to a read-only STL-style container. Instead 10268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// of the complete STL container concept, this adaptor only implements 10278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// members useful for Google Mock's container matchers. New members 10288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// should be added as needed. To simplify the implementation, we only 10298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// support Element being a raw type (i.e. having no top-level const or 10308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// reference modifier). It's the client's responsibility to satisfy 10318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// this requirement. Element can be an array type itself (hence 10328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// multi-dimensional arrays are supported). 10338b92989c89bec8632aa47dc58dc162f199d62edcJames Zerntemplate <typename Element> 10348b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass NativeArray { 10358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public: 10368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // STL-style container typedefs. 10378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef Element value_type; 10388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef Element* iterator; 10398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern typedef const Element* const_iterator; 10408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Constructs from a native array. References the source. 10428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern NativeArray(const Element* array, size_t count, RelationToSourceReference) { 10438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern InitRef(array, count); 10448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Constructs from a native array. Copies the source. 10478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern NativeArray(const Element* array, size_t count, RelationToSourceCopy) { 10488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern InitCopy(array, count); 10498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Copy constructor. 10528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern NativeArray(const NativeArray& rhs) { 10538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern (this->*rhs.clone_)(rhs.array_, rhs.size_); 10548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ~NativeArray() { 10578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (clone_ != &NativeArray::InitRef) 10588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern delete[] array_; 10598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // STL-style container methods. 10628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern size_t size() const { return size_; } 10638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const_iterator begin() const { return array_; } 10648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const_iterator end() const { return array_ + size_; } 10658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool operator==(const NativeArray& rhs) const { 10668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return size() == rhs.size() && 10678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ArrayEq(begin(), size(), rhs.begin()); 10688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private: 10718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern enum { 10728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern kCheckTypeIsNotConstOrAReference = StaticAssertTypeEqHelper< 10738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value, 10748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern }; 10758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Initializes this object with a copy of the input. 10778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern void InitCopy(const Element* array, size_t a_size) { 10788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern Element* const copy = new Element[a_size]; 10798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern CopyArray(array, a_size, copy); 10808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern array_ = copy; 10818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern size_ = a_size; 10828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern clone_ = &NativeArray::InitCopy; 10838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern // Initializes this object with a reference of the input. 10868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern void InitRef(const Element* array, size_t a_size) { 10878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern array_ = array; 10888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern size_ = a_size; 10898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern clone_ = &NativeArray::InitRef; 10908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } 10918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern const Element* array_; 10938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern size_t size_; 10948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern void (NativeArray::*clone_)(const Element*, size_t); 10958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_DISALLOW_ASSIGN_(NativeArray); 10978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}; 10988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 10998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} // namespace internal 11008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern} // namespace testing 11018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_MESSAGE_AT_(file, line, message, result_type) \ 11038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::testing::internal::AssertHelper(result_type, file, line, message) \ 11048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern = ::testing::Message() 11058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_MESSAGE_(message, result_type) \ 11078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) 11088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_FATAL_FAILURE_(message) \ 11108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) 11118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_NONFATAL_FAILURE_(message) \ 11138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) 11148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_SUCCESS_(message) \ 11168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) 11178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Suppresses MSVC warnings 4072 (unreachable code) for the code following 11198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// statement if it returns or throws (or doesn't return or throw in some 11208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// situations). 11218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ 11228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (::testing::internal::AlwaysTrue()) { statement; } 11238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ 11258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 11268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (::testing::internal::ConstCharPtr gtest_msg = "") { \ 11278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool gtest_caught_expected = false; \ 11288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern try { \ 11298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 11308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern catch (expected_exception const&) { \ 11328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern gtest_caught_expected = true; \ 11338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern catch (...) { \ 11358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern gtest_msg.value = \ 11368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern "Expected: " #statement " throws an exception of type " \ 11378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern #expected_exception ".\n Actual: it throws a different type."; \ 11388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 11398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (!gtest_caught_expected) { \ 11418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern gtest_msg.value = \ 11428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern "Expected: " #statement " throws an exception of type " \ 11438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern #expected_exception ".\n Actual: it throws nothing."; \ 11448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 11458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } else \ 11478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ 11488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fail(gtest_msg.value) 11498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_TEST_NO_THROW_(statement, fail) \ 11518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 11528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (::testing::internal::AlwaysTrue()) { \ 11538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern try { \ 11548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 11558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern catch (...) { \ 11578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ 11588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } else \ 11608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ 11618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fail("Expected: " #statement " doesn't throw an exception.\n" \ 11628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern " Actual: it throws.") 11638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_TEST_ANY_THROW_(statement, fail) \ 11658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 11668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (::testing::internal::AlwaysTrue()) { \ 11678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern bool gtest_caught_any = false; \ 11688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern try { \ 11698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 11708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern catch (...) { \ 11728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern gtest_caught_any = true; \ 11738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (!gtest_caught_any) { \ 11758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ 11768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 11778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } else \ 11788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ 11798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fail("Expected: " #statement " throws an exception.\n" \ 11808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern " Actual: it doesn't.") 11818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Implements Boolean test assertions such as EXPECT_TRUE. expression can be 11848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// either a boolean expression or an AssertionResult. text is a textual 11858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// represenation of expression as it was passed into the EXPECT_TRUE. 11868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ 11878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 11888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (const ::testing::AssertionResult gtest_ar_ = \ 11898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::testing::AssertionResult(expression)) \ 11908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ; \ 11918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern else \ 11928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fail(::testing::internal::GetBoolAssertionFailureMessage(\ 11938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern gtest_ar_, text, #actual, #expected).c_str()) 11948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 11958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ 11968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 11978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (::testing::internal::AlwaysTrue()) { \ 11988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ 11998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 12008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ 12018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ 12028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } \ 12038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern } else \ 12048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ 12058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern fail("Expected: " #statement " doesn't generate new fatal " \ 12068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern "failures in the current thread.\n" \ 12078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern " Actual: it does.") 12088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 12098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Expands to the name of the class that implements the given test. 12108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ 12118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern test_case_name##_##test_name##_Test 12128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 12138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Helper macro for defining tests. 12148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ 12158b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ 12168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public:\ 12178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ 12188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private:\ 12198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern virtual void TestBody();\ 12208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ 12218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_DISALLOW_COPY_AND_ASSIGN_(\ 12228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ 12238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern};\ 12248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern\ 12258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ 12268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::test_info_ =\ 12278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::testing::internal::MakeAndRegisterTestInfo(\ 12288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern #test_case_name, #test_name, NULL, NULL, \ 12298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern ::testing::internal::CodeLocation(__FILE__, __LINE__), \ 12308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern (parent_id), \ 12318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern parent_class::SetUpTestCase, \ 12328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern parent_class::TearDownTestCase, \ 12338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern new ::testing::internal::TestFactoryImpl<\ 12348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ 12358b92989c89bec8632aa47dc58dc162f199d62edcJames Zernvoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() 12368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 12378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 12388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern 1239