14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2005, Google Inc. 24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// All rights reserved. 34b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Redistribution and use in source and binary forms, with or without 54b6829f0d28990dd645e16386eb226d0f10c8731shiqian// modification, are permitted provided that the following conditions are 64b6829f0d28990dd645e16386eb226d0f10c8731shiqian// met: 74b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 84b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions of source code must retain the above copyright 94b6829f0d28990dd645e16386eb226d0f10c8731shiqian// notice, this list of conditions and the following disclaimer. 104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions in binary form must reproduce the above 114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// copyright notice, this list of conditions and the following disclaimer 124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the documentation and/or other materials provided with the 134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// distribution. 144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Neither the name of Google Inc. nor the names of its 154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// contributors may be used to endorse or promote products derived from 164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this software without specific prior written permission. 174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) 314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The Google C++ Testing Framework (Google Test) 334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This header file declares functions and macros used internally by 354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test. They are subject to change without notice. 364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 374b6829f0d28990dd645e16386eb226d0f10c8731shiqian#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 384b6829f0d28990dd645e16386eb226d0f10c8731shiqian#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 402620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/internal/gtest-port.h" 414b6829f0d28990dd645e16386eb226d0f10c8731shiqian 424cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_LINUX 43733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <stdlib.h> 44733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/types.h> 45733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/wait.h> 46733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <unistd.h> 474b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_OS_LINUX 484b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan#if GTEST_HAS_EXCEPTIONS 50c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan# include <stdexcept> 51c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan#endif 52c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan 53e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#include <ctype.h> 54be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan#include <float.h> 55e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#include <string.h> 56e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#include <iomanip> 57e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#include <limits> 58e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#include <set> 59d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com#include <string> 60d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com#include <vector> 614b6829f0d28990dd645e16386eb226d0f10c8731shiqian 622733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan#include "gtest/gtest-message.h" 632620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/internal/gtest-string.h" 642620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/internal/gtest-filepath.h" 652620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/internal/gtest-type-util.h" 664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Due to C++ preprocessor weirdness, we need double indirection to 684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// concatenate two tokens when one of them is __LINE__. Writing 694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// foo ## __LINE__ 714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// will result in the token foo__LINE__, instead of foo followed by 734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the current line number. For more details, see 744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 75e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) 76e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar 774b6829f0d28990dd645e16386eb226d0f10c8731shiqian 78678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanclass ProtocolMessage; 79678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wannamespace proto2 { class Message; } 80678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 814b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing { 824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan// Forward declarations. 844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 851cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanclass AssertionResult; // Result of an assertion. 864b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass Message; // Represents a failure message. 874834581321d60c17997d65a2360c7674f15f9bbcshiqianclass Test; // Represents a test. 884b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass TestInfo; // Information about a test. 891cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanclass TestPartResult; // Result of a test part. 904b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass UnitTest; // A collection of test cases. 914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9239dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wantemplate <typename T> 9339dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan::std::string PrintToString(const T& value); 9439dc95e495fd9f888bcd460c383a2594bf57429dzhanyong.wan 954b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 964b6829f0d28990dd645e16386eb226d0f10c8731shiqian 974b6829f0d28990dd645e16386eb226d0f10c8731shiqianstruct TraceInfo; // Information about a trace point. 984b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass ScopedTrace; // Implements scoped trace. 994b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass TestInfoImpl; // Opaque implementation of TestInfo 1004b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass UnitTestImpl; // Opaque implementation of UnitTest 1014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 102f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// How many times InitGoogleTest() has been called. 10386554039f1bc9e84c9e4e22a5af5d2b396fef5a0vladlosevGTEST_API_ extern int g_init_gtest_count; 104f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 105e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// The text used in failure messages to indicate the start of the 106e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// stack trace. 1071ce454985edf37b17f2f266d499c2b7dec339002zhanyong.wanGTEST_API_ extern const char kStackTraceMarker[]; 108e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 1094b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Two overloaded helpers for checking at compile time whether an 1104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// expression is a null pointer literal (i.e. NULL or any 0-valued 1114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// compile-time integral constant). Their return values have 1124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// different sizes, so we can use sizeof() to test which version is 1134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// picked by the compiler. These helpers have no implementations, as 1144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// we only need their signatures. 1154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 1164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Given IsNullLiteralHelper(x), the compiler will pick the first 1174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// version if x can be implicitly converted to Secret*, and pick the 1184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// second version otherwise. Since Secret is a secret and incomplete 1194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// type, the only expression a user can write that has type Secret* is 1204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// a null pointer literal. Therefore, we know that x is a null 1214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// pointer literal if and only if the first version is picked by the 1224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// compiler. 1234b6829f0d28990dd645e16386eb226d0f10c8731shiqianchar IsNullLiteralHelper(Secret* p); 1244b6829f0d28990dd645e16386eb226d0f10c8731shiqianchar (&IsNullLiteralHelper(...))[2]; // NOLINT 1254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A compile-time bool constant that is true if and only if x is a 1274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// null pointer literal (i.e. NULL or any 0-valued compile-time 1284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// integral constant). 1293eddf52d9cae4e9fd28eda46dcfe38bdeb09d1c0zhanyong.wan#ifdef GTEST_ELLIPSIS_NEEDS_POD_ 1303eddf52d9cae4e9fd28eda46dcfe38bdeb09d1c0zhanyong.wan// We lose support for NULL detection where the compiler doesn't like 1313eddf52d9cae4e9fd28eda46dcfe38bdeb09d1c0zhanyong.wan// passing non-POD classes through ellipsis (...). 132733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_IS_NULL_LITERAL_(x) false 133941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian#else 134733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_IS_NULL_LITERAL_(x) \ 1354b6829f0d28990dd645e16386eb226d0f10c8731shiqian (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) 1363eddf52d9cae4e9fd28eda46dcfe38bdeb09d1c0zhanyong.wan#endif // GTEST_ELLIPSIS_NEEDS_POD_ 1374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Appends the user-supplied message to the Google-Test-generated message. 13903c314931649a999b0cf5deb0a434a1009157416jgm@google.comGTEST_API_ std::string AppendUserMessage( 14003c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& gtest_msg, const Message& user_msg); 1414b6829f0d28990dd645e16386eb226d0f10c8731shiqian 142c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan#if GTEST_HAS_EXCEPTIONS 143c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan 144c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan// This exception is thrown by (and only by) a failed Google Test 145c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions 146c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan// are enabled). We derive it from std::runtime_error, which is for 147c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan// errors presumably detectable only at run time. Since 148c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan// std::runtime_error inherits from std::exception, many testing 149c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan// frameworks know how to extract and print the message inside it. 150c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wanclass GTEST_API_ GoogleTestFailureException : public ::std::runtime_error { 151c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan public: 152c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan explicit GoogleTestFailureException(const TestPartResult& failure); 153c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan}; 154c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan 155c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan#endif // GTEST_HAS_EXCEPTIONS 156c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan 1574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A helper class for creating scoped traces in user programs. 158e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanclass GTEST_API_ ScopedTrace { 1594b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 1604b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The c'tor pushes the given source file location and message onto 1614b6829f0d28990dd645e16386eb226d0f10c8731shiqian // a trace stack maintained by Google Test. 1624b6829f0d28990dd645e16386eb226d0f10c8731shiqian ScopedTrace(const char* file, int line, const Message& message); 1634b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The d'tor pops the info pushed by the c'tor. 1654b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Note that the d'tor is not virtual in order to be efficient. 1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Don't inherit from ScopedTrace! 1684b6829f0d28990dd645e16386eb226d0f10c8731shiqian ~ScopedTrace(); 1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1704b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 171e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); 172e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its 173e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian // c'tor and d'tor. Therefore it doesn't 174e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian // need to be used otherwise. 1754b6829f0d28990dd645e16386eb226d0f10c8731shiqian 176d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comnamespace edit_distance { 177d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Returns the optimal edits to go from 'left' to 'right'. 178d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// All edits cost the same, with replace having lower priority than 179d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// add/remove. 180d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Simple implementation of the Wagner–Fischer algorithm. 181d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm 182d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comenum EditType { kMatch, kAdd, kRemove, kReplace }; 183d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comGTEST_API_ std::vector<EditType> CalculateOptimalEdits( 184d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<size_t>& left, const std::vector<size_t>& right); 185d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 186d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Same as above, but the input is represented as strings. 187d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comGTEST_API_ std::vector<EditType> CalculateOptimalEdits( 188d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string>& left, 189d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string>& right); 190d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 191d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Create a diff of the input strings in Unified diff format. 192d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comGTEST_API_ std::string CreateUnifiedDiff(const std::vector<std::string>& left, 193d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string>& right, 194d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t context = 2); 195d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 196d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} // namespace edit_distance 197d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 198d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Calculate the diff between 'left' and 'right' and return it in unified diff 199d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// format. 200d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// If not null, stores in 'total_line_count' the total number of lines found 201d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// in left + right. 202d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comGTEST_API_ std::string DiffStrings(const std::string& left, 203d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::string& right, 204d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t* total_line_count); 205d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 2064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Constructs and returns the message for an equality assertion 2074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. 2084b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2094b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The first four parameters are the expressions used in the assertion 2104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// and their values, as strings. For example, for ASSERT_EQ(foo, bar) 2114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// where foo is 5 and bar is 6, we have: 2124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// expected_expression: "foo" 2144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// actual_expression: "bar" 2154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// expected_value: "5" 2164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// actual_value: "6" 2174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The ignoring_case parameter is true iff the assertion is a 2194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will 2204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// be inserted into the message. 221e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanGTEST_API_ AssertionResult EqFailure(const char* expected_expression, 222e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan const char* actual_expression, 22303c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& expected_value, 22403c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& actual_value, 225e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan bool ignoring_case); 2264b6829f0d28990dd645e16386eb226d0f10c8731shiqian 227fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. 22803c314931649a999b0cf5deb0a434a1009157416jgm@google.comGTEST_API_ std::string GetBoolAssertionFailureMessage( 229e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan const AssertionResult& assertion_result, 230e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan const char* expression_text, 231e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan const char* actual_predicate_value, 232e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan const char* expected_predicate_value); 2334b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This template class represents an IEEE floating-point number 2354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (either single-precision or double-precision, depending on the 2364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// template parameters). 2374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The purpose of this class is to do more sophisticated number 2394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// comparison. (Due to round-off error, etc, it's very unlikely that 2404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// two floating-points will be equal exactly. Hence a naive 2414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// comparison by the == operation often doesn't work.) 2424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Format of IEEE floating-point: 2444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The most-significant bit being the leftmost, an IEEE 2464b6829f0d28990dd645e16386eb226d0f10c8731shiqian// floating-point looks like 2474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// sign_bit exponent_bits fraction_bits 2494b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Here, sign_bit is a single bit that designates the sign of the 2514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// number. 2524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// For float, there are 8 exponent bits and 23 fraction bits. 2544b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// For double, there are 11 exponent bits and 52 fraction bits. 2564b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// More details can be found at 2584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// http://en.wikipedia.org/wiki/IEEE_floating-point_standard. 2594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Template parameter: 2614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// RawType: the raw floating-point type (either float or double) 2634b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename RawType> 2644b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass FloatingPoint { 2654b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 2664b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Defines the unsigned integer type that has the same size as the 2674b6829f0d28990dd645e16386eb226d0f10c8731shiqian // floating point number. 2684b6829f0d28990dd645e16386eb226d0f10c8731shiqian typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits; 2694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2704b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Constants. 2714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2724b6829f0d28990dd645e16386eb226d0f10c8731shiqian // # of bits in a number. 2734b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const size_t kBitCount = 8*sizeof(RawType); 2744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2754b6829f0d28990dd645e16386eb226d0f10c8731shiqian // # of fraction bits in a number. 2764b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const size_t kFractionBitCount = 2774b6829f0d28990dd645e16386eb226d0f10c8731shiqian std::numeric_limits<RawType>::digits - 1; 2784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2794b6829f0d28990dd645e16386eb226d0f10c8731shiqian // # of exponent bits in a number. 2804b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; 2814b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2824b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The mask for the sign bit. 2834b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1); 2844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2854b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The mask for the fraction bits. 2864b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const Bits kFractionBitMask = 2874b6829f0d28990dd645e16386eb226d0f10c8731shiqian ~static_cast<Bits>(0) >> (kExponentBitCount + 1); 2884b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2894b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The mask for the exponent bits. 2904b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); 2914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2924b6829f0d28990dd645e16386eb226d0f10c8731shiqian // How many ULP's (Units in the Last Place) we want to tolerate when 2934b6829f0d28990dd645e16386eb226d0f10c8731shiqian // comparing two numbers. The larger the value, the more error we 2944b6829f0d28990dd645e16386eb226d0f10c8731shiqian // allow. A 0 value means that two numbers must be exactly the same 2954b6829f0d28990dd645e16386eb226d0f10c8731shiqian // to be considered equal. 2964b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 2974b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The maximum error of a single floating-point operation is 0.5 2984b6829f0d28990dd645e16386eb226d0f10c8731shiqian // units in the last place. On Intel CPU's, all floating-point 2994b6829f0d28990dd645e16386eb226d0f10c8731shiqian // calculations are done with 80-bit precision, while double has 64 3004b6829f0d28990dd645e16386eb226d0f10c8731shiqian // bits. Therefore, 4 should be enough for ordinary use. 3014b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3024b6829f0d28990dd645e16386eb226d0f10c8731shiqian // See the following article for more details on ULP: 30306458571cbeaf622eaf4f88bd7980f5a88bafeedzhanyong.wan // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ 3044b6829f0d28990dd645e16386eb226d0f10c8731shiqian static const size_t kMaxUlps = 4; 3054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3064b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Constructs a FloatingPoint from a raw floating-point number. 3074b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3084b6829f0d28990dd645e16386eb226d0f10c8731shiqian // On an Intel CPU, passing a non-normalized NAN (Not a Number) 3094b6829f0d28990dd645e16386eb226d0f10c8731shiqian // around may change its bits, although the new value is guaranteed 3104b6829f0d28990dd645e16386eb226d0f10c8731shiqian // to be also a NAN. Therefore, don't expect this constructor to 3114b6829f0d28990dd645e16386eb226d0f10c8731shiqian // preserve the bits in x when x is a NAN. 31298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan explicit FloatingPoint(const RawType& x) { u_.value_ = x; } 3134b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3144b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Static methods 3154b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3164b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Reinterprets a bit pattern as a floating-point number. 3174b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3184b6829f0d28990dd645e16386eb226d0f10c8731shiqian // This function is needed to test the AlmostEquals() method. 3194b6829f0d28990dd645e16386eb226d0f10c8731shiqian static RawType ReinterpretBits(const Bits bits) { 3204b6829f0d28990dd645e16386eb226d0f10c8731shiqian FloatingPoint fp(0); 32198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan fp.u_.bits_ = bits; 32298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan return fp.u_.value_; 3234b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3244b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3254b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns the floating-point number that represent positive infinity. 3264b6829f0d28990dd645e16386eb226d0f10c8731shiqian static RawType Infinity() { 3274b6829f0d28990dd645e16386eb226d0f10c8731shiqian return ReinterpretBits(kExponentBitMask); 3284b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3294b6829f0d28990dd645e16386eb226d0f10c8731shiqian 330be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan // Returns the maximum representable finite floating-point number. 331be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan static RawType Max(); 332be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan 3334b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Non-static methods 3344b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3354b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns the bits that represents this number. 33698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan const Bits &bits() const { return u_.bits_; } 3374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3384b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns the exponent bits of this number. 33998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } 3404b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3414b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns the fraction bits of this number. 34298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } 3434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3444b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns the sign bit of this number. 34598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan Bits sign_bit() const { return kSignBitMask & u_.bits_; } 3464b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3474b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns true iff this is NAN (not a number). 3484b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool is_nan() const { 3494b6829f0d28990dd645e16386eb226d0f10c8731shiqian // It's a NAN if the exponent bits are all ones and the fraction 3504b6829f0d28990dd645e16386eb226d0f10c8731shiqian // bits are not entirely zeros. 3514b6829f0d28990dd645e16386eb226d0f10c8731shiqian return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); 3524b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3534b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3544b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns true iff this number is at most kMaxUlps ULP's away from 3554b6829f0d28990dd645e16386eb226d0f10c8731shiqian // rhs. In particular, this function: 3564b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3574b6829f0d28990dd645e16386eb226d0f10c8731shiqian // - returns false if either number is (or both are) NAN. 3584b6829f0d28990dd645e16386eb226d0f10c8731shiqian // - treats really large numbers as almost equal to infinity. 3594b6829f0d28990dd645e16386eb226d0f10c8731shiqian // - thinks +0.0 and -0.0 are 0 DLP's apart. 3604b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool AlmostEquals(const FloatingPoint& rhs) const { 3614b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The IEEE standard says that any comparison operation involving 3624b6829f0d28990dd645e16386eb226d0f10c8731shiqian // a NAN must return false. 3634b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (is_nan() || rhs.is_nan()) return false; 3644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 36598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) 36698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan <= kMaxUlps; 3674b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3694b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 37098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan // The data type used to store the actual floating-point number. 37198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan union FloatingPointUnion { 37298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan RawType value_; // The raw floating-point number. 37398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan Bits bits_; // The bits that represent the number. 37498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan }; 37598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan 3764b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Converts an integer from the sign-and-magnitude representation to 3774b6829f0d28990dd645e16386eb226d0f10c8731shiqian // the biased representation. More precisely, let N be 2 to the 3784b6829f0d28990dd645e16386eb226d0f10c8731shiqian // power of (kBitCount - 1), an integer x is represented by the 3794b6829f0d28990dd645e16386eb226d0f10c8731shiqian // unsigned number x + N. 3804b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3814b6829f0d28990dd645e16386eb226d0f10c8731shiqian // For instance, 3824b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3834b6829f0d28990dd645e16386eb226d0f10c8731shiqian // -N + 1 (the most negative number representable using 3844b6829f0d28990dd645e16386eb226d0f10c8731shiqian // sign-and-magnitude) is represented by 1; 3854b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 0 is represented by N; and 3864b6829f0d28990dd645e16386eb226d0f10c8731shiqian // N - 1 (the biggest number representable using 3874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // sign-and-magnitude) is represented by 2N - 1. 3884b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3894b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Read http://en.wikipedia.org/wiki/Signed_number_representations 3904b6829f0d28990dd645e16386eb226d0f10c8731shiqian // for more details on signed number representations. 3914b6829f0d28990dd645e16386eb226d0f10c8731shiqian static Bits SignAndMagnitudeToBiased(const Bits &sam) { 3924b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (kSignBitMask & sam) { 3934b6829f0d28990dd645e16386eb226d0f10c8731shiqian // sam represents a negative number. 3944b6829f0d28990dd645e16386eb226d0f10c8731shiqian return ~sam + 1; 3954b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 3964b6829f0d28990dd645e16386eb226d0f10c8731shiqian // sam represents a positive number. 3974b6829f0d28990dd645e16386eb226d0f10c8731shiqian return kSignBitMask | sam; 3984b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3994b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 4004b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4014b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Given two numbers in the sign-and-magnitude representation, 4024b6829f0d28990dd645e16386eb226d0f10c8731shiqian // returns the distance between them as an unsigned number. 4034b6829f0d28990dd645e16386eb226d0f10c8731shiqian static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, 4044b6829f0d28990dd645e16386eb226d0f10c8731shiqian const Bits &sam2) { 4054b6829f0d28990dd645e16386eb226d0f10c8731shiqian const Bits biased1 = SignAndMagnitudeToBiased(sam1); 4064b6829f0d28990dd645e16386eb226d0f10c8731shiqian const Bits biased2 = SignAndMagnitudeToBiased(sam2); 4074b6829f0d28990dd645e16386eb226d0f10c8731shiqian return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); 4084b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 4094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 41098efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan FloatingPointUnion u_; 4114b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 4124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 413be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan// We cannot use std::numeric_limits<T>::max() as it clashes with the max() 414be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan// macro defined by <windows.h>. 415be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wantemplate <> 416be1b3b66822cc3929f3da700973cef88bf45849azhanyong.waninline float FloatingPoint<float>::Max() { return FLT_MAX; } 417be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wantemplate <> 418be1b3b66822cc3929f3da700973cef88bf45849azhanyong.waninline double FloatingPoint<double>::Max() { return DBL_MAX; } 419be1b3b66822cc3929f3da700973cef88bf45849azhanyong.wan 4204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Typedefs the instances of the FloatingPoint template class that we 4214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// care to use. 4224b6829f0d28990dd645e16386eb226d0f10c8731shiqiantypedef FloatingPoint<float> Float; 4234b6829f0d28990dd645e16386eb226d0f10c8731shiqiantypedef FloatingPoint<double> Double; 4244b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// In order to catch the mistake of putting tests that use different 4264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test fixture classes in the same test case, we need to assign 4274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// unique IDs to fixture classes and compare them. The TypeId type is 4284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// used to hold such IDs. The user should treat TypeId as an opaque 4294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// type: the only operation allowed on TypeId values is to compare 4304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// them for equality using the == operator. 431fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqiantypedef const void* TypeId; 432fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian 433fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqiantemplate <typename T> 434fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianclass TypeIdHelper { 435fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian public: 436fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian // dummy_ must not have a const type. Otherwise an overly eager 437fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian // compiler (e.g. MSVC 7.1 & 8.0) may try to merge 438fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian // TypeIdHelper<T>::dummy_ for different Ts as an "optimization". 439fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian static bool dummy_; 440fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian}; 441fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian 442fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqiantemplate <typename T> 443fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianbool TypeIdHelper<T>::dummy_ = false; 4444b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// GetTypeId<T>() returns the ID of type T. Different values will be 4464b6829f0d28990dd645e16386eb226d0f10c8731shiqian// returned for different types. Calling the function twice with the 4474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// same type argument is guaranteed to return the same ID. 4484b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename T> 449fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianTypeId GetTypeId() { 450fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian // The compiler is required to allocate a different 451fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian // TypeIdHelper<T>::dummy_ variable for each T used to instantiate 452fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian // the template. Therefore, the address of dummy_ is guaranteed to 453fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian // be unique. 454fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian return &(TypeIdHelper<T>::dummy_); 4554b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 457fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// Returns the type ID of ::testing::Test. Always call this instead 458fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// of GetTypeId< ::testing::Test>() to get the type ID of 459fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// ::testing::Test, as the latter may give the wrong result due to a 460fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// suspected linker bug when compiling Google Test as a Mac OS X 461fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// framework. 462e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanGTEST_API_ TypeId GetTestTypeId(); 463fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian 4644834581321d60c17997d65a2360c7674f15f9bbcshiqian// Defines the abstract factory interface that creates instances 4654834581321d60c17997d65a2360c7674f15f9bbcshiqian// of a Test object. 4664834581321d60c17997d65a2360c7674f15f9bbcshiqianclass TestFactoryBase { 4674834581321d60c17997d65a2360c7674f15f9bbcshiqian public: 4684834581321d60c17997d65a2360c7674f15f9bbcshiqian virtual ~TestFactoryBase() {} 4694834581321d60c17997d65a2360c7674f15f9bbcshiqian 4704834581321d60c17997d65a2360c7674f15f9bbcshiqian // Creates a test instance to run. The instance is both created and destroyed 4714834581321d60c17997d65a2360c7674f15f9bbcshiqian // within TestInfoImpl::Run() 4724834581321d60c17997d65a2360c7674f15f9bbcshiqian virtual Test* CreateTest() = 0; 4734834581321d60c17997d65a2360c7674f15f9bbcshiqian 4744834581321d60c17997d65a2360c7674f15f9bbcshiqian protected: 4754834581321d60c17997d65a2360c7674f15f9bbcshiqian TestFactoryBase() {} 4764834581321d60c17997d65a2360c7674f15f9bbcshiqian 4774834581321d60c17997d65a2360c7674f15f9bbcshiqian private: 478e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); 4794834581321d60c17997d65a2360c7674f15f9bbcshiqian}; 4804834581321d60c17997d65a2360c7674f15f9bbcshiqian 4814834581321d60c17997d65a2360c7674f15f9bbcshiqian// This class provides implementation of TeastFactoryBase interface. 4824834581321d60c17997d65a2360c7674f15f9bbcshiqian// It is used in TEST and TEST_F macros. 4834834581321d60c17997d65a2360c7674f15f9bbcshiqiantemplate <class TestClass> 4844834581321d60c17997d65a2360c7674f15f9bbcshiqianclass TestFactoryImpl : public TestFactoryBase { 4854834581321d60c17997d65a2360c7674f15f9bbcshiqian public: 4864834581321d60c17997d65a2360c7674f15f9bbcshiqian virtual Test* CreateTest() { return new TestClass; } 4874834581321d60c17997d65a2360c7674f15f9bbcshiqian}; 4884834581321d60c17997d65a2360c7674f15f9bbcshiqian 4894cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS 4904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Predicate-formatters for implementing the HRESULT checking macros 4924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} 4934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// We pass a long instead of HRESULT to avoid causing an 4944b6829f0d28990dd645e16386eb226d0f10c8731shiqian// include dependency for the HRESULT type. 495e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, 496e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan long hr); // NOLINT 497e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, 498e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wan long hr); // NOLINT 4994b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5004b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_OS_WINDOWS 5014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 502e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Types of SetUpTestCase() and TearDownTestCase() functions. 503e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantypedef void (*SetUpTestCaseFunc)(); 504e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantypedef void (*TearDownTestCaseFunc)(); 505e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 506e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Creates a new TestInfo object and registers it with Google Test; 507e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// returns the created object. 508e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// 509e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Arguments: 510e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// 511e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// test_case_name: name of the test case 512e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// name: name of the test 513a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// type_param the name of the test's type parameter, or NULL if 5143b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com// this is not a typed or a type-parameterized test. 515a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// value_param text representation of the test's value parameter, 516a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// or NULL if this is not a type-parameterized test. 517e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// fixture_class_id: ID of the test fixture class 518e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// set_up_tc: pointer to the function that sets up the test case 519e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// tear_down_tc: pointer to the function that tears down the test case 520e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// factory: pointer to the factory that creates a test object. 521e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// The newly created TestInfo instance will assume 522e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// ownership of the factory object. 523e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanGTEST_API_ TestInfo* MakeAndRegisterTestInfo( 5243b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com const char* test_case_name, 5253b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com const char* name, 526a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* type_param, 527a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* value_param, 528e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TypeId fixture_class_id, 529e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian SetUpTestCaseFunc set_up_tc, 530e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TearDownTestCaseFunc tear_down_tc, 531e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TestFactoryBase* factory); 532e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 5334e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan// If *pstr starts with the given prefix, modifies *pstr to be right 5344e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan// past the prefix and returns true; otherwise leaves *pstr unchanged 5354e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan// and returns false. None of pstr, *pstr, and prefix can be NULL. 5369748de060f19f81fd9dd7ccabf2be4bb624237b5zhanyong.wanGTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); 5374e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan 5384cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 539e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 540e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// State of the definition of a type-parameterized test case. 541e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanclass GTEST_API_ TypedTestCasePState { 542e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian public: 543e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TypedTestCasePState() : registered_(false) {} 544e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 545e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // Adds the given test name to defined_test_names_ and return true 546e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // if the test case hasn't been registered; otherwise aborts the 547e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // program. 548e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian bool AddTestName(const char* file, int line, const char* case_name, 549e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* test_name) { 550e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian if (registered_) { 551e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian fprintf(stderr, "%s Test %s must be defined before " 552e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n", 553e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian FormatFileLocation(file, line).c_str(), test_name, case_name); 554dd617c1bc8e67a915068e8462881fbc5e2f6ae30zhanyong.wan fflush(stderr); 555c427f5e8ab231012d7663a0ee408f1225bac971azhanyong.wan posix::Abort(); 556e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 557e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian defined_test_names_.insert(test_name); 558e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return true; 559e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 560e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 561e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // Verifies that registered_tests match the test names in 562e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // defined_test_names_; returns registered_tests if successful, or 563e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // aborts the program otherwise. 564e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* VerifyRegisteredTestNames( 565e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* file, int line, const char* registered_tests); 566e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 567e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian private: 568e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian bool registered_; 569e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian ::std::set<const char*> defined_test_names_; 570e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}; 571e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 572e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Skips to the first non-space char after the first comma in 'str'; 573e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// returns NULL if no comma is found in 'str'. 574e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianinline const char* SkipComma(const char* str) { 575e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* comma = strchr(str, ','); 576e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian if (comma == NULL) { 577e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return NULL; 578e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 5795d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan while (IsSpace(*(++comma))) {} 580e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return comma; 581e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian} 582e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 583e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Returns the prefix of 'str' before the first comma in it; returns 584e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// the entire string if it contains no comma. 58503c314931649a999b0cf5deb0a434a1009157416jgm@google.cominline std::string GetPrefixUntilComma(const char* str) { 586e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* comma = strchr(str, ','); 58703c314931649a999b0cf5deb0a434a1009157416jgm@google.com return comma == NULL ? str : std::string(str, comma); 588e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian} 589e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 590e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// TypeParameterizedTest<Fixture, TestSel, Types>::Register() 591e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// registers a list of type-parameterized tests with Google Test. The 592e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// return value is insignificant - we just need to return something 593e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// such that we can call this function in a namespace scope. 594e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// 595e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Implementation note: The GTEST_TEMPLATE_ macro declares a template 596e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// template parameter. It's defined in gtest-type-util.h. 597e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types> 598e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypeParameterizedTest { 599e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian public: 600e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // 'index' is the index of the test in the type list 'Types' 601e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase, 602e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // Types). Valid values for 'index' are [0, N - 1] where N is the 603e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // length of Types. 604e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian static bool Register(const char* prefix, const char* case_name, 605e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* test_names, int index) { 606e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian typedef typename Types::Head Type; 607e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian typedef Fixture<Type> FixtureClass; 608e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian typedef typename GTEST_BIND_(TestSel, Type) TestClass; 609e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 610e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // First, registers the first type-parameterized test in the type 611e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // list. 612e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian MakeAndRegisterTestInfo( 6133b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/" 6143b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com + StreamableToString(index)).c_str(), 615e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian GetPrefixUntilComma(test_names).c_str(), 616a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan GetTypeName<Type>().c_str(), 617a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan NULL, // No value parameter. 618e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian GetTypeId<FixtureClass>(), 619e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TestClass::SetUpTestCase, 620e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TestClass::TearDownTestCase, 621e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian new TestFactoryImpl<TestClass>); 622e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 623e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // Next, recurses (at compile time) with the tail of the type list. 624e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail> 625e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian ::Register(prefix, case_name, test_names, index + 1); 626e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 627e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}; 628e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 629e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// The base case for the compile time recursion. 630e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <GTEST_TEMPLATE_ Fixture, class TestSel> 631e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypeParameterizedTest<Fixture, TestSel, Types0> { 632e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian public: 633e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian static bool Register(const char* /*prefix*/, const char* /*case_name*/, 634e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* /*test_names*/, int /*index*/) { 635e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return true; 636e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 637e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}; 638e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 639e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// TypeParameterizedTestCase<Fixture, Tests, Types>::Register() 640e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// registers *all combinations* of 'Tests' and 'Types' with Google 641e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Test. The return value is insignificant - we just need to return 642e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// something such that we can call this function in a namespace scope. 643e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types> 644e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypeParameterizedTestCase { 645e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian public: 646e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian static bool Register(const char* prefix, const char* case_name, 647e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const char* test_names) { 648e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian typedef typename Tests::Head Head; 649e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 650e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // First, register the first test in 'Test' for each type in 'Types'. 651e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TypeParameterizedTest<Fixture, Head, Types>::Register( 652e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian prefix, case_name, test_names, 0); 653e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 654e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // Next, recurses (at compile time) with the tail of the test list. 655e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types> 656e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian ::Register(prefix, case_name, SkipComma(test_names)); 657e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 658e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}; 659e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 660e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// The base case for the compile time recursion. 661e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiantemplate <GTEST_TEMPLATE_ Fixture, typename Types> 662e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass TypeParameterizedTestCase<Fixture, Templates0, Types> { 663e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian public: 66437ce949fb6ee00109391035835d4893a94f250a9zhanyong.wan static bool Register(const char* /*prefix*/, const char* /*case_name*/, 66537ce949fb6ee00109391035835d4893a94f250a9zhanyong.wan const char* /*test_names*/) { 666e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return true; 667e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 668e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian}; 669e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 670e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P 671e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 67203c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Returns the current OS stack trace as an std::string. 673f904a612d9444ab36c07a8e619c113432e046f49vladlosev// 674f904a612d9444ab36c07a8e619c113432e046f49vladlosev// The maximum number of stack frames to be included is specified by 675f904a612d9444ab36c07a8e619c113432e046f49vladlosev// the gtest_stack_trace_depth flag. The skip_count parameter 676f904a612d9444ab36c07a8e619c113432e046f49vladlosev// specifies the number of top frames to be skipped, which doesn't 677f904a612d9444ab36c07a8e619c113432e046f49vladlosev// count against the number of frames to be included. 678f904a612d9444ab36c07a8e619c113432e046f49vladlosev// 679f904a612d9444ab36c07a8e619c113432e046f49vladlosev// For example, if Foo() calls Bar(), which in turn calls 680f904a612d9444ab36c07a8e619c113432e046f49vladlosev// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in 681f904a612d9444ab36c07a8e619c113432e046f49vladlosev// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. 68203c314931649a999b0cf5deb0a434a1009157416jgm@google.comGTEST_API_ std::string GetCurrentOsStackTraceExceptTop( 68303c314931649a999b0cf5deb0a434a1009157416jgm@google.com UnitTest* unit_test, int skip_count); 684f904a612d9444ab36c07a8e619c113432e046f49vladlosev 685f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Helpers for suppressing warnings on unreachable code or constant 686f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// condition. 687f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 688f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Always returns true. 689e4092294d7c1f38f303e8c7f67da31ba3e7e7d9azhanyong.wanGTEST_API_ bool AlwaysTrue(); 690b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan 691f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Always returns false. 692f6d087b78d230d875bf5d8281112662795044680zhanyong.waninline bool AlwaysFalse() { return !AlwaysTrue(); } 693f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 69499f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan// Helper for suppressing false warning from Clang on a const char* 69599f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan// variable declared in a conditional expression always being NULL in 69699f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan// the else branch. 69799f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wanstruct GTEST_API_ ConstCharPtr { 69899f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan ConstCharPtr(const char* str) : value(str) {} 69999f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan operator bool() const { return true; } 70099f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan const char* value; 70199f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan}; 70299f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan 70385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// A simple Linear Congruential Generator for generating random 70485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// numbers with a uniform distribution. Unlike rand() and srand(), it 70585f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// doesn't use global state (and therefore can't interfere with user 70685f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// code). Unlike rand_r(), it's portable. An LCG isn't very random, 70785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// but it's good enough for our purposes. 7081ce454985edf37b17f2f266d499c2b7dec339002zhanyong.wanclass GTEST_API_ Random { 70985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan public: 71085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan static const UInt32 kMaxRange = 1u << 31; 71185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 71285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan explicit Random(UInt32 seed) : state_(seed) {} 71385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 71485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan void Reseed(UInt32 seed) { state_ = seed; } 71585f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 71685f555add7acc03149b76db239a4cdd18433a558zhanyong.wan // Generates a random number from [0, range). Crashes if 'range' is 71785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan // 0 or greater than kMaxRange. 71885f555add7acc03149b76db239a4cdd18433a558zhanyong.wan UInt32 Generate(UInt32 range); 71985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 72085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan private: 72185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan UInt32 state_; 72285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); 72385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan}; 72485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 725678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a 726678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// compiler error iff T1 and T2 are different types. 727678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T1, typename T2> 728678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct CompileAssertTypesEqual; 729678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 730678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 731678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct CompileAssertTypesEqual<T, T> { 732678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}; 733678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 734678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Removes the reference from a type if it is a reference type, 735678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// otherwise leaves it unchanged. This is the same as 736678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// tr1::remove_reference, which is not widely available yet. 737678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 738678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct RemoveReference { typedef T type; }; // NOLINT 739678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 740678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct RemoveReference<T&> { typedef T type; }; // NOLINT 741678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 742678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// A handy wrapper around RemoveReference that works when the argument 743678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// T depends on template parameters. 744678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan#define GTEST_REMOVE_REFERENCE_(T) \ 745678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan typename ::testing::internal::RemoveReference<T>::type 746678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 747678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Removes const from a type if it is a const type, otherwise leaves 748678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// it unchanged. This is the same as tr1::remove_const, which is not 749678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// widely available yet. 750678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 751678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct RemoveConst { typedef T type; }; // NOLINT 752678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 753678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct RemoveConst<const T> { typedef T type; }; // NOLINT 754678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 7553aa2af18a9c47b16824fe0e7462c807533fcdea7zhanyong.wan// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above 7563aa2af18a9c47b16824fe0e7462c807533fcdea7zhanyong.wan// definition to fail to remove the const in 'const int[3]' and 'const 7573aa2af18a9c47b16824fe0e7462c807533fcdea7zhanyong.wan// char[3][4]'. The following specialization works around the bug. 758678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, size_t N> 7593aa2af18a9c47b16824fe0e7462c807533fcdea7zhanyong.wanstruct RemoveConst<const T[N]> { 760678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan typedef typename RemoveConst<T>::type type[N]; 761678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}; 762678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 76395a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev#if defined(_MSC_VER) && _MSC_VER < 1400 76495a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev// This is the only specialization that allows VC++ 7.1 to remove const in 76595a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC 76695a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev// and thus needs to be conditionally compiled. 76795a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosevtemplate <typename T, size_t N> 76895a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosevstruct RemoveConst<T[N]> { 76995a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev typedef typename RemoveConst<T>::type type[N]; 77095a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev}; 77195a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev#endif 77295a77adfeb8f97d2a61956e2eda12afe7371f1dbvladlosev 773678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// A handy wrapper around RemoveConst that works when the argument 774678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// T depends on template parameters. 775678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan#define GTEST_REMOVE_CONST_(T) \ 776678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan typename ::testing::internal::RemoveConst<T>::type 777678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 778c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan// Turns const U&, U&, const U, and U all into U. 779c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ 780c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) 781c3ad69057c28427c2a000a462468b34883853c6ezhanyong.wan 782678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Adds reference to a type if it is not a reference type, 783678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// otherwise leaves it unchanged. This is the same as 784678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// tr1::add_reference, which is not widely available yet. 785678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 786678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct AddReference { typedef T& type; }; // NOLINT 787678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 788678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct AddReference<T&> { typedef T& type; }; // NOLINT 789678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 790678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// A handy wrapper around AddReference that works when the argument T 791678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// depends on template parameters. 792678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan#define GTEST_ADD_REFERENCE_(T) \ 793678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan typename ::testing::internal::AddReference<T>::type 794678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 795678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Adds a reference to const on top of T as necessary. For example, 796678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// it transforms 797678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// 798678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// char ==> const char& 799678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// const char ==> const char& 800678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// char& ==> const char& 801678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// const char& ==> const char& 802678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// 803678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// The argument T must depend on some template parameters. 804678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan#define GTEST_REFERENCE_TO_CONST_(T) \ 805678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T)) 806678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 807678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// ImplicitlyConvertible<From, To>::value is a compile-time bool 808678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// constant that's true iff type From can be implicitly converted to 809678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// type To. 810678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename From, typename To> 811678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanclass ImplicitlyConvertible { 812678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan private: 813678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // We need the following helper functions only for their types. 814678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // They have no implementations. 815678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 816678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // MakeFrom() is an expression whose type is From. We cannot simply 817678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // use From(), as the type From may not have a public default 818678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // constructor. 819bc830d325d07a8a943386446139be3ab3565e038kosak@google.com static typename AddReference<From>::type MakeFrom(); 820678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 821678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // These two functions are overloaded. Given an expression 822678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // Helper(x), the compiler will pick the first version if x can be 823678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // implicitly converted to type To; otherwise it will pick the 824678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // second version. 825678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // 826678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // The first version returns a value of size 1, and the second 827678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // version returns a value of size 2. Therefore, by checking the 828678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // size of Helper(x), which can be done at compile time, we can tell 829678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // which version of Helper() is used, and hence whether x can be 830678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // implicitly converted to type To. 831678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan static char Helper(To); 832678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan static char (&Helper(...))[2]; // NOLINT 833678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 834678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // We have to put the 'public' section after the 'private' section, 835678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // or MSVC refuses to compile the code. 836678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan public: 837f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#if defined(__BORLANDC__) 838ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan // C++Builder cannot use member overload resolution during template 839ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan // instantiation. The simplest workaround is to use its C++0x type traits 840ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan // functions (C++Builder 2009 and above only). 841ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wan static const bool value = __is_convertible(From, To); 842678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan#else 843f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // MSVC warns about implicitly converting from double to int for 844f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // possible loss of data, so we need to temporarily disable the 845f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // warning. 846f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244) 847678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan static const bool value = 848678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1; 849f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_POP_() 850f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#endif // __BORLANDC__ 851678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}; 852678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename From, typename To> 853678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanconst bool ImplicitlyConvertible<From, To>::value; 854678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 855678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// IsAProtocolMessage<T>::value is a compile-time bool constant that's 856678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// true iff T is type ProtocolMessage, proto2::Message, or a subclass 857678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// of those. 858678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T> 859678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanstruct IsAProtocolMessage 860678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan : public bool_constant< 861678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value || 862678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> { 863678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}; 864678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 8656c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// When the compiler sees expression IsContainerTest<C>(0), if C is an 8666c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// STL-style container class, the first overload of IsContainerTest 8676c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// will be viable (since both C::iterator* and C::const_iterator* are 8686c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// valid types and NULL can be implicitly converted to them). It will 8696c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// be picked over the second overload as 'int' is a perfect match for 8706c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// the type of argument 0. If C::iterator or C::const_iterator is not 8716c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// a valid type, the first overload is not viable, and the second 8726c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// overload will be picked. Therefore, we can determine whether C is 8736c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// a container class by checking the type of IsContainerTest<C>(0). 8746c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// The value of the expression is insignificant. 8756c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// 8766c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// Note that we look for both C::iterator and C::const_iterator. The 8776c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// reason is that C++ injects the name of a class as a member of the 8786c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// class itself (e.g. you can refer to class iterator as either 8796c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// 'iterator' or 'iterator::iterator'). If we look for C::iterator 8806c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// only, for example, we would mistakenly think that a class named 8816c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// iterator is an STL container. 8826c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// 8836c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// Also note that the simpler approach of overloading 8846c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// IsContainerTest(typename C::const_iterator*) and 8856c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. 886678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantypedef int IsContainer; 887678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <class C> 8886c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wanIsContainer IsContainerTest(int /* dummy */, 8896c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan typename C::iterator* /* it */ = NULL, 8906c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan typename C::const_iterator* /* const_it */ = NULL) { 8916c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan return 0; 8926c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan} 893678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 894678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantypedef char IsNotContainer; 895678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <class C> 8966c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wanIsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } 897678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 8985e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan// EnableIf<condition>::type is void when 'Cond' is true, and 8995e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan// undefined when 'Cond' is false. To use SFINAE to make a function 9005e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan// overload only apply when a particular expression is true, add 9015e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan// "typename EnableIf<expression>::type* = 0" as the last parameter. 9025e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wantemplate<bool> struct EnableIf; 9035e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wantemplate<> struct EnableIf<true> { typedef void type; }; // NOLINT 9045e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan 905678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Utilities for native arrays. 906678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 907678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// ArrayEq() compares two k-dimensional native arrays using the 908678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// elements' operator==, where k can be any integer >= 0. When k is 909678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// 0, ArrayEq() degenerates into comparing a single pair of values. 910678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 911678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U> 912678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanbool ArrayEq(const T* lhs, size_t size, const U* rhs); 913678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 914678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// This generic version is used when k is 0. 915678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U> 916678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.waninline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } 917678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 918678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// This overload is used when k >= 1. 919678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U, size_t N> 920678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.waninline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { 921678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan return internal::ArrayEq(lhs, N, rhs); 922678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan} 923678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 924678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// This helper reduces code bloat. If we instead put its logic inside 925678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// the previous ArrayEq() function, arrays with different sizes would 926678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// lead to different copies of the template code. 927678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U> 928678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanbool ArrayEq(const T* lhs, size_t size, const U* rhs) { 929678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan for (size_t i = 0; i != size; i++) { 930678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan if (!internal::ArrayEq(lhs[i], rhs[i])) 931678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan return false; 932678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 933678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan return true; 934678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan} 935678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 936678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Finds the first element in the iterator range [begin, end) that 937678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// equals elem. Element may be a native array type itself. 938678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename Iter, typename Element> 939678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanIter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { 940678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan for (Iter it = begin; it != end; ++it) { 941678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan if (internal::ArrayEq(*it, elem)) 942678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan return it; 943678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 944678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan return end; 945678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan} 946678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 947678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// CopyArray() copies a k-dimensional native array using the elements' 948678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// operator=, where k can be any integer >= 0. When k is 0, 949678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// CopyArray() degenerates into copying a single value. 950678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 951678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U> 952678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanvoid CopyArray(const T* from, size_t size, U* to); 953678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 954678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// This generic version is used when k is 0. 955678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U> 956678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.waninline void CopyArray(const T& from, U* to) { *to = from; } 957678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 958678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// This overload is used when k >= 1. 959678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U, size_t N> 960678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.waninline void CopyArray(const T(&from)[N], U(*to)[N]) { 961678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan internal::CopyArray(from, N, *to); 962678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan} 963678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 964678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// This helper reduces code bloat. If we instead put its logic inside 965678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// the previous CopyArray() function, arrays with different sizes 966678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// would lead to different copies of the template code. 967678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename T, typename U> 968678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanvoid CopyArray(const T* from, size_t size, U* to) { 969678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan for (size_t i = 0; i != size; i++) { 970678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan internal::CopyArray(from[i], to + i); 971678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 972678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan} 973678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 974678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// The relation between an NativeArray object (see below) and the 975678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// native array it represents. 976f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com// We use 2 different structs to allow non-copyable types to be used, as long 977f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com// as RelationToSourceReference() is passed. 978f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comstruct RelationToSourceReference {}; 979f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comstruct RelationToSourceCopy {}; 980678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 981678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// Adapts a native array to a read-only STL-style container. Instead 982678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// of the complete STL container concept, this adaptor only implements 983678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// members useful for Google Mock's container matchers. New members 984678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// should be added as needed. To simplify the implementation, we only 985678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// support Element being a raw type (i.e. having no top-level const or 986678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// reference modifier). It's the client's responsibility to satisfy 987678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// this requirement. Element can be an array type itself (hence 988678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan// multi-dimensional arrays are supported). 989678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wantemplate <typename Element> 990678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wanclass NativeArray { 991678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan public: 992678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // STL-style container typedefs. 993678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan typedef Element value_type; 9946c5116014ce51ef3273d800cbf75fcef99e798c6zhanyong.wan typedef Element* iterator; 995678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan typedef const Element* const_iterator; 996678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 997f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // Constructs from a native array. References the source. 998f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com NativeArray(const Element* array, size_t count, RelationToSourceReference) { 999f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com InitRef(array, count); 1000f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com } 1001f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com 1002f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // Constructs from a native array. Copies the source. 1003f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com NativeArray(const Element* array, size_t count, RelationToSourceCopy) { 1004f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com InitCopy(array, count); 1005678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 1006678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 1007678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // Copy constructor. 1008678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan NativeArray(const NativeArray& rhs) { 1009f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com (this->*rhs.clone_)(rhs.array_, rhs.size_); 1010678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 1011678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 1012678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan ~NativeArray() { 1013f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com if (clone_ != &NativeArray::InitRef) 1014678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan delete[] array_; 1015678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 1016678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 1017678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan // STL-style container methods. 1018678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan size_t size() const { return size_; } 1019678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan const_iterator begin() const { return array_; } 1020678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan const_iterator end() const { return array_ + size_; } 1021678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan bool operator==(const NativeArray& rhs) const { 1022678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan return size() == rhs.size() && 1023678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan ArrayEq(begin(), size(), rhs.begin()); 1024678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 1025678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 1026678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan private: 1027f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com enum { 1028f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com kCheckTypeIsNotConstOrAReference = StaticAssertTypeEqHelper< 1029f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value, 1030f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com }; 1031f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com 1032f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // Initializes this object with a copy of the input. 1033f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com void InitCopy(const Element* array, size_t a_size) { 1034f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com Element* const copy = new Element[a_size]; 1035f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com CopyArray(array, a_size, copy); 1036f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com array_ = copy; 1037678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan size_ = a_size; 1038f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com clone_ = &NativeArray::InitCopy; 1039f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com } 1040f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com 1041f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com // Initializes this object with a reference of the input. 1042f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com void InitRef(const Element* array, size_t a_size) { 1043f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com array_ = array; 1044f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com size_ = a_size; 1045f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com clone_ = &NativeArray::InitRef; 1046678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan } 1047678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 1048678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan const Element* array_; 1049678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan size_t size_; 1050f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com void (NativeArray::*clone_)(const Element*, size_t); 1051678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 1052678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan GTEST_DISALLOW_ASSIGN_(NativeArray); 1053678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan}; 1054678f92b8f17c8edf1a21efb401c91b355fe7bb2bzhanyong.wan 10554b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 10564b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace testing 10574b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1058d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan#define GTEST_MESSAGE_AT_(file, line, message, result_type) \ 1059d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan ::testing::internal::AssertHelper(result_type, file, line, message) \ 10604b6829f0d28990dd645e16386eb226d0f10c8731shiqian = ::testing::Message() 10614b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1062d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan#define GTEST_MESSAGE_(message, result_type) \ 1063d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) 1064d5ad2ca82051c34b19af628a3c81131ca65010c2zhanyong.wan 1065e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_FATAL_FAILURE_(message) \ 1066334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) 10674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1068e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_NONFATAL_FAILURE_(message) \ 1069334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) 10704b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1071e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_SUCCESS_(message) \ 1072334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) 10734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1074e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// Suppresses MSVC warnings 4072 (unreachable code) for the code following 1075e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// statement if it returns or throws (or doesn't return or throw in some 1076e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan// situations). 10772962b23886e9b922398b573fadfa7993f1cb26d7zhanyong.wan#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ 1078e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan if (::testing::internal::AlwaysTrue()) { statement; } 1079e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan 1080e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ 1081e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 108299f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan if (::testing::internal::ConstCharPtr gtest_msg = "") { \ 10839204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian bool gtest_caught_expected = false; \ 10849204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian try { \ 10852962b23886e9b922398b573fadfa7993f1cb26d7zhanyong.wan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 10869204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 10879204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian catch (expected_exception const&) { \ 10889204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian gtest_caught_expected = true; \ 10899204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 10909204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian catch (...) { \ 109199f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan gtest_msg.value = \ 109299f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan "Expected: " #statement " throws an exception of type " \ 109399f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan #expected_exception ".\n Actual: it throws a different type."; \ 1094e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 10959204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 10969204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian if (!gtest_caught_expected) { \ 109799f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan gtest_msg.value = \ 109899f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan "Expected: " #statement " throws an exception of type " \ 109999f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan #expected_exception ".\n Actual: it throws nothing."; \ 1100e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ 11019204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 11029204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } else \ 1103e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ 110499f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan fail(gtest_msg.value) 11059204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian 1106e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_TEST_NO_THROW_(statement, fail) \ 1107e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 110899f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan if (::testing::internal::AlwaysTrue()) { \ 11099204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian try { \ 11102962b23886e9b922398b573fadfa7993f1cb26d7zhanyong.wan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 11119204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 11129204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian catch (...) { \ 1113e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ 11149204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 11159204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } else \ 1116e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ 111799f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan fail("Expected: " #statement " doesn't throw an exception.\n" \ 111899f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan " Actual: it throws.") 11199204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian 1120e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_TEST_ANY_THROW_(statement, fail) \ 1121e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 112299f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan if (::testing::internal::AlwaysTrue()) { \ 11239204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian bool gtest_caught_any = false; \ 11249204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian try { \ 11252962b23886e9b922398b573fadfa7993f1cb26d7zhanyong.wan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 11269204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 11279204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian catch (...) { \ 11289204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian gtest_caught_any = true; \ 11299204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 11309204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian if (!gtest_caught_any) { \ 1131e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ 11329204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } \ 11339204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian } else \ 1134e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ 113599f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan fail("Expected: " #statement " throws an exception.\n" \ 113699f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan " Actual: it doesn't.") 11379204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian 11389204c8ec6edda2013cd81bf3c93e9cb6c45b9bb5shiqian 1139fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Implements Boolean test assertions such as EXPECT_TRUE. expression can be 1140fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// either a boolean expression or an AssertionResult. text is a textual 1141fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// represenation of expression as it was passed into the EXPECT_TRUE. 1142fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ 1143e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 1144fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev if (const ::testing::AssertionResult gtest_ar_ = \ 1145fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev ::testing::AssertionResult(expression)) \ 11464b6829f0d28990dd645e16386eb226d0f10c8731shiqian ; \ 11474b6829f0d28990dd645e16386eb226d0f10c8731shiqian else \ 1148fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev fail(::testing::internal::GetBoolAssertionFailureMessage(\ 1149fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev gtest_ar_, text, #actual, #expected).c_str()) 11504b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1151e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ 1152e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ 115399f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan if (::testing::internal::AlwaysTrue()) { \ 1154e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ 11552962b23886e9b922398b573fadfa7993f1cb26d7zhanyong.wan GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ 1156e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ 1157e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ 1158e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian } \ 1159e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian } else \ 1160e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ 116199f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan fail("Expected: " #statement " doesn't generate new fatal " \ 116299f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan "failures in the current thread.\n" \ 116399f2fd8ac474e2a8cf922410af199fa7a0057f7bzhanyong.wan " Actual: it does.") 1164e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 1165e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Expands to the name of the class that implements the given test. 1166e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ 1167e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian test_case_name##_##test_name##_Test 1168e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 11694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helper macro for defining tests. 1170fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ 1171e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ 11724b6829f0d28990dd645e16386eb226d0f10c8731shiqian public:\ 1173e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ 11744b6829f0d28990dd645e16386eb226d0f10c8731shiqian private:\ 11754b6829f0d28990dd645e16386eb226d0f10c8731shiqian virtual void TestBody();\ 11765e255e0b6affbdc56718d81f0bb5d1b802a1c6c2zhanyong.wan static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ 1177e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(\ 1178e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ 11794b6829f0d28990dd645e16386eb226d0f10c8731shiqian};\ 11804b6829f0d28990dd645e16386eb226d0f10c8731shiqian\ 1181e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ 1182e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian ::test_info_ =\ 1183e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian ::testing::internal::MakeAndRegisterTestInfo(\ 1184a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan #test_case_name, #test_name, NULL, NULL, \ 1185fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian (parent_id), \ 11864834581321d60c17997d65a2360c7674f15f9bbcshiqian parent_class::SetUpTestCase, \ 11874834581321d60c17997d65a2360c7674f15f9bbcshiqian parent_class::TearDownTestCase, \ 11884834581321d60c17997d65a2360c7674f15f9bbcshiqian new ::testing::internal::TestFactoryImpl<\ 1189e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ 1190e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianvoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() 11914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 11924b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ 1193f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com 1194