gtest.h revision b33f8e3e55932d0e15a686ef0c598da8dbc37acd
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
57b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-internal.h"
58b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-string.h"
59b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-death-test.h"
60b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-message.h"
61b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-param-test.h"
62b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-printers.h"
63b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest_prod.h"
64b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-test-part.h"
65b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-typed-test.h"
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Depending on the platform, different string classes are available.
6857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// On Linux, in addition to ::std::string, Google also makes use of
6957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// class ::string, which has the same interface as ::std::string, but
7057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// has a different implementation.
7157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
7257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
7357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// ::string is available AND is a distinct type to ::std::string, or
7457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// define it to 0 to indicate otherwise.
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If the user's ::std::string and ::string are the same class due to
7757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
7957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
8057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// heuristically.
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing {
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
84e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Declares the flags.
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
86e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag temporary enables the disabled tests.
87e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(also_run_disabled_tests);
88e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
89e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag brings the debugger on an assertion failure.
90e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(break_on_failure);
91e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
92e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag controls whether Google Test catches all test-thrown exceptions
93e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// and logs them as failures.
94e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(catch_exceptions);
95e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
96e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag enables using colors in terminal output. Available values are
97e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
98e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// to let Google Test decide.
99e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_string_(color);
100e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
101e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag sets up the filter to select by name using a glob pattern
102e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the tests to run. If the filter is not given all tests are executed.
103e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_string_(filter);
104e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
105e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag causes the Google Test to list tests. None of the tests listed
106e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// are actually run if the flag is provided.
107e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(list_tests);
108e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
109e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag controls whether Google Test emits a detailed XML report to a file
110e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// in addition to its normal textual output.
111e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_string_(output);
112e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
113e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flags control whether Google Test prints the elapsed time for each
114e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// test.
115e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(print_time);
116e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
117190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// This flag specifies the random number seed.
118190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerGTEST_DECLARE_int32_(random_seed);
119190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
120e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag sets how many times the tests are repeated. The default value
121e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// is 1. If the value is -1 the tests are repeating forever.
122e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_int32_(repeat);
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This flag controls whether Google Test includes Google Test internal
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// stack frames in failure stack traces.
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanGTEST_DECLARE_bool_(show_internal_stack_frames);
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
128190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// When this flag is specified, tests' order is randomized on every iteration.
129190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerGTEST_DECLARE_bool_(shuffle);
130190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
131e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// This flag specifies the maximum number of stack frames to be
132e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// printed in a failure message.
133e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_int32_(stack_trace_depth);
134e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
135e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// When this flag is specified, a failed assertion will throw an
136e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// exception if exceptions are enabled, or exit the program with a
137e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// non-zero code otherwise.
138e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin KramerGTEST_DECLARE_bool_(throw_on_failure);
139e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
140b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// When this flag is set with a "host:port" string, on supported
141b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// platforms test results are streamed to the specified port on
142b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// the specified host machine.
143b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay FoadGTEST_DECLARE_string_(stream_result_to);
144b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
145e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// The upper limit for valid stack trace depths.
146e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerconst int kMaxStackTraceDepth = 100;
147e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
150190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass AssertHelper;
151190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass DefaultGlobalTestPartResultReporter;
152190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass ExecDeathTest;
153190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass NoExecDeathTest;
154190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass FinalSuccessChecker;
1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass GTestFlagSaver;
156190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestResultAccessor;
157190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestEventListenersAccessor;
158190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestEventRepeater;
159190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass WindowsDeathTest;
160190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass UnitTestImpl* GetUnitTestImpl();
161190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
162190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                    const String& message);
1637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Converts a streamable value to a String.  A NULL pointer is
1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// converted to "(null)".  When the input value is a ::string,
1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::std::string, ::wstring, or ::std::wstring object, each NUL
1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// character in it is replaced with "\\0".
1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Declared in gtest-internal.h but defined here, so that it has access
1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to the definition of the Message class, required by the ARM
1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// compiler.
1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanString StreamableToString(const T& streamable) {
1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return (Message() << streamable).GetString();
1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
178b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// The friend relationship of some of these classes is cyclic.
179b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// If we don't forward declare them the compiler might confuse the classes
180b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// in friendship clauses with same named classes on the scope.
181b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass Test;
182b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass TestCase;
183b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass TestInfo;
184b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass UnitTest;
185b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A class for indicating whether an assertion was successful.  When
1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the assertion wasn't successful, the AssertionResult object
18857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// remembers a non-empty message that describes how it failed.
1897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// To create an instance of this class, use one of the factory functions
1917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (AssertionSuccess() and AssertionFailure()).
1927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// This class is useful for two purposes:
19457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   1. Defining predicate functions to be used with Boolean test assertions
19557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
19657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   2. Defining predicate-format functions to be
19757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
19857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
19957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// For example, if you define IsEven predicate:
20057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
20157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   testing::AssertionResult IsEven(int n) {
20257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     if ((n % 2) == 0)
20357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionSuccess();
20457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     else
20557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionFailure() << n << " is odd";
20657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   }
20757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
20857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
20957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// will print the message
21057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
21157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Value of: IsEven(Fib(5))
21257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     Actual: false (5 is odd)
21357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Expected: true
21457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
21557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// instead of a more opaque
21657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
21757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Value of: IsEven(Fib(5))
21857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     Actual: false
21957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Expected: true
22057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
22157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// in case IsEven is a simple Boolean predicate.
22257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
22357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// If you expect your predicate to be reused and want to support informative
22457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
22557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// about half as often as positive ones in our tests), supply messages for
22657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// both success and failure cases:
22757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
22857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   testing::AssertionResult IsEven(int n) {
22957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     if ((n % 2) == 0)
23057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionSuccess() << n << " is even";
23157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     else
23257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionFailure() << n << " is odd";
23357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   }
23457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
23557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
23657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
23757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Value of: IsEven(Fib(6))
23857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     Actual: true (8 is even)
23957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//   Expected: false
24057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
24157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// NB: Predicates that support negative Boolean assertions have reduced
24257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// performance in positive ones so be careful not to use them in tests
24357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// that have lots (tens of thousands) of positive Boolean assertions.
24457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
24557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// To use this class with EXPECT_PRED_FORMAT assertions such as:
2467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   // Verifies that Foo() returns an even number.
2487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_PRED_FORMAT1(IsEven, Foo());
2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
25057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// you need to define:
2517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   testing::AssertionResult IsEven(const char* expr, int n) {
25357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     if ((n % 2) == 0)
25457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionSuccess();
25557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//     else
25657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//       return testing::AssertionFailure()
25757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
2587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
2597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If Foo() returns 5, you will see the following message:
2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Expected: Foo() is even
2637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Actual: it's 5
26457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer//
26557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ AssertionResult {
2667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
26757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Copy constructor.
26857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Used in EXPECT_TRUE/FALSE(assertion_result).
26957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  AssertionResult(const AssertionResult& other);
27057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Used in the EXPECT_TRUE/FALSE(bool_expression).
27157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  explicit AssertionResult(bool success) : success_(success) {}
2727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns true iff the assertion succeeded.
27457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  operator bool() const { return success_; }  // NOLINT
27557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
27657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
27757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  AssertionResult operator!() const;
27857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
27957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Returns the text streamed into this AssertionResult. Test assertions
28057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // use it when they fail (i.e., the predicate's outcome doesn't match the
28157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // assertion's expectation). When nothing has been streamed into the
28257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // object, returns an empty string.
28357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const char* message() const {
284b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return message_.get() != NULL ?  message_->c_str() : "";
28557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  }
28657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // TODO(vladl@google.com): Remove this after making sure no clients use it.
28757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Deprecated; please use message() instead.
28857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const char* failure_message() const { return message(); }
2897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
29057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Streams a custom failure message into this object.
291b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  template <typename T> AssertionResult& operator<<(const T& value) {
292b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    AppendMessage(Message() << value);
293b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return *this;
294b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
295b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
296b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Allows streaming basic output manipulators such as endl or flush into
297b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // this object.
298b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  AssertionResult& operator<<(
299b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
300b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    AppendMessage(Message() << basic_manipulator);
301b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return *this;
302b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
3037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
305b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Appends the contents of message to message_.
306b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  void AppendMessage(const Message& a_message) {
307b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    if (message_.get() == NULL)
308b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      message_.reset(new ::std::string);
309b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    message_->append(a_message.GetString().c_str());
310b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
31157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
31257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Stores result of the assertion predicate.
31357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  bool success_;
31457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Stores the message describing the condition in case the expectation
31557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // construct is not satisfied with the predicate's outcome.
31657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // Referenced via a pointer to avoid taking too much stack frame space
31757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  // with test assertions.
318b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  internal::scoped_ptr< ::std::string> message_;
31957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
320b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  GTEST_DISALLOW_ASSIGN_(AssertionResult);
321b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad};
3227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Makes a successful assertion result.
32457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult AssertionSuccess();
32557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
32657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Makes a failed assertion result.
32757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult AssertionFailure();
3287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Makes a failed assertion result with the given failure message.
33057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Deprecated; use AssertionFailure() << msg.
33157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult AssertionFailure(const Message& msg);
3327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The abstract class that all tests inherit from.
3347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In Google Test, a unit test program contains one or many TestCases, and
3367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// each TestCase contains one or many Tests.
3377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// When you define a test using the TEST macro, you don't need to
3397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// explicitly derive from Test - the TEST macro automatically does
3407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this for you.
3417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The only time you derive from Test is when defining a test fixture
3437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to be used a TEST_F.  For example:
3447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   class FooTest : public testing::Test {
3467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    protected:
3477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     virtual void SetUp() { ... }
3487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     virtual void TearDown() { ... }
3497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     ...
3507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   };
3517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, Bar) { ... }
3537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, Baz) { ... }
3547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
3557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Test is not copyable.
35657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ Test {
3577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
358b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  friend class TestInfo;
3597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Defines types for pointers to functions that set up and tear down
3617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // a test case.
3627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
3637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
3647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The d'tor is virtual as we intend to inherit from Test.
3667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual ~Test();
3677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets up the stuff shared by all tests in this test case.
3697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
3707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test will call Foo::SetUpTestCase() before running the first
3717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // test in test case Foo.  Hence a sub-class can define its own
3727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // SetUpTestCase() method to shadow the one defined in the super
3737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // class.
3747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void SetUpTestCase() {}
3757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Tears down the stuff shared by all tests in this test case.
3777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
3787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test will call Foo::TearDownTestCase() after running the last
3797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // test in test case Foo.  Hence a sub-class can define its own
3807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // TearDownTestCase() method to shadow the one defined in the super
3817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // class.
3827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void TearDownTestCase() {}
3837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns true iff the current test has a fatal failure.
3857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static bool HasFatalFailure();
3867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
387190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the current test has a non-fatal failure.
388190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool HasNonfatalFailure();
389190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
390190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the current test has a (either fatal or
391190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // non-fatal) failure.
392190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
393190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
3947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Logs a property for the current test.  Only the last value for a given
3957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // key is remembered.
3967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // These are public static so they can be called from utility functions
3977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // that are not members of the test fixture.
3987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The arguments are const char* instead strings, as Google Test is used
3997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // on platforms where string doesn't compile.
4007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Note that a driving consideration for these RecordProperty methods
4027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // was to produce xml output suited to the Greenspan charting utility,
4037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // which at present will only chart values that fit in a 32-bit int. It
4047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // is the user's responsibility to restrict their values to 32-bit ints
4057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // if they intend them to be used with Greenspan.
4067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void RecordProperty(const char* key, const char* value);
4077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void RecordProperty(const char* key, int value);
4087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman protected:
4107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Creates a Test object.
4117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  Test();
4127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets up the test fixture.
4147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void SetUp();
4157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Tears down the test fixture.
4177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void TearDown();
4187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
4207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns true iff the current test has the same fixture class as
4217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the first test in the current test case.
4227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static bool HasSameFixtureClass();
4237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Runs the test after the test fixture has been set up.
4257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // A sub-class must implement this to define the test logic.
4277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
4297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Instead, use the TEST or TEST_F macro.
4307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void TestBody() = 0;
4317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets up, executes, and tears down the test.
4337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void Run();
4347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
435b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Deletes self.  We deliberately pick an unusual name for this
436b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // internal method to avoid clashing with names used in user TESTs.
437b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  void DeleteSelf_() { delete this; }
438b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
4397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Uses a GTestFlagSaver to save and restore all Google Test flags.
4407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const internal::GTestFlagSaver* const gtest_flag_saver_;
4417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Often a user mis-spells SetUp() as Setup() and spends a long time
4437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // wondering why it is never called by Google Test.  The declaration of
4447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the following method is solely for catching such an error at
4457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // compile time:
4467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   - The return type is deliberately chosen to be not void, so it
4487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   will be a conflict if a user declares void Setup() in his test
4497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   fixture.
4507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   - This method is private, so it will be another compiler error
4527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //   if a user calls it from his test fixture.
4537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // DO NOT OVERRIDE THIS FUNCTION.
4557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
4567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // If you see an error about overriding the following function or
4577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // about it being private, you have mis-spelled SetUp() as Setup().
4587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  struct Setup_should_be_spelled_SetUp {};
4597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
4607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
4617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // We disallow copying Tests.
4627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
4637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
4647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
465190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramertypedef internal::TimeInMillis TimeInMillis;
466190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
467190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// A copyable object representing a user specified test property which can be
468190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// output as a key/value string pair.
469190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
470190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Don't inherit from TestProperty as its destructor is not virtual.
471190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestProperty {
472190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
473190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // C'tor.  TestProperty does NOT have a default constructor.
474190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Always use this constructor (with parameters) to create a
475190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // TestProperty object.
47657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  TestProperty(const char* a_key, const char* a_value) :
47757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    key_(a_key), value_(a_value) {
478190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
479190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
480190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the user supplied key.
481190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const char* key() const {
482190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return key_.c_str();
483190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
484190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
485190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the user supplied value.
486190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const char* value() const {
487190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return value_.c_str();
488190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
489190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
490190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets a new value, overriding the one supplied in the constructor.
491190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SetValue(const char* new_value) {
492190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    value_ = new_value;
493190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
494190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
495190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
496190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The key supplied by the user.
497190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::String key_;
498190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The value supplied by the user.
499190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::String value_;
500190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
501190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
502190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The result of a single Test.  This includes a list of
503190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestPartResults, a list of TestProperties, a count of how many
504190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// death tests there are in the Test, and how much time it took to run
505190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// the Test.
506190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
507190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestResult is not copyable.
50857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestResult {
509190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
510190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Creates an empty TestResult.
511190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestResult();
512190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
513190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // D'tor.  Do not inherit from TestResult.
514190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  ~TestResult();
515190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
516190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all test parts.  This is the sum of the number
517190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // of successful test parts and the number of failed test parts.
518190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_part_count() const;
519190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
520190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the number of the test properties.
521190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_property_count() const;
522190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
523190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test passed (i.e. no test part failed).
524190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Passed() const { return !Failed(); }
525190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
526190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test failed.
527190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Failed() const;
528190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
529190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test fatally failed.
530190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool HasFatalFailure() const;
531190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
532190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test has a non-fatal failure.
533190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool HasNonfatalFailure() const;
534190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
535190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the elapsed time, in milliseconds.
536190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time() const { return elapsed_time_; }
537190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
538190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test part result among all the results. i can range
539190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // from 0 to test_property_count() - 1. If i is not in that range, aborts
540190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the program.
541190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestPartResult& GetTestPartResult(int i) const;
542190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
543190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test property. i can range from 0 to
544190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // test_property_count() - 1. If i is not in that range, aborts the
545190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // program.
546190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestProperty& GetTestProperty(int i) const;
547190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
548190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
549190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class TestInfo;
550190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class UnitTest;
551190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::DefaultGlobalTestPartResultReporter;
552190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::ExecDeathTest;
553190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::TestResultAccessor;
554190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
555190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::WindowsDeathTest;
556190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
557190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the vector of TestPartResults.
55857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const std::vector<TestPartResult>& test_part_results() const {
55957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    return test_part_results_;
560190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
561190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
562190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the vector of TestProperties.
56357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const std::vector<TestProperty>& test_properties() const {
56457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    return test_properties_;
565190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
566190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
567190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the elapsed time.
568190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
569190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
570190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a test property to the list. The property is validated and may add
571190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
572190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // key names). If a property is already recorded for the same key, the
573190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // value will be updated, rather than storing multiple values for the same
574190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // key.
575190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void RecordProperty(const TestProperty& test_property);
576190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
577190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a failure if the key is a reserved attribute of Google Test
578190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // testcase tags.  Returns true if the property is valid.
579190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // TODO(russr): Validate attribute names are legal and human readable.
580190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static bool ValidateTestProperty(const TestProperty& test_property);
581190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
582190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a test part result to the list.
583190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void AddTestPartResult(const TestPartResult& test_part_result);
584190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
585190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the death test count.
586190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int death_test_count() const { return death_test_count_; }
587190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
588190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Increments the death test count, returning the new count.
589190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int increment_death_test_count() { return ++death_test_count_; }
590190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
591190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the test part results.
592190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void ClearTestPartResults();
593190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
594190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the object.
595190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void Clear();
596190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
597190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Protects mutable state of the property vector and of owned
598190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // properties, whose values may be updated.
599190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::Mutex test_properites_mutex_;
600190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
601190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The vector of TestPartResults
60257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestPartResult> test_part_results_;
603190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The vector of TestProperties
60457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestProperty> test_properties_;
605190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Running count of death tests.
606190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int death_test_count_;
607190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The elapsed time, in milliseconds.
608190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time_;
609190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
610190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We disallow copying TestResult.
611190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
612190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};  // class TestResult
6137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A TestInfo object stores the following information about a test:
6157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
6167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Test case name
6177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Test name
6187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Whether the test should be run
6197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   A function pointer that creates the test object when invoked
6207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Test result
6217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
6227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The constructor of TestInfo registers itself with the UnitTest
6237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// singleton such that the RUN_ALL_TESTS() macro knows which tests to
6247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// run.
62557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestInfo {
6267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
6277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Destructs a TestInfo object.  This function is not virtual, so
6287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // don't inherit from TestInfo.
6297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ~TestInfo();
6307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the test case name.
632b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const char* test_case_name() const { return test_case_name_.c_str(); }
6337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the test name.
635b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const char* name() const { return name_.c_str(); }
6367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
637b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Returns the name of the parameter type, or NULL if this is not a typed
638b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // or a type-parameterized test.
639b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const char* type_param() const {
640b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    if (type_param_.get() != NULL)
641b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      return type_param_->c_str();
642b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return NULL;
643b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
6447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
645b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Returns the text representation of the value parameter, or NULL if this
646b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // is not a value-parameterized test.
647b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const char* value_param() const {
648b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    if (value_param_.get() != NULL)
649b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      return value_param_->c_str();
650b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return NULL;
651b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
6527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
653190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true if this test should run, that is if the test is not disabled
654190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // (or it is disabled but the also_run_disabled_tests flag has been specified)
655190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // and its full name matches the user-specified filter.
6567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
6577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test allows the user to filter the tests by their full names.
6587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The full name of a test Bar in test case Foo is defined as
6597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // "Foo.Bar".  Only the tests that match the filter will run.
6607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
6617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // A filter is a colon-separated list of glob (not regex) patterns,
6627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // optionally followed by a '-' and a colon-separated list of
6637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // negative patterns (tests to exclude).  A test is run if it
6647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // matches one of the positive patterns and does not match any of
6657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the negative patterns.
6667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
6677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // For example, *A*:Foo.* is a filter that matches any string that
6687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // contains the character 'A' or starts with "Foo.".
669b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  bool should_run() const { return should_run_; }
6707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the result of the test.
672b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const TestResult* result() const { return &result_; }
673190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
6747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
675b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
676e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_DEATH_TEST
6777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class internal::DefaultDeathTestFactory;
6787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_DEATH_TEST
6797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class Test;
6807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class TestCase;
681190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
6827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend TestInfo* internal::MakeAndRegisterTestInfo(
6837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      const char* test_case_name, const char* name,
684b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const char* type_param,
685b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const char* value_param,
6867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      internal::TypeId fixture_class_id,
6877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Test::SetUpTestCaseFunc set_up_tc,
6887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      Test::TearDownTestCaseFunc tear_down_tc,
6897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      internal::TestFactoryBase* factory);
6907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
6917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Constructs a TestInfo object. The newly constructed instance assumes
6927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // ownership of the factory object.
6937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TestInfo(const char* test_case_name, const char* name,
694b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad           const char* a_type_param,
695b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad           const char* a_value_param,
6967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman           internal::TypeId fixture_class_id,
6977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman           internal::TestFactoryBase* factory);
6987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
699b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Increments the number of death tests encountered in this test so
700b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // far.
701b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  int increment_death_test_count() {
702b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return result_.increment_death_test_count();
703b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
704b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
705b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Creates the test object, runs it, records its result, and then
706b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // deletes it.
707b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  void Run();
708b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
709b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static void ClearTestResult(TestInfo* test_info) {
710b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    test_info->result_.Clear();
711b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
712b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
713b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // These fields are immutable properties of the test.
714b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const std::string test_case_name_;     // Test case name
715b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const std::string name_;               // Test name
716b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Name of the parameter type, or NULL if this is not a typed or a
717b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // type-parameterized test.
718b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const internal::scoped_ptr<const ::std::string> type_param_;
719b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Text representation of the value parameter, or NULL if this is not a
720b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // value-parameterized test.
721b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const internal::scoped_ptr<const ::std::string> value_param_;
722b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
723b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  bool should_run_;                 // True iff this test should run
724b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  bool is_disabled_;                // True iff this test is disabled
725b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  bool matches_filter_;             // True if this test matches the
726b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                                    // user-specified filter.
727b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  internal::TestFactoryBase* const factory_;  // The factory that creates
728b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                                              // the test object
729b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
730b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // This field is mutable and needs to be reset before running the
731b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // test for the second time.
732b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  TestResult result_;
7337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
7347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
7357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
7367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
737190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// A test case, which consists of a vector of TestInfos.
738190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
739190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestCase is not copyable.
74057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestCase {
741190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
742190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Creates a TestCase with the given name.
743190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
744190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // TestCase does NOT have a default constructor.  Always use this
745190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // constructor to create a TestCase object.
746190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
747190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Arguments:
748190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
749190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //   name:         name of the test case
750b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  //   a_type_param: the name of the test's type parameter, or NULL if
751b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  //                 this is not a type-parameterized test.
752190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //   set_up_tc:    pointer to the function that sets up the test case
753190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //   tear_down_tc: pointer to the function that tears down the test case
754b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  TestCase(const char* name, const char* a_type_param,
755190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer           Test::SetUpTestCaseFunc set_up_tc,
756190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer           Test::TearDownTestCaseFunc tear_down_tc);
757190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
758190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Destructor of TestCase.
759190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual ~TestCase();
760190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
761190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the name of the TestCase.
762190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const char* name() const { return name_.c_str(); }
763190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
764b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Returns the name of the parameter type, or NULL if this is not a
765b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // type-parameterized test case.
766b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const char* type_param() const {
767b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    if (type_param_.get() != NULL)
768b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      return type_param_->c_str();
769b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return NULL;
770b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
771190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
772190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true if any test in this test case should run.
773190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool should_run() const { return should_run_; }
774190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
775190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of successful tests in this test case.
776190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int successful_test_count() const;
777190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
778190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of failed tests in this test case.
779190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int failed_test_count() const;
780190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
781190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of disabled tests in this test case.
782190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int disabled_test_count() const;
783190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
784190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Get the number of tests in this test case that should run.
785190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_to_run_count() const;
786190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
787190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all tests in this test case.
788190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_test_count() const;
789190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
790190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test case passed.
791190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Passed() const { return !Failed(); }
792190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
793190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the test case failed.
794190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Failed() const { return failed_test_count() > 0; }
795190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
796190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the elapsed time, in milliseconds.
797190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time() const { return elapsed_time_; }
798190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
799190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test among all the tests. i can range from 0 to
800190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_count() - 1. If i is not in that range, returns NULL.
801190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestInfo* GetTestInfo(int i) const;
802190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
803190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
804190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class Test;
805190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
806190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
807190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the (mutable) vector of TestInfos in this TestCase.
80857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
809190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
810190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the (immutable) vector of TestInfos in this TestCase.
81157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  const std::vector<TestInfo*>& test_info_list() const {
81257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    return test_info_list_;
813190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
814190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
815190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the i-th test among all the tests. i can range from 0 to
816190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_count() - 1. If i is not in that range, returns NULL.
817190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestInfo* GetMutableTestInfo(int i);
818190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
819190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the should_run member.
820190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void set_should_run(bool should) { should_run_ = should; }
821190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
822190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
823190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // destruction of the TestCase object.
824190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void AddTestInfo(TestInfo * test_info);
825190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
826190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the results of all tests in this test case.
827190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void ClearResult();
828190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
829190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Clears the results of all tests in the given test case.
830190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  static void ClearTestCaseResult(TestCase* test_case) {
831190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    test_case->ClearResult();
832190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
833190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
834190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Runs every test in this TestCase.
835190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void Run();
836190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
837b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
838b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // for catching exceptions thrown from SetUpTestCase().
839b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  void RunSetUpTestCase() { (*set_up_tc_)(); }
840b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
841b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Runs TearDownTestCase() for this TestCase.  This wrapper is
842b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // needed for catching exceptions thrown from TearDownTestCase().
843b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  void RunTearDownTestCase() { (*tear_down_tc_)(); }
844b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
845190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff test passed.
846b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static bool TestPassed(const TestInfo* test_info) {
847b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return test_info->should_run() && test_info->result()->Passed();
848b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
849190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
850190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff test failed.
851b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static bool TestFailed(const TestInfo* test_info) {
852b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return test_info->should_run() && test_info->result()->Failed();
853b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
854190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
855190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff test is disabled.
856b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static bool TestDisabled(const TestInfo* test_info) {
857b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return test_info->is_disabled_;
858b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
859190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
860190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true if the given test should run.
861b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static bool ShouldRunTest(const TestInfo* test_info) {
862b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return test_info->should_run();
863b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  }
864190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
865190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Shuffles the tests in this test case.
866190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void ShuffleTests(internal::Random* random);
867190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
868190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Restores the test order to before the first shuffle.
869190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void UnshuffleTests();
870190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
871190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Name of the test case.
872190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::String name_;
873b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Name of the parameter type, or NULL if this is not a typed or a
874b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // type-parameterized test.
875b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const internal::scoped_ptr<const ::std::string> type_param_;
876190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The vector of TestInfos in their original order.  It owns the
877190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // elements in the vector.
87857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestInfo*> test_info_list_;
879190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Provides a level of indirection for the test list to allow easy
880190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // shuffling and restoring the test order.  The i-th element in this
881190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // vector is the index of the i-th test in the shuffled test list.
88257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<int> test_indices_;
883190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Pointer to the function that sets up the test case.
884190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Test::SetUpTestCaseFunc set_up_tc_;
885190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Pointer to the function that tears down the test case.
886190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Test::TearDownTestCaseFunc tear_down_tc_;
887190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // True iff any test in this test case should run.
888190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool should_run_;
889190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Elapsed time, in milliseconds.
890190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time_;
891190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
892190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We disallow copying TestCases.
893190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
894190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
895190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
8967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// An Environment object is capable of setting up and tearing down an
8977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// environment.  The user should subclass this to define his own
8987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// environment(s).
8997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
9007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// An Environment object does the set-up and tear-down in virtual
9017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// methods SetUp() and TearDown() instead of the constructor and the
9027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// destructor, as:
9037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
9047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   1. You cannot safely throw from a destructor.  This is a problem
9057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      as in some cases Google Test is used where exceptions are enabled, and
9067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      we may want to implement ASSERT_* using exceptions where they are
9077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      available.
9087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   2. You cannot use ASSERT_* directly in a constructor or
9097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//      destructor.
9107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass Environment {
9117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
9127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The d'tor is virtual as we need to subclass Environment.
9137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual ~Environment() {}
9147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Override this to define how to set up the environment.
9167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void SetUp() {}
9177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Override this to define how to tear down the environment.
9197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void TearDown() {}
9207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
9217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // If you see an error about overriding the following function or
9227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // about it being private, you have mis-spelled SetUp() as Setup().
9237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  struct Setup_should_be_spelled_SetUp {};
9247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
9257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
9267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
927190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The interface for tracing execution of tests. The methods are organized in
928190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// the order the corresponding events are fired.
929190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass TestEventListener {
930190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
931190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual ~TestEventListener() {}
932190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
933190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before any test activity starts.
934190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
935190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
936190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before each iteration of tests starts.  There may be more than
937190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
938190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // index, starting from 0.
939190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationStart(const UnitTest& unit_test,
940190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                    int iteration) = 0;
941190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
942190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before environment set-up for each iteration of tests starts.
943190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
944190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
945190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after environment set-up for each iteration of tests ends.
946190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
947190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
948190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before the test case starts.
949190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
950190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
951190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before the test starts.
952190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestStart(const TestInfo& test_info) = 0;
953190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
954b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // Fired after a failed assertion or a SUCCEED() invocation.
955190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
956190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
957190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after the test ends.
958190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestEnd(const TestInfo& test_info) = 0;
959190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
960190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after the test case ends.
961190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
962190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
963190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired before environment tear-down for each iteration of tests starts.
964190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
965190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
966190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after environment tear-down for each iteration of tests ends.
967190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
968190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
969190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after each iteration of tests finishes.
970190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationEnd(const UnitTest& unit_test,
971190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                  int iteration) = 0;
972190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
973190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Fired after all test activities have ended.
974190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
975190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
976190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
977190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// The convenience class for users who need to override just one or two
978190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// methods and are not concerned that a possible change to a signature of
979190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// the methods they override will not be caught during the build.  For
980190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// comments about each method please see the definition of TestEventListener
981190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// above.
982190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerclass EmptyTestEventListener : public TestEventListener {
983190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
984190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
985190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
986190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                    int /*iteration*/) {}
987190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
988190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
989190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
990190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
991190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
992190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
993190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
994190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
995190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
996190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
997190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                                  int /*iteration*/) {}
998190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
999190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
1000190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1001190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// TestEventListeners lets users add listeners to track events in Google Test.
100257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestEventListeners {
1003190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer public:
1004190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListeners();
1005190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  ~TestEventListeners();
1006190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1007190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Appends an event listener to the end of the list. Google Test assumes
1008190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the ownership of the listener (i.e. it will delete the listener when
1009190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the test program finishes).
1010190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void Append(TestEventListener* listener);
1011190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1012190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Removes the given event listener from the list and returns it.  It then
1013190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // becomes the caller's responsibility to delete the listener. Returns
1014190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // NULL if the listener is not found in the list.
1015190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* Release(TestEventListener* listener);
1016190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1017190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the standard listener responsible for the default console
1018190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // output.  Can be removed from the listeners list to shut down default
1019190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // console output.  Note that removing this object from the listener list
1020190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // with Release transfers its ownership to the caller and makes this
1021190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // function return NULL the next time.
1022190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_result_printer() const {
1023190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return default_result_printer_;
1024190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
1025190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1026190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the standard listener responsible for the default XML output
1027190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // controlled by the --gtest_output=xml flag.  Can be removed from the
1028190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // listeners list by users who want to shut down the default XML output
1029190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // controlled by this flag and substitute it with custom one.  Note that
1030190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // removing this object from the listener list with Release transfers its
1031190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // ownership to the caller and makes this function return NULL the next
1032190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // time.
1033190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_xml_generator() const {
1034190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    return default_xml_generator_;
1035190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  }
1036190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1037190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
1038190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class TestCase;
1039b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  friend class TestInfo;
1040190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::DefaultGlobalTestPartResultReporter;
1041190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::NoExecDeathTest;
1042190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::TestEventListenersAccessor;
1043190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::UnitTestImpl;
1044190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1045190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns repeater that broadcasts the TestEventListener events to all
1046190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // subscribers.
1047190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* repeater();
1048190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1049190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the default_result_printer attribute to the provided listener.
1050190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The listener is also added to the listener list and previous
1051190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // default_result_printer is removed from it and deleted. The listener can
1052190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // also be NULL in which case it will not be added to the list. Does
1053190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // nothing if the previous and the current listener objects are the same.
1054190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SetDefaultResultPrinter(TestEventListener* listener);
1055190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1056190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Sets the default_xml_generator attribute to the provided listener.  The
1057190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // listener is also added to the listener list and previous
1058190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // default_xml_generator is removed from it and deleted. The listener can
1059190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // also be NULL in which case it will not be added to the list. Does
1060190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // nothing if the previous and the current listener objects are the same.
1061190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SetDefaultXmlGenerator(TestEventListener* listener);
1062190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1063190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Controls whether events will be forwarded by the repeater to the
1064190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // listeners in the list.
1065190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool EventForwardingEnabled() const;
1066190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void SuppressEventForwarding();
1067190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1068190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The actual list of listeners.
1069190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  internal::TestEventRepeater* repeater_;
1070190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Listener responsible for the standard result output.
1071190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_result_printer_;
1072190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Listener responsible for the creation of the XML output file.
1073190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListener* default_xml_generator_;
1074190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1075190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We disallow copying TestEventListeners.
1076190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
1077190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer};
1078190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1079190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// A UnitTest consists of a vector of TestCases.
10807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
10817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This is a singleton class.  The only instance of UnitTest is
10827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// created when UnitTest::GetInstance() is first called.  This
10837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// instance is never deleted.
10847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
10857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// UnitTest is not copyable.
10867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
10877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This class is thread-safe as long as the methods are called
10887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// according to their specification.
108957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ UnitTest {
10907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
10917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the singleton UnitTest object.  The first time this method
10927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // is called, a UnitTest object is constructed and returned.
10937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Consecutive calls will return the same object.
10947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static UnitTest* GetInstance();
10957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
10967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Runs all tests in this UnitTest object and prints the result.
10977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns 0 if successful, or 1 otherwise.
10987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
10997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // This method can only be called from the main thread.
11007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
11017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
11027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int Run() GTEST_MUST_USE_RESULT_;
11037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the working directory when the first TEST() or TEST_F()
11057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // was executed.  The UnitTest object owns the string.
11067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* original_working_dir() const;
11077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the TestCase object for the test that's currently running,
11097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // or NULL if no test is running.
11107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const TestCase* current_test_case() const;
11117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
11127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the TestInfo object for the test that's currently running,
11137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // or NULL if no test is running.
11147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const TestInfo* current_test_info() const;
11157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1116190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the random seed used at the start of the current test run.
1117190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int random_seed() const;
1118190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1119e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_PARAM_TEST
11207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the ParameterizedTestCaseRegistry object used to keep track of
11217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // value-parameterized tests and instantiate and register them.
1122190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
1123190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
11247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
11257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_PARAM_TEST
11267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1127190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of successful test cases.
1128190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int successful_test_case_count() const;
1129190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1130190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of failed test cases.
1131190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int failed_test_case_count() const;
1132190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1133190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all test cases.
1134190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_test_case_count() const;
1135190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1136190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all test cases that contain at least one test
1137190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // that should run.
1138190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_case_to_run_count() const;
1139190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1140190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of successful tests.
1141190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int successful_test_count() const;
1142190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1143190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of failed tests.
1144190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int failed_test_count() const;
1145190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1146190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of disabled tests.
1147190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int disabled_test_count() const;
1148190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1149190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of all tests.
1150190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int total_test_count() const;
1151190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1152190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the number of tests that should run.
1153190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  int test_to_run_count() const;
1154190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1155190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the elapsed time, in milliseconds.
1156190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TimeInMillis elapsed_time() const;
1157190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1158190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the unit test passed (i.e. all test cases passed).
1159190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Passed() const;
1160190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1161190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns true iff the unit test failed (i.e. some test case failed
1162190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // or something outside of all tests failed).
1163190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool Failed() const;
1164190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1165190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the i-th test case among all the test cases. i can range from 0 to
1166190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_case_count() - 1. If i is not in that range, returns NULL.
1167190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestCase* GetTestCase(int i) const;
1168190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1169190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Returns the list of event listeners that can be used to track events
1170190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // inside Google Test.
1171190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestEventListeners& listeners();
1172190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1173190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer private:
1174190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Registers and returns a global test environment.  When a test
1175190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // program is run, all global test environments will be set-up in
1176190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the order they were registered.  After all tests in the program
1177190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // have finished, all global test environments will be torn-down in
1178190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // the *reverse* order they were registered.
1179190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
1180190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The UnitTest object takes ownership of the given environment.
1181190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  //
1182190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // This method can only be called from the main thread.
1183190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Environment* AddEnvironment(Environment* env);
1184190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1185190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a TestPartResult to the current TestResult object.  All
1186190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
1187190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // eventually call this to report their results.  The user code
1188190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // should use the assertion macros instead of calling this directly.
1189190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void AddTestPartResult(TestPartResult::Type result_type,
1190190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         const char* file_name,
1191190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         int line_number,
1192190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         const internal::String& message,
1193190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                         const internal::String& os_stack_trace);
1194190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1195190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Adds a TestProperty to the current TestResult object. If the result already
1196190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // contains a property with the same key, the value will be updated.
1197190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  void RecordPropertyForCurrentTest(const char* key, const char* value);
1198190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1199190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // Gets the i-th test case among all the test cases. i can range from 0 to
1200190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // total_test_case_count() - 1. If i is not in that range, returns NULL.
1201190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  TestCase* GetMutableTestCase(int i);
1202190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
12037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Accessors for the implementation object.
12047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::UnitTestImpl* impl() { return impl_; }
12057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const internal::UnitTestImpl* impl() const { return impl_; }
1206190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1207190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // These classes and funcions are friends as they need to access private
1208190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // members of UnitTest.
1209190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class Test;
1210190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend class internal::AssertHelper;
12117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  friend class internal::ScopedTrace;
1212190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend Environment* AddGlobalTestEnvironment(Environment* env);
1213190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
1214190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  friend void internal::ReportFailureInUnknownLocation(
1215190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      TestPartResult::Type result_type,
1216190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      const internal::String& message);
12177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Creates an empty UnitTest.
12197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  UnitTest();
12207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // D'tor
12227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual ~UnitTest();
12237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
12257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Google Test trace stack.
12267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void PushGTestTrace(const internal::TraceInfo& trace);
12277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Pops a trace from the per-thread Google Test trace stack.
12297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void PopGTestTrace();
12307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Protects mutable state in *impl_.  This is mutable as some const
12327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // methods need to lock it too.
12337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  mutable internal::Mutex mutex_;
12347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Opaque implementation object.  This field is never changed once
12367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // the object is constructed.  We don't mark it as const here, as
12377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // doing so will cause a warning in the constructor of UnitTest.
12387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Mutable state in *impl_ is protected by mutex_.
12397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::UnitTestImpl* impl_;
12407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // We disallow copying UnitTest.
12427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
12437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
12447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A convenient wrapper for adding an environment for the test
12467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// program.
12477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// You should call this before RUN_ALL_TESTS() is called, probably in
12497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// main().  If you use gtest_main, you need to call this before main()
12507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// starts for it to take effect.  For example, you can define a global
12517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// variable like this:
12527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   testing::Environment* const foo_env =
12547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//       testing::AddGlobalTestEnvironment(new FooEnvironment);
12557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// However, we strongly recommend you to write your own main() and
12577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// call AddGlobalTestEnvironment() there, as relying on initialization
12587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of global variables makes the code harder to read and may cause
12597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// problems when you register multiple environments from different
12607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// translation units and the environments have dependencies among them
12617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (remember that the compiler doesn't guarantee the order in which
12627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// global variables from different translation units are initialized).
12637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninline Environment* AddGlobalTestEnvironment(Environment* env) {
12647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return UnitTest::GetInstance()->AddEnvironment(env);
12657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
12667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Initializes Google Test.  This must be called before calling
12687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// RUN_ALL_TESTS().  In particular, it parses a command line for the
12697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// flags that Google Test recognizes.  Whenever a Google Test flag is
12707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// seen, it is removed from argv, and *argc is decremented.
12717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// No value is returned.  Instead, the Google Test flag variables are
12737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// updated.
12747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Calling the function for the second time has no user-visible effect.
127657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ void InitGoogleTest(int* argc, char** argv);
12777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This overloaded version can be used in Windows programs compiled in
12797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// UNICODE mode.
128057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
12817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
12837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
12847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
12857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// operand to be used in a failure message.  The type (but not value)
12867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of the other operand may affect the format.  This allows us to
12877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// print a char* as a raw pointer when it is compared against another
12887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// char*, and print it as a C string when it is compared against an
12897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// std::string object, for example.
12907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The default implementation ignores the type of the other operand.
12927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Some specialized versions are used to handle formatting wide or
12937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// narrow C strings.
12947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
12957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
12967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2>
12977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanString FormatForComparisonFailureMessage(const T1& value,
12987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         const T2& /* other_operand */) {
1299b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // C++Builder compiles this incorrectly if the namespace isn't explicitly
1300b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // given.
1301b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  return ::testing::PrintToString(value);
13027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_EQ.
13057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2>
13067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult CmpHelperEQ(const char* expected_expression,
13077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                            const char* actual_expression,
13087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                            const T1& expected,
13097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                            const T2& actual) {
1310e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#ifdef _MSC_VER
1311b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# pragma warning(push)          // Saves the current warning state.
1312b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# pragma warning(disable:4389)  // Temporarily disables warning on
1313e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer                               // signed/unsigned mismatch.
13149bf9aa5106eb663a371b2b0bc7ab929500ad6ff9Oscar Fuentes#pragma warning(disable:4805)  // Temporarily disables warning on
13159bf9aa5106eb663a371b2b0bc7ab929500ad6ff9Oscar Fuentes                               // unsafe mix of types
1316e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif
1317e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
13187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (expected == actual) {
13197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return AssertionSuccess();
13207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1322e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#ifdef _MSC_VER
1323b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# pragma warning(pop)          // Restores the warning state.
1324e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#endif
1325e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer
13267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return EqFailure(expected_expression,
13277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   actual_expression,
13287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   FormatForComparisonFailureMessage(expected, actual),
13297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   FormatForComparisonFailureMessage(actual, expected),
13307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   false);
13317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
13327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// With this overloaded version, we allow anonymous enums to be used
13347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
13357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// can be implicitly cast to BiggestInt.
133657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
133757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                       const char* actual_expression,
133857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                       BiggestInt expected,
133957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                       BiggestInt actual);
13407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
13427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
13437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is a null pointer literal.  The following default implementation is
13447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// for lhs_is_null_literal being false.
13457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <bool lhs_is_null_literal>
13467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass EqHelper {
13477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
13487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // This templatized version is for the general case.
13497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename T1, typename T2>
13507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static AssertionResult Compare(const char* expected_expression,
13517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const char* actual_expression,
13527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const T1& expected,
13537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const T2& actual) {
13547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression, expected,
13557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                       actual);
13567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // With this overloaded version, we allow anonymous enums to be used
13597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
13607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // enums can be implicitly cast to BiggestInt.
13617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
13627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Even though its body looks the same as the above version, we
13637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // cannot merge the two, as it will make anonymous enums unhappy.
13647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static AssertionResult Compare(const char* expected_expression,
13657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 const char* actual_expression,
13667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 BiggestInt expected,
13677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                 BiggestInt actual) {
13687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression, expected,
13697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                       actual);
13707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
13727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
13737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This specialization is used when the first argument to ASSERT_EQ()
1374b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// is a null pointer literal, like NULL, false, or 0.
13757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <>
13767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass EqHelper<true> {
13777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
13787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // We define two overloaded versions of Compare().  The first
13797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // version will be picked when the second argument to ASSERT_EQ() is
13807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
13817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // EXPECT_EQ(false, a_bool).
13827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <typename T1, typename T2>
1383b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static AssertionResult Compare(
1384b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const char* expected_expression,
1385b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const char* actual_expression,
1386b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const T1& expected,
1387b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const T2& actual,
1388b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // The following line prevents this overload from being considered if T2
1389b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
1390b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
1391b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // to match the Secret* in the other overload, which would otherwise make
1392b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // this template match better.
1393b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
13947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression, expected,
13957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                       actual);
13967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
13977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1398b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // This version will be picked when the second argument to ASSERT_EQ() is a
1399b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
1400b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  template <typename T>
1401b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  static AssertionResult Compare(
1402b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const char* expected_expression,
1403b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      const char* actual_expression,
1404b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // We used to have a second template parameter instead of Secret*.  That
1405b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // template parameter would deduce to 'long', making this a better match
1406b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // than the first overload even without the first overload's EnableIf.
1407b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
1408b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // non-pointer argument" (even a deduced integral argument), so the old
1409b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      // implementation caused warnings in user code.
1410b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      Secret* /* expected (NULL) */,
1411b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad      T* actual) {
14127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    // We already know that 'expected' is a null pointer.
14137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return CmpHelperEQ(expected_expression, actual_expression,
1414b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                       static_cast<T*>(NULL), actual);
14157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
14167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
14177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A macro for implementing the helper functions needed to implement
14197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
14207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of similar code.
14217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For each templatized helper function, we also define an overloaded
14237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// version for BiggestInt in order to reduce code bloat and allow
14247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
14257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// with gcc 4.
14267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
14287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
14297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T1, typename T2>\
14307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
14317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                   const T1& val1, const T2& val2) {\
14327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (val1 op val2) {\
14337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return AssertionSuccess();\
14347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  } else {\
1435b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad    return AssertionFailure() \
1436b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad        << "Expected: (" << expr1 << ") " #op " (" << expr2\
14377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
14387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
14397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }\
14407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}\
144157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelper##op_name(\
144257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
14437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
14457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_NE
144757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(NE, !=);
14487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_LE
144957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(LE, <=);
14507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_LT
145157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(LT, < );
14527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_GE
145357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(GE, >=);
14547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements the helper function for {ASSERT|EXPECT}_GT
145557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_IMPL_CMP_HELPER_(GT, > );
14567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#undef GTEST_IMPL_CMP_HELPER_
14587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STREQ.
14607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
146257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
146357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* actual_expression,
146457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* expected,
146557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* actual);
14667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
14687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
147057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
147157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* actual_expression,
147257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* expected,
147357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* actual);
14747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STRNE.
14767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
147857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
147957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s2_expression,
148057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s1,
148157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s2);
14827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The helper function for {ASSERT|EXPECT}_STRCASENE.
14847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
148657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
148757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* s2_expression,
148857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* s1,
148957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                              const char* s2);
14907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
14927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for *_STREQ on wide strings.
14937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
14947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
149557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
149657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* actual_expression,
149757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* expected,
149857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* actual);
14997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for *_STRNE on wide strings.
15017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
150357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
150457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const char* s2_expression,
150557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* s1,
150657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                          const wchar_t* s2);
15077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
15097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// IsSubstring() and IsNotSubstring() are intended to be used as the
15117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
15127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// themselves.  They check whether needle is a substring of haystack
15137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (NULL is considered a substring of itself only), and return an
15147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// appropriate error message when they fail.
15157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The {needle,haystack}_expr arguments are the stringified
15177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// expressions that generated the two real arguments.
151857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
15197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle, const char* haystack);
152157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
15227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const wchar_t* needle, const wchar_t* haystack);
152457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
15257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle, const char* haystack);
152757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
15287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const wchar_t* needle, const wchar_t* haystack);
153057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
15317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::string& needle, const ::std::string& haystack);
153357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
15347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::string& needle, const ::std::string& haystack);
15367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if GTEST_HAS_STD_WSTRING
153857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsSubstring(
15397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::wstring& needle, const ::std::wstring& haystack);
154157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult IsNotSubstring(
15427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const char* needle_expr, const char* haystack_expr,
15437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const ::std::wstring& needle, const ::std::wstring& haystack);
15447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_STD_WSTRING
15457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
15477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper template function for comparing floating-points.
15497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Template parameter:
15517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   RawType: the raw floating-point type (either float or double)
15537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
15557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename RawType>
15567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
15577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         const char* actual_expression,
15587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         RawType expected,
15597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                         RawType actual) {
15607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const FloatingPoint<RawType> lhs(expected), rhs(actual);
15617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (lhs.AlmostEquals(rhs)) {
15637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    return AssertionSuccess();
15647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
15657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1566b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  ::std::stringstream expected_ss;
15677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
15687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              << expected;
15697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1570b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  ::std::stringstream actual_ss;
15717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
15727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman            << actual;
15737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return EqFailure(expected_expression,
15757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   actual_expression,
1576b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                   StringStreamToString(&expected_ss),
1577b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                   StringStreamToString(&actual_ss),
15787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                   false);
15797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
15807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for implementing ASSERT_NEAR.
15827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
15837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
158457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
158557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                const char* expr2,
158657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                const char* abs_error_expr,
158757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                double val1,
158857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                double val2,
158957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                                double abs_error);
15907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
15917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
15927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A class that enables one to stream messages to assertion macros
159357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ AssertHelper {
15947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
15957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Constructor.
1596190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  AssertHelper(TestPartResult::Type type,
1597190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer               const char* file,
1598190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer               int line,
15997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman               const char* message);
1600190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  ~AssertHelper();
1601190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
16027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Message assignment is a semantic trick to enable assertion
16037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // streaming; see the GTEST_MESSAGE_ macro below.
16047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void operator=(const Message& message) const;
1605190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
16067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
1607190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // We put our data in a struct so that the size of the AssertHelper class can
1608190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // be as small as possible.  This is important because gcc is incapable of
1609190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // re-using stack space even for temporary variables, so every EXPECT_EQ
1610190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // reserves stack space for another AssertHelper.
1611190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  struct AssertHelperData {
1612190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    AssertHelperData(TestPartResult::Type t,
1613190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                     const char* srcfile,
1614190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                     int line_num,
1615190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                     const char* msg)
1616190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        : type(t), file(srcfile), line(line_num), message(msg) { }
1617190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1618190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    TestPartResult::Type const type;
1619190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    const char*        const file;
1620190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    int                const line;
1621190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    String             const message;
1622190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1623190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer   private:
1624190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
1625190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  };
1626190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
1627190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  AssertHelperData* const data_;
16287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
16307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
16317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
16337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1634e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_HAS_PARAM_TEST
1635b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// The pure interface class that all value-parameterized tests inherit from.
1636b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// A value-parameterized class must inherit from both ::testing::Test and
1637b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// ::testing::WithParamInterface. In most cases that just means inheriting
1638b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// from ::testing::TestWithParam, but more complicated test hierarchies
1639b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// may need to inherit from Test and WithParamInterface at different levels.
16407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1641b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// This interface has support for accessing the test parameter value via
16427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the GetParam() method.
16437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Use it with one of the parameter generator defining functions, like Range(),
16457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Values(), ValuesIn(), Bool(), and Combine().
16467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
16477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// class FooTest : public ::testing::TestWithParam<int> {
16487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//  protected:
16497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   FooTest() {
16507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
16517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
16527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual ~FooTest() {
16537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
16547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
16557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual void SetUp() {
16567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
16577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
16587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   virtual void TearDown {
16597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     // Can use GetParam() here.
16607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
16617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// };
16627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TEST_P(FooTest, DoesBar) {
16637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   // Can use GetParam() method here.
16647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Foo foo;
16657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_TRUE(foo.DoesBar(GetParam()));
16667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// }
16677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
16687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
1670b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass WithParamInterface {
16717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
16727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  typedef T ParamType;
1673b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  virtual ~WithParamInterface() {}
16747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The current parameter value. Is also available in the test fixture's
1676b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // constructor. This member function is non-static, even though it only
1677b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // references static data, to reduce the opportunity for incorrect uses
1678b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
1679b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // uses a fixture whose parameter type is int.
16807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const ParamType& GetParam() const { return *parameter_; }
16817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
16837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Sets parameter value. The caller is responsible for making sure the value
16847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // remains alive and unchanged throughout the current test.
16857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static void SetParam(const ParamType* parameter) {
16867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    parameter_ = parameter;
16877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
16887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Static value used for accessing parameter during a test lifetime.
16907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static const ParamType* parameter_;
16917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1692b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  // TestClass must be a subclass of WithParamInterface<T> and Test.
16937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  template <class TestClass> friend class internal::ParameterizedTestFactory;
16947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
16957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
16967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename T>
1697b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadconst T* WithParamInterface<T>::parameter_ = NULL;
1698b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1699b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// Most value-parameterized classes can ignore the existence of
1700b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// WithParamInterface, and can just inherit from ::testing::TestWithParam.
1701b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1702b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadtemplate <typename T>
1703b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foadclass TestWithParam : public Test, public WithParamInterface<T> {
1704b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad};
17057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_HAS_PARAM_TEST
17077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for indicating success/failure in test code.
17097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ADD_FAILURE unconditionally adds a failure to the current test.
17117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SUCCEED generates a success - it doesn't automatically make the
17127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// current test successful, as a test is only successful when it has
17137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// no failure.
17147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_* verifies that a certain condition is satisfied.  If not,
17167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// it behaves like ADD_FAILURE.  In particular:
17177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_TRUE  verifies that a Boolean condition is true.
17197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_FALSE verifies that a Boolean condition is false.
17207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
17227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// that they will also abort the current function on failure.  People
17237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
17247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// writing data-driven tests often find themselves using ADD_FAILURE
17257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// and EXPECT_* more.
17267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples:
17287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_TRUE(server.StatusIsOK());
17307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_FALSE(server.HasPendingRequest(port))
17317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//       << "There are still pending requests " << "on port " << port;
17327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Generates a nonfatal failure with a generic message.
17347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
17357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1736b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// Generates a nonfatal failure at the given source file location with
1737b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// a generic message.
1738b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#define ADD_FAILURE_AT(file, line) \
1739b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  GTEST_MESSAGE_AT_(file, line, "Failed", \
1740b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                    ::testing::TestPartResult::kNonFatalFailure)
1741b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
17427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Generates a fatal failure with a generic message.
174357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
174457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
174557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Define this macro to 1 to omit the definition of FAIL(), which is a
174657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// generic name and clashes with some other libraries.
174757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#if !GTEST_DONT_DEFINE_FAIL
1748b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define FAIL() GTEST_FAIL()
174957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#endif
17507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Generates a success with a generic message.
175257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
175357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
175457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Define this macro to 1 to omit the definition of SUCCEED(), which
175557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// is a generic name and clashes with some other libraries.
175657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#if !GTEST_DONT_DEFINE_SUCCEED
1757b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define SUCCEED() GTEST_SUCCEED()
175857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#endif
17597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for testing exceptions.
17617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
17627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
17637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that the statement throws the expected exception.
17647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_NO_THROW(statement):
17657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that the statement doesn't throw any exception.
17667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_ANY_THROW(statement):
17677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that the statement throws an exception.
17687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_THROW(statement, expected_exception) \
17707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
17717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NO_THROW(statement) \
17727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
17737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_ANY_THROW(statement) \
17747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
17757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_THROW(statement, expected_exception) \
17767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
17777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_NO_THROW(statement) \
17787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
17797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_ANY_THROW(statement) \
17807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
17817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
178257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Boolean assertions. Condition can be either a Boolean expression or an
178357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// AssertionResult. For more information on how to use AssertionResult with
178457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// these macros see comments on that class.
17857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_TRUE(condition) \
17867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
17877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_NONFATAL_FAILURE_)
17887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FALSE(condition) \
17897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
17907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_NONFATAL_FAILURE_)
17917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_TRUE(condition) \
17927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
17937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_FATAL_FAILURE_)
17947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_FALSE(condition) \
17957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
17967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      GTEST_FATAL_FAILURE_)
17977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
17987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Includes the auto-generated header that implements a family of
17997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// generic predicate assertion macros.
1800b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest_pred_impl.h"
18017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for testing equalities and inequalities.
18037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
18057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
18067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
18077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
18087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
18097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
18107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// When they are not, Google Test prints both the tested expressions and
18127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// their actual values.  The values must be compatible built-in types,
18137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// or you will get a compiler error.  By "compatible" we mean that the
18147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// values can be compared by the respective operator.
18157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note:
18177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   1. It is possible to make a user-defined type work with
18197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   {ASSERT|EXPECT}_??(), but that requires overloading the
18207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   comparison operators and is thus discouraged by the Google C++
18217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   Usage Guide.  Therefore, you are advised to use the
18227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
18237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   equal.
18247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
18267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   pointers (in particular, C strings).  Therefore, if you use it
18277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   with two C strings, you are testing how their locations in memory
18287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   are related, not how their content is related.  To compare two C
18297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   strings by content, use {ASSERT|EXPECT}_STR*().
18307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
18327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
18337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   what the actual value is when it fails, and similarly for the
18347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   other comparisons.
18357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
18377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   evaluate their arguments, which is undefined.
18387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   5. These macros evaluate their arguments exactly once.
18407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples:
18427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
18437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_NE(5, Foo());
18447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_EQ(NULL, a_pointer);
18457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_LT(i, array_size);
18467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_GT(records.size(), 0) << "There is no record left.";
18477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
18487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_EQ(expected, actual) \
18497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal:: \
18507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
18517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
18527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NE(expected, actual) \
18537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
18547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_LE(val1, val2) \
18557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
18567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_LT(val1, val2) \
18577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
18587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_GE(val1, val2) \
18597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
18607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_GT(val1, val2) \
18617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
18627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1863b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#define GTEST_ASSERT_EQ(expected, actual) \
18647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal:: \
18657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
18667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
1867b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#define GTEST_ASSERT_NE(val1, val2) \
18687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
1869b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#define GTEST_ASSERT_LE(val1, val2) \
18707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
1871b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#define GTEST_ASSERT_LT(val1, val2) \
18727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
1873b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#define GTEST_ASSERT_GE(val1, val2) \
18747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
1875b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#define GTEST_ASSERT_GT(val1, val2) \
18767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
18777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1878b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
1879b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// ASSERT_XY(), which clashes with some users' own code.
1880b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1881b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#if !GTEST_DONT_DEFINE_ASSERT_EQ
1882b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
1883b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#endif
1884b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1885b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#if !GTEST_DONT_DEFINE_ASSERT_NE
1886b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
1887b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#endif
1888b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1889b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#if !GTEST_DONT_DEFINE_ASSERT_LE
1890b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
1891b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#endif
1892b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1893b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#if !GTEST_DONT_DEFINE_ASSERT_LT
1894b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
1895b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#endif
1896b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1897b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#if !GTEST_DONT_DEFINE_ASSERT_GE
1898b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
1899b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#endif
1900b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
1901b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#if !GTEST_DONT_DEFINE_ASSERT_GT
1902b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
1903b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#endif
1904b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad
19057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// C String Comparisons.  All tests treat NULL and any non-NULL string
19067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// as different.  Two NULLs are equal.
19077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
19097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
19107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
19117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
19127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For wide or narrow string objects, you can use the
19147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// {ASSERT|EXPECT}_??() macros.
19157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't depend on the order in which the arguments are evaluated,
19177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// which is undefined.
19187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// These macros evaluate their arguments exactly once.
19207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STREQ(expected, actual) \
19227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STRNE(s1, s2) \
19247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STRCASEEQ(expected, actual) \
19267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_STRCASENE(s1, s2)\
19287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STREQ(expected, actual) \
19317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
19327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STRNE(s1, s2) \
19337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
19347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STRCASEEQ(expected, actual) \
19357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
19367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_STRCASENE(s1, s2)\
19377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
19387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros for comparing floating-point numbers.
19407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
19427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that two float values are almost equal.
19437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
19447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that two double values are almost equal.
19457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
19467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//         Tests that v1 and v2 are within the given distance to each other.
19477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Google Test uses ULP-based comparison to automatically pick a default
19497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// error bound that is appropriate for the operands.  See the
19507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FloatingPoint template class in gtest-internal.h if you are
19517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// interested in the implementation details.
19527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FLOAT_EQ(expected, actual)\
19547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
19567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_DOUBLE_EQ(expected, actual)\
19587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
19607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_FLOAT_EQ(expected, actual)\
19627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
19637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
19647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_DOUBLE_EQ(expected, actual)\
19667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
19677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      expected, actual)
19687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NEAR(val1, val2, abs_error)\
19707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      val1, val2, abs_error)
19727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_NEAR(val1, val2, abs_error)\
19747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
19757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                      val1, val2, abs_error)
19767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// These predicate format functions work on floating-point values, and
19787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
19797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
19817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Asserts that val1 is less than, or almost equal to, val2.  Fails
19837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// otherwise.  In particular, it fails if either val1 or val2 is NaN.
198457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
198557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                   float val1, float val2);
198657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
198757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                                    double val1, double val2);
19887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1990e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#if GTEST_OS_WINDOWS
19917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
19927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros that test for HRESULT failure and success, these are only useful
19937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// on Windows, and rely on Windows SDK macros and APIs to compile.
19947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
19967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
19977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// When expr unexpectedly fails or succeeds, Google Test prints the
19987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// expected result and the actual result with both a human-readable
19997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// string representation of the error, if available, as well as the
20007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// hex result code.
2001b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_HRESULT_SUCCEEDED(expr) \
20027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
20037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2004b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_HRESULT_SUCCEEDED(expr) \
20057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
20067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2007b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define EXPECT_HRESULT_FAILED(expr) \
20087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
20097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2010b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define ASSERT_HRESULT_FAILED(expr) \
20117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
20127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_OS_WINDOWS
20147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Macros that execute statement and check that it doesn't generate new fatal
20167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// failures in the current thread.
20177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
20197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Examples:
20217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   EXPECT_NO_FATAL_FAILURE(Process());
20237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
20247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_NO_FATAL_FAILURE(statement) \
20267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
20277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NO_FATAL_FAILURE(statement) \
20287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
20297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Causes a trace (including the source file path, the current line
20317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// number, and the given message) to be included in every test failure
20327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// message generated by code in the current scope.  The effect is
20337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// undone when the control leaves the current scope.
20347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The message argument can be anything streamable to std::ostream.
20367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// In the implementation, we include the current line number as part
20387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
20397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to appear in the same block - as long as they are on different
20407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// lines.
20417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define SCOPED_TRACE(message) \
20427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
20437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    __FILE__, __LINE__, ::testing::Message() << (message))
20447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2045e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Compile-time assertion for type equality.
2046e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
2047e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the same type.  The value it returns is not interesting.
2048e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2049e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// Instead of making StaticAssertTypeEq a class template, we make it a
2050e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// function template that invokes a helper class template.  This
2051e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
2052e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// defining objects of that type.
2053e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2054e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// CAVEAT:
2055e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2056e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// When used inside a method of a class template,
2057e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
2058e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// instantiated.  For example, given:
2059e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2060e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   template <typename T> class Foo {
2061e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//    public:
2062e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
2063e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   };
2064e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2065e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// the code:
2066e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2067e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   void Test1() { Foo<bool> foo; }
2068e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2069e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// will NOT generate a compiler error, as Foo<bool>::Bar() is never
2070e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// actually instantiated.  Instead, you need:
2071e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2072e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//   void Test2() { Foo<bool> foo; foo.Bar(); }
2073e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//
2074e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer// to cause a compiler error.
2075e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramertemplate <typename T1, typename T2>
2076e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerbool StaticAssertTypeEq() {
2077b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
2078e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer  return true;
2079e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer}
20807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines a test.
20827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The first parameter is the name of the test case, and the second
20847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parameter is the name of the test within the test case.
20857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The convention is to end the test case name with "Test".  For
20877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// example, a test case for the Foo class can be named FooTest.
20887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The user should put his test code between braces after using this
20907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// macro.  Example:
20917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
20927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST(FooTest, InitializesCorrectly) {
20937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Foo foo;
20947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_TRUE(foo.StatusIsOK());
20957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
20967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
20977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note that we call GetTestTypeId() instead of GetTypeId<
20987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::testing::Test>() here to get the type ID of testing::Test.  This
20997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is to work around a suspected linker bug when using Google Test as
21007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// a framework on Mac OS X.  The bug causes GetTypeId<
21017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// ::testing::Test>() to return different values depending on whether
21027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the call is from the Google Test framework itself or from user test
21037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// code.  GetTestTypeId() is guaranteed to always return the same
21047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// value, as it always calls GetTypeId<>() from the Google Test
21057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// framework.
210657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#define GTEST_TEST(test_case_name, test_name)\
2107e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer  GTEST_TEST_(test_case_name, test_name, \
21087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              ::testing::Test, ::testing::internal::GetTestTypeId())
21097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
211057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// Define this macro to 1 to omit the definition of TEST(), which
211157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer// is a generic name and clashes with some other libraries.
211257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#if !GTEST_DONT_DEFINE_TEST
2113b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
211457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#endif
21157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
21167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Defines a test that uses a test fixture.
21177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
21187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The first parameter is the name of the test fixture class, which
21197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// also doubles as the test case name.  The second parameter is the
21207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// name of the test within the test case.
21217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
21227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A test fixture class must be declared earlier.  The user should put
21237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// his test code between braces after using this macro.  Example:
21247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
21257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   class FooTest : public testing::Test {
21267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//    protected:
21277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     virtual void SetUp() { b_.AddElement(3); }
21287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
21297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Foo a_;
21307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     Foo b_;
21317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   };
21327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
21337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, InitializesCorrectly) {
21347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_TRUE(a_.StatusIsOK());
21357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
21367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
21377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
21387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_EQ(0, a_.size());
21397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     EXPECT_EQ(1, b_.size());
21407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   }
21417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
21427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define TEST_F(test_fixture, test_name)\
2143e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer  GTEST_TEST_(test_fixture, test_name, test_fixture, \
21447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman              ::testing::internal::GetTypeId<test_fixture>())
21457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
21467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Use this macro in main() to run all tests.  It returns 0 if all
21477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// tests are successful, or 1 otherwise.
21487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
21497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// RUN_ALL_TESTS() should be invoked after the command line has been
21507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// parsed by InitGoogleTest().
21517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
21527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define RUN_ALL_TESTS()\
21537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  (::testing::UnitTest::GetInstance()->Run())
21547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
21557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
21567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
21577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
2158