gtest.h revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org// Copyright 2005, Google Inc.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// All rights reserved.
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org//
4b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Redistribution and use in source and binary forms, with or without
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// modification, are permitted provided that the following conditions are
6b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// met:
793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org//
89dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//     * Redistributions of source code must retain the above copyright
96313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org// notice, this list of conditions and the following disclaimer.
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org//     * Redistributions in binary form must reproduce the above
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// copyright notice, this list of conditions and the following disclaimer
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// in the documentation and/or other materials provided with the
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// distribution.
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org//     * Neither the name of Google Inc. nor the names of its
15d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org// contributors may be used to endorse or promote products derived from
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// this software without specific prior written permission.
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org//
18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
30d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// Author: wan@google.com (Zhanyong Wan)
31d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
32d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// The Google C++ Testing Framework (Google Test)
33d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
34d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// This header file defines the public API for Google Test.  It should be
35e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org// included by any test program that uses Google Test.
36d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
37d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
3883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// leave some internal implementation details in this header file.
3983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// They are clearly marked by comments like this:
4083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org//
41d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
4283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org//
43d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// Such code is NOT meant to be used by a user directly, and is subject
44d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
4583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// program!
4683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org//
4783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// Acknowledgment: Google Test borrowed the idea of automatic test
48d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
4983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// easyUnit framework.
50d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
51d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
52d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#define GTEST_INCLUDE_GTEST_GTEST_H_
534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
544f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org// The following platform macro is used throughout Google Test:
55e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org//   _WIN32_WCE      Windows CE     (set in project files)
564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
57d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#include <limits>
584f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#include <gtest/internal/gtest-internal.h>
59d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#include <gtest/internal/gtest-string.h>
604f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#include <gtest/gtest-death-test.h>
614f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#include <gtest/gtest-message.h>
624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#include <gtest/gtest-param-test.h>
63d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#include <gtest/gtest_prod.h>
64d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#include <gtest/gtest-test-part.h>
65d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com#include <gtest/gtest-typed-test.h>
66d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
6783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// Depending on the platform, different string classes are available.
68e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org// On Windows, ::std::string compiles only when exceptions are
69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org// enabled.  On Linux, in addition to ::std::string, Google also makes
70d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// use of class ::string, which has the same interface as
7183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// ::std::string, but has a different implementation.
72d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
73d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// The user can tell us whether ::std::string is available in his
74d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// environment by defining the macro GTEST_HAS_STD_STRING to either 1
75d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// or 0 on the compiler command line.  He can also define
76d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// GTEST_HAS_GLOBAL_STRING to 1 to indicate that ::string is available
77d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// AND is a distinct type to ::std::string, or define it to 0 to
78d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// indicate otherwise.
79d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
80d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// If the user's ::std::string and ::string are the same class due to
81d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// aliasing, he should define GTEST_HAS_STD_STRING to 1 and
82b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// GTEST_HAS_GLOBAL_STRING to 0.
83b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
84b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// If the user doesn't define GTEST_HAS_STD_STRING and/or
85b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// GTEST_HAS_GLOBAL_STRING, they are defined heuristically.
86b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
87b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgnamespace testing {
882efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
89b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Declares the flags.
90b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
91b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// This flag temporary enables the disabled tests.
92b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgGTEST_DECLARE_bool_(also_run_disabled_tests);
93b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
94b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// This flag brings the debugger on an assertion failure.
9556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgGTEST_DECLARE_bool_(break_on_failure);
9656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
9704e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org// This flag controls whether Google Test catches all test-thrown exceptions
9804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org// and logs them as failures.
99f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgGTEST_DECLARE_bool_(catch_exceptions);
10041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
101fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// This flag enables using colors in terminal output. Available values are
1025c838251403b0be9a882540f1922577abba4c872ager@chromium.org// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
103ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org// to let Google Test decide.
104b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgGTEST_DECLARE_string_(color);
105753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org
106753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org// This flag sets up the filter to select by name using a glob pattern
107a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org// the tests to run. If the filter is not given all tests are executed.
108a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.orgGTEST_DECLARE_string_(filter);
10959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
110a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org// This flag causes the Google Test to list tests. None of the tests listed
111a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org// are actually run if the flag is provided.
112a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.orgGTEST_DECLARE_bool_(list_tests);
113a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org
114486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// This flag controls whether Google Test emits a detailed XML report to a file
115e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org// in addition to its normal textual output.
116e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.orgGTEST_DECLARE_string_(output);
117486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
11840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org// This flags control whether Google Test prints the elapsed time for each
119e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org// test.
120d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgGTEST_DECLARE_bool_(print_time);
12143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
122e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org// This flag specifies the random number seed.
123e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.orgGTEST_DECLARE_int32_(random_seed);
124e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org
125e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org// This flag sets how many times the tests are repeated. The default value
12643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// is 1. If the value is -1 the tests are repeating forever.
12758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.orgGTEST_DECLARE_int32_(repeat);
128e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org
12943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// This flag controls whether Google Test includes Google Test internal
130e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org// stack frames in failure stack traces.
13140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.orgGTEST_DECLARE_bool_(show_internal_stack_frames);
13240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org
13340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org// When this flag is specified, tests' order is randomized on every run.
134c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comGTEST_DECLARE_bool_(shuffle);
135c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
136c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// This flag specifies the maximum number of stack frames to be
137c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// printed in a failure message.
138c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comGTEST_DECLARE_int32_(stack_trace_depth);
13983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
140285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org// When this flag is specified, a failed assertion will throw an
1414e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org// exception if exceptions are enabled, or exit the program with a
142ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// non-zero code otherwise.
143ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgGTEST_DECLARE_bool_(throw_on_failure);
1444f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// The upper limit for valid stack trace depths.
146e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.orgconst int kMaxStackTraceDepth = 100;
147ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
148ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgnamespace internal {
149ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
150a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgclass AssertHelper;
1513ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass DefaultGlobalTestPartResultReporter;
1523ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass ExecDeathTest;
1533ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass FinalSuccessChecker;
1543ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass GTestFlagSaver;
1553ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass TestCase;
1563ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass TestInfoImpl;
1573ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass TestResultAccessor;
158a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgclass UnitTestAccessor;
159ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass WindowsDeathTest;
160a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgclass UnitTestImpl* GetUnitTestImpl();
161a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgvoid ReportFailureInUnknownLocation(TestPartResultType result_type,
162a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                                    const String& message);
1632f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
164a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// Converts a streamable value to a String.  A NULL pointer is
165a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// converted to "(null)".  When the input value is a ::string,
166a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// ::std::string, ::wstring, or ::std::wstring object, each NUL
167a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// character in it is replaced with "\\0".
168a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// Declared in gtest-internal.h but defined here, so that it has access
169a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// to the definition of the Message class, required by the ARM
170a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// compiler.
1712f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgtemplate <typename T>
172a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgString StreamableToString(const T& streamable) {
173a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  return (Message() << streamable).GetString();
174a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org}
175a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
176a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org}  // namespace internal
177763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org
178b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// A class for indicating whether an assertion was successful.  When
179b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// the assertion wasn't successful, the AssertionResult object
180ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// remembers a non-empty message that described how it failed.
181b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
182ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// This class is useful for defining predicate-format functions to be
183b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
184ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//
1854f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org// The constructor of AssertionResult is private.  To create an
186ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// instance of this class, use one of the factory functions
18746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// (AssertionSuccess() and AssertionFailure()).
1887e6132b924829c353864933f29124419916db550machenbach@chromium.org//
189ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// For example, in order to be able to write:
19046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org//
191763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org//   // Verifies that Foo() returns an even number.
19246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org//   EXPECT_PRED_FORMAT1(IsEven, Foo());
19347390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org//
19446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// you just need to define:
195f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org//
196ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//   testing::AssertionResult IsEven(const char* expr, int n) {
1977e6132b924829c353864933f29124419916db550machenbach@chromium.org//     if ((n % 2) == 0) return testing::AssertionSuccess();
1987e6132b924829c353864933f29124419916db550machenbach@chromium.org//
199ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//     Message msg;
200763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org//     msg << "Expected: " << expr << " is even\n"
20147390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org//         << "  Actual: it's " << n;
202ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//     return testing::AssertionFailure(msg);
203ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//   }
204bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org//
205bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org// If Foo() returns 5, you will see the following message:
206bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org//
207bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org//   Expected: Foo() is even
208ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//     Actual: it's 5
209ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass AssertionResult {
2104f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org public:
211ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  // Declares factory functions for making successful and failed
212486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // assertion results as friends.
213486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  friend AssertionResult AssertionSuccess();
214ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  friend AssertionResult AssertionFailure(const Message&);
215ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
216ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  // Returns true iff the assertion succeeded.
21743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  operator bool() const { return failure_message_.c_str() == NULL; }  // NOLINT
218ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
219486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Returns the assertion's failure message.
22043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  const char* failure_message() const { return failure_message_.c_str(); }
221c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2227e6132b924829c353864933f29124419916db550machenbach@chromium.org private:
2237e6132b924829c353864933f29124419916db550machenbach@chromium.org  // The default constructor.  It is used when the assertion succeeded.
2247e6132b924829c353864933f29124419916db550machenbach@chromium.org  AssertionResult() {}
2257e6132b924829c353864933f29124419916db550machenbach@chromium.org
2267e6132b924829c353864933f29124419916db550machenbach@chromium.org  // The constructor used when the assertion failed.
2277e6132b924829c353864933f29124419916db550machenbach@chromium.org  explicit AssertionResult(const internal::String& failure_message);
2287e6132b924829c353864933f29124419916db550machenbach@chromium.org
2297e6132b924829c353864933f29124419916db550machenbach@chromium.org  // Stores the assertion's failure message.
2307e6132b924829c353864933f29124419916db550machenbach@chromium.org  internal::String failure_message_;
231b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org};
232b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
233ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// Makes a successful assertion result.
234b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgAssertionResult AssertionSuccess();
235ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
2364a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// Makes a failed assertion result with the given failure message.
237ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgAssertionResult AssertionFailure(const Message& msg);
238ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
239ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// The abstract class that all tests inherit from.
240ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//
241ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// In Google Test, a unit test program contains one or many TestCases, and
242763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// each TestCase contains one or many Tests.
243ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//
244763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// When you define a test using the TEST macro, you don't need to
245b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// explicitly derive from Test - the TEST macro automatically does
246ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// this for you.
2474f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org//
2484f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org// The only time you derive from Test is when defining a test fixture
249895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org// to be used a TEST_F.  For example:
250ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//
251763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org//   class FooTest : public testing::Test {
2524f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org//    protected:
253ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//     virtual void SetUp() { ... }
254ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//     virtual void TearDown() { ... }
255ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//     ...
256ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org//   };
2572efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org//
258486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org//   TEST_F(FooTest, Bar) { ... }
2592efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org//   TEST_F(FooTest, Baz) { ... }
2602efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org//
261486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// Test is not copyable.
2622efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.orgclass Test {
263486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org public:
2642efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  friend class internal::TestInfoImpl;
265f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
266ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  // Defines types for pointers to functions that set up and tear down
2674d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  // a test case.
268486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
269b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
270b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
271a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // The d'tor is virtual as we intend to inherit from Test.
272a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  virtual ~Test();
273a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
274a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Sets up the stuff shared by all tests in this test case.
2755d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  //
2765d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // Google Test will call Foo::SetUpTestCase() before running the first
2775d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // test in test case Foo.  Hence a sub-class can define its own
2785d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // SetUpTestCase() method to shadow the one defined in the super
2795d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // class.
280486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static void SetUpTestCase() {}
2815d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org
282471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Tears down the stuff shared by all tests in this test case.
2835d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  //
2845d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // Google Test will call Foo::TearDownTestCase() after running the last
2855d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // test in test case Foo.  Hence a sub-class can define its own
2865d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // TearDownTestCase() method to shadow the one defined in the super
287ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // class.
288e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  static void TearDownTestCase() {}
289486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
290e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // Returns true iff the current test has a fatal failure.
291ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  static bool HasFatalFailure();
2925d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org
2935d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // Returns true iff the current test has a non-fatal failure.
2945d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  static bool HasNonfatalFailure();
295b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
2965d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // Returns true iff the current test has a (either fatal or
297471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // non-fatal) failure.
2983ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
2993ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org
3003ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  // Logs a property for the current test.  Only the last value for a given
3013ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  // key is remembered.
3023ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  // These are public static so they can be called from utility functions
3035d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // that are not members of the test fixture.
3045d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // The arguments are const char* instead strings, as Google Test is used
3055d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // on platforms where string doesn't compile.
306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  //
3075d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // Note that a driving consideration for these RecordProperty methods
308e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // was to produce xml output suited to the Greenspan charting utility,
3095d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // which at present will only chart values that fit in a 32-bit int. It
310b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // is the user's responsibility to restrict their values to 32-bit ints
311b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // if they intend them to be used with Greenspan.
3125d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  static void RecordProperty(const char* key, const char* value);
3135d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  static void RecordProperty(const char* key, int value);
314b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
315b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org protected:
3162cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  // Creates a Test object.
317b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  Test();
318b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
319b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Sets up the test fixture.
320b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  virtual void SetUp();
3215f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
3225d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org  // Tears down the test fixture.
3235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  virtual void TearDown();
3245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
3255f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org private:
3261456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  // Returns true iff the current test has the same fixture class as
3279cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  // the first test in the current test case.
32841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  static bool HasSameFixtureClass();
3291456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org
3301456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  // Runs the test after the test fixture has been set up.
3311456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  //
3321456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  // A sub-class must implement this to define the test logic.
3331456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  //
3341456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
3359cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  // Instead, use the TEST or TEST_F macro.
336e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  virtual void TestBody() = 0;
33743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
3381456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  // Sets up, executes, and tears down the test.
3391456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  void Run();
3401456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org
341731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  // Uses a GTestFlagSaver to save and restore all Google Test flags.
342731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  const internal::GTestFlagSaver* const gtest_flag_saver_;
343731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org
344cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org  // Often a user mis-spells SetUp() as Setup() and spends a long time
345cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org  // wondering why it is never called by Google Test.  The declaration of
346cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org  // the following method is solely for catching such an error at
34783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  // compile time:
3481456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  //
349e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  //   - The return type is deliberately chosen to be not void, so it
350afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  //   will be a conflict if a user declares void Setup() in his test
351afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  //   fixture.
352afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  //
353cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org  //   - This method is private, so it will be another compiler error
3541456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  //   if a user calls it from his test fixture.
355731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  //
356731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  // DO NOT OVERRIDE THIS FUNCTION.
357731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  //
358731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  // If you see an error about overriding the following function or
359731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  // about it being private, you have mis-spelled SetUp() as Setup().
360d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  struct Setup_should_be_spelled_SetUp {};
361731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
362731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org
363731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  // We disallow copying Tests.
364731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
3651456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org};
366731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org
367731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.orgtypedef internal::TimeInMillis TimeInMillis;
368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
369731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.orgnamespace internal {
370a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
371d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// A copyable object representing a user specified test property which can be
372d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// output as a key/value string pair.
373d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org//
374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Don't inherit from TestProperty as its destructor is not virtual.
375a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass TestProperty {
376a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
377a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // C'tor.  TestProperty does NOT have a default constructor.
3782cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  // Always use this constructor (with parameters) to create a
379b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // TestProperty object.
380b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TestProperty(const char* key, const char* value) :
381b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    key_(key), value_(value) {
382b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
383b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
384b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Gets the user supplied key.
385763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org  const char* key() const {
386b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    return key_.c_str();
387b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
388afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org
389afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  // Gets the user supplied value.
390afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  const char* value() const {
391afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org    return value_.c_str();
392afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  }
393afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org
394afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  // Sets a new value, overriding the one supplied in the constructor.
395afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  void SetValue(const char* new_value) {
3961456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    value_ = new_value;
397afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  }
398afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org
399afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org private:
400763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org  // The key supplied by the user.
401afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  internal::String key_;
402afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  // The value supplied by the user.
403763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org  internal::String value_;
404afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org};
405afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org
406b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// The result of a single Test.  This includes a list of
407b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// TestPartResults, a list of TestProperties, a count of how many
408b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// death tests there are in the Test, and how much time it took to run
409b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// the Test.
410b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
411e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org// TestResult is not copyable.
412b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgclass TestResult {
413b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org public:
414b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Creates an empty TestResult.
41543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  TestResult();
416763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org
4174e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  // D'tor.  Do not inherit from TestResult.
418d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  ~TestResult();
4194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
420d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  // Gets the number of all test parts.  This is the sum of the number
421d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  // of successful test parts and the number of failed test parts.
422b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  int total_part_count() const;
4234edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
4244edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  // Returns the number of the test properties.
4254edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  int test_property_count() const;
4264edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
427b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns true iff the test passed (i.e. no test part failed).
428b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  bool Passed() const { return !Failed(); }
429b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
430d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  // Returns true iff the test failed.
431d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  bool Failed() const;
432e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
433d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  // Returns true iff the test fatally failed.
434865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  bool HasFatalFailure() const;
4354e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
436b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns true iff the test has a non-fatal failure.
437b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  bool HasNonfatalFailure() const;
438b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
439b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns the elapsed time, in milliseconds.
440486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  TimeInMillis elapsed_time() const { return elapsed_time_; }
441e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
4424a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns the i-th test part result among all the results. i can range
443b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // from 0 to test_property_count() - 1. If i is not in that range, aborts
444b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // the program.
445486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  const TestPartResult& GetTestPartResult(int i) const;
446e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
447486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Returns the i-th test property. i can range from 0 to
4484a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // test_property_count() - 1. If i is not in that range, aborts the
449b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // program.
4504a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  const TestProperty& GetTestProperty(int i) const;
451486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
452e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org private:
453486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  friend class internal::DefaultGlobalTestPartResultReporter;
454763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org  friend class internal::ExecDeathTest;
455b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  friend class internal::TestInfoImpl;
456b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  friend class internal::TestResultAccessor;
457b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  friend class internal::UnitTestImpl;
458486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  friend class internal::WindowsDeathTest;
459486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  friend class testing::TestInfo;
460c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  friend class testing::UnitTest;
4616d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
4624a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Gets the vector of TestPartResults.
463b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  const internal::Vector<TestPartResult>& test_part_results() const {
4644a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org    return *test_part_results_;
4654a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  }
466b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
467b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Gets the vector of TestProperties.
468b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  const internal::Vector<TestProperty>& test_properties() const {
4694a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org    return *test_properties_;
4704a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  }
4714a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
4724a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Sets the elapsed time.
473b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
4744a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
4754a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Adds a test property to the list. The property is validated and may add
4764a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
4774a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // key names). If a property is already recorded for the same key, the
4784a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // value will be updated, rather than storing multiple values for the same
4794a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // key.
4804a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  void RecordProperty(const TestProperty& test_property);
4814a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
482c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Adds a failure if the key is a reserved attribute of Google Test
483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // testcase tags.  Returns true if the property is valid.
484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // TODO(russr): Validate attribute names are legal and human readable.
485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static bool ValidateTestProperty(const TestProperty& test_property);
4864a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
4874a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Adds a test part result to the list.
4884a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  void AddTestPartResult(const TestPartResult& test_part_result);
489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4904a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns the death test count.
491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int death_test_count() const { return death_test_count_; }
4924a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
4934a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Increments the death test count, returning the new count.
4946d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  int increment_death_test_count() { return ++death_test_count_; }
495b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
496b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Clears the test part results.
497b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  void ClearTestPartResults();
498b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
4994a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Clears the object.
5004a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  void Clear();
501b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
502b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Protects mutable state of the property vector and of owned
5034a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // properties, whose values may be updated.
5044a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  internal::Mutex test_properites_mutex_;
5057a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org
5067a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org  // The vector of TestPartResults
5077a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org  internal::scoped_ptr<internal::Vector<TestPartResult> > test_part_results_;
5087a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org  // The vector of TestProperties
5097a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org  internal::scoped_ptr<internal::Vector<TestProperty> > test_properties_;
5104a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Running count of death tests.
511b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  int death_test_count_;
5124a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // The elapsed time, in milliseconds.
5134a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  TimeInMillis elapsed_time_;
5147a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org
5157a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org  // We disallow copying TestResult.
5167a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
5177a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org};  // class TestResult
5187a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org
5194a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org}  // namespace internal
5204a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
5214a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// A TestInfo object stores the following information about a test:
5224a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org//
523c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org//   Test case name
524a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//   Test name
525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//   Whether the test should be run
526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//   A function pointer that creates the test object when invoked
527e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org//   Test result
5284a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org//
529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// The constructor of TestInfo registers itself with the UnitTest
5304a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// singleton such that the RUN_ALL_TESTS() macro knows which tests to
531a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// run.
5324a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgclass TestInfo {
5334a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org public:
534a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Destructs a TestInfo object.  This function is not virtual, so
5354a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // don't inherit from TestInfo.
536a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ~TestInfo();
5374a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
5384a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns the test case name.
5394a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  const char* test_case_name() const;
540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5414a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns the test name.
542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  const char* name() const;
5434a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
5444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns the test case comment.
5454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  const char* test_case_comment() const;
5464a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
5476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  // Returns the test comment.
548b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  const char* comment() const;
549b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
550b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns true if this test should run, that is if the test is not disabled
551b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // (or it is disabled but the also_run_disabled_tests flag has been specified)
5524a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // and its full name matches the user-specified filter.
5534a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  //
554e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // Google Test allows the user to filter the tests by their full names.
5554a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // The full name of a test Bar in test case Foo is defined as
5564a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // "Foo.Bar".  Only the tests that match the filter will run.
557b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  //
558b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // A filter is a colon-separated list of glob (not regex) patterns,
5594a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // optionally followed by a '-' and a colon-separated list of
5604a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // negative patterns (tests to exclude).  A test is run if it
5614a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // matches one of the positive patterns and does not match any of
562e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // the negative patterns.
5634a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  //
5644a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // For example, *A*:Foo.* is a filter that matches any string that
5654a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // contains the character 'A' or starts with "Foo.".
566b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  bool should_run() const;
5674a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
5684a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns the result of the test.
5694a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  const internal::TestResult* result() const;
570e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
5714a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org private:
57243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org#if GTEST_HAS_DEATH_TEST
5739dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  friend class internal::DefaultDeathTestFactory;
5749dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif  // GTEST_HAS_DEATH_TEST
5759dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  friend class internal::TestInfoImpl;
5764a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  friend class internal::UnitTestImpl;
5774a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  friend class Test;
578e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  friend class internal::TestCase;
5794a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  friend TestInfo* internal::MakeAndRegisterTestInfo(
5804a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org      const char* test_case_name, const char* name,
5814a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org      const char* test_case_comment, const char* comment,
582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      internal::TypeId fixture_class_id,
5836d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org      Test::SetUpTestCaseFunc set_up_tc,
5844a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org      Test::TearDownTestCaseFunc tear_down_tc,
585b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      internal::TestFactoryBase* factory);
586b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
5874a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns true if this test matches the user-specified filter.
5884a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool matches_filter() const;
589e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
5904a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Increments the number of death tests encountered in this test so
5914a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // far.
592b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  int increment_death_test_count();
5934a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
5944a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Accessors for the implementation object.
5954a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  internal::TestInfoImpl* impl() { return impl_; }
5964a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  const internal::TestInfoImpl* impl() const { return impl_; }
59783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
5984a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Constructs a TestInfo object. The newly constructed instance assumes
599ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // ownership of the factory object.
60083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  TestInfo(const char* test_case_name, const char* name,
6014a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org           const char* test_case_comment, const char* comment,
602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org           internal::TypeId fixture_class_id,
6034a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org           internal::TestFactoryBase* factory);
604b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
605b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // An opaque implementation object.
606b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  internal::TestInfoImpl* impl_;
6074a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
6084a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
6094a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org};
61083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
6114a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgnamespace internal {
612ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
61383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// A test case, which consists of a vector of TestInfos.
6144a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org//
615ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// TestCase is not copyable.
6164a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgclass TestCase {
6174a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org public:
6184a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Creates a TestCase with the given name.
6194a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  //
6204a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // TestCase does NOT have a default constructor.  Always use this
6214a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // constructor to create a TestCase object.
622e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  //
623e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // Arguments:
6244a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  //
6254a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  //   name:         name of the test case
6264a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  //   set_up_tc:    pointer to the function that sets up the test case
6274a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  //   tear_down_tc: pointer to the function that tears down the test case
6284a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  TestCase(const char* name, const char* comment,
6294a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org           Test::SetUpTestCaseFunc set_up_tc,
6304a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org           Test::TearDownTestCaseFunc tear_down_tc);
6314a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
6324a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Destructor of TestCase.
6334a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  virtual ~TestCase();
6344a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
6354a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Gets the name of the TestCase.
6364a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  const char* name() const { return name_.c_str(); }
6374a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
6384a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns the test case comment.
6394a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  const char* comment() const { return comment_.c_str(); }
6404a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
6414a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Returns true if any test in this test case should run.
6424a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  bool should_run() const { return should_run_; }
6434a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
6444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Gets the number of successful tests in this test case.
6454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int successful_test_count() const;
646c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
647d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Gets the number of failed tests in this test case.
648d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  int failed_test_count() const;
649d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
6504a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Gets the number of disabled tests in this test case.
6514a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  int disabled_test_count() const;
6524a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
6534a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  // Get the number of tests in this test case that should run.
6549dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  int test_to_run_count() const;
6559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
6569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // Gets the number of all tests in this test case.
6579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  int total_test_count() const;
6586d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
6596d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  // Returns true iff the test case passed.
66065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  bool Passed() const { return !Failed(); }
66165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
662b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // Returns true iff the test case failed.
663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool Failed() const { return failed_test_count() > 0; }
6647a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org
66565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  // Returns the elapsed time, in milliseconds.
66665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  TimeInMillis elapsed_time() const { return elapsed_time_; }
66765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
668b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns the i-th test among all the tests. i can range from 0 to
669b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // total_test_count() - 1. If i is not in that range, returns NULL.
67065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  const TestInfo* GetTestInfo(int i) const;
67165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
67265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org private:
67365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  friend class testing::Test;
67465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  friend class internal::UnitTestImpl;
67565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
67665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  // Gets the (mutable) vector of TestInfos in this TestCase.
67765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  internal::Vector<TestInfo*>& test_info_list() { return *test_info_list_; }
67865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
67965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  // Gets the (immutable) vector of TestInfos in this TestCase.
68065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  const internal::Vector<TestInfo *> & test_info_list() const {
681b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    return *test_info_list_;
682b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
683b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
684b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Sets the should_run member.
685486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  void set_should_run(bool should) { should_run_ = should; }
686e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
687486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
688486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // destruction of the TestCase object.
689486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  void AddTestInfo(TestInfo * test_info);
690486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
691d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  // Clears the results of all tests in this test case.
692d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  void ClearResult();
693486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
694486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Clears the results of all tests in the given test case.
695486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static void ClearTestCaseResult(TestCase* test_case) {
696486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org    test_case->ClearResult();
697486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  }
698486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
699486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Runs every test in this TestCase.
700486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  void Run();
701e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
702486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Runs every test in the given TestCase.
703486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static void RunTestCase(TestCase * test_case) { test_case->Run(); }
704486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
705486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Returns true iff test passed.
706486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static bool TestPassed(const TestInfo * test_info);
707486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
708b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns true iff test failed.
709b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  static bool TestFailed(const TestInfo * test_info);
710b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
711b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns true iff test is disabled.
712486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static bool TestDisabled(const TestInfo * test_info);
713e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
714486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Returns true if the given test should run.
71543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  static bool ShouldRunTest(const TestInfo *test_info);
716b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
717b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Name of the test case.
718b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  internal::String name_;
719486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Comment on the test case.
720486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  internal::String comment_;
721486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Vector of TestInfos.
722486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  internal::Vector<TestInfo*>* test_info_list_;
723e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // Pointer to the function that sets up the test case.
724e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  Test::SetUpTestCaseFunc set_up_tc_;
725e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // Pointer to the function that tears down the test case.
726e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  Test::TearDownTestCaseFunc tear_down_tc_;
727486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // True iff any test in this test case should run.
72843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  bool should_run_;
729c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Elapsed time, in milliseconds.
730b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TimeInMillis elapsed_time_;
731486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
732486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // We disallow copying TestCases.
733c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
734b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org};
735b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
736b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}  // namespace internal
737b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
738c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// An Environment object is capable of setting up and tearing down an
739a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// environment.  The user should subclass this to define his own
740a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// environment(s).
741a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//
742d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// An Environment object does the set-up and tear-down in virtual
743d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// methods SetUp() and TearDown() instead of the constructor and the
744d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// destructor, as:
745d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org//
746d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org//   1. You cannot safely throw from a destructor.  This is a problem
74783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org//      as in some cases Google Test is used where exceptions are enabled, and
74883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org//      we may want to implement ASSERT_* using exceptions where they are
749c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org//      available.
750d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org//   2. You cannot use ASSERT_* directly in a constructor or
751d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org//      destructor.
752d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgclass Environment {
753d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org public:
754d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // The d'tor is virtual as we need to subclass Environment.
755a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  virtual ~Environment() {}
756a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
757a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Override this to define how to set up the environment.
758ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  virtual void SetUp() {}
7598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
760e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // Override this to define how to tear down the environment.
761000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  virtual void TearDown() {}
762ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com private:
76343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  // If you see an error about overriding the following function or
764ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // about it being private, you have mis-spelled SetUp() as Setup().
765594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  struct Setup_should_be_spelled_SetUp {};
766ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
767594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org};
768ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
769ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// A UnitTest consists of a vector of TestCases.
770ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com//
771ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// This is a singleton class.  The only instance of UnitTest is
772ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// created when UnitTest::GetInstance() is first called.  This
773ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// instance is never deleted.
774486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//
775486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org// UnitTest is not copyable.
776486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//
777ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// This class is thread-safe as long as the methods are called
778ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// according to their specification.
7791805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgclass UnitTest {
780486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org public:
781486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Gets the singleton UnitTest object.  The first time this method
782486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // is called, a UnitTest object is constructed and returned.
7837028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // Consecutive calls will return the same object.
784ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  static UnitTest* GetInstance();
785ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
7867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // Runs all tests in this UnitTest object and prints the result.
7877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // Returns 0 if successful, or 1 otherwise.
788486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  //
789486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // This method can only be called from the main thread.
790486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  //
791486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
792ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int Run() GTEST_MUST_USE_RESULT_;
793ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
79480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  // Returns the working directory when the first TEST() or TEST_F()
79543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  // was executed.  The UnitTest object owns the string.
796b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  const char* original_working_dir() const;
7974668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
798b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Returns the TestCase object for the test that's currently running,
799486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // or NULL if no test is running.
800ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  const internal::TestCase* current_test_case() const;
801ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
802ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Returns the TestInfo object for the test that's currently running,
80380c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  // or NULL if no test is running.
80443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  const TestInfo* current_test_info() const;
80580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
8061805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // Returns the random seed used at the start of the current test run.
8074668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  int random_seed() const;
8084668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
809b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#if GTEST_HAS_PARAM_TEST
810486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // Returns the ParameterizedTestCaseRegistry object used to keep track of
811ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // value-parameterized tests and instantiate and register them.
812763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org  //
8134668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
814394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
815e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#endif  // GTEST_HAS_PARAM_TEST
816394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
817355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org private:
8184668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // Registers and returns a global test environment.  When a test
8194668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // program is run, all global test environments will be set-up in
8204668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // the order they were registered.  After all tests in the program
8214668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // have finished, all global test environments will be torn-down in
8224668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // the *reverse* order they were registered.
823ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  //
82480c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  // The UnitTest object takes ownership of the given environment.
8254668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  //
826486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  // This method can only be called from the main thread.
8274668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  Environment* AddEnvironment(Environment* env);
8289bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
8294668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // Adds a TestPartResult to the current TestResult object.  All
830b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
831b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // eventually call this to report their results.  The user code
832b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // should use the assertion macros instead of calling this directly.
833b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  void AddTestPartResult(TestPartResultType result_type,
834b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org                         const char* file_name,
835ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com                         int line_number,
836ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com                         const internal::String& message,
837ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com                         const internal::String& os_stack_trace);
838ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
839ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Adds a TestProperty to the current TestResult object. If the result already
840ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // contains a property with the same key, the value will be updated.
8417028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void RecordPropertyForCurrentTest(const char* key, const char* value);
842ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
8437c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  // Accessors for the implementation object.
844ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  internal::UnitTestImpl* impl() { return impl_; }
845ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  const internal::UnitTestImpl* impl() const { return impl_; }
8467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
847ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of successful test cases.
848ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int successful_test_case_count() const;
849ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
850ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of failed test cases.
851ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int failed_test_case_count() const;
852ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
853ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of all test cases.
85443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  int total_test_case_count() const;
855ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
856ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of all test cases that contain at least one test
857ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // that should run.
858ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int test_case_to_run_count() const;
859ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
860ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of successful tests.
861ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int successful_test_count() const;
86243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
863ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of failed tests.
864ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int failed_test_count() const;
865ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
866ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of disabled tests.
867ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int disabled_test_count() const;
868ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
869ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of all tests.
870ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int total_test_count() const;
871ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
872ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the number of tests that should run.
873ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  int test_to_run_count() const;
874ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
875ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the elapsed time, in milliseconds.
876ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  TimeInMillis elapsed_time() const;
877ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
878763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org  // Returns true iff the unit test passed (i.e. all test cases passed).
879ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  bool Passed() const;
880ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
881ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Returns true iff the unit test failed (i.e. some test case failed
8829bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  // or something outside of all tests failed).
883ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  bool Failed() const;
884ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
885ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Gets the i-th test case among all the test cases. i can range from 0 to
886ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // total_test_case_count() - 1. If i is not in that range, returns NULL.
887ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  const internal::TestCase* GetTestCase(int i) const;
888ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
889ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // ScopedTrace is a friend as it needs to modify the per-thread
8908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  // trace stack, which is a private member of UnitTest.
891e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // TODO(vladl@google.com): Order all declarations according to the style
892e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  // guide after publishing of the above methods is done.
8938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend class internal::ScopedTrace;
8948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend Environment* AddGlobalTestEnvironment(Environment* env);
8958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
8968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend class internal::AssertHelper;
8978e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend class Test;
8988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend void internal::ReportFailureInUnknownLocation(
89943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      TestPartResultType result_type,
90043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      const internal::String& message);
9018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  // TODO(vladl@google.com): Remove these when publishing the new accessors.
9028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend class PrettyUnitTestResultPrinter;
90343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  friend class XmlUnitTestResultPrinter;
9048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend class internal::UnitTestAccessor;
9058e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  friend class FinalSuccessChecker;
9068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  FRIEND_TEST(ApiTest, UnitTestImmutableAccessorsWork);
9078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  FRIEND_TEST(ApiTest, TestCaseImmutableAccessorsWork);
9088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  FRIEND_TEST(ApiTest, DisabledTestCaseAccessorsWork);
9098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
9108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
9118e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  // Creates an empty UnitTest.
9128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  UnitTest();
9138e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
9148e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  // D'tor
9158e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  virtual ~UnitTest();
916ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
917ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
918ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Google Test trace stack.
919ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  void PushGTestTrace(const internal::TraceInfo& trace);
920ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
921ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Pops a trace from the per-thread Google Test trace stack.
922ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  void PopGTestTrace();
923ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
924ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Protects mutable state in *impl_.  This is mutable as some const
925ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // methods need to lock it too.
926ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  mutable internal::Mutex mutex_;
927ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
928ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Opaque implementation object.  This field is never changed once
929ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // the object is constructed.  We don't mark it as const here, as
930ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // doing so will cause a warning in the constructor of UnitTest.
931ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // Mutable state in *impl_ is protected by mutex_.
932ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  internal::UnitTestImpl* impl_;
933ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
934ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  // We disallow copying UnitTest.
935ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
936ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com};
937ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
938ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// A convenient wrapper for adding an environment for the test
939ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// program.
940ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com//
941ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// You should call this before RUN_ALL_TESTS() is called, probably in
942ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// main().  If you use gtest_main, you need to call this before main()
943ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// starts for it to take effect.  For example, you can define a global
944ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// variable like this:
945ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com//
946ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com//   testing::Environment* const foo_env =
947b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//       testing::AddGlobalTestEnvironment(new FooEnvironment);
948b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
949763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// However, we strongly recommend you to write your own main() and
950b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// call AddGlobalTestEnvironment() there, as relying on initialization
9511805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// of global variables makes the code harder to read and may cause
95247390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org// problems when you register multiple environments from different
953b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// translation units and the environments have dependencies among them
954b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// (remember that the compiler doesn't guarantee the order in which
955b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// global variables from different translation units are initialized).
956b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orginline Environment* AddGlobalTestEnvironment(Environment* env) {
9578e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  return UnitTest::GetInstance()->AddEnvironment(env);
9588e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
9598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
96047390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org// Initializes Google Test.  This must be called before calling
9618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org// RUN_ALL_TESTS().  In particular, it parses a command line for the
9628e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org// flags that Google Test recognizes.  Whenever a Google Test flag is
9638e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org// seen, it is removed from argv, and *argc is decremented.
9648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org//
9659dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// No value is returned.  Instead, the Google Test flag variables are
9669dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// updated.
9679dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
9689dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// Calling the function for the second time has no user-visible effect.
969d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgvoid InitGoogleTest(int* argc, char** argv);
9709dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
9714a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// This overloaded version can be used in Windows programs compiled in
972d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// UNICODE mode.
9739dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comvoid InitGoogleTest(int* argc, wchar_t** argv);
9749dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
9759dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comnamespace internal {
9769dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
9779dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// These overloaded versions handle ::std::string and ::std::wstring.
9789dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#if GTEST_HAS_STD_STRING
9799dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.cominline String FormatForFailureMessage(const ::std::string& str) {
9809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  return (Message() << '"' << str << '"').GetString();
98144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org}
982d218783b5ca3a9706b143874e9372e469f3e6f71fschneider@chromium.org#endif  // GTEST_HAS_STD_STRING
9839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
9849dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#if GTEST_HAS_STD_WSTRING
9859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.cominline String FormatForFailureMessage(const ::std::wstring& wstr) {
9869dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  return (Message() << "L\"" << wstr << '"').GetString();
9879dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com}
9889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif  // GTEST_HAS_STD_WSTRING
9899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
9909dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// These overloaded versions handle ::string and ::wstring.
9919dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#if GTEST_HAS_GLOBAL_STRING
9929dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.cominline String FormatForFailureMessage(const ::string& str) {
9939dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  return (Message() << '"' << str << '"').GetString();
9944a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org}
9959dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif  // GTEST_HAS_GLOBAL_STRING
99665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
99743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org#if GTEST_HAS_GLOBAL_WSTRING
998d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.cominline String FormatForFailureMessage(const ::wstring& wstr) {
999d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  return (Message() << "L\"" << wstr << '"').GetString();
1000d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com}
100183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org#endif  // GTEST_HAS_GLOBAL_WSTRING
100243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
1003895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
100483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org// operand to be used in a failure message.  The type (but not value)
1005d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// of the other operand may affect the format.  This allows us to
10067a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org// print a char* as a raw pointer when it is compared against another
100765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// char*, and print it as a C string when it is compared against an
100865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// std::string object, for example.
100944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org//
101065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// The default implementation ignores the type of the other operand.
101165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// Some specialized versions are used to handle formatting wide or
10129dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// narrow C strings.
1013d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com//
1014d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
10156313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgtemplate <typename T1, typename T2>
10166313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.orgString FormatForComparisonFailureMessage(const T1& value,
1017f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                         const T2& /* other_operand */) {
10184f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return FormatForFailureMessage(value);
1019d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com}
10204f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org
10214f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org// The helper function for {ASSERT|EXPECT}_EQ.
10224f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.orgtemplate <typename T1, typename T2>
10234f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.orgAssertionResult CmpHelperEQ(const char* expected_expression,
10244f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                            const char* actual_expression,
10254f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                            const T1& expected,
10264f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                            const T2& actual) {
10274f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org#ifdef _MSC_VER
10284f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org#pragma warning(push)          // Saves the current warning state.
10297a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org#pragma warning(disable:4389)  // Temporarily disables warning on
10309dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               // signed/unsigned mismatch.
10319dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif
103244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
10339dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  if (expected == actual) {
10349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    return AssertionSuccess();
10359dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  }
10369dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
10379dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#ifdef _MSC_VER
10389dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#pragma warning(pop)          // Restores the warning state.
10399dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif
104028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
10419dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  return EqFailure(expected_expression,
104244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                   actual_expression,
10439dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                   FormatForComparisonFailureMessage(expected, actual),
10449dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                   FormatForComparisonFailureMessage(actual, expected),
10459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                   false);
10469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com}
10479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
10489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// With this overloaded version, we allow anonymous enums to be used
104944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
10504d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org// can be implicitly cast to BiggestInt.
10519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comAssertionResult CmpHelperEQ(const char* expected_expression,
10529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                            const char* actual_expression,
10539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                            BiggestInt expected,
105428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org                            BiggestInt actual);
1055d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
10569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
10579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
10589dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// is a null pointer literal.  The following default implementation is
10599dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// for lhs_is_null_literal being false.
10609dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comtemplate <bool lhs_is_null_literal>
1061f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgclass EqHelper {
10629dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com public:
10639dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // This templatized version is for the general case.
10649dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  template <typename T1, typename T2>
10659dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static AssertionResult Compare(const char* expected_expression,
10669dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                 const char* actual_expression,
10679dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                 const T1& expected,
10681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                                 const T2& actual) {
10691fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return CmpHelperEQ(expected_expression, actual_expression, expected,
10704a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org                       actual);
10719dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  }
10729dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
10735d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // With this overloaded version, we allow anonymous enums to be used
10745d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
10757a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org  // enums can be implicitly cast to BiggestInt.
10769dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  //
10779dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // Even though its body looks the same as the above version, we
1078be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  // cannot merge the two, as it will make anonymous enums unhappy.
1079be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  static AssertionResult Compare(const char* expected_expression,
10809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                 const char* actual_expression,
10819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                 BiggestInt expected,
10829dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                 BiggestInt actual) {
1083d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org    return CmpHelperEQ(expected_expression, actual_expression, expected,
10849dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                       actual);
10859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  }
1086763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org};
10879dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
10889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// This specialization is used when the first argument to ASSERT_EQ()
1089763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// is a null pointer literal.
10909dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comtemplate <>
1091394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comclass EqHelper<true> {
1092394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com public:
1093394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // We define two overloaded versions of Compare().  The first
1094394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // version will be picked when the second argument to ASSERT_EQ() is
1095394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
1096394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // EXPECT_EQ(false, a_bool).
10975d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  template <typename T1, typename T2>
10985d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  static AssertionResult Compare(const char* expected_expression,
10995d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org                                 const char* actual_expression,
11005d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org                                 const T1& expected,
1101be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org                                 const T2& actual) {
11025d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org    return CmpHelperEQ(expected_expression, actual_expression, expected,
11035d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org                       actual);
11045d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  }
110583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
110643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  // This version will be picked when the second argument to
110783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  // ASSERT_EQ() is a pointer, e.g. ASSERT_EQ(NULL, a_pointer).
11089dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  template <typename T1, typename T2>
11099dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  static AssertionResult Compare(const char* expected_expression,
11105d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org                                 const char* actual_expression,
1111763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org                                 const T1& /* expected */,
11129dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                 T2* actual) {
11139dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    // We already know that 'expected' is a null pointer.
11149dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    return CmpHelperEQ(expected_expression, actual_expression,
11159dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                       static_cast<T2*>(NULL), actual);
11169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  }
111783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org};
11189dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
11199dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// A macro for implementing the helper functions needed to implement
1120355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
11219dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// of similar code.
11229dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
11235d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org// For each templatized helper function, we also define an overloaded
1124355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org// version for BiggestInt in order to reduce code bloat and allow
1125355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
1126355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org// with gcc 4.
1127355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org//
1128355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
1129355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
1130355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgtemplate <typename T1, typename T2>\
113140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.orgAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
113243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org                                   const T1& val1, const T2& val2) {\
113343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  if (val1 op val2) {\
11349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    return AssertionSuccess();\
1135f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  } else {\
1136763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org    Message msg;\
1137763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org    msg << "Expected: (" << expr1 << ") " #op " (" << expr2\
1138763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
11399dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
11409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    return AssertionFailure(msg);\
11419dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  }\
1142355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org}\
1143fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
1144355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org                                   BiggestInt val1, BiggestInt val2);
1145355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
11469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
1147394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
11489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// Implements the helper function for {ASSERT|EXPECT}_NE
11499a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.orgGTEST_IMPL_CMP_HELPER_(NE, !=)
1150f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Implements the helper function for {ASSERT|EXPECT}_LE
1151f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgGTEST_IMPL_CMP_HELPER_(LE, <=)
1152f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Implements the helper function for {ASSERT|EXPECT}_LT
1153a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgGTEST_IMPL_CMP_HELPER_(LT, < )
1154394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Implements the helper function for {ASSERT|EXPECT}_GE
115543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgGTEST_IMPL_CMP_HELPER_(GE, >=)
1156394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Implements the helper function for {ASSERT|EXPECT}_GT
1157394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comGTEST_IMPL_CMP_HELPER_(GT, > )
1158394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
1159394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com#undef GTEST_IMPL_CMP_HELPER_
1160394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
1161763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// The helper function for {ASSERT|EXPECT}_STREQ.
1162763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org//
116343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
1164763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.orgAssertionResult CmpHelperSTREQ(const char* expected_expression,
11659dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const char* actual_expression,
11669dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const char* expected,
11679dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const char* actual);
1168be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
11699dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
117043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org//
11717a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
117228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.orgAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
11739dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                   const char* actual_expression,
11749dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                                   const char* expected,
117543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org                                   const char* actual);
1176eb7c144137bd7d461d4996f752f1353a0856fac1ricow@chromium.org
117743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// The helper function for {ASSERT|EXPECT}_STRNE.
11789dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
11799dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
11809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comAssertionResult CmpHelperSTRNE(const char* s1_expression,
11819dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const char* s2_expression,
1182394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                               const char* s1,
11839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const char* s2);
118443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
11859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// The helper function for {ASSERT|EXPECT}_STRCASENE.
11869dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
1187394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
118883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgAssertionResult CmpHelperSTRCASENE(const char* s1_expression,
118943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org                                   const char* s2_expression,
11907a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org                                   const char* s1,
119183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org                                   const char* s2);
11929dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1193394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
1194394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Helper function for *_STREQ on wide strings.
1195394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com//
1196394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
1197394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comAssertionResult CmpHelperSTREQ(const char* expected_expression,
11989dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const char* actual_expression,
11999dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const wchar_t* expected,
12009dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const wchar_t* actual);
1201763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org
1202763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// Helper function for *_STRNE on wide strings.
12039dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
1204badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
120528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.orgAssertionResult CmpHelperSTRNE(const char* s1_expression,
120643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org                               const char* s2_expression,
12079dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const wchar_t* s1,
12089dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com                               const wchar_t* s2);
12099dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
12109dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com}  // namespace internal
121143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
12129dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// IsSubstring() and IsNotSubstring() are intended to be used as the
12135f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
1214be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org// themselves.  They check whether needle is a substring of haystack
12155f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org// (NULL is considered a substring of itself only), and return an
12169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// appropriate error message when they fail.
12179dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
12189dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// The {needle,haystack}_expr arguments are the stringified
12199dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// expressions that generated the two real arguments.
12209dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comAssertionResult IsSubstring(
12219dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    const char* needle_expr, const char* haystack_expr,
122228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    const char* needle, const char* haystack);
12239dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comAssertionResult IsSubstring(
12249dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    const char* needle_expr, const char* haystack_expr,
1225cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org    const wchar_t* needle, const wchar_t* haystack);
1226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgAssertionResult IsNotSubstring(
12279dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    const char* needle_expr, const char* haystack_expr,
12289dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    const char* needle, const char* haystack);
122928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.orgAssertionResult IsNotSubstring(
1230fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org    const char* needle_expr, const char* haystack_expr,
12319dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    const wchar_t* needle, const wchar_t* haystack);
12329dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#if GTEST_HAS_STD_STRING
1233be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgAssertionResult IsSubstring(
12349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    const char* needle_expr, const char* haystack_expr,
12359dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com    const ::std::string& needle, const ::std::string& haystack);
12369dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comAssertionResult IsNotSubstring(
1237b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    const char* needle_expr, const char* haystack_expr,
1238b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    const ::std::string& needle, const ::std::string& haystack);
12391fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org#endif  // GTEST_HAS_STD_STRING
12401fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12411fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org#if GTEST_HAS_STD_WSTRING
12421fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgAssertionResult IsSubstring(
12431fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    const char* needle_expr, const char* haystack_expr,
12441fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    const ::std::wstring& needle, const ::std::wstring& haystack);
12451fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgAssertionResult IsNotSubstring(
12461845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org    const char* needle_expr, const char* haystack_expr,
12471845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org    const ::std::wstring& needle, const ::std::wstring& haystack);
12481fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org#endif  // GTEST_HAS_STD_WSTRING
12491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgnamespace internal {
12511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org// Helper template function for comparing floating-points.
12531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org//
12541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org// Template parameter:
12551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org//
12561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org//   RawType: the raw floating-point type (either float or double)
12571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org//
12581fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
12591fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgtemplate <typename RawType>
12601fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
12611fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                                         const char* actual_expression,
12621fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                                         RawType expected,
12631fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                                         RawType actual) {
12641fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  const FloatingPoint<RawType> lhs(expected), rhs(actual);
12651fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12661fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  if (lhs.AlmostEquals(rhs)) {
12671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    return AssertionSuccess();
12681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
12691fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12701fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  StrStream expected_ss;
12711fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
12721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org              << expected;
12731fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  StrStream actual_ss;
12751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
12761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org            << actual;
12771fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12781fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return EqFailure(expected_expression,
12791fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                   actual_expression,
12801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                   StrStreamToString(&expected_ss),
128121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org                   StrStreamToString(&actual_ss),
128221b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org                   false);
12839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com}
12845d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org
12855d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org// Helper function for implementing ASSERT_NEAR.
12865d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org//
12875d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
12885d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.orgAssertionResult DoubleNearPredFormat(const char* expr1,
12895d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org                                     const char* expr2,
12905d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org                                     const char* abs_error_expr,
1291ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                     double val1,
12925d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org                                     double val2,
1293ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                     double abs_error);
12942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
1295662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
12969dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// A class that enables one to stream messages to assertion macros
12979dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comclass AssertHelper {
1298763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org public:
12999dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  // Constructor.
1300ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  AssertHelper(TestPartResultType type, const char* file, int line,
1301ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org               const char* message);
1302ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Message assignment is a semantic trick to enable assertion
130347390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org  // streaming; see the GTEST_MESSAGE_ macro below.
13049dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  void operator=(const Message& message) const;
13054a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org private:
1306b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  TestPartResultType const type_;
1307b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  const char*        const file_;
1308b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  int                const line_;
1309b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  String             const message_;
1310b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1311030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
1312b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org};
1313b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1314b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}  // namespace internal
1315a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1316a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#if GTEST_HAS_PARAM_TEST
1317a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// The abstract base class that all value-parameterized tests inherit from.
1318a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//
1319a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// This class adds support for accessing the test parameter value via
1320a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// the GetParam() method.
1321a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//
1322a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// Use it with one of the parameter generator defining functions, like Range(),
1323a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// Values(), ValuesIn(), Bool(), and Combine().
1324a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//
1325a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// class FooTest : public ::testing::TestWithParam<int> {
1326a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//  protected:
1327a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//   FooTest() {
1328a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//     // Can use GetParam() here.
1329a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//   }
1330a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//   virtual ~FooTest() {
1331a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//     // Can use GetParam() here.
1332a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//   }
1333a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org//   virtual void SetUp() {
13349d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org//     // Can use GetParam() here.
1335486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   }
1336486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   virtual void TearDown {
13372ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//     // Can use GetParam() here.
13382ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//   }
13392ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// };
13402ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// TEST_P(FooTest, DoesBar) {
13412ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//   // Can use GetParam() method here.
13422ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//   Foo foo;
1343486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org//   ASSERT_TRUE(foo.DoesBar(GetParam()));
13442ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// }
13457a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
13462ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
13472ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgtemplate <typename T>
13482ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgclass TestWithParam : public Test {
13492ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org public:
135043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  typedef T ParamType;
13512ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
13522ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  // The current parameter value. Is also available in the test fixture's
13532ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  // constructor.
13542ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  const ParamType& GetParam() const { return *parameter_; }
13552ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
13562ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org private:
1357486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  // Sets parameter value. The caller is responsible for making sure the value
13582ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  // remains alive and unchanged throughout the current test.
13592ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  static void SetParam(const ParamType* parameter) {
13602ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org    parameter_ = parameter;
13612ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  }
13622ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
13632ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  // Static value used for accessing parameter during a test lifetime.
136483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  static const ParamType* parameter_;
13652ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
136643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  // TestClass must be a subclass of TestWithParam<T>.
13672ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  template <class TestClass> friend class internal::ParameterizedTestFactory;
13682ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org};
136946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
13702ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.orgtemplate <typename T>
137146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgconst T* TestWithParam<T>::parameter_ = NULL;
13727a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org
137383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org#endif  // GTEST_HAS_PARAM_TEST
13742ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
13757a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org// Macros for indicating success/failure in test code.
13762ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
13772ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// ADD_FAILURE unconditionally adds a failure to the current test.
137843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// SUCCEED generates a success - it doesn't automatically make the
13792ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// current test successful, as a test is only successful when it has
13802ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// no failure.
13812ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//
13822ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// EXPECT_* verifies that a certain condition is satisfied.  If not,
13832ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// it behaves like ADD_FAILURE.  In particular:
13842ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//
13859aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org//   EXPECT_TRUE  verifies that a Boolean condition is true.
13869aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org//   EXPECT_FALSE verifies that a Boolean condition is false.
13879d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org//
13889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
13899d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org// that they will also abort the current function on failure.  People
13909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
13919d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org// writing data-driven tests often find themselves using ADD_FAILURE
13929cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// and EXPECT_* more.
13939cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org//
13949cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// Examples:
13959cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org//
13962ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//   EXPECT_TRUE(server.StatusIsOK());
13972ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//   ASSERT_FALSE(server.HasPendingRequest(port))
13982ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//       << "There are still pending requests " << "on port " << port;
1399486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
1400486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org// Generates a nonfatal failure with a generic message.
1401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
14022ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
14032ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Generates a fatal failure with a generic message.
14042ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org#define FAIL() GTEST_FATAL_FAILURE_("Failed")
1405486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
14062ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// Generates a success with a generic message.
1407486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org#define SUCCEED() GTEST_SUCCESS_("Succeeded")
14082ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
14097a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org// Macros for testing exceptions.
14102ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//
14112ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
14122ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//         Tests that the statement throws the expected exception.
141343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org//    * {ASSERT|EXPECT}_NO_THROW(statement):
14142ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//         Tests that the statement doesn't throw any exception.
14152ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//    * {ASSERT|EXPECT}_ANY_THROW(statement):
14162ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//         Tests that the statement throws an exception.
14172ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org
14182ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org#define EXPECT_THROW(statement, expected_exception) \
14197a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
14202ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org#define EXPECT_NO_THROW(statement) \
14215d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
14225d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org#define EXPECT_ANY_THROW(statement) \
14235d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
14245d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org#define ASSERT_THROW(statement, expected_exception) \
1425486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
14262ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org#define ASSERT_NO_THROW(statement) \
14272ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
14282ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org#define ASSERT_ANY_THROW(statement) \
14299d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
1430486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
1431486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org// Boolean assertions.
1432486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org#define EXPECT_TRUE(condition) \
14332ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
14342ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org                      GTEST_NONFATAL_FAILURE_)
14352ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org#define EXPECT_FALSE(condition) \
14362ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
14372ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org                      GTEST_NONFATAL_FAILURE_)
14389d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org#define ASSERT_TRUE(condition) \
1439b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
14409d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                      GTEST_FATAL_FAILURE_)
14412ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org#define ASSERT_FALSE(condition) \
1442b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
1443486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org                      GTEST_FATAL_FAILURE_)
144443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
1445486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// Includes the auto-generated header that implements a family of
1446486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// generic predicate assertion macros.
1447486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org#include <gtest/gtest_pred_impl.h>
1448486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
1449486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org// Macros for testing equalities and inequalities.
1450a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org//
1451486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
1452a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
145347390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
1454a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
14552ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
1456486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
14572ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//
14582ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// When they are not, Google Test prints both the tested expressions and
14592ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// their actual values.  The values must be compatible built-in types,
14602ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org// or you will get a compiler error.  By "compatible" we mean that the
1461030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org// values can be compared by the respective operator.
1462030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org//
1463030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org// Note:
1464030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org//
1465030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org//   1. It is possible to make a user-defined type work with
1466486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   {ASSERT|EXPECT}_??(), but that requires overloading the
1467486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   comparison operators and is thus discouraged by the Google C++
1468486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   Usage Guide.  Therefore, you are advised to use the
1469486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
1470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//   equal.
14719aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org//
14729aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
14739d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org//   pointers (in particular, C strings).  Therefore, if you use it
14749aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org//   with two C strings, you are testing how their locations in memory
14759d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org//   are related, not how their content is related.  To compare two C
14769d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org//   strings by content, use {ASSERT|EXPECT}_STR*().
14779cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org//
1478486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
1479486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
1480486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   what the actual value is when it fails, and similarly for the
14812ec107fe650fe56eed094ca017940f26af46644bsgjesse@chromium.org//   other comparisons.
1482486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//
1483486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
1484486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org//   evaluate their arguments, which is undefined.
1485f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//
1486f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//   5. These macros evaluate their arguments exactly once.
1487c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//
1488c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// Examples:
1489c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//
1490c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//   EXPECT_NE(5, Foo());
1491c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//   EXPECT_EQ(NULL, a_pointer);
1492c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//   ASSERT_LT(i, array_size);
1493e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org//   ASSERT_GT(records.size(), 0) << "There is no record left.";
1494c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1495c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define EXPECT_EQ(expected, actual) \
1496c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal:: \
1497c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
1498c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org                      expected, actual)
1499c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define EXPECT_NE(expected, actual) \
1500c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
1501c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define EXPECT_LE(val1, val2) \
1502c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
1503c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define EXPECT_LT(val1, val2) \
1504c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
1505c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define EXPECT_GE(val1, val2) \
1506c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
1507c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define EXPECT_GT(val1, val2) \
1508c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
1509c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1510c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define ASSERT_EQ(expected, actual) \
1511c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal:: \
1512c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
1513c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org                      expected, actual)
1514ac45fedf88208de9636b896863f0942bae969d67jkummerow@chromium.org#define ASSERT_NE(val1, val2) \
1515c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
1516e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#define ASSERT_LE(val1, val2) \
1517e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
1518486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org#define ASSERT_LT(val1, val2) \
1519c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
1520c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define ASSERT_GE(val1, val2) \
1521c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
1522c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define ASSERT_GT(val1, val2) \
1523c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
1524c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1525c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// C String Comparisons.  All tests treat NULL and any non-NULL string
1526c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// as different.  Two NULLs are equal.
1527c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//
1528486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
1529c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
1530c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
1531c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
153247390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org//
1533c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// For wide or narrow string objects, you can use the
1534c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// {ASSERT|EXPECT}_??() macros.
1535e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org//
1536c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// Don't depend on the order in which the arguments are evaluated,
1537c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// which is undefined.
1538c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//
1539c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// These macros evaluate their arguments exactly once.
1540c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1541486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org#define EXPECT_STREQ(expected, actual) \
1542486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
1543c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define EXPECT_STRNE(s1, s2) \
1544486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
1545486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org#define EXPECT_STRCASEEQ(expected, actual) \
1546b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
1547486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org#define EXPECT_STRCASENE(s1, s2)\
1548f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
1549486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
1550486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org#define ASSERT_STREQ(expected, actual) \
1551486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
15529d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org#define ASSERT_STRNE(s1, s2) \
1553486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
1554763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org#define ASSERT_STRCASEEQ(expected, actual) \
155580c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
15564c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org#define ASSERT_STRCASENE(s1, s2)\
155780c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
155880c42ed5ace766a3a02b30a53a25e5e81e234723yangguo@chromium.org
1559486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org// Macros for comparing floating-point numbers.
15609dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
1561b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
1562b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//         Tests that two float values are almost equal.
1563b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
1564b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//         Tests that two double values are almost equal.
1565b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
1566b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//         Tests that v1 and v2 are within the given distance to each other.
1567c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org//
1568b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Google Test uses ULP-based comparison to automatically pick a default
1569b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// error bound that is appropriate for the operands.  See the
1570c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org// FloatingPoint template class in gtest-internal.h if you are
1571c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org// interested in the implementation details.
1572c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org
157343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org#define EXPECT_FLOAT_EQ(expected, actual)\
157443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
1575b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org                      expected, actual)
157665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
157743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org#define EXPECT_DOUBLE_EQ(expected, actual)\
1578c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
1579486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org                      expected, actual)
1580c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org
1581b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#define ASSERT_FLOAT_EQ(expected, actual)\
1582b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
1583763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org                      expected, actual)
1584b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1585b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#define ASSERT_DOUBLE_EQ(expected, actual)\
1586b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
158747390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org                      expected, actual)
158843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
1589c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org#define EXPECT_NEAR(val1, val2, abs_error)\
1590c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
1591c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org                      val1, val2, abs_error)
1592c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org
15932bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org#define ASSERT_NEAR(val1, val2, abs_error)\
1594c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
1595c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org                      val1, val2, abs_error)
1596c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org
1597763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// These predicate format functions work on floating-point values, and
1598c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
159947390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org//
1600763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
1601c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org
1602c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org// Asserts that val1 is less than, or almost equal to, val2.  Fails
1603c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org// otherwise.  In particular, it fails if either val1 or val2 is NaN.
1604c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgAssertionResult FloatLE(const char* expr1, const char* expr2,
1605c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org                        float val1, float val2);
160643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgAssertionResult DoubleLE(const char* expr1, const char* expr2,
160743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org                         double val1, double val2);
160843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
160943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
1610c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org#if GTEST_OS_WINDOWS
1611c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org
161243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// Macros that test for HRESULT failure and success, these are only useful
161343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// on Windows, and rely on Windows SDK macros and APIs to compile.
1614c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org//
16154a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
1616b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
1617b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// When expr unexpectedly fails or succeeds, Google Test prints the
1618b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// expected result and the actual result with both a human-readable
16192c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// string representation of the error, if available, as well as the
16202c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// hex result code.
16212c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#define EXPECT_HRESULT_SUCCEEDED(expr) \
16222c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
16232c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
16242c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#define ASSERT_HRESULT_SUCCEEDED(expr) \
16252c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
16262c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
16272c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#define EXPECT_HRESULT_FAILED(expr) \
1628b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
1629b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1630e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org#define ASSERT_HRESULT_FAILED(expr) \
16317ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
1632f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1633ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif  // GTEST_OS_WINDOWS
1634ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1635ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Macros that execute statement and check that it doesn't generate new fatal
1636ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// failures in the current thread.
1637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//
1638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
1639f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org//
1640a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// Examples:
1641874aad37f2a832804012c6f56739f4fc6c9283cdmachenbach@chromium.org//
1642f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org//   EXPECT_NO_FATAL_FAILURE(Process());
164343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
1644763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org//
164571fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org#define ASSERT_NO_FATAL_FAILURE(statement) \
164671fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
164771fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org#define EXPECT_NO_FATAL_FAILURE(statement) \
164847390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
1649f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
165043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// Causes a trace (including the source file path, the current line
165143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// number, and the given message) to be included in every test failure
165271fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org// message generated by code in the current scope.  The effect is
165371fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org// undone when the control leaves the current scope.
165471fc3467b5396c27d0b701d88e196e88c78d8864mstarzinger@chromium.org//
1655f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org// The message argument can be anything streamable to std::ostream.
1656f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org//
1657b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// In the implementation, we include the current line number as part
1658b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
1659b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// to appear in the same block - as long as they are on different
1660b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// lines.
1661b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org#define SCOPED_TRACE(message) \
1662b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
1663e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    __FILE__, __LINE__, ::testing::Message() << (message))
1664e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
1665e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgnamespace internal {
16667028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
1667e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// This template is declared, but intentionally undefined.
16685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgtemplate <typename T1, typename T2>
1669b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgstruct StaticAssertTypeEqHelper;
1670b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1671b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgtemplate <typename T>
1672b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgstruct StaticAssertTypeEqHelper<T, T> {};
1673b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1674b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}  // namespace internal
1675b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1676763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// Compile-time assertion for type equality.
1677b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
1678b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// the same type.  The value it returns is not interesting.
1679b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
1680b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Instead of making StaticAssertTypeEq a class template, we make it a
1681b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// function template that invokes a helper class template.  This
1682b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
1683e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org// defining objects of that type.
1684b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
1685b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// CAVEAT:
16861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org//
1687e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// When used inside a method of a class template,
168840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
16899aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org// instantiated.  For example, given:
16909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org//
16919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org//   template <typename T> class Foo {
1692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//    public:
1693d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
169440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org//   };
169540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org//
1696e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// the code:
1697b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
1698b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//   void Test1() { Foo<bool> foo; }
1699763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org//
17004a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// will NOT generate a compiler error, as Foo<bool>::Bar() is never
17014a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// actually instantiated.  Instead, you need:
1702e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org//
1703f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org//   void Test2() { Foo<bool> foo; foo.Bar(); }
1704f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org//
1705e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org// to cause a compiler error.
1706e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgtemplate <typename T1, typename T2>
1707e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgbool StaticAssertTypeEq() {
1708b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  internal::StaticAssertTypeEqHelper<T1, T2>();
1709750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return true;
1710763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org}
1711750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1712750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Defines a test.
1713750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
1714750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// The first parameter is the name of the test case, and the second
1715750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// parameter is the name of the test within the test case.
1716750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
1717750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// The convention is to end the test case name with "Test".  For
1718b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// example, a test case for the Foo class can be named FooTest.
17192c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org//
17202c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// The user should put his test code between braces after using this
17212c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// macro.  Example:
17222c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org//
1723b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//   TEST(FooTest, InitializesCorrectly) {
1724b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//     Foo foo;
1725b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//     EXPECT_TRUE(foo.StatusIsOK());
1726b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//   }
17272c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
17282c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// Note that we call GetTestTypeId() instead of GetTypeId<
17292c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// ::testing::Test>() here to get the type ID of testing::Test.  This
17302c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// is to work around a suspected linker bug when using Google Test as
17312c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// a framework on Mac OS X.  The bug causes GetTypeId<
1732763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// ::testing::Test>() to return different values depending on whether
17332c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// the call is from the Google Test framework itself or from user test
17342c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// code.  GetTestTypeId() is guaranteed to always return the same
17352c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// value, as it always calls GetTypeId<>() from the Google Test
17362c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// framework.
1737248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#define TEST(test_case_name, test_name)\
17382c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  GTEST_TEST_(test_case_name, test_name, \
17392c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org              ::testing::Test, ::testing::internal::GetTestTypeId())
1740ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1741e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
1742763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org// Defines a test that uses a test fixture.
1743ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org//
1744ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// The first parameter is the name of the test fixture class, which
1745ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// also doubles as the test case name.  The second parameter is the
1746b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// name of the test within the test case.
17474a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org//
1748b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// A test fixture class must be declared earlier.  The user should put
17494a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org// his test code between braces after using this macro.  Example:
1750b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
1751b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//   class FooTest : public testing::Test {
1752b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//    protected:
1753b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//     virtual void SetUp() { b_.AddElement(3); }
1754b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//
1755b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org//     Foo a_;
17569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//     Foo b_;
17577ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org//   };
175837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org//
175937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org//   TEST_F(FooTest, InitializesCorrectly) {
176037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org//     EXPECT_TRUE(a_.StatusIsOK());
176137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org//   }
17629dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//
17639dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
1764394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com//     EXPECT_EQ(0, a_.size());
1765e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org//     EXPECT_EQ(1, b_.size());
1766394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com//   }
1767394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
1768830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org#define TEST_F(test_fixture, test_name)\
1769830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  GTEST_TEST_(test_fixture, test_name, test_fixture, \
1770394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com              ::testing::internal::GetTypeId<test_fixture>())
1771394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
17729dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// Use this macro in main() to run all tests.  It returns 0 if all
17739cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org// tests are successful, or 1 otherwise.
1774c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org//
1775c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org// RUN_ALL_TESTS() should be invoked after the command line has been
1776c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org// parsed by InitGoogleTest().
1777c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1778c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org#define RUN_ALL_TESTS()\
1779c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  (::testing::UnitTest::GetInstance()->Run())
1780e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
178143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org}  // namespace testing
1782763da4c1a1bd42dfafe0844b4c18f4882cc66352machenbach@chromium.org
1783e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
1784e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org