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