gtest.h revision 57240ff6e2252f8986f6e47e4010bc52fbae25d1
17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2005, Google Inc.
27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All rights reserved.
37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met:
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions of source code must retain the above copyright
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer.
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions in binary form must reproduce the above
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution.
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Neither the name of Google Inc. nor the names of its
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission.
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Author: wan@google.com (Zhanyong Wan)
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The Google C++ Testing Framework (Google Test)
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This header file defines the public API for Google Test.  It should be
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// included by any test program that uses Google Test.
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// leave some internal implementation details in this header file.
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// They are clearly marked by comments like this:
407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Such code is NOT meant to be used by a user directly, and is subject
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// program!
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Acknowledgment: Google Test borrowed the idea of automatic test
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// easyUnit framework.
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_H_
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <limits>
5557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#include <vector>
5657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/internal/gtest-internal.h>
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/internal/gtest-string.h>
597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/gtest-death-test.h>
607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/gtest-message.h>
617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/gtest-param-test.h>
627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/gtest_prod.h>
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/gtest-test-part.h>
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/gtest-typed-test.h>
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Depending on the platform, different string classes are available.
6757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// On Linux, in addition to ::std::string, Google also makes use of
6857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// class ::string, which has the same interface as ::std::string, but
6957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// has a different implementation.
7057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
7157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
7257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// ::string is available AND is a distinct type to ::std::string, or
7357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// define it to 0 to indicate otherwise.
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If the user's ::std::string and ::string are the same class due to
7657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
7857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
7957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// heuristically.
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing {
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
83e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Declares the flags.
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
85e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag temporary enables the disabled tests.
86e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(also_run_disabled_tests);
87e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
88e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag brings the debugger on an assertion failure.
89e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(break_on_failure);
90e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
91e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag controls whether Google Test catches all test-thrown exceptions
92e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// and logs them as failures.
93e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(catch_exceptions);
94e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
95e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag enables using colors in terminal output. Available values are
96e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
97e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// to let Google Test decide.
98e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_string_(color);
99e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
100e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag sets up the filter to select by name using a glob pattern
101e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the tests to run. If the filter is not given all tests are executed.
102e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_string_(filter);
103e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
104e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag causes the Google Test to list tests. None of the tests listed
105e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// are actually run if the flag is provided.
106e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(list_tests);
107e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
108e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag controls whether Google Test emits a detailed XML report to a file
109e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// in addition to its normal textual output.
110e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_string_(output);
111e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
112e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flags control whether Google Test prints the elapsed time for each
113e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// test.
114e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(print_time);
115e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
116190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// This flag specifies the random number seed.
117190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerGTEST_DECLARE_int32_(random_seed);
118190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
119e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag sets how many times the tests are repeated. The default value
120e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// is 1. If the value is -1 the tests are repeating forever.
121e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_int32_(repeat);
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This flag controls whether Google Test includes Google Test internal
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// stack frames in failure stack traces.
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanGTEST_DECLARE_bool_(show_internal_stack_frames);
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
127190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// When this flag is specified, tests' order is randomized on every iteration.
128190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerGTEST_DECLARE_bool_(shuffle);
129190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
130e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag specifies the maximum number of stack frames to be
131e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// printed in a failure message.
132e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_int32_(stack_trace_depth);
133e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
134e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// When this flag is specified, a failed assertion will throw an
135e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// exception if exceptions are enabled, or exit the program with a
136e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// non-zero code otherwise.
137e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(throw_on_failure);
138e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
139e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// The upper limit for valid stack trace depths.
140e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerconst int kMaxStackTraceDepth = 100;
141e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
144190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass AssertHelper;
145190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass DefaultGlobalTestPartResultReporter;
146190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass ExecDeathTest;
147190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass NoExecDeathTest;
148190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass FinalSuccessChecker;
1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass GTestFlagSaver;
150190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestInfoImpl;
151190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestResultAccessor;
152190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestEventListenersAccessor;
153190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestEventRepeater;
154190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass WindowsDeathTest;
155190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass UnitTestImpl* GetUnitTestImpl();
156190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
157190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                    const String& message);
158190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass PrettyUnitTestResultPrinter;
159190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass XmlUnitTestResultPrinter;
1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Converts a streamable value to a String.  A NULL pointer is
1627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// converted to "(null)".  When the input value is a ::string,
1637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::std::string, ::wstring, or ::std::wstring object, each NUL
1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// character in it is replaced with "\\0".
1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Declared in gtest-internal.h but defined here, so that it has access
1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to the definition of the Message class, required by the ARM
1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// compiler.
1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanString StreamableToString(const T& streamable) {
1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return (Message() << streamable).GetString();
1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A class for indicating whether an assertion was successful.  When
1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the assertion wasn't successful, the AssertionResult object
17757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// remembers a non-empty message that describes how it failed.
1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// To create an instance of this class, use one of the factory functions
1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (AssertionSuccess() and AssertionFailure()).
1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// This class is useful for two purposes:
18357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   1. Defining predicate functions to be used with Boolean test assertions
18457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
18557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   2. Defining predicate-format functions to be
18657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
18757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
18857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// For example, if you define IsEven predicate:
18957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
19057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   testing::AssertionResult IsEven(int n) {
19157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     if ((n % 2) == 0)
19257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionSuccess();
19357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     else
19457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionFailure() << n << " is odd";
19557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   }
19657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
19757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
19857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// will print the message
19957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
20057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Value of: IsEven(Fib(5))
20157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     Actual: false (5 is odd)
20257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Expected: true
20357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
20457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// instead of a more opaque
20557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
20657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Value of: IsEven(Fib(5))
20757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     Actual: false
20857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Expected: true
20957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
21057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// in case IsEven is a simple Boolean predicate.
21157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
21257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// If you expect your predicate to be reused and want to support informative
21357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
21457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// about half as often as positive ones in our tests), supply messages for
21557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// both success and failure cases:
21657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
21757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   testing::AssertionResult IsEven(int n) {
21857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     if ((n % 2) == 0)
21957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionSuccess() << n << " is even";
22057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     else
22157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionFailure() << n << " is odd";
22257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   }
22357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
22457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
22557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
22657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Value of: IsEven(Fib(6))
22757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     Actual: true (8 is even)
22857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Expected: false
22957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
23057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// NB: Predicates that support negative Boolean assertions have reduced
23157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// performance in positive ones so be careful not to use them in tests
23257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// that have lots (tens of thousands) of positive Boolean assertions.
23357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
23457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// To use this class with EXPECT_PRED_FORMAT assertions such as:
2357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   // Verifies that Foo() returns an even number.
2377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_PRED_FORMAT1(IsEven, Foo());
2387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
23957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// you need to define:
2407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   testing::AssertionResult IsEven(const char* expr, int n) {
24257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     if ((n % 2) == 0)
24357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionSuccess();
24457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     else
24557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionFailure()
24657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
2477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
2487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If Foo() returns 5, you will see the following message:
2507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Expected: Foo() is even
2527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Actual: it's 5
25357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
25457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ AssertionResult {
2557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
25657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Copy constructor.
25757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Used in EXPECT_TRUE/FALSE(assertion_result).
25857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  AssertionResult(const AssertionResult& other);
25957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Used in the EXPECT_TRUE/FALSE(bool_expression).
26057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  explicit AssertionResult(bool success) : success_(success) {}
2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns true iff the assertion succeeded.
26357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  operator bool() const { return success_; }  // NOLINT
26457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
26557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
26657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  AssertionResult operator!() const;
26757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
26857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Returns the text streamed into this AssertionResult. Test assertions
26957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // use it when they fail (i.e., the predicate's outcome doesn't match the
27057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // assertion's expectation). When nothing has been streamed into the
27157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // object, returns an empty string.
27257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const char* message() const {
27357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    return message_.get() != NULL && message_->c_str() != NULL ?
27457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer           message_->c_str() : "";
27557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  }
27657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // TODO(vladl@google.com): Remove this after making sure no clients use it.
27757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Deprecated; please use message() instead.
27857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const char* failure_message() const { return message(); }
2797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
28057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Streams a custom failure message into this object.
28157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  template <typename T> AssertionResult& operator<<(const T& value);
2827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
28457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // No implementation - we want AssertionResult to be
28557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // copy-constructible but not assignable.
28657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  void operator=(const AssertionResult& other);
28757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
28857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Stores result of the assertion predicate.
28957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  bool success_;
29057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Stores the message describing the condition in case the expectation
29157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // construct is not satisfied with the predicate's outcome.
29257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Referenced via a pointer to avoid taking too much stack frame space
29357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // with test assertions.
29457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  internal::scoped_ptr<internal::String> message_;
29557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer};  // class AssertionResult
29657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
29757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Streams a custom failure message into this object.
29857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramertemplate <typename T>
29957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerAssertionResult& AssertionResult::operator<<(const T& value) {
30057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  Message msg;
30157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  if (message_.get() != NULL)
30257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    msg << *message_;
30357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  msg << value;
30457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  message_.reset(new internal::String(msg.GetString()));
30557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  return *this;
30657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer}
3077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Makes a successful assertion result.
30957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult AssertionSuccess();
31057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
31157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Makes a failed assertion result.
31257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult AssertionFailure();
3137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Makes a failed assertion result with the given failure message.
31557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Deprecated; use AssertionFailure() << msg.
31657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult AssertionFailure(const Message& msg);
3177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The abstract class that all tests inherit from.
3197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In Google Test, a unit test program contains one or many TestCases, and
3217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each TestCase contains one or many Tests.
3227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// When you define a test using the TEST macro, you don't need to
3247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// explicitly derive from Test - the TEST macro automatically does
3257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this for you.
3267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The only time you derive from Test is when defining a test fixture
3287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to be used a TEST_F.  For example:
3297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   class FooTest : public testing::Test {
3317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    protected:
3327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     virtual void SetUp() { ... }
3337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     virtual void TearDown() { ... }
3347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     ...
3357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   };
3367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, Bar) { ... }
3387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, Baz) { ... }
3397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Test is not copyable.
34157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ Test {
3427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
3437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class internal::TestInfoImpl;
3447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Defines types for pointers to functions that set up and tear down
3467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // a test case.
3477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
3487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
3497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The d'tor is virtual as we intend to inherit from Test.
3517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual ~Test();
3527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets up the stuff shared by all tests in this test case.
3547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
3557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test will call Foo::SetUpTestCase() before running the first
3567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // test in test case Foo.  Hence a sub-class can define its own
3577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // SetUpTestCase() method to shadow the one defined in the super
3587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // class.
3597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void SetUpTestCase() {}
3607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Tears down the stuff shared by all tests in this test case.
3627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
3637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test will call Foo::TearDownTestCase() after running the last
3647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // test in test case Foo.  Hence a sub-class can define its own
3657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // TearDownTestCase() method to shadow the one defined in the super
3667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // class.
3677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void TearDownTestCase() {}
3687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns true iff the current test has a fatal failure.
3707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static bool HasFatalFailure();
3717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
372190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the current test has a non-fatal failure.
373190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool HasNonfatalFailure();
374190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
375190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the current test has a (either fatal or
376190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // non-fatal) failure.
377190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
378190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
3797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Logs a property for the current test.  Only the last value for a given
3807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // key is remembered.
3817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // These are public static so they can be called from utility functions
3827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // that are not members of the test fixture.
3837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The arguments are const char* instead strings, as Google Test is used
3847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // on platforms where string doesn't compile.
3857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
3867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Note that a driving consideration for these RecordProperty methods
3877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // was to produce xml output suited to the Greenspan charting utility,
3887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // which at present will only chart values that fit in a 32-bit int. It
3897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // is the user's responsibility to restrict their values to 32-bit ints
3907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // if they intend them to be used with Greenspan.
3917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void RecordProperty(const char* key, const char* value);
3927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void RecordProperty(const char* key, int value);
3937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman protected:
3957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Creates a Test object.
3967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  Test();
3977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets up the test fixture.
3997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void SetUp();
4007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Tears down the test fixture.
4027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void TearDown();
4037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
4057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns true iff the current test has the same fixture class as
4067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the first test in the current test case.
4077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static bool HasSameFixtureClass();
4087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Runs the test after the test fixture has been set up.
4107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // A sub-class must implement this to define the test logic.
4127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
4147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Instead, use the TEST or TEST_F macro.
4157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void TestBody() = 0;
4167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets up, executes, and tears down the test.
4187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void Run();
4197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Uses a GTestFlagSaver to save and restore all Google Test flags.
4217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const internal::GTestFlagSaver* const gtest_flag_saver_;
4227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Often a user mis-spells SetUp() as Setup() and spends a long time
4247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // wondering why it is never called by Google Test.  The declaration of
4257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the following method is solely for catching such an error at
4267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // compile time:
4277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   - The return type is deliberately chosen to be not void, so it
4297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   will be a conflict if a user declares void Setup() in his test
4307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   fixture.
4317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   - This method is private, so it will be another compiler error
4337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   if a user calls it from his test fixture.
4347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // DO NOT OVERRIDE THIS FUNCTION.
4367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // If you see an error about overriding the following function or
4387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // about it being private, you have mis-spelled SetUp() as Setup().
4397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  struct Setup_should_be_spelled_SetUp {};
4407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
4417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // We disallow copying Tests.
4437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
4447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
4457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
446190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramertypedef internal::TimeInMillis TimeInMillis;
447190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
448190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// A copyable object representing a user specified test property which can be
449190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// output as a key/value string pair.
450190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
451190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Don't inherit from TestProperty as its destructor is not virtual.
452190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestProperty {
453190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
454190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // C'tor.  TestProperty does NOT have a default constructor.
455190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Always use this constructor (with parameters) to create a
456190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // TestProperty object.
45757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  TestProperty(const char* a_key, const char* a_value) :
45857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    key_(a_key), value_(a_value) {
459190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
460190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
461190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the user supplied key.
462190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const char* key() const {
463190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return key_.c_str();
464190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
465190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
466190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the user supplied value.
467190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const char* value() const {
468190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return value_.c_str();
469190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
470190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
471190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets a new value, overriding the one supplied in the constructor.
472190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SetValue(const char* new_value) {
473190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    value_ = new_value;
474190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
475190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
476190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
477190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The key supplied by the user.
478190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::String key_;
479190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The value supplied by the user.
480190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::String value_;
481190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
482190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
483190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The result of a single Test.  This includes a list of
484190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestPartResults, a list of TestProperties, a count of how many
485190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// death tests there are in the Test, and how much time it took to run
486190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// the Test.
487190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
488190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestResult is not copyable.
48957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestResult {
490190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
491190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Creates an empty TestResult.
492190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestResult();
493190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
494190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // D'tor.  Do not inherit from TestResult.
495190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  ~TestResult();
496190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
497190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all test parts.  This is the sum of the number
498190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // of successful test parts and the number of failed test parts.
499190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_part_count() const;
500190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
501190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the number of the test properties.
502190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_property_count() const;
503190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
504190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test passed (i.e. no test part failed).
505190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Passed() const { return !Failed(); }
506190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
507190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test failed.
508190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Failed() const;
509190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
510190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test fatally failed.
511190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool HasFatalFailure() const;
512190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
513190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test has a non-fatal failure.
514190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool HasNonfatalFailure() const;
515190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
516190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the elapsed time, in milliseconds.
517190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time() const { return elapsed_time_; }
518190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
519190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test part result among all the results. i can range
520190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // from 0 to test_property_count() - 1. If i is not in that range, aborts
521190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the program.
522190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestPartResult& GetTestPartResult(int i) const;
523190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
524190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test property. i can range from 0 to
525190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // test_property_count() - 1. If i is not in that range, aborts the
526190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // program.
527190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestProperty& GetTestProperty(int i) const;
528190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
529190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
530190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class TestInfo;
531190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class UnitTest;
532190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::DefaultGlobalTestPartResultReporter;
533190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::ExecDeathTest;
534190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::TestInfoImpl;
535190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::TestResultAccessor;
536190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
537190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::WindowsDeathTest;
538190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
539190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the vector of TestPartResults.
54057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const std::vector<TestPartResult>& test_part_results() const {
54157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    return test_part_results_;
542190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
543190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
544190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the vector of TestProperties.
54557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const std::vector<TestProperty>& test_properties() const {
54657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    return test_properties_;
547190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
548190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
549190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the elapsed time.
550190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
551190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
552190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a test property to the list. The property is validated and may add
553190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
554190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // key names). If a property is already recorded for the same key, the
555190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // value will be updated, rather than storing multiple values for the same
556190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // key.
557190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void RecordProperty(const TestProperty& test_property);
558190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
559190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a failure if the key is a reserved attribute of Google Test
560190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // testcase tags.  Returns true if the property is valid.
561190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // TODO(russr): Validate attribute names are legal and human readable.
562190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool ValidateTestProperty(const TestProperty& test_property);
563190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
564190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a test part result to the list.
565190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void AddTestPartResult(const TestPartResult& test_part_result);
566190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
567190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the death test count.
568190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int death_test_count() const { return death_test_count_; }
569190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
570190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Increments the death test count, returning the new count.
571190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int increment_death_test_count() { return ++death_test_count_; }
572190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
573190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the test part results.
574190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void ClearTestPartResults();
575190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
576190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the object.
577190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void Clear();
578190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
579190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Protects mutable state of the property vector and of owned
580190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // properties, whose values may be updated.
581190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::Mutex test_properites_mutex_;
582190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
583190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The vector of TestPartResults
58457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestPartResult> test_part_results_;
585190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The vector of TestProperties
58657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestProperty> test_properties_;
587190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Running count of death tests.
588190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int death_test_count_;
589190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The elapsed time, in milliseconds.
590190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time_;
591190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
592190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We disallow copying TestResult.
593190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
594190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};  // class TestResult
5957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
5967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A TestInfo object stores the following information about a test:
5977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
5987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Test case name
5997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Test name
6007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Whether the test should be run
6017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   A function pointer that creates the test object when invoked
6027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Test result
6037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
6047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The constructor of TestInfo registers itself with the UnitTest
6057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// singleton such that the RUN_ALL_TESTS() macro knows which tests to
6067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// run.
60757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestInfo {
6087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
6097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Destructs a TestInfo object.  This function is not virtual, so
6107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // don't inherit from TestInfo.
6117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ~TestInfo();
6127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the test case name.
6147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* test_case_name() const;
6157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the test name.
6177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* name() const;
6187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the test case comment.
6207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* test_case_comment() const;
6217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the test comment.
6237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* comment() const;
6247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
625190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true if this test should run, that is if the test is not disabled
626190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // (or it is disabled but the also_run_disabled_tests flag has been specified)
627190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // and its full name matches the user-specified filter.
6287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
6297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test allows the user to filter the tests by their full names.
6307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The full name of a test Bar in test case Foo is defined as
6317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // "Foo.Bar".  Only the tests that match the filter will run.
6327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
6337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // A filter is a colon-separated list of glob (not regex) patterns,
6347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // optionally followed by a '-' and a colon-separated list of
6357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // negative patterns (tests to exclude).  A test is run if it
6367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // matches one of the positive patterns and does not match any of
6377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the negative patterns.
6387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
6397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // For example, *A*:Foo.* is a filter that matches any string that
6407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // contains the character 'A' or starts with "Foo.".
6417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  bool should_run() const;
6427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the result of the test.
644190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestResult* result() const;
645190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
6467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
647e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_DEATH_TEST
6487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class internal::DefaultDeathTestFactory;
6497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_DEATH_TEST
6507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class Test;
6517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class TestCase;
652190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::TestInfoImpl;
653190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
6547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend TestInfo* internal::MakeAndRegisterTestInfo(
6557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      const char* test_case_name, const char* name,
6567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      const char* test_case_comment, const char* comment,
6577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      internal::TypeId fixture_class_id,
6587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Test::SetUpTestCaseFunc set_up_tc,
6597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Test::TearDownTestCaseFunc tear_down_tc,
6607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      internal::TestFactoryBase* factory);
6617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
662190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true if this test matches the user-specified filter.
663190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool matches_filter() const;
664190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
6657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Increments the number of death tests encountered in this test so
6667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // far.
6677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int increment_death_test_count();
6687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Accessors for the implementation object.
6707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::TestInfoImpl* impl() { return impl_; }
6717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const internal::TestInfoImpl* impl() const { return impl_; }
6727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Constructs a TestInfo object. The newly constructed instance assumes
6747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // ownership of the factory object.
6757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TestInfo(const char* test_case_name, const char* name,
6767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman           const char* test_case_comment, const char* comment,
6777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman           internal::TypeId fixture_class_id,
6787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman           internal::TestFactoryBase* factory);
6797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // An opaque implementation object.
6817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::TestInfoImpl* impl_;
6827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
6847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
6857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
686190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// A test case, which consists of a vector of TestInfos.
687190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
688190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestCase is not copyable.
68957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestCase {
690190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
691190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Creates a TestCase with the given name.
692190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
693190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // TestCase does NOT have a default constructor.  Always use this
694190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // constructor to create a TestCase object.
695190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
696190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Arguments:
697190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
698190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //   name:         name of the test case
699190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //   set_up_tc:    pointer to the function that sets up the test case
700190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //   tear_down_tc: pointer to the function that tears down the test case
701190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestCase(const char* name, const char* comment,
702190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer           Test::SetUpTestCaseFunc set_up_tc,
703190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer           Test::TearDownTestCaseFunc tear_down_tc);
704190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
705190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Destructor of TestCase.
706190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual ~TestCase();
707190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
708190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the name of the TestCase.
709190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const char* name() const { return name_.c_str(); }
710190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
711190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the test case comment.
712190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const char* comment() const { return comment_.c_str(); }
713190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
714190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true if any test in this test case should run.
715190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool should_run() const { return should_run_; }
716190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
717190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of successful tests in this test case.
718190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int successful_test_count() const;
719190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
720190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of failed tests in this test case.
721190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int failed_test_count() const;
722190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
723190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of disabled tests in this test case.
724190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int disabled_test_count() const;
725190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
726190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Get the number of tests in this test case that should run.
727190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_to_run_count() const;
728190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
729190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all tests in this test case.
730190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_test_count() const;
731190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
732190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test case passed.
733190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Passed() const { return !Failed(); }
734190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
735190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test case failed.
736190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Failed() const { return failed_test_count() > 0; }
737190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
738190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the elapsed time, in milliseconds.
739190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time() const { return elapsed_time_; }
740190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
741190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test among all the tests. i can range from 0 to
742190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_count() - 1. If i is not in that range, returns NULL.
743190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestInfo* GetTestInfo(int i) const;
744190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
745190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
746190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class Test;
747190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
748190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
749190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the (mutable) vector of TestInfos in this TestCase.
75057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
751190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
752190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the (immutable) vector of TestInfos in this TestCase.
75357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const std::vector<TestInfo*>& test_info_list() const {
75457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    return test_info_list_;
755190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
756190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
757190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test among all the tests. i can range from 0 to
758190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_count() - 1. If i is not in that range, returns NULL.
759190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestInfo* GetMutableTestInfo(int i);
760190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
761190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the should_run member.
762190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void set_should_run(bool should) { should_run_ = should; }
763190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
764190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
765190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // destruction of the TestCase object.
766190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void AddTestInfo(TestInfo * test_info);
767190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
768190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the results of all tests in this test case.
769190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void ClearResult();
770190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
771190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the results of all tests in the given test case.
772190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static void ClearTestCaseResult(TestCase* test_case) {
773190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    test_case->ClearResult();
774190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
775190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
776190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Runs every test in this TestCase.
777190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void Run();
778190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
779190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff test passed.
780190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool TestPassed(const TestInfo * test_info);
781190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
782190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff test failed.
783190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool TestFailed(const TestInfo * test_info);
784190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
785190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff test is disabled.
786190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool TestDisabled(const TestInfo * test_info);
787190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
788190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true if the given test should run.
789190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool ShouldRunTest(const TestInfo *test_info);
790190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
791190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Shuffles the tests in this test case.
792190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void ShuffleTests(internal::Random* random);
793190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
794190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Restores the test order to before the first shuffle.
795190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void UnshuffleTests();
796190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
797190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Name of the test case.
798190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::String name_;
799190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Comment on the test case.
800190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::String comment_;
801190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The vector of TestInfos in their original order.  It owns the
802190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // elements in the vector.
80357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestInfo*> test_info_list_;
804190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Provides a level of indirection for the test list to allow easy
805190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // shuffling and restoring the test order.  The i-th element in this
806190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // vector is the index of the i-th test in the shuffled test list.
80757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<int> test_indices_;
808190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Pointer to the function that sets up the test case.
809190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Test::SetUpTestCaseFunc set_up_tc_;
810190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Pointer to the function that tears down the test case.
811190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Test::TearDownTestCaseFunc tear_down_tc_;
812190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // True iff any test in this test case should run.
813190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool should_run_;
814190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Elapsed time, in milliseconds.
815190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time_;
816190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
817190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We disallow copying TestCases.
818190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
819190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
820190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
8217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// An Environment object is capable of setting up and tearing down an
8227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// environment.  The user should subclass this to define his own
8237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// environment(s).
8247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
8257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// An Environment object does the set-up and tear-down in virtual
8267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// methods SetUp() and TearDown() instead of the constructor and the
8277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// destructor, as:
8287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
8297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   1. You cannot safely throw from a destructor.  This is a problem
8307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      as in some cases Google Test is used where exceptions are enabled, and
8317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      we may want to implement ASSERT_* using exceptions where they are
8327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      available.
8337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   2. You cannot use ASSERT_* directly in a constructor or
8347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      destructor.
8357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass Environment {
8367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
8377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The d'tor is virtual as we need to subclass Environment.
8387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual ~Environment() {}
8397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
8407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Override this to define how to set up the environment.
8417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void SetUp() {}
8427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
8437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Override this to define how to tear down the environment.
8447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void TearDown() {}
8457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
8467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // If you see an error about overriding the following function or
8477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // about it being private, you have mis-spelled SetUp() as Setup().
8487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  struct Setup_should_be_spelled_SetUp {};
8497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
8507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
8517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
852190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The interface for tracing execution of tests. The methods are organized in
853190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// the order the corresponding events are fired.
854190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestEventListener {
855190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
856190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual ~TestEventListener() {}
857190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
858190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before any test activity starts.
859190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
860190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
861190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before each iteration of tests starts.  There may be more than
862190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
863190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // index, starting from 0.
864190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationStart(const UnitTest& unit_test,
865190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                    int iteration) = 0;
866190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
867190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before environment set-up for each iteration of tests starts.
868190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
869190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
870190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after environment set-up for each iteration of tests ends.
871190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
872190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
873190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before the test case starts.
874190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
875190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
876190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before the test starts.
877190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestStart(const TestInfo& test_info) = 0;
878190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
879190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after a failed assertion or a SUCCESS().
880190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
881190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
882190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after the test ends.
883190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestEnd(const TestInfo& test_info) = 0;
884190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
885190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after the test case ends.
886190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
887190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
888190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before environment tear-down for each iteration of tests starts.
889190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
890190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
891190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after environment tear-down for each iteration of tests ends.
892190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
893190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
894190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after each iteration of tests finishes.
895190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationEnd(const UnitTest& unit_test,
896190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                  int iteration) = 0;
897190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
898190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after all test activities have ended.
899190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
900190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
901190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
902190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The convenience class for users who need to override just one or two
903190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// methods and are not concerned that a possible change to a signature of
904190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// the methods they override will not be caught during the build.  For
905190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// comments about each method please see the definition of TestEventListener
906190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// above.
907190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass EmptyTestEventListener : public TestEventListener {
908190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
909190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
910190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
911190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                    int /*iteration*/) {}
912190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
913190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
914190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
915190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
916190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
917190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
918190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
919190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
920190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
921190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
922190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                  int /*iteration*/) {}
923190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
924190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
925190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
926190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestEventListeners lets users add listeners to track events in Google Test.
92757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestEventListeners {
928190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
929190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListeners();
930190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  ~TestEventListeners();
931190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
932190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Appends an event listener to the end of the list. Google Test assumes
933190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the ownership of the listener (i.e. it will delete the listener when
934190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the test program finishes).
935190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void Append(TestEventListener* listener);
936190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
937190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Removes the given event listener from the list and returns it.  It then
938190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // becomes the caller's responsibility to delete the listener. Returns
939190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // NULL if the listener is not found in the list.
940190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* Release(TestEventListener* listener);
941190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
942190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the standard listener responsible for the default console
943190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // output.  Can be removed from the listeners list to shut down default
944190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // console output.  Note that removing this object from the listener list
945190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // with Release transfers its ownership to the caller and makes this
946190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // function return NULL the next time.
947190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_result_printer() const {
948190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return default_result_printer_;
949190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
950190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
951190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the standard listener responsible for the default XML output
952190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // controlled by the --gtest_output=xml flag.  Can be removed from the
953190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // listeners list by users who want to shut down the default XML output
954190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // controlled by this flag and substitute it with custom one.  Note that
955190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // removing this object from the listener list with Release transfers its
956190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // ownership to the caller and makes this function return NULL the next
957190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // time.
958190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_xml_generator() const {
959190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return default_xml_generator_;
960190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
961190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
962190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
963190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class TestCase;
964190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::DefaultGlobalTestPartResultReporter;
965190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::NoExecDeathTest;
966190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::TestEventListenersAccessor;
967190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::TestInfoImpl;
968190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
969190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
970190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns repeater that broadcasts the TestEventListener events to all
971190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // subscribers.
972190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* repeater();
973190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
974190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the default_result_printer attribute to the provided listener.
975190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The listener is also added to the listener list and previous
976190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // default_result_printer is removed from it and deleted. The listener can
977190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // also be NULL in which case it will not be added to the list. Does
978190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // nothing if the previous and the current listener objects are the same.
979190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SetDefaultResultPrinter(TestEventListener* listener);
980190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
981190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the default_xml_generator attribute to the provided listener.  The
982190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // listener is also added to the listener list and previous
983190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // default_xml_generator is removed from it and deleted. The listener can
984190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // also be NULL in which case it will not be added to the list. Does
985190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // nothing if the previous and the current listener objects are the same.
986190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SetDefaultXmlGenerator(TestEventListener* listener);
987190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
988190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Controls whether events will be forwarded by the repeater to the
989190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // listeners in the list.
990190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool EventForwardingEnabled() const;
991190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SuppressEventForwarding();
992190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
993190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The actual list of listeners.
994190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::TestEventRepeater* repeater_;
995190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Listener responsible for the standard result output.
996190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_result_printer_;
997190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Listener responsible for the creation of the XML output file.
998190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_xml_generator_;
999190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1000190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We disallow copying TestEventListeners.
1001190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
1002190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
1003190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1004190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// A UnitTest consists of a vector of TestCases.
10057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
10067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This is a singleton class.  The only instance of UnitTest is
10077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// created when UnitTest::GetInstance() is first called.  This
10087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// instance is never deleted.
10097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
10107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// UnitTest is not copyable.
10117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
10127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This class is thread-safe as long as the methods are called
10137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// according to their specification.
101457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ UnitTest {
10157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
10167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the singleton UnitTest object.  The first time this method
10177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // is called, a UnitTest object is constructed and returned.
10187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Consecutive calls will return the same object.
10197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static UnitTest* GetInstance();
10207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Runs all tests in this UnitTest object and prints the result.
10227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns 0 if successful, or 1 otherwise.
10237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
10247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // This method can only be called from the main thread.
10257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
10267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
10277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int Run() GTEST_MUST_USE_RESULT_;
10287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the working directory when the first TEST() or TEST_F()
10307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // was executed.  The UnitTest object owns the string.
10317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* original_working_dir() const;
10327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the TestCase object for the test that's currently running,
10347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // or NULL if no test is running.
10357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const TestCase* current_test_case() const;
10367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the TestInfo object for the test that's currently running,
10387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // or NULL if no test is running.
10397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const TestInfo* current_test_info() const;
10407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1041190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the random seed used at the start of the current test run.
1042190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int random_seed() const;
1043190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1044e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_PARAM_TEST
10457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the ParameterizedTestCaseRegistry object used to keep track of
10467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // value-parameterized tests and instantiate and register them.
1047190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
1048190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
10497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
10507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_PARAM_TEST
10517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1052190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of successful test cases.
1053190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int successful_test_case_count() const;
1054190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1055190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of failed test cases.
1056190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int failed_test_case_count() const;
1057190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1058190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all test cases.
1059190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_test_case_count() const;
1060190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1061190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all test cases that contain at least one test
1062190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // that should run.
1063190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_case_to_run_count() const;
1064190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1065190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of successful tests.
1066190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int successful_test_count() const;
1067190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1068190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of failed tests.
1069190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int failed_test_count() const;
1070190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1071190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of disabled tests.
1072190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int disabled_test_count() const;
1073190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1074190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all tests.
1075190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_test_count() const;
1076190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1077190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of tests that should run.
1078190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_to_run_count() const;
1079190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1080190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the elapsed time, in milliseconds.
1081190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time() const;
1082190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1083190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the unit test passed (i.e. all test cases passed).
1084190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Passed() const;
1085190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1086190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the unit test failed (i.e. some test case failed
1087190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // or something outside of all tests failed).
1088190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Failed() const;
1089190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1090190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the i-th test case among all the test cases. i can range from 0 to
1091190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_case_count() - 1. If i is not in that range, returns NULL.
1092190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestCase* GetTestCase(int i) const;
1093190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1094190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the list of event listeners that can be used to track events
1095190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // inside Google Test.
1096190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListeners& listeners();
1097190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1098190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
1099190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Registers and returns a global test environment.  When a test
1100190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // program is run, all global test environments will be set-up in
1101190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the order they were registered.  After all tests in the program
1102190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // have finished, all global test environments will be torn-down in
1103190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the *reverse* order they were registered.
1104190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
1105190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The UnitTest object takes ownership of the given environment.
1106190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
1107190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // This method can only be called from the main thread.
1108190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Environment* AddEnvironment(Environment* env);
1109190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1110190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a TestPartResult to the current TestResult object.  All
1111190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
1112190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // eventually call this to report their results.  The user code
1113190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // should use the assertion macros instead of calling this directly.
1114190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void AddTestPartResult(TestPartResult::Type result_type,
1115190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         const char* file_name,
1116190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         int line_number,
1117190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         const internal::String& message,
1118190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         const internal::String& os_stack_trace);
1119190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1120190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a TestProperty to the current TestResult object. If the result already
1121190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // contains a property with the same key, the value will be updated.
1122190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void RecordPropertyForCurrentTest(const char* key, const char* value);
1123190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1124190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the i-th test case among all the test cases. i can range from 0 to
1125190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_case_count() - 1. If i is not in that range, returns NULL.
1126190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestCase* GetMutableTestCase(int i);
1127190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
11287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Accessors for the implementation object.
11297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::UnitTestImpl* impl() { return impl_; }
11307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const internal::UnitTestImpl* impl() const { return impl_; }
1131190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1132190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // These classes and funcions are friends as they need to access private
1133190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // members of UnitTest.
1134190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class Test;
1135190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::AssertHelper;
11367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class internal::ScopedTrace;
1137190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend Environment* AddGlobalTestEnvironment(Environment* env);
1138190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
1139190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend void internal::ReportFailureInUnknownLocation(
1140190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      TestPartResult::Type result_type,
1141190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      const internal::String& message);
11427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Creates an empty UnitTest.
11447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  UnitTest();
11457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // D'tor
11477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual ~UnitTest();
11487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
11507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test trace stack.
11517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void PushGTestTrace(const internal::TraceInfo& trace);
11527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Pops a trace from the per-thread Google Test trace stack.
11547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void PopGTestTrace();
11557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Protects mutable state in *impl_.  This is mutable as some const
11577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // methods need to lock it too.
11587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  mutable internal::Mutex mutex_;
11597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Opaque implementation object.  This field is never changed once
11617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the object is constructed.  We don't mark it as const here, as
11627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // doing so will cause a warning in the constructor of UnitTest.
11637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Mutable state in *impl_ is protected by mutex_.
11647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::UnitTestImpl* impl_;
11657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // We disallow copying UnitTest.
11677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
11687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
11697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A convenient wrapper for adding an environment for the test
11717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// program.
11727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
11737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// You should call this before RUN_ALL_TESTS() is called, probably in
11747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// main().  If you use gtest_main, you need to call this before main()
11757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// starts for it to take effect.  For example, you can define a global
11767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// variable like this:
11777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
11787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   testing::Environment* const foo_env =
11797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//       testing::AddGlobalTestEnvironment(new FooEnvironment);
11807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
11817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// However, we strongly recommend you to write your own main() and
11827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// call AddGlobalTestEnvironment() there, as relying on initialization
11837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of global variables makes the code harder to read and may cause
11847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// problems when you register multiple environments from different
11857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// translation units and the environments have dependencies among them
11867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (remember that the compiler doesn't guarantee the order in which
11877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// global variables from different translation units are initialized).
11887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninline Environment* AddGlobalTestEnvironment(Environment* env) {
11897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return UnitTest::GetInstance()->AddEnvironment(env);
11907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
11917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Initializes Google Test.  This must be called before calling
11937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// RUN_ALL_TESTS().  In particular, it parses a command line for the
11947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// flags that Google Test recognizes.  Whenever a Google Test flag is
11957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// seen, it is removed from argv, and *argc is decremented.
11967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
11977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// No value is returned.  Instead, the Google Test flag variables are
11987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// updated.
11997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Calling the function for the second time has no user-visible effect.
120157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ void InitGoogleTest(int* argc, char** argv);
12027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This overloaded version can be used in Windows programs compiled in
12047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// UNICODE mode.
120557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
12067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
12087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// These overloaded versions handle ::std::string and ::std::wstring.
121057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ inline String FormatForFailureMessage(const ::std::string& str) {
12117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return (Message() << '"' << str << '"').GetString();
12127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_WSTRING
121557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ inline String FormatForFailureMessage(const ::std::wstring& wstr) {
12167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return (Message() << "L\"" << wstr << '"').GetString();
12177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_STD_WSTRING
12197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// These overloaded versions handle ::string and ::wstring.
12217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_GLOBAL_STRING
122257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ inline String FormatForFailureMessage(const ::string& str) {
12237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return (Message() << '"' << str << '"').GetString();
12247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_GLOBAL_STRING
12267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_GLOBAL_WSTRING
122857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ inline String FormatForFailureMessage(const ::wstring& wstr) {
12297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return (Message() << "L\"" << wstr << '"').GetString();
12307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_GLOBAL_WSTRING
12327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
12347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// operand to be used in a failure message.  The type (but not value)
12357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of the other operand may affect the format.  This allows us to
12367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// print a char* as a raw pointer when it is compared against another
12377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// char*, and print it as a C string when it is compared against an
12387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// std::string object, for example.
12397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The default implementation ignores the type of the other operand.
12417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Some specialized versions are used to handle formatting wide or
12427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// narrow C strings.
12437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
12457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2>
12467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanString FormatForComparisonFailureMessage(const T1& value,
12477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         const T2& /* other_operand */) {
12487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return FormatForFailureMessage(value);
12497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_EQ.
12527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2>
12537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult CmpHelperEQ(const char* expected_expression,
12547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                            const char* actual_expression,
12557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                            const T1& expected,
12567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                            const T2& actual) {
1257e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#ifdef _MSC_VER
1258e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#pragma warning(push)          // Saves the current warning state.
1259e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#pragma warning(disable:4389)  // Temporarily disables warning on
1260e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer                               // signed/unsigned mismatch.
1261e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif
1262e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
12637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (expected == actual) {
12647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return AssertionSuccess();
12657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
12667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1267e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#ifdef _MSC_VER
1268e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#pragma warning(pop)          // Restores the warning state.
1269e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif
1270e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
12717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return EqFailure(expected_expression,
12727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   actual_expression,
12737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   FormatForComparisonFailureMessage(expected, actual),
12747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   FormatForComparisonFailureMessage(actual, expected),
12757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   false);
12767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// With this overloaded version, we allow anonymous enums to be used
12797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
12807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// can be implicitly cast to BiggestInt.
128157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
128257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                       const char* actual_expression,
128357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                       BiggestInt expected,
128457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                       BiggestInt actual);
12857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
12877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
12887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is a null pointer literal.  The following default implementation is
12897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// for lhs_is_null_literal being false.
12907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <bool lhs_is_null_literal>
12917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass EqHelper {
12927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
12937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // This templatized version is for the general case.
12947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename T1, typename T2>
12957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static AssertionResult Compare(const char* expected_expression,
12967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const char* actual_expression,
12977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const T1& expected,
12987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const T2& actual) {
12997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression, expected,
13007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                       actual);
13017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // With this overloaded version, we allow anonymous enums to be used
13047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
13057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // enums can be implicitly cast to BiggestInt.
13067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
13077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Even though its body looks the same as the above version, we
13087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // cannot merge the two, as it will make anonymous enums unhappy.
13097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static AssertionResult Compare(const char* expected_expression,
13107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const char* actual_expression,
13117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 BiggestInt expected,
13127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 BiggestInt actual) {
13137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression, expected,
13147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                       actual);
13157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
13177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This specialization is used when the first argument to ASSERT_EQ()
13197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is a null pointer literal.
13207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <>
13217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass EqHelper<true> {
13227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
13237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // We define two overloaded versions of Compare().  The first
13247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // version will be picked when the second argument to ASSERT_EQ() is
13257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
13267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // EXPECT_EQ(false, a_bool).
13277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename T1, typename T2>
13287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static AssertionResult Compare(const char* expected_expression,
13297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const char* actual_expression,
13307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const T1& expected,
13317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const T2& actual) {
13327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression, expected,
13337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                       actual);
13347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // This version will be picked when the second argument to
13377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // ASSERT_EQ() is a pointer, e.g. ASSERT_EQ(NULL, a_pointer).
13387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename T1, typename T2>
13397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static AssertionResult Compare(const char* expected_expression,
13407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const char* actual_expression,
1341e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer                                 const T1& /* expected */,
13427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 T2* actual) {
13437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    // We already know that 'expected' is a null pointer.
13447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression,
13457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                       static_cast<T2*>(NULL), actual);
13467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
13487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A macro for implementing the helper functions needed to implement
13507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
13517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of similar code.
13527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
13537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For each templatized helper function, we also define an overloaded
13547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// version for BiggestInt in order to reduce code bloat and allow
13557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
13567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// with gcc 4.
13577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
13587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
13597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
13607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2>\
13617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
13627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                   const T1& val1, const T2& val2) {\
13637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (val1 op val2) {\
13647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return AssertionSuccess();\
13657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  } else {\
13667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    Message msg;\
13677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    msg << "Expected: (" << expr1 << ") " #op " (" << expr2\
13687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
13697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
13707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return AssertionFailure(msg);\
13717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }\
13727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}\
137357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelper##op_name(\
137457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
13757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
13777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_NE
137957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(NE, !=);
13807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_LE
138157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(LE, <=);
13827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_LT
138357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(LT, < );
13847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_GE
138557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(GE, >=);
13867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_GT
138757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(GT, > );
13887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#undef GTEST_IMPL_CMP_HELPER_
13907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STREQ.
13927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
13937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
139457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
139557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* actual_expression,
139657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* expected,
139757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* actual);
13987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
14007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
140257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
140357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* actual_expression,
140457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* expected,
140557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* actual);
14067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STRNE.
14087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
141057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
141157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s2_expression,
141257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s1,
141357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s2);
14147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STRCASENE.
14167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
141857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
141957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* s2_expression,
142057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* s1,
142157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* s2);
14227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for *_STREQ on wide strings.
14257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
142757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
142857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* actual_expression,
142957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* expected,
143057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* actual);
14317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for *_STRNE on wide strings.
14337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
143557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
143657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s2_expression,
143757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* s1,
143857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* s2);
14397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
14417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// IsSubstring() and IsNotSubstring() are intended to be used as the
14437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
14447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// themselves.  They check whether needle is a substring of haystack
14457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (NULL is considered a substring of itself only), and return an
14467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// appropriate error message when they fail.
14477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The {needle,haystack}_expr arguments are the stringified
14497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// expressions that generated the two real arguments.
145057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
14517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle, const char* haystack);
145357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
14547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const wchar_t* needle, const wchar_t* haystack);
145657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
14577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle, const char* haystack);
145957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
14607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const wchar_t* needle, const wchar_t* haystack);
146257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
14637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::string& needle, const ::std::string& haystack);
146557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
14667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::string& needle, const ::std::string& haystack);
14687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_WSTRING
147057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
14717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::wstring& needle, const ::std::wstring& haystack);
147357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
14747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
14757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::wstring& needle, const ::std::wstring& haystack);
14767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_STD_WSTRING
14777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
14797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper template function for comparing floating-points.
14817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Template parameter:
14837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   RawType: the raw floating-point type (either float or double)
14857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
14877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename RawType>
14887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
14897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         const char* actual_expression,
14907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         RawType expected,
14917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         RawType actual) {
14927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const FloatingPoint<RawType> lhs(expected), rhs(actual);
14937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (lhs.AlmostEquals(rhs)) {
14957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return AssertionSuccess();
14967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
14977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  StrStream expected_ss;
14997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
15007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              << expected;
15017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  StrStream actual_ss;
15037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
15047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman            << actual;
15057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return EqFailure(expected_expression,
15077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   actual_expression,
15087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   StrStreamToString(&expected_ss),
15097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   StrStreamToString(&actual_ss),
15107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   false);
15117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
15127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for implementing ASSERT_NEAR.
15147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
151657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
151757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                const char* expr2,
151857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                const char* abs_error_expr,
151957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                double val1,
152057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                double val2,
152157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                double abs_error);
15227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
15247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A class that enables one to stream messages to assertion macros
152557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ AssertHelper {
15267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
15277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Constructor.
1528190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  AssertHelper(TestPartResult::Type type,
1529190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer               const char* file,
1530190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer               int line,
15317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman               const char* message);
1532190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  ~AssertHelper();
1533190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
15347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Message assignment is a semantic trick to enable assertion
15357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // streaming; see the GTEST_MESSAGE_ macro below.
15367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void operator=(const Message& message) const;
1537190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
15387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
1539190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We put our data in a struct so that the size of the AssertHelper class can
1540190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // be as small as possible.  This is important because gcc is incapable of
1541190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // re-using stack space even for temporary variables, so every EXPECT_EQ
1542190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // reserves stack space for another AssertHelper.
1543190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  struct AssertHelperData {
1544190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    AssertHelperData(TestPartResult::Type t,
1545190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                     const char* srcfile,
1546190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                     int line_num,
1547190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                     const char* msg)
1548190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        : type(t), file(srcfile), line(line_num), message(msg) { }
1549190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1550190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    TestPartResult::Type const type;
1551190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    const char*        const file;
1552190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    int                const line;
1553190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    String             const message;
1554190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1555190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer   private:
1556190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
1557190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  };
1558190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1559190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  AssertHelperData* const data_;
15607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
15627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
15637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
15657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1566e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_PARAM_TEST
15677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The abstract base class that all value-parameterized tests inherit from.
15687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This class adds support for accessing the test parameter value via
15707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the GetParam() method.
15717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Use it with one of the parameter generator defining functions, like Range(),
15737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Values(), ValuesIn(), Bool(), and Combine().
15747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// class FooTest : public ::testing::TestWithParam<int> {
15767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  protected:
15777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   FooTest() {
15787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
15797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
15807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual ~FooTest() {
15817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
15827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
15837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual void SetUp() {
15847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
15857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
15867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual void TearDown {
15877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
15887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
15897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// };
15907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TEST_P(FooTest, DoesBar) {
15917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   // Can use GetParam() method here.
15927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Foo foo;
15937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_TRUE(foo.DoesBar(GetParam()));
15947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
15957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
15967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
15987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass TestWithParam : public Test {
15997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
16007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef T ParamType;
16017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The current parameter value. Is also available in the test fixture's
16037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // constructor.
16047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const ParamType& GetParam() const { return *parameter_; }
16057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
16077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets parameter value. The caller is responsible for making sure the value
16087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // remains alive and unchanged throughout the current test.
16097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void SetParam(const ParamType* parameter) {
16107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    parameter_ = parameter;
16117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
16127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Static value used for accessing parameter during a test lifetime.
16147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static const ParamType* parameter_;
16157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // TestClass must be a subclass of TestWithParam<T>.
16177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <class TestClass> friend class internal::ParameterizedTestFactory;
16187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
16197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
16217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanconst T* TestWithParam<T>::parameter_ = NULL;
16227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_PARAM_TEST
16247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for indicating success/failure in test code.
16267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ADD_FAILURE unconditionally adds a failure to the current test.
16287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SUCCEED generates a success - it doesn't automatically make the
16297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// current test successful, as a test is only successful when it has
16307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// no failure.
16317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_* verifies that a certain condition is satisfied.  If not,
16337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// it behaves like ADD_FAILURE.  In particular:
16347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_TRUE  verifies that a Boolean condition is true.
16367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_FALSE verifies that a Boolean condition is false.
16377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
16397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// that they will also abort the current function on failure.  People
16407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
16417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// writing data-driven tests often find themselves using ADD_FAILURE
16427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// and EXPECT_* more.
16437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples:
16457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_TRUE(server.StatusIsOK());
16477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_FALSE(server.HasPendingRequest(port))
16487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//       << "There are still pending requests " << "on port " << port;
16497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Generates a nonfatal failure with a generic message.
16517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
16527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Generates a fatal failure with a generic message.
165457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
165557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
165657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Define this macro to 1 to omit the definition of FAIL(), which is a
165757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// generic name and clashes with some other libraries.
165857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#if !GTEST_DONT_DEFINE_FAIL
165957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define FAIL() GTEST_FAIL()
166057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#endif
16617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Generates a success with a generic message.
166357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
166457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
166557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Define this macro to 1 to omit the definition of SUCCEED(), which
166657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// is a generic name and clashes with some other libraries.
166757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#if !GTEST_DONT_DEFINE_SUCCEED
166857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define SUCCEED() GTEST_SUCCEED()
166957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#endif
16707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for testing exceptions.
16727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
16747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that the statement throws the expected exception.
16757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_NO_THROW(statement):
16767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that the statement doesn't throw any exception.
16777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_ANY_THROW(statement):
16787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that the statement throws an exception.
16797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_THROW(statement, expected_exception) \
16817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
16827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NO_THROW(statement) \
16837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
16847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_ANY_THROW(statement) \
16857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
16867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_THROW(statement, expected_exception) \
16877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
16887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_NO_THROW(statement) \
16897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
16907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_ANY_THROW(statement) \
16917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
16927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
169357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Boolean assertions. Condition can be either a Boolean expression or an
169457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// AssertionResult. For more information on how to use AssertionResult with
169557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// these macros see comments on that class.
16967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_TRUE(condition) \
16977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
16987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_NONFATAL_FAILURE_)
16997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FALSE(condition) \
17007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
17017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_NONFATAL_FAILURE_)
17027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_TRUE(condition) \
17037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
17047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_FATAL_FAILURE_)
17057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_FALSE(condition) \
17067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
17077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_FATAL_FAILURE_)
17087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Includes the auto-generated header that implements a family of
17107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// generic predicate assertion macros.
17117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <gtest/gtest_pred_impl.h>
17127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for testing equalities and inequalities.
17147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
17167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
17177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
17187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
17197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
17207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
17217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// When they are not, Google Test prints both the tested expressions and
17237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// their actual values.  The values must be compatible built-in types,
17247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// or you will get a compiler error.  By "compatible" we mean that the
17257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// values can be compared by the respective operator.
17267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note:
17287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   1. It is possible to make a user-defined type work with
17307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   {ASSERT|EXPECT}_??(), but that requires overloading the
17317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   comparison operators and is thus discouraged by the Google C++
17327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Usage Guide.  Therefore, you are advised to use the
17337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
17347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   equal.
17357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
17377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   pointers (in particular, C strings).  Therefore, if you use it
17387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   with two C strings, you are testing how their locations in memory
17397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   are related, not how their content is related.  To compare two C
17407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   strings by content, use {ASSERT|EXPECT}_STR*().
17417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
17437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
17447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   what the actual value is when it fails, and similarly for the
17457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   other comparisons.
17467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
17487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   evaluate their arguments, which is undefined.
17497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   5. These macros evaluate their arguments exactly once.
17517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples:
17537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_NE(5, Foo());
17557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_EQ(NULL, a_pointer);
17567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_LT(i, array_size);
17577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_GT(records.size(), 0) << "There is no record left.";
17587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_EQ(expected, actual) \
17607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal:: \
17617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
17627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
17637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NE(expected, actual) \
17647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
17657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_LE(val1, val2) \
17667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
17677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_LT(val1, val2) \
17687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
17697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_GE(val1, val2) \
17707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
17717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_GT(val1, val2) \
17727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
17737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_EQ(expected, actual) \
17757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal:: \
17767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
17777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
17787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_NE(val1, val2) \
17797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
17807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_LE(val1, val2) \
17817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
17827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_LT(val1, val2) \
17837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
17847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_GE(val1, val2) \
17857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
17867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_GT(val1, val2) \
17877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
17887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// C String Comparisons.  All tests treat NULL and any non-NULL string
17907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// as different.  Two NULLs are equal.
17917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
17937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
17947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
17957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
17967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For wide or narrow string objects, you can use the
17987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// {ASSERT|EXPECT}_??() macros.
17997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't depend on the order in which the arguments are evaluated,
18017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// which is undefined.
18027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// These macros evaluate their arguments exactly once.
18047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STREQ(expected, actual) \
18067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
18077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STRNE(s1, s2) \
18087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
18097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STRCASEEQ(expected, actual) \
18107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
18117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STRCASENE(s1, s2)\
18127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
18137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STREQ(expected, actual) \
18157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
18167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STRNE(s1, s2) \
18177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
18187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STRCASEEQ(expected, actual) \
18197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
18207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STRCASENE(s1, s2)\
18217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
18227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for comparing floating-point numbers.
18247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
18267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that two float values are almost equal.
18277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
18287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that two double values are almost equal.
18297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
18307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that v1 and v2 are within the given distance to each other.
18317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Google Test uses ULP-based comparison to automatically pick a default
18337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// error bound that is appropriate for the operands.  See the
18347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FloatingPoint template class in gtest-internal.h if you are
18357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// interested in the implementation details.
18367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FLOAT_EQ(expected, actual)\
18387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
18397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
18407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_DOUBLE_EQ(expected, actual)\
18427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
18437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
18447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_FLOAT_EQ(expected, actual)\
18467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
18477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
18487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_DOUBLE_EQ(expected, actual)\
18507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
18517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
18527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NEAR(val1, val2, abs_error)\
18547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
18557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      val1, val2, abs_error)
18567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_NEAR(val1, val2, abs_error)\
18587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
18597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      val1, val2, abs_error)
18607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// These predicate format functions work on floating-point values, and
18627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
18637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
18657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Asserts that val1 is less than, or almost equal to, val2.  Fails
18677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// otherwise.  In particular, it fails if either val1 or val2 is NaN.
186857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
186957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                   float val1, float val2);
187057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
187157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                    double val1, double val2);
18727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1874e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_OS_WINDOWS
18757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros that test for HRESULT failure and success, these are only useful
18777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// on Windows, and rely on Windows SDK macros and APIs to compile.
18787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
18807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// When expr unexpectedly fails or succeeds, Google Test prints the
18827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// expected result and the actual result with both a human-readable
18837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// string representation of the error, if available, as well as the
18847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// hex result code.
18857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_HRESULT_SUCCEEDED(expr) \
18867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
18877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_HRESULT_SUCCEEDED(expr) \
18897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
18907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_HRESULT_FAILED(expr) \
18927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
18937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_HRESULT_FAILED(expr) \
18957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
18967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_OS_WINDOWS
18987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros that execute statement and check that it doesn't generate new fatal
19007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// failures in the current thread.
19017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
19037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples:
19057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_NO_FATAL_FAILURE(Process());
19077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
19087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_NO_FATAL_FAILURE(statement) \
19107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
19117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NO_FATAL_FAILURE(statement) \
19127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
19137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Causes a trace (including the source file path, the current line
19157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// number, and the given message) to be included in every test failure
19167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// message generated by code in the current scope.  The effect is
19177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// undone when the control leaves the current scope.
19187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The message argument can be anything streamable to std::ostream.
19207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In the implementation, we include the current line number as part
19227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
19237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to appear in the same block - as long as they are on different
19247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// lines.
19257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define SCOPED_TRACE(message) \
19267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
19277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    __FILE__, __LINE__, ::testing::Message() << (message))
19287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1929e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramernamespace internal {
1930e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
1931e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This template is declared, but intentionally undefined.
1932e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramertemplate <typename T1, typename T2>
1933e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerstruct StaticAssertTypeEqHelper;
1934e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
1935e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramertemplate <typename T>
1936e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerstruct StaticAssertTypeEqHelper<T, T> {};
1937e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
1938e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer}  // namespace internal
1939e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
1940e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Compile-time assertion for type equality.
1941e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
1942e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the same type.  The value it returns is not interesting.
1943e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1944e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Instead of making StaticAssertTypeEq a class template, we make it a
1945e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// function template that invokes a helper class template.  This
1946e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
1947e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// defining objects of that type.
1948e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1949e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// CAVEAT:
1950e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1951e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// When used inside a method of a class template,
1952e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
1953e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// instantiated.  For example, given:
1954e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1955e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   template <typename T> class Foo {
1956e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//    public:
1957e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
1958e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   };
1959e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1960e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the code:
1961e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1962e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   void Test1() { Foo<bool> foo; }
1963e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1964e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// will NOT generate a compiler error, as Foo<bool>::Bar() is never
1965e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// actually instantiated.  Instead, you need:
1966e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1967e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   void Test2() { Foo<bool> foo; foo.Bar(); }
1968e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
1969e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// to cause a compiler error.
1970e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramertemplate <typename T1, typename T2>
1971e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerbool StaticAssertTypeEq() {
1972e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer  internal::StaticAssertTypeEqHelper<T1, T2>();
1973e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer  return true;
1974e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer}
19757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines a test.
19777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The first parameter is the name of the test case, and the second
19797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parameter is the name of the test within the test case.
19807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The convention is to end the test case name with "Test".  For
19827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// example, a test case for the Foo class can be named FooTest.
19837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user should put his test code between braces after using this
19857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// macro.  Example:
19867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST(FooTest, InitializesCorrectly) {
19887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Foo foo;
19897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_TRUE(foo.StatusIsOK());
19907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
19917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note that we call GetTestTypeId() instead of GetTypeId<
19937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::testing::Test>() here to get the type ID of testing::Test.  This
19947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is to work around a suspected linker bug when using Google Test as
19957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// a framework on Mac OS X.  The bug causes GetTypeId<
19967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::testing::Test>() to return different values depending on whether
19977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the call is from the Google Test framework itself or from user test
19987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// code.  GetTestTypeId() is guaranteed to always return the same
19997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// value, as it always calls GetTypeId<>() from the Google Test
20007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// framework.
200157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define GTEST_TEST(test_case_name, test_name)\
2002e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer  GTEST_TEST_(test_case_name, test_name, \
20037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              ::testing::Test, ::testing::internal::GetTestTypeId())
20047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
200557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Define this macro to 1 to omit the definition of TEST(), which
200657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// is a generic name and clashes with some other libraries.
200757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#if !GTEST_DONT_DEFINE_TEST
200857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
200957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#endif
20107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines a test that uses a test fixture.
20127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The first parameter is the name of the test fixture class, which
20147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// also doubles as the test case name.  The second parameter is the
20157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// name of the test within the test case.
20167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A test fixture class must be declared earlier.  The user should put
20187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// his test code between braces after using this macro.  Example:
20197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   class FooTest : public testing::Test {
20217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    protected:
20227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     virtual void SetUp() { b_.AddElement(3); }
20237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Foo a_;
20257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Foo b_;
20267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   };
20277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, InitializesCorrectly) {
20297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_TRUE(a_.StatusIsOK());
20307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
20317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
20337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_EQ(0, a_.size());
20347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_EQ(1, b_.size());
20357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
20367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define TEST_F(test_fixture, test_name)\
2038e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer  GTEST_TEST_(test_fixture, test_name, test_fixture, \
20397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              ::testing::internal::GetTypeId<test_fixture>())
20407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Use this macro in main() to run all tests.  It returns 0 if all
20427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// tests are successful, or 1 otherwise.
20437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// RUN_ALL_TESTS() should be invoked after the command line has been
20457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parsed by InitGoogleTest().
20467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define RUN_ALL_TESTS()\
20487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  (::testing::UnitTest::GetInstance()->Run())
20497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
20517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
2053