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