113481Sgiacomo.travaglini@arm.com// Copyright 2005, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com//
3213481Sgiacomo.travaglini@arm.com// The Google C++ Testing Framework (Google Test)
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// This header file defines the public API for Google Test.  It should be
3513481Sgiacomo.travaglini@arm.com// included by any test program that uses Google Test.
3613481Sgiacomo.travaglini@arm.com//
3713481Sgiacomo.travaglini@arm.com// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
3813481Sgiacomo.travaglini@arm.com// leave some internal implementation details in this header file.
3913481Sgiacomo.travaglini@arm.com// They are clearly marked by comments like this:
4013481Sgiacomo.travaglini@arm.com//
4113481Sgiacomo.travaglini@arm.com//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
4213481Sgiacomo.travaglini@arm.com//
4313481Sgiacomo.travaglini@arm.com// Such code is NOT meant to be used by a user directly, and is subject
4413481Sgiacomo.travaglini@arm.com// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
4513481Sgiacomo.travaglini@arm.com// program!
4613481Sgiacomo.travaglini@arm.com//
4713481Sgiacomo.travaglini@arm.com// Acknowledgment: Google Test borrowed the idea of automatic test
4813481Sgiacomo.travaglini@arm.com// registration from Barthelemy Dagenais' (barthelemy@prologique.com)
4913481Sgiacomo.travaglini@arm.com// easyUnit framework.
5013481Sgiacomo.travaglini@arm.com
5113481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
5213481Sgiacomo.travaglini@arm.com#define GTEST_INCLUDE_GTEST_GTEST_H_
5313481Sgiacomo.travaglini@arm.com
5413481Sgiacomo.travaglini@arm.com#include <limits>
5513481Sgiacomo.travaglini@arm.com#include <ostream>
5613481Sgiacomo.travaglini@arm.com#include <vector>
5713481Sgiacomo.travaglini@arm.com
5813481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-internal.h"
5913481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-string.h"
6013481Sgiacomo.travaglini@arm.com#include "gtest/gtest-death-test.h"
6113481Sgiacomo.travaglini@arm.com#include "gtest/gtest-message.h"
6213481Sgiacomo.travaglini@arm.com#include "gtest/gtest-param-test.h"
6313481Sgiacomo.travaglini@arm.com#include "gtest/gtest-printers.h"
6413481Sgiacomo.travaglini@arm.com#include "gtest/gtest_prod.h"
6513481Sgiacomo.travaglini@arm.com#include "gtest/gtest-test-part.h"
6613481Sgiacomo.travaglini@arm.com#include "gtest/gtest-typed-test.h"
6713481Sgiacomo.travaglini@arm.com
6813481Sgiacomo.travaglini@arm.com// Depending on the platform, different string classes are available.
6913481Sgiacomo.travaglini@arm.com// On Linux, in addition to ::std::string, Google also makes use of
7013481Sgiacomo.travaglini@arm.com// class ::string, which has the same interface as ::std::string, but
7113481Sgiacomo.travaglini@arm.com// has a different implementation.
7213481Sgiacomo.travaglini@arm.com//
7313481Sgiacomo.travaglini@arm.com// You can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
7413481Sgiacomo.travaglini@arm.com// ::string is available AND is a distinct type to ::std::string, or
7513481Sgiacomo.travaglini@arm.com// define it to 0 to indicate otherwise.
7613481Sgiacomo.travaglini@arm.com//
7713481Sgiacomo.travaglini@arm.com// If ::std::string and ::string are the same class on your platform
7813481Sgiacomo.travaglini@arm.com// due to aliasing, you should define GTEST_HAS_GLOBAL_STRING to 0.
7913481Sgiacomo.travaglini@arm.com//
8013481Sgiacomo.travaglini@arm.com// If you do not define GTEST_HAS_GLOBAL_STRING, it is defined
8113481Sgiacomo.travaglini@arm.com// heuristically.
8213481Sgiacomo.travaglini@arm.com
8313481Sgiacomo.travaglini@arm.comnamespace testing {
8413481Sgiacomo.travaglini@arm.com
8513481Sgiacomo.travaglini@arm.com// Declares the flags.
8613481Sgiacomo.travaglini@arm.com
8713481Sgiacomo.travaglini@arm.com// This flag temporary enables the disabled tests.
8813481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(also_run_disabled_tests);
8913481Sgiacomo.travaglini@arm.com
9013481Sgiacomo.travaglini@arm.com// This flag brings the debugger on an assertion failure.
9113481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(break_on_failure);
9213481Sgiacomo.travaglini@arm.com
9313481Sgiacomo.travaglini@arm.com// This flag controls whether Google Test catches all test-thrown exceptions
9413481Sgiacomo.travaglini@arm.com// and logs them as failures.
9513481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(catch_exceptions);
9613481Sgiacomo.travaglini@arm.com
9713481Sgiacomo.travaglini@arm.com// This flag enables using colors in terminal output. Available values are
9813481Sgiacomo.travaglini@arm.com// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
9913481Sgiacomo.travaglini@arm.com// to let Google Test decide.
10013481Sgiacomo.travaglini@arm.comGTEST_DECLARE_string_(color);
10113481Sgiacomo.travaglini@arm.com
10213481Sgiacomo.travaglini@arm.com// This flag sets up the filter to select by name using a glob pattern
10313481Sgiacomo.travaglini@arm.com// the tests to run. If the filter is not given all tests are executed.
10413481Sgiacomo.travaglini@arm.comGTEST_DECLARE_string_(filter);
10513481Sgiacomo.travaglini@arm.com
10613481Sgiacomo.travaglini@arm.com// This flag causes the Google Test to list tests. None of the tests listed
10713481Sgiacomo.travaglini@arm.com// are actually run if the flag is provided.
10813481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(list_tests);
10913481Sgiacomo.travaglini@arm.com
11013481Sgiacomo.travaglini@arm.com// This flag controls whether Google Test emits a detailed XML report to a file
11113481Sgiacomo.travaglini@arm.com// in addition to its normal textual output.
11213481Sgiacomo.travaglini@arm.comGTEST_DECLARE_string_(output);
11313481Sgiacomo.travaglini@arm.com
11413481Sgiacomo.travaglini@arm.com// This flags control whether Google Test prints the elapsed time for each
11513481Sgiacomo.travaglini@arm.com// test.
11613481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(print_time);
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com// This flag specifies the random number seed.
11913481Sgiacomo.travaglini@arm.comGTEST_DECLARE_int32_(random_seed);
12013481Sgiacomo.travaglini@arm.com
12113481Sgiacomo.travaglini@arm.com// This flag sets how many times the tests are repeated. The default value
12213481Sgiacomo.travaglini@arm.com// is 1. If the value is -1 the tests are repeating forever.
12313481Sgiacomo.travaglini@arm.comGTEST_DECLARE_int32_(repeat);
12413481Sgiacomo.travaglini@arm.com
12513481Sgiacomo.travaglini@arm.com// This flag controls whether Google Test includes Google Test internal
12613481Sgiacomo.travaglini@arm.com// stack frames in failure stack traces.
12713481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(show_internal_stack_frames);
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.com// When this flag is specified, tests' order is randomized on every iteration.
13013481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(shuffle);
13113481Sgiacomo.travaglini@arm.com
13213481Sgiacomo.travaglini@arm.com// This flag specifies the maximum number of stack frames to be
13313481Sgiacomo.travaglini@arm.com// printed in a failure message.
13413481Sgiacomo.travaglini@arm.comGTEST_DECLARE_int32_(stack_trace_depth);
13513481Sgiacomo.travaglini@arm.com
13613481Sgiacomo.travaglini@arm.com// When this flag is specified, a failed assertion will throw an
13713481Sgiacomo.travaglini@arm.com// exception if exceptions are enabled, or exit the program with a
13813481Sgiacomo.travaglini@arm.com// non-zero code otherwise.
13913481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(throw_on_failure);
14013481Sgiacomo.travaglini@arm.com
14113481Sgiacomo.travaglini@arm.com// When this flag is set with a "host:port" string, on supported
14213481Sgiacomo.travaglini@arm.com// platforms test results are streamed to the specified port on
14313481Sgiacomo.travaglini@arm.com// the specified host machine.
14413481Sgiacomo.travaglini@arm.comGTEST_DECLARE_string_(stream_result_to);
14513481Sgiacomo.travaglini@arm.com
14613481Sgiacomo.travaglini@arm.com// The upper limit for valid stack trace depths.
14713481Sgiacomo.travaglini@arm.comconst int kMaxStackTraceDepth = 100;
14813481Sgiacomo.travaglini@arm.com
14913481Sgiacomo.travaglini@arm.comnamespace internal {
15013481Sgiacomo.travaglini@arm.com
15113481Sgiacomo.travaglini@arm.comclass AssertHelper;
15213481Sgiacomo.travaglini@arm.comclass DefaultGlobalTestPartResultReporter;
15313481Sgiacomo.travaglini@arm.comclass ExecDeathTest;
15413481Sgiacomo.travaglini@arm.comclass NoExecDeathTest;
15513481Sgiacomo.travaglini@arm.comclass FinalSuccessChecker;
15613481Sgiacomo.travaglini@arm.comclass GTestFlagSaver;
15713481Sgiacomo.travaglini@arm.comclass StreamingListenerTest;
15813481Sgiacomo.travaglini@arm.comclass TestResultAccessor;
15913481Sgiacomo.travaglini@arm.comclass TestEventListenersAccessor;
16013481Sgiacomo.travaglini@arm.comclass TestEventRepeater;
16113481Sgiacomo.travaglini@arm.comclass UnitTestRecordPropertyTestHelper;
16213481Sgiacomo.travaglini@arm.comclass WindowsDeathTest;
16313481Sgiacomo.travaglini@arm.comclass UnitTestImpl* GetUnitTestImpl();
16413481Sgiacomo.travaglini@arm.comvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
16513481Sgiacomo.travaglini@arm.com                                    const std::string& message);
16613481Sgiacomo.travaglini@arm.com
16713481Sgiacomo.travaglini@arm.com}  // namespace internal
16813481Sgiacomo.travaglini@arm.com
16913481Sgiacomo.travaglini@arm.com// The friend relationship of some of these classes is cyclic.
17013481Sgiacomo.travaglini@arm.com// If we don't forward declare them the compiler might confuse the classes
17113481Sgiacomo.travaglini@arm.com// in friendship clauses with same named classes on the scope.
17213481Sgiacomo.travaglini@arm.comclass Test;
17313481Sgiacomo.travaglini@arm.comclass TestCase;
17413481Sgiacomo.travaglini@arm.comclass TestInfo;
17513481Sgiacomo.travaglini@arm.comclass UnitTest;
17613481Sgiacomo.travaglini@arm.com
17713481Sgiacomo.travaglini@arm.com// A class for indicating whether an assertion was successful.  When
17813481Sgiacomo.travaglini@arm.com// the assertion wasn't successful, the AssertionResult object
17913481Sgiacomo.travaglini@arm.com// remembers a non-empty message that describes how it failed.
18013481Sgiacomo.travaglini@arm.com//
18113481Sgiacomo.travaglini@arm.com// To create an instance of this class, use one of the factory functions
18213481Sgiacomo.travaglini@arm.com// (AssertionSuccess() and AssertionFailure()).
18313481Sgiacomo.travaglini@arm.com//
18413481Sgiacomo.travaglini@arm.com// This class is useful for two purposes:
18513481Sgiacomo.travaglini@arm.com//   1. Defining predicate functions to be used with Boolean test assertions
18613481Sgiacomo.travaglini@arm.com//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
18713481Sgiacomo.travaglini@arm.com//   2. Defining predicate-format functions to be
18813481Sgiacomo.travaglini@arm.com//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
18913481Sgiacomo.travaglini@arm.com//
19013481Sgiacomo.travaglini@arm.com// For example, if you define IsEven predicate:
19113481Sgiacomo.travaglini@arm.com//
19213481Sgiacomo.travaglini@arm.com//   testing::AssertionResult IsEven(int n) {
19313481Sgiacomo.travaglini@arm.com//     if ((n % 2) == 0)
19413481Sgiacomo.travaglini@arm.com//       return testing::AssertionSuccess();
19513481Sgiacomo.travaglini@arm.com//     else
19613481Sgiacomo.travaglini@arm.com//       return testing::AssertionFailure() << n << " is odd";
19713481Sgiacomo.travaglini@arm.com//   }
19813481Sgiacomo.travaglini@arm.com//
19913481Sgiacomo.travaglini@arm.com// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
20013481Sgiacomo.travaglini@arm.com// will print the message
20113481Sgiacomo.travaglini@arm.com//
20213481Sgiacomo.travaglini@arm.com//   Value of: IsEven(Fib(5))
20313481Sgiacomo.travaglini@arm.com//     Actual: false (5 is odd)
20413481Sgiacomo.travaglini@arm.com//   Expected: true
20513481Sgiacomo.travaglini@arm.com//
20613481Sgiacomo.travaglini@arm.com// instead of a more opaque
20713481Sgiacomo.travaglini@arm.com//
20813481Sgiacomo.travaglini@arm.com//   Value of: IsEven(Fib(5))
20913481Sgiacomo.travaglini@arm.com//     Actual: false
21013481Sgiacomo.travaglini@arm.com//   Expected: true
21113481Sgiacomo.travaglini@arm.com//
21213481Sgiacomo.travaglini@arm.com// in case IsEven is a simple Boolean predicate.
21313481Sgiacomo.travaglini@arm.com//
21413481Sgiacomo.travaglini@arm.com// If you expect your predicate to be reused and want to support informative
21513481Sgiacomo.travaglini@arm.com// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
21613481Sgiacomo.travaglini@arm.com// about half as often as positive ones in our tests), supply messages for
21713481Sgiacomo.travaglini@arm.com// both success and failure cases:
21813481Sgiacomo.travaglini@arm.com//
21913481Sgiacomo.travaglini@arm.com//   testing::AssertionResult IsEven(int n) {
22013481Sgiacomo.travaglini@arm.com//     if ((n % 2) == 0)
22113481Sgiacomo.travaglini@arm.com//       return testing::AssertionSuccess() << n << " is even";
22213481Sgiacomo.travaglini@arm.com//     else
22313481Sgiacomo.travaglini@arm.com//       return testing::AssertionFailure() << n << " is odd";
22413481Sgiacomo.travaglini@arm.com//   }
22513481Sgiacomo.travaglini@arm.com//
22613481Sgiacomo.travaglini@arm.com// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
22713481Sgiacomo.travaglini@arm.com//
22813481Sgiacomo.travaglini@arm.com//   Value of: IsEven(Fib(6))
22913481Sgiacomo.travaglini@arm.com//     Actual: true (8 is even)
23013481Sgiacomo.travaglini@arm.com//   Expected: false
23113481Sgiacomo.travaglini@arm.com//
23213481Sgiacomo.travaglini@arm.com// NB: Predicates that support negative Boolean assertions have reduced
23313481Sgiacomo.travaglini@arm.com// performance in positive ones so be careful not to use them in tests
23413481Sgiacomo.travaglini@arm.com// that have lots (tens of thousands) of positive Boolean assertions.
23513481Sgiacomo.travaglini@arm.com//
23613481Sgiacomo.travaglini@arm.com// To use this class with EXPECT_PRED_FORMAT assertions such as:
23713481Sgiacomo.travaglini@arm.com//
23813481Sgiacomo.travaglini@arm.com//   // Verifies that Foo() returns an even number.
23913481Sgiacomo.travaglini@arm.com//   EXPECT_PRED_FORMAT1(IsEven, Foo());
24013481Sgiacomo.travaglini@arm.com//
24113481Sgiacomo.travaglini@arm.com// you need to define:
24213481Sgiacomo.travaglini@arm.com//
24313481Sgiacomo.travaglini@arm.com//   testing::AssertionResult IsEven(const char* expr, int n) {
24413481Sgiacomo.travaglini@arm.com//     if ((n % 2) == 0)
24513481Sgiacomo.travaglini@arm.com//       return testing::AssertionSuccess();
24613481Sgiacomo.travaglini@arm.com//     else
24713481Sgiacomo.travaglini@arm.com//       return testing::AssertionFailure()
24813481Sgiacomo.travaglini@arm.com//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
24913481Sgiacomo.travaglini@arm.com//   }
25013481Sgiacomo.travaglini@arm.com//
25113481Sgiacomo.travaglini@arm.com// If Foo() returns 5, you will see the following message:
25213481Sgiacomo.travaglini@arm.com//
25313481Sgiacomo.travaglini@arm.com//   Expected: Foo() is even
25413481Sgiacomo.travaglini@arm.com//     Actual: it's 5
25513481Sgiacomo.travaglini@arm.com//
25613481Sgiacomo.travaglini@arm.comclass GTEST_API_ AssertionResult {
25713481Sgiacomo.travaglini@arm.com public:
25813481Sgiacomo.travaglini@arm.com  // Copy constructor.
25913481Sgiacomo.travaglini@arm.com  // Used in EXPECT_TRUE/FALSE(assertion_result).
26013481Sgiacomo.travaglini@arm.com  AssertionResult(const AssertionResult& other);
26113481Sgiacomo.travaglini@arm.com
26213481Sgiacomo.travaglini@arm.com  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */)
26313481Sgiacomo.travaglini@arm.com
26413481Sgiacomo.travaglini@arm.com  // Used in the EXPECT_TRUE/FALSE(bool_expression).
26513481Sgiacomo.travaglini@arm.com  //
26613481Sgiacomo.travaglini@arm.com  // T must be contextually convertible to bool.
26713481Sgiacomo.travaglini@arm.com  //
26813481Sgiacomo.travaglini@arm.com  // The second parameter prevents this overload from being considered if
26913481Sgiacomo.travaglini@arm.com  // the argument is implicitly convertible to AssertionResult. In that case
27013481Sgiacomo.travaglini@arm.com  // we want AssertionResult's copy constructor to be used.
27113481Sgiacomo.travaglini@arm.com  template <typename T>
27213481Sgiacomo.travaglini@arm.com  explicit AssertionResult(
27313481Sgiacomo.travaglini@arm.com      const T& success,
27413481Sgiacomo.travaglini@arm.com      typename internal::EnableIf<
27513481Sgiacomo.travaglini@arm.com          !internal::ImplicitlyConvertible<T, AssertionResult>::value>::type*
27613481Sgiacomo.travaglini@arm.com          /*enabler*/ = NULL)
27713481Sgiacomo.travaglini@arm.com      : success_(success) {}
27813481Sgiacomo.travaglini@arm.com
27913481Sgiacomo.travaglini@arm.com  GTEST_DISABLE_MSC_WARNINGS_POP_()
28013481Sgiacomo.travaglini@arm.com
28113481Sgiacomo.travaglini@arm.com  // Assignment operator.
28213481Sgiacomo.travaglini@arm.com  AssertionResult& operator=(AssertionResult other) {
28313481Sgiacomo.travaglini@arm.com    swap(other);
28413481Sgiacomo.travaglini@arm.com    return *this;
28513481Sgiacomo.travaglini@arm.com  }
28613481Sgiacomo.travaglini@arm.com
28713481Sgiacomo.travaglini@arm.com  // Returns true iff the assertion succeeded.
28813481Sgiacomo.travaglini@arm.com  operator bool() const { return success_; }  // NOLINT
28913481Sgiacomo.travaglini@arm.com
29013481Sgiacomo.travaglini@arm.com  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
29113481Sgiacomo.travaglini@arm.com  AssertionResult operator!() const;
29213481Sgiacomo.travaglini@arm.com
29313481Sgiacomo.travaglini@arm.com  // Returns the text streamed into this AssertionResult. Test assertions
29413481Sgiacomo.travaglini@arm.com  // use it when they fail (i.e., the predicate's outcome doesn't match the
29513481Sgiacomo.travaglini@arm.com  // assertion's expectation). When nothing has been streamed into the
29613481Sgiacomo.travaglini@arm.com  // object, returns an empty string.
29713481Sgiacomo.travaglini@arm.com  const char* message() const {
29813481Sgiacomo.travaglini@arm.com    return message_.get() != NULL ?  message_->c_str() : "";
29913481Sgiacomo.travaglini@arm.com  }
30013481Sgiacomo.travaglini@arm.com  // TODO(vladl@google.com): Remove this after making sure no clients use it.
30113481Sgiacomo.travaglini@arm.com  // Deprecated; please use message() instead.
30213481Sgiacomo.travaglini@arm.com  const char* failure_message() const { return message(); }
30313481Sgiacomo.travaglini@arm.com
30413481Sgiacomo.travaglini@arm.com  // Streams a custom failure message into this object.
30513481Sgiacomo.travaglini@arm.com  template <typename T> AssertionResult& operator<<(const T& value) {
30613481Sgiacomo.travaglini@arm.com    AppendMessage(Message() << value);
30713481Sgiacomo.travaglini@arm.com    return *this;
30813481Sgiacomo.travaglini@arm.com  }
30913481Sgiacomo.travaglini@arm.com
31013481Sgiacomo.travaglini@arm.com  // Allows streaming basic output manipulators such as endl or flush into
31113481Sgiacomo.travaglini@arm.com  // this object.
31213481Sgiacomo.travaglini@arm.com  AssertionResult& operator<<(
31313481Sgiacomo.travaglini@arm.com      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
31413481Sgiacomo.travaglini@arm.com    AppendMessage(Message() << basic_manipulator);
31513481Sgiacomo.travaglini@arm.com    return *this;
31613481Sgiacomo.travaglini@arm.com  }
31713481Sgiacomo.travaglini@arm.com
31813481Sgiacomo.travaglini@arm.com private:
31913481Sgiacomo.travaglini@arm.com  // Appends the contents of message to message_.
32013481Sgiacomo.travaglini@arm.com  void AppendMessage(const Message& a_message) {
32113481Sgiacomo.travaglini@arm.com    if (message_.get() == NULL)
32213481Sgiacomo.travaglini@arm.com      message_.reset(new ::std::string);
32313481Sgiacomo.travaglini@arm.com    message_->append(a_message.GetString().c_str());
32413481Sgiacomo.travaglini@arm.com  }
32513481Sgiacomo.travaglini@arm.com
32613481Sgiacomo.travaglini@arm.com  // Swap the contents of this AssertionResult with other.
32713481Sgiacomo.travaglini@arm.com  void swap(AssertionResult& other);
32813481Sgiacomo.travaglini@arm.com
32913481Sgiacomo.travaglini@arm.com  // Stores result of the assertion predicate.
33013481Sgiacomo.travaglini@arm.com  bool success_;
33113481Sgiacomo.travaglini@arm.com  // Stores the message describing the condition in case the expectation
33213481Sgiacomo.travaglini@arm.com  // construct is not satisfied with the predicate's outcome.
33313481Sgiacomo.travaglini@arm.com  // Referenced via a pointer to avoid taking too much stack frame space
33413481Sgiacomo.travaglini@arm.com  // with test assertions.
33513481Sgiacomo.travaglini@arm.com  internal::scoped_ptr< ::std::string> message_;
33613481Sgiacomo.travaglini@arm.com};
33713481Sgiacomo.travaglini@arm.com
33813481Sgiacomo.travaglini@arm.com// Makes a successful assertion result.
33913481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult AssertionSuccess();
34013481Sgiacomo.travaglini@arm.com
34113481Sgiacomo.travaglini@arm.com// Makes a failed assertion result.
34213481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult AssertionFailure();
34313481Sgiacomo.travaglini@arm.com
34413481Sgiacomo.travaglini@arm.com// Makes a failed assertion result with the given failure message.
34513481Sgiacomo.travaglini@arm.com// Deprecated; use AssertionFailure() << msg.
34613481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult AssertionFailure(const Message& msg);
34713481Sgiacomo.travaglini@arm.com
34813481Sgiacomo.travaglini@arm.com// The abstract class that all tests inherit from.
34913481Sgiacomo.travaglini@arm.com//
35013481Sgiacomo.travaglini@arm.com// In Google Test, a unit test program contains one or many TestCases, and
35113481Sgiacomo.travaglini@arm.com// each TestCase contains one or many Tests.
35213481Sgiacomo.travaglini@arm.com//
35313481Sgiacomo.travaglini@arm.com// When you define a test using the TEST macro, you don't need to
35413481Sgiacomo.travaglini@arm.com// explicitly derive from Test - the TEST macro automatically does
35513481Sgiacomo.travaglini@arm.com// this for you.
35613481Sgiacomo.travaglini@arm.com//
35713481Sgiacomo.travaglini@arm.com// The only time you derive from Test is when defining a test fixture
35813481Sgiacomo.travaglini@arm.com// to be used a TEST_F.  For example:
35913481Sgiacomo.travaglini@arm.com//
36013481Sgiacomo.travaglini@arm.com//   class FooTest : public testing::Test {
36113481Sgiacomo.travaglini@arm.com//    protected:
36213481Sgiacomo.travaglini@arm.com//     void SetUp() override { ... }
36313481Sgiacomo.travaglini@arm.com//     void TearDown() override { ... }
36413481Sgiacomo.travaglini@arm.com//     ...
36513481Sgiacomo.travaglini@arm.com//   };
36613481Sgiacomo.travaglini@arm.com//
36713481Sgiacomo.travaglini@arm.com//   TEST_F(FooTest, Bar) { ... }
36813481Sgiacomo.travaglini@arm.com//   TEST_F(FooTest, Baz) { ... }
36913481Sgiacomo.travaglini@arm.com//
37013481Sgiacomo.travaglini@arm.com// Test is not copyable.
37113481Sgiacomo.travaglini@arm.comclass GTEST_API_ Test {
37213481Sgiacomo.travaglini@arm.com public:
37313481Sgiacomo.travaglini@arm.com  friend class TestInfo;
37413481Sgiacomo.travaglini@arm.com
37513481Sgiacomo.travaglini@arm.com  // Defines types for pointers to functions that set up and tear down
37613481Sgiacomo.travaglini@arm.com  // a test case.
37713481Sgiacomo.travaglini@arm.com  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
37813481Sgiacomo.travaglini@arm.com  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
37913481Sgiacomo.travaglini@arm.com
38013481Sgiacomo.travaglini@arm.com  // The d'tor is virtual as we intend to inherit from Test.
38113481Sgiacomo.travaglini@arm.com  virtual ~Test();
38213481Sgiacomo.travaglini@arm.com
38313481Sgiacomo.travaglini@arm.com  // Sets up the stuff shared by all tests in this test case.
38413481Sgiacomo.travaglini@arm.com  //
38513481Sgiacomo.travaglini@arm.com  // Google Test will call Foo::SetUpTestCase() before running the first
38613481Sgiacomo.travaglini@arm.com  // test in test case Foo.  Hence a sub-class can define its own
38713481Sgiacomo.travaglini@arm.com  // SetUpTestCase() method to shadow the one defined in the super
38813481Sgiacomo.travaglini@arm.com  // class.
38913481Sgiacomo.travaglini@arm.com  static void SetUpTestCase() {}
39013481Sgiacomo.travaglini@arm.com
39113481Sgiacomo.travaglini@arm.com  // Tears down the stuff shared by all tests in this test case.
39213481Sgiacomo.travaglini@arm.com  //
39313481Sgiacomo.travaglini@arm.com  // Google Test will call Foo::TearDownTestCase() after running the last
39413481Sgiacomo.travaglini@arm.com  // test in test case Foo.  Hence a sub-class can define its own
39513481Sgiacomo.travaglini@arm.com  // TearDownTestCase() method to shadow the one defined in the super
39613481Sgiacomo.travaglini@arm.com  // class.
39713481Sgiacomo.travaglini@arm.com  static void TearDownTestCase() {}
39813481Sgiacomo.travaglini@arm.com
39913481Sgiacomo.travaglini@arm.com  // Returns true iff the current test has a fatal failure.
40013481Sgiacomo.travaglini@arm.com  static bool HasFatalFailure();
40113481Sgiacomo.travaglini@arm.com
40213481Sgiacomo.travaglini@arm.com  // Returns true iff the current test has a non-fatal failure.
40313481Sgiacomo.travaglini@arm.com  static bool HasNonfatalFailure();
40413481Sgiacomo.travaglini@arm.com
40513481Sgiacomo.travaglini@arm.com  // Returns true iff the current test has a (either fatal or
40613481Sgiacomo.travaglini@arm.com  // non-fatal) failure.
40713481Sgiacomo.travaglini@arm.com  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
40813481Sgiacomo.travaglini@arm.com
40913481Sgiacomo.travaglini@arm.com  // Logs a property for the current test, test case, or for the entire
41013481Sgiacomo.travaglini@arm.com  // invocation of the test program when used outside of the context of a
41113481Sgiacomo.travaglini@arm.com  // test case.  Only the last value for a given key is remembered.  These
41213481Sgiacomo.travaglini@arm.com  // are public static so they can be called from utility functions that are
41313481Sgiacomo.travaglini@arm.com  // not members of the test fixture.  Calls to RecordProperty made during
41413481Sgiacomo.travaglini@arm.com  // lifespan of the test (from the moment its constructor starts to the
41513481Sgiacomo.travaglini@arm.com  // moment its destructor finishes) will be output in XML as attributes of
41613481Sgiacomo.travaglini@arm.com  // the <testcase> element.  Properties recorded from fixture's
41713481Sgiacomo.travaglini@arm.com  // SetUpTestCase or TearDownTestCase are logged as attributes of the
41813481Sgiacomo.travaglini@arm.com  // corresponding <testsuite> element.  Calls to RecordProperty made in the
41913481Sgiacomo.travaglini@arm.com  // global context (before or after invocation of RUN_ALL_TESTS and from
42013481Sgiacomo.travaglini@arm.com  // SetUp/TearDown method of Environment objects registered with Google
42113481Sgiacomo.travaglini@arm.com  // Test) will be output as attributes of the <testsuites> element.
42213481Sgiacomo.travaglini@arm.com  static void RecordProperty(const std::string& key, const std::string& value);
42313481Sgiacomo.travaglini@arm.com  static void RecordProperty(const std::string& key, int value);
42413481Sgiacomo.travaglini@arm.com
42513481Sgiacomo.travaglini@arm.com protected:
42613481Sgiacomo.travaglini@arm.com  // Creates a Test object.
42713481Sgiacomo.travaglini@arm.com  Test();
42813481Sgiacomo.travaglini@arm.com
42913481Sgiacomo.travaglini@arm.com  // Sets up the test fixture.
43013481Sgiacomo.travaglini@arm.com  virtual void SetUp();
43113481Sgiacomo.travaglini@arm.com
43213481Sgiacomo.travaglini@arm.com  // Tears down the test fixture.
43313481Sgiacomo.travaglini@arm.com  virtual void TearDown();
43413481Sgiacomo.travaglini@arm.com
43513481Sgiacomo.travaglini@arm.com private:
43613481Sgiacomo.travaglini@arm.com  // Returns true iff the current test has the same fixture class as
43713481Sgiacomo.travaglini@arm.com  // the first test in the current test case.
43813481Sgiacomo.travaglini@arm.com  static bool HasSameFixtureClass();
43913481Sgiacomo.travaglini@arm.com
44013481Sgiacomo.travaglini@arm.com  // Runs the test after the test fixture has been set up.
44113481Sgiacomo.travaglini@arm.com  //
44213481Sgiacomo.travaglini@arm.com  // A sub-class must implement this to define the test logic.
44313481Sgiacomo.travaglini@arm.com  //
44413481Sgiacomo.travaglini@arm.com  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
44513481Sgiacomo.travaglini@arm.com  // Instead, use the TEST or TEST_F macro.
44613481Sgiacomo.travaglini@arm.com  virtual void TestBody() = 0;
44713481Sgiacomo.travaglini@arm.com
44813481Sgiacomo.travaglini@arm.com  // Sets up, executes, and tears down the test.
44913481Sgiacomo.travaglini@arm.com  void Run();
45013481Sgiacomo.travaglini@arm.com
45113481Sgiacomo.travaglini@arm.com  // Deletes self.  We deliberately pick an unusual name for this
45213481Sgiacomo.travaglini@arm.com  // internal method to avoid clashing with names used in user TESTs.
45313481Sgiacomo.travaglini@arm.com  void DeleteSelf_() { delete this; }
45413481Sgiacomo.travaglini@arm.com
45513481Sgiacomo.travaglini@arm.com  const internal::scoped_ptr< GTEST_FLAG_SAVER_ > gtest_flag_saver_;
45613481Sgiacomo.travaglini@arm.com
45713481Sgiacomo.travaglini@arm.com  // Often a user misspells SetUp() as Setup() and spends a long time
45813481Sgiacomo.travaglini@arm.com  // wondering why it is never called by Google Test.  The declaration of
45913481Sgiacomo.travaglini@arm.com  // the following method is solely for catching such an error at
46013481Sgiacomo.travaglini@arm.com  // compile time:
46113481Sgiacomo.travaglini@arm.com  //
46213481Sgiacomo.travaglini@arm.com  //   - The return type is deliberately chosen to be not void, so it
46313481Sgiacomo.travaglini@arm.com  //   will be a conflict if void Setup() is declared in the user's
46413481Sgiacomo.travaglini@arm.com  //   test fixture.
46513481Sgiacomo.travaglini@arm.com  //
46613481Sgiacomo.travaglini@arm.com  //   - This method is private, so it will be another compiler error
46713481Sgiacomo.travaglini@arm.com  //   if the method is called from the user's test fixture.
46813481Sgiacomo.travaglini@arm.com  //
46913481Sgiacomo.travaglini@arm.com  // DO NOT OVERRIDE THIS FUNCTION.
47013481Sgiacomo.travaglini@arm.com  //
47113481Sgiacomo.travaglini@arm.com  // If you see an error about overriding the following function or
47213481Sgiacomo.travaglini@arm.com  // about it being private, you have mis-spelled SetUp() as Setup().
47313481Sgiacomo.travaglini@arm.com  struct Setup_should_be_spelled_SetUp {};
47413481Sgiacomo.travaglini@arm.com  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
47513481Sgiacomo.travaglini@arm.com
47613481Sgiacomo.travaglini@arm.com  // We disallow copying Tests.
47713481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
47813481Sgiacomo.travaglini@arm.com};
47913481Sgiacomo.travaglini@arm.com
48013481Sgiacomo.travaglini@arm.comtypedef internal::TimeInMillis TimeInMillis;
48113481Sgiacomo.travaglini@arm.com
48213481Sgiacomo.travaglini@arm.com// A copyable object representing a user specified test property which can be
48313481Sgiacomo.travaglini@arm.com// output as a key/value string pair.
48413481Sgiacomo.travaglini@arm.com//
48513481Sgiacomo.travaglini@arm.com// Don't inherit from TestProperty as its destructor is not virtual.
48613481Sgiacomo.travaglini@arm.comclass TestProperty {
48713481Sgiacomo.travaglini@arm.com public:
48813481Sgiacomo.travaglini@arm.com  // C'tor.  TestProperty does NOT have a default constructor.
48913481Sgiacomo.travaglini@arm.com  // Always use this constructor (with parameters) to create a
49013481Sgiacomo.travaglini@arm.com  // TestProperty object.
49113481Sgiacomo.travaglini@arm.com  TestProperty(const std::string& a_key, const std::string& a_value) :
49213481Sgiacomo.travaglini@arm.com    key_(a_key), value_(a_value) {
49313481Sgiacomo.travaglini@arm.com  }
49413481Sgiacomo.travaglini@arm.com
49513481Sgiacomo.travaglini@arm.com  // Gets the user supplied key.
49613481Sgiacomo.travaglini@arm.com  const char* key() const {
49713481Sgiacomo.travaglini@arm.com    return key_.c_str();
49813481Sgiacomo.travaglini@arm.com  }
49913481Sgiacomo.travaglini@arm.com
50013481Sgiacomo.travaglini@arm.com  // Gets the user supplied value.
50113481Sgiacomo.travaglini@arm.com  const char* value() const {
50213481Sgiacomo.travaglini@arm.com    return value_.c_str();
50313481Sgiacomo.travaglini@arm.com  }
50413481Sgiacomo.travaglini@arm.com
50513481Sgiacomo.travaglini@arm.com  // Sets a new value, overriding the one supplied in the constructor.
50613481Sgiacomo.travaglini@arm.com  void SetValue(const std::string& new_value) {
50713481Sgiacomo.travaglini@arm.com    value_ = new_value;
50813481Sgiacomo.travaglini@arm.com  }
50913481Sgiacomo.travaglini@arm.com
51013481Sgiacomo.travaglini@arm.com private:
51113481Sgiacomo.travaglini@arm.com  // The key supplied by the user.
51213481Sgiacomo.travaglini@arm.com  std::string key_;
51313481Sgiacomo.travaglini@arm.com  // The value supplied by the user.
51413481Sgiacomo.travaglini@arm.com  std::string value_;
51513481Sgiacomo.travaglini@arm.com};
51613481Sgiacomo.travaglini@arm.com
51713481Sgiacomo.travaglini@arm.com// The result of a single Test.  This includes a list of
51813481Sgiacomo.travaglini@arm.com// TestPartResults, a list of TestProperties, a count of how many
51913481Sgiacomo.travaglini@arm.com// death tests there are in the Test, and how much time it took to run
52013481Sgiacomo.travaglini@arm.com// the Test.
52113481Sgiacomo.travaglini@arm.com//
52213481Sgiacomo.travaglini@arm.com// TestResult is not copyable.
52313481Sgiacomo.travaglini@arm.comclass GTEST_API_ TestResult {
52413481Sgiacomo.travaglini@arm.com public:
52513481Sgiacomo.travaglini@arm.com  // Creates an empty TestResult.
52613481Sgiacomo.travaglini@arm.com  TestResult();
52713481Sgiacomo.travaglini@arm.com
52813481Sgiacomo.travaglini@arm.com  // D'tor.  Do not inherit from TestResult.
52913481Sgiacomo.travaglini@arm.com  ~TestResult();
53013481Sgiacomo.travaglini@arm.com
53113481Sgiacomo.travaglini@arm.com  // Gets the number of all test parts.  This is the sum of the number
53213481Sgiacomo.travaglini@arm.com  // of successful test parts and the number of failed test parts.
53313481Sgiacomo.travaglini@arm.com  int total_part_count() const;
53413481Sgiacomo.travaglini@arm.com
53513481Sgiacomo.travaglini@arm.com  // Returns the number of the test properties.
53613481Sgiacomo.travaglini@arm.com  int test_property_count() const;
53713481Sgiacomo.travaglini@arm.com
53813481Sgiacomo.travaglini@arm.com  // Returns true iff the test passed (i.e. no test part failed).
53913481Sgiacomo.travaglini@arm.com  bool Passed() const { return !Failed(); }
54013481Sgiacomo.travaglini@arm.com
54113481Sgiacomo.travaglini@arm.com  // Returns true iff the test failed.
54213481Sgiacomo.travaglini@arm.com  bool Failed() const;
54313481Sgiacomo.travaglini@arm.com
54413481Sgiacomo.travaglini@arm.com  // Returns true iff the test fatally failed.
54513481Sgiacomo.travaglini@arm.com  bool HasFatalFailure() const;
54613481Sgiacomo.travaglini@arm.com
54713481Sgiacomo.travaglini@arm.com  // Returns true iff the test has a non-fatal failure.
54813481Sgiacomo.travaglini@arm.com  bool HasNonfatalFailure() const;
54913481Sgiacomo.travaglini@arm.com
55013481Sgiacomo.travaglini@arm.com  // Returns the elapsed time, in milliseconds.
55113481Sgiacomo.travaglini@arm.com  TimeInMillis elapsed_time() const { return elapsed_time_; }
55213481Sgiacomo.travaglini@arm.com
55313481Sgiacomo.travaglini@arm.com  // Returns the i-th test part result among all the results. i can range
55413481Sgiacomo.travaglini@arm.com  // from 0 to test_property_count() - 1. If i is not in that range, aborts
55513481Sgiacomo.travaglini@arm.com  // the program.
55613481Sgiacomo.travaglini@arm.com  const TestPartResult& GetTestPartResult(int i) const;
55713481Sgiacomo.travaglini@arm.com
55813481Sgiacomo.travaglini@arm.com  // Returns the i-th test property. i can range from 0 to
55913481Sgiacomo.travaglini@arm.com  // test_property_count() - 1. If i is not in that range, aborts the
56013481Sgiacomo.travaglini@arm.com  // program.
56113481Sgiacomo.travaglini@arm.com  const TestProperty& GetTestProperty(int i) const;
56213481Sgiacomo.travaglini@arm.com
56313481Sgiacomo.travaglini@arm.com private:
56413481Sgiacomo.travaglini@arm.com  friend class TestInfo;
56513481Sgiacomo.travaglini@arm.com  friend class TestCase;
56613481Sgiacomo.travaglini@arm.com  friend class UnitTest;
56713481Sgiacomo.travaglini@arm.com  friend class internal::DefaultGlobalTestPartResultReporter;
56813481Sgiacomo.travaglini@arm.com  friend class internal::ExecDeathTest;
56913481Sgiacomo.travaglini@arm.com  friend class internal::TestResultAccessor;
57013481Sgiacomo.travaglini@arm.com  friend class internal::UnitTestImpl;
57113481Sgiacomo.travaglini@arm.com  friend class internal::WindowsDeathTest;
57213481Sgiacomo.travaglini@arm.com
57313481Sgiacomo.travaglini@arm.com  // Gets the vector of TestPartResults.
57413481Sgiacomo.travaglini@arm.com  const std::vector<TestPartResult>& test_part_results() const {
57513481Sgiacomo.travaglini@arm.com    return test_part_results_;
57613481Sgiacomo.travaglini@arm.com  }
57713481Sgiacomo.travaglini@arm.com
57813481Sgiacomo.travaglini@arm.com  // Gets the vector of TestProperties.
57913481Sgiacomo.travaglini@arm.com  const std::vector<TestProperty>& test_properties() const {
58013481Sgiacomo.travaglini@arm.com    return test_properties_;
58113481Sgiacomo.travaglini@arm.com  }
58213481Sgiacomo.travaglini@arm.com
58313481Sgiacomo.travaglini@arm.com  // Sets the elapsed time.
58413481Sgiacomo.travaglini@arm.com  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
58513481Sgiacomo.travaglini@arm.com
58613481Sgiacomo.travaglini@arm.com  // Adds a test property to the list. The property is validated and may add
58713481Sgiacomo.travaglini@arm.com  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
58813481Sgiacomo.travaglini@arm.com  // key names). If a property is already recorded for the same key, the
58913481Sgiacomo.travaglini@arm.com  // value will be updated, rather than storing multiple values for the same
59013481Sgiacomo.travaglini@arm.com  // key.  xml_element specifies the element for which the property is being
59113481Sgiacomo.travaglini@arm.com  // recorded and is used for validation.
59213481Sgiacomo.travaglini@arm.com  void RecordProperty(const std::string& xml_element,
59313481Sgiacomo.travaglini@arm.com                      const TestProperty& test_property);
59413481Sgiacomo.travaglini@arm.com
59513481Sgiacomo.travaglini@arm.com  // Adds a failure if the key is a reserved attribute of Google Test
59613481Sgiacomo.travaglini@arm.com  // testcase tags.  Returns true if the property is valid.
59713481Sgiacomo.travaglini@arm.com  // TODO(russr): Validate attribute names are legal and human readable.
59813481Sgiacomo.travaglini@arm.com  static bool ValidateTestProperty(const std::string& xml_element,
59913481Sgiacomo.travaglini@arm.com                                   const TestProperty& test_property);
60013481Sgiacomo.travaglini@arm.com
60113481Sgiacomo.travaglini@arm.com  // Adds a test part result to the list.
60213481Sgiacomo.travaglini@arm.com  void AddTestPartResult(const TestPartResult& test_part_result);
60313481Sgiacomo.travaglini@arm.com
60413481Sgiacomo.travaglini@arm.com  // Returns the death test count.
60513481Sgiacomo.travaglini@arm.com  int death_test_count() const { return death_test_count_; }
60613481Sgiacomo.travaglini@arm.com
60713481Sgiacomo.travaglini@arm.com  // Increments the death test count, returning the new count.
60813481Sgiacomo.travaglini@arm.com  int increment_death_test_count() { return ++death_test_count_; }
60913481Sgiacomo.travaglini@arm.com
61013481Sgiacomo.travaglini@arm.com  // Clears the test part results.
61113481Sgiacomo.travaglini@arm.com  void ClearTestPartResults();
61213481Sgiacomo.travaglini@arm.com
61313481Sgiacomo.travaglini@arm.com  // Clears the object.
61413481Sgiacomo.travaglini@arm.com  void Clear();
61513481Sgiacomo.travaglini@arm.com
61613481Sgiacomo.travaglini@arm.com  // Protects mutable state of the property vector and of owned
61713481Sgiacomo.travaglini@arm.com  // properties, whose values may be updated.
61813481Sgiacomo.travaglini@arm.com  internal::Mutex test_properites_mutex_;
61913481Sgiacomo.travaglini@arm.com
62013481Sgiacomo.travaglini@arm.com  // The vector of TestPartResults
62113481Sgiacomo.travaglini@arm.com  std::vector<TestPartResult> test_part_results_;
62213481Sgiacomo.travaglini@arm.com  // The vector of TestProperties
62313481Sgiacomo.travaglini@arm.com  std::vector<TestProperty> test_properties_;
62413481Sgiacomo.travaglini@arm.com  // Running count of death tests.
62513481Sgiacomo.travaglini@arm.com  int death_test_count_;
62613481Sgiacomo.travaglini@arm.com  // The elapsed time, in milliseconds.
62713481Sgiacomo.travaglini@arm.com  TimeInMillis elapsed_time_;
62813481Sgiacomo.travaglini@arm.com
62913481Sgiacomo.travaglini@arm.com  // We disallow copying TestResult.
63013481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
63113481Sgiacomo.travaglini@arm.com};  // class TestResult
63213481Sgiacomo.travaglini@arm.com
63313481Sgiacomo.travaglini@arm.com// A TestInfo object stores the following information about a test:
63413481Sgiacomo.travaglini@arm.com//
63513481Sgiacomo.travaglini@arm.com//   Test case name
63613481Sgiacomo.travaglini@arm.com//   Test name
63713481Sgiacomo.travaglini@arm.com//   Whether the test should be run
63813481Sgiacomo.travaglini@arm.com//   A function pointer that creates the test object when invoked
63913481Sgiacomo.travaglini@arm.com//   Test result
64013481Sgiacomo.travaglini@arm.com//
64113481Sgiacomo.travaglini@arm.com// The constructor of TestInfo registers itself with the UnitTest
64213481Sgiacomo.travaglini@arm.com// singleton such that the RUN_ALL_TESTS() macro knows which tests to
64313481Sgiacomo.travaglini@arm.com// run.
64413481Sgiacomo.travaglini@arm.comclass GTEST_API_ TestInfo {
64513481Sgiacomo.travaglini@arm.com public:
64613481Sgiacomo.travaglini@arm.com  // Destructs a TestInfo object.  This function is not virtual, so
64713481Sgiacomo.travaglini@arm.com  // don't inherit from TestInfo.
64813481Sgiacomo.travaglini@arm.com  ~TestInfo();
64913481Sgiacomo.travaglini@arm.com
65013481Sgiacomo.travaglini@arm.com  // Returns the test case name.
65113481Sgiacomo.travaglini@arm.com  const char* test_case_name() const { return test_case_name_.c_str(); }
65213481Sgiacomo.travaglini@arm.com
65313481Sgiacomo.travaglini@arm.com  // Returns the test name.
65413481Sgiacomo.travaglini@arm.com  const char* name() const { return name_.c_str(); }
65513481Sgiacomo.travaglini@arm.com
65613481Sgiacomo.travaglini@arm.com  // Returns the name of the parameter type, or NULL if this is not a typed
65713481Sgiacomo.travaglini@arm.com  // or a type-parameterized test.
65813481Sgiacomo.travaglini@arm.com  const char* type_param() const {
65913481Sgiacomo.travaglini@arm.com    if (type_param_.get() != NULL)
66013481Sgiacomo.travaglini@arm.com      return type_param_->c_str();
66113481Sgiacomo.travaglini@arm.com    return NULL;
66213481Sgiacomo.travaglini@arm.com  }
66313481Sgiacomo.travaglini@arm.com
66413481Sgiacomo.travaglini@arm.com  // Returns the text representation of the value parameter, or NULL if this
66513481Sgiacomo.travaglini@arm.com  // is not a value-parameterized test.
66613481Sgiacomo.travaglini@arm.com  const char* value_param() const {
66713481Sgiacomo.travaglini@arm.com    if (value_param_.get() != NULL)
66813481Sgiacomo.travaglini@arm.com      return value_param_->c_str();
66913481Sgiacomo.travaglini@arm.com    return NULL;
67013481Sgiacomo.travaglini@arm.com  }
67113481Sgiacomo.travaglini@arm.com
67213481Sgiacomo.travaglini@arm.com  // Returns the file name where this test is defined.
67313481Sgiacomo.travaglini@arm.com  const char* file() const { return location_.file.c_str(); }
67413481Sgiacomo.travaglini@arm.com
67513481Sgiacomo.travaglini@arm.com  // Returns the line where this test is defined.
67613481Sgiacomo.travaglini@arm.com  int line() const { return location_.line; }
67713481Sgiacomo.travaglini@arm.com
67813481Sgiacomo.travaglini@arm.com  // Returns true if this test should run, that is if the test is not
67913481Sgiacomo.travaglini@arm.com  // disabled (or it is disabled but the also_run_disabled_tests flag has
68013481Sgiacomo.travaglini@arm.com  // been specified) and its full name matches the user-specified filter.
68113481Sgiacomo.travaglini@arm.com  //
68213481Sgiacomo.travaglini@arm.com  // Google Test allows the user to filter the tests by their full names.
68313481Sgiacomo.travaglini@arm.com  // The full name of a test Bar in test case Foo is defined as
68413481Sgiacomo.travaglini@arm.com  // "Foo.Bar".  Only the tests that match the filter will run.
68513481Sgiacomo.travaglini@arm.com  //
68613481Sgiacomo.travaglini@arm.com  // A filter is a colon-separated list of glob (not regex) patterns,
68713481Sgiacomo.travaglini@arm.com  // optionally followed by a '-' and a colon-separated list of
68813481Sgiacomo.travaglini@arm.com  // negative patterns (tests to exclude).  A test is run if it
68913481Sgiacomo.travaglini@arm.com  // matches one of the positive patterns and does not match any of
69013481Sgiacomo.travaglini@arm.com  // the negative patterns.
69113481Sgiacomo.travaglini@arm.com  //
69213481Sgiacomo.travaglini@arm.com  // For example, *A*:Foo.* is a filter that matches any string that
69313481Sgiacomo.travaglini@arm.com  // contains the character 'A' or starts with "Foo.".
69413481Sgiacomo.travaglini@arm.com  bool should_run() const { return should_run_; }
69513481Sgiacomo.travaglini@arm.com
69613481Sgiacomo.travaglini@arm.com  // Returns true iff this test will appear in the XML report.
69713481Sgiacomo.travaglini@arm.com  bool is_reportable() const {
69813481Sgiacomo.travaglini@arm.com    // For now, the XML report includes all tests matching the filter.
69913481Sgiacomo.travaglini@arm.com    // In the future, we may trim tests that are excluded because of
70013481Sgiacomo.travaglini@arm.com    // sharding.
70113481Sgiacomo.travaglini@arm.com    return matches_filter_;
70213481Sgiacomo.travaglini@arm.com  }
70313481Sgiacomo.travaglini@arm.com
70413481Sgiacomo.travaglini@arm.com  // Returns the result of the test.
70513481Sgiacomo.travaglini@arm.com  const TestResult* result() const { return &result_; }
70613481Sgiacomo.travaglini@arm.com
70713481Sgiacomo.travaglini@arm.com private:
70813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_DEATH_TEST
70913481Sgiacomo.travaglini@arm.com  friend class internal::DefaultDeathTestFactory;
71013481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_DEATH_TEST
71113481Sgiacomo.travaglini@arm.com  friend class Test;
71213481Sgiacomo.travaglini@arm.com  friend class TestCase;
71313481Sgiacomo.travaglini@arm.com  friend class internal::UnitTestImpl;
71413481Sgiacomo.travaglini@arm.com  friend class internal::StreamingListenerTest;
71513481Sgiacomo.travaglini@arm.com  friend TestInfo* internal::MakeAndRegisterTestInfo(
71613481Sgiacomo.travaglini@arm.com      const char* test_case_name,
71713481Sgiacomo.travaglini@arm.com      const char* name,
71813481Sgiacomo.travaglini@arm.com      const char* type_param,
71913481Sgiacomo.travaglini@arm.com      const char* value_param,
72013481Sgiacomo.travaglini@arm.com      internal::CodeLocation code_location,
72113481Sgiacomo.travaglini@arm.com      internal::TypeId fixture_class_id,
72213481Sgiacomo.travaglini@arm.com      Test::SetUpTestCaseFunc set_up_tc,
72313481Sgiacomo.travaglini@arm.com      Test::TearDownTestCaseFunc tear_down_tc,
72413481Sgiacomo.travaglini@arm.com      internal::TestFactoryBase* factory);
72513481Sgiacomo.travaglini@arm.com
72613481Sgiacomo.travaglini@arm.com  // Constructs a TestInfo object. The newly constructed instance assumes
72713481Sgiacomo.travaglini@arm.com  // ownership of the factory object.
72813481Sgiacomo.travaglini@arm.com  TestInfo(const std::string& test_case_name,
72913481Sgiacomo.travaglini@arm.com           const std::string& name,
73013481Sgiacomo.travaglini@arm.com           const char* a_type_param,   // NULL if not a type-parameterized test
73113481Sgiacomo.travaglini@arm.com           const char* a_value_param,  // NULL if not a value-parameterized test
73213481Sgiacomo.travaglini@arm.com           internal::CodeLocation a_code_location,
73313481Sgiacomo.travaglini@arm.com           internal::TypeId fixture_class_id,
73413481Sgiacomo.travaglini@arm.com           internal::TestFactoryBase* factory);
73513481Sgiacomo.travaglini@arm.com
73613481Sgiacomo.travaglini@arm.com  // Increments the number of death tests encountered in this test so
73713481Sgiacomo.travaglini@arm.com  // far.
73813481Sgiacomo.travaglini@arm.com  int increment_death_test_count() {
73913481Sgiacomo.travaglini@arm.com    return result_.increment_death_test_count();
74013481Sgiacomo.travaglini@arm.com  }
74113481Sgiacomo.travaglini@arm.com
74213481Sgiacomo.travaglini@arm.com  // Creates the test object, runs it, records its result, and then
74313481Sgiacomo.travaglini@arm.com  // deletes it.
74413481Sgiacomo.travaglini@arm.com  void Run();
74513481Sgiacomo.travaglini@arm.com
74613481Sgiacomo.travaglini@arm.com  static void ClearTestResult(TestInfo* test_info) {
74713481Sgiacomo.travaglini@arm.com    test_info->result_.Clear();
74813481Sgiacomo.travaglini@arm.com  }
74913481Sgiacomo.travaglini@arm.com
75013481Sgiacomo.travaglini@arm.com  // These fields are immutable properties of the test.
75113481Sgiacomo.travaglini@arm.com  const std::string test_case_name_;     // Test case name
75213481Sgiacomo.travaglini@arm.com  const std::string name_;               // Test name
75313481Sgiacomo.travaglini@arm.com  // Name of the parameter type, or NULL if this is not a typed or a
75413481Sgiacomo.travaglini@arm.com  // type-parameterized test.
75513481Sgiacomo.travaglini@arm.com  const internal::scoped_ptr<const ::std::string> type_param_;
75613481Sgiacomo.travaglini@arm.com  // Text representation of the value parameter, or NULL if this is not a
75713481Sgiacomo.travaglini@arm.com  // value-parameterized test.
75813481Sgiacomo.travaglini@arm.com  const internal::scoped_ptr<const ::std::string> value_param_;
75913481Sgiacomo.travaglini@arm.com  internal::CodeLocation location_;
76013481Sgiacomo.travaglini@arm.com  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
76113481Sgiacomo.travaglini@arm.com  bool should_run_;                 // True iff this test should run
76213481Sgiacomo.travaglini@arm.com  bool is_disabled_;                // True iff this test is disabled
76313481Sgiacomo.travaglini@arm.com  bool matches_filter_;             // True if this test matches the
76413481Sgiacomo.travaglini@arm.com                                    // user-specified filter.
76513481Sgiacomo.travaglini@arm.com  internal::TestFactoryBase* const factory_;  // The factory that creates
76613481Sgiacomo.travaglini@arm.com                                              // the test object
76713481Sgiacomo.travaglini@arm.com
76813481Sgiacomo.travaglini@arm.com  // This field is mutable and needs to be reset before running the
76913481Sgiacomo.travaglini@arm.com  // test for the second time.
77013481Sgiacomo.travaglini@arm.com  TestResult result_;
77113481Sgiacomo.travaglini@arm.com
77213481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
77313481Sgiacomo.travaglini@arm.com};
77413481Sgiacomo.travaglini@arm.com
77513481Sgiacomo.travaglini@arm.com// A test case, which consists of a vector of TestInfos.
77613481Sgiacomo.travaglini@arm.com//
77713481Sgiacomo.travaglini@arm.com// TestCase is not copyable.
77813481Sgiacomo.travaglini@arm.comclass GTEST_API_ TestCase {
77913481Sgiacomo.travaglini@arm.com public:
78013481Sgiacomo.travaglini@arm.com  // Creates a TestCase with the given name.
78113481Sgiacomo.travaglini@arm.com  //
78213481Sgiacomo.travaglini@arm.com  // TestCase does NOT have a default constructor.  Always use this
78313481Sgiacomo.travaglini@arm.com  // constructor to create a TestCase object.
78413481Sgiacomo.travaglini@arm.com  //
78513481Sgiacomo.travaglini@arm.com  // Arguments:
78613481Sgiacomo.travaglini@arm.com  //
78713481Sgiacomo.travaglini@arm.com  //   name:         name of the test case
78813481Sgiacomo.travaglini@arm.com  //   a_type_param: the name of the test's type parameter, or NULL if
78913481Sgiacomo.travaglini@arm.com  //                 this is not a type-parameterized test.
79013481Sgiacomo.travaglini@arm.com  //   set_up_tc:    pointer to the function that sets up the test case
79113481Sgiacomo.travaglini@arm.com  //   tear_down_tc: pointer to the function that tears down the test case
79213481Sgiacomo.travaglini@arm.com  TestCase(const char* name, const char* a_type_param,
79313481Sgiacomo.travaglini@arm.com           Test::SetUpTestCaseFunc set_up_tc,
79413481Sgiacomo.travaglini@arm.com           Test::TearDownTestCaseFunc tear_down_tc);
79513481Sgiacomo.travaglini@arm.com
79613481Sgiacomo.travaglini@arm.com  // Destructor of TestCase.
79713481Sgiacomo.travaglini@arm.com  virtual ~TestCase();
79813481Sgiacomo.travaglini@arm.com
79913481Sgiacomo.travaglini@arm.com  // Gets the name of the TestCase.
80013481Sgiacomo.travaglini@arm.com  const char* name() const { return name_.c_str(); }
80113481Sgiacomo.travaglini@arm.com
80213481Sgiacomo.travaglini@arm.com  // Returns the name of the parameter type, or NULL if this is not a
80313481Sgiacomo.travaglini@arm.com  // type-parameterized test case.
80413481Sgiacomo.travaglini@arm.com  const char* type_param() const {
80513481Sgiacomo.travaglini@arm.com    if (type_param_.get() != NULL)
80613481Sgiacomo.travaglini@arm.com      return type_param_->c_str();
80713481Sgiacomo.travaglini@arm.com    return NULL;
80813481Sgiacomo.travaglini@arm.com  }
80913481Sgiacomo.travaglini@arm.com
81013481Sgiacomo.travaglini@arm.com  // Returns true if any test in this test case should run.
81113481Sgiacomo.travaglini@arm.com  bool should_run() const { return should_run_; }
81213481Sgiacomo.travaglini@arm.com
81313481Sgiacomo.travaglini@arm.com  // Gets the number of successful tests in this test case.
81413481Sgiacomo.travaglini@arm.com  int successful_test_count() const;
81513481Sgiacomo.travaglini@arm.com
81613481Sgiacomo.travaglini@arm.com  // Gets the number of failed tests in this test case.
81713481Sgiacomo.travaglini@arm.com  int failed_test_count() const;
81813481Sgiacomo.travaglini@arm.com
81913481Sgiacomo.travaglini@arm.com  // Gets the number of disabled tests that will be reported in the XML report.
82013481Sgiacomo.travaglini@arm.com  int reportable_disabled_test_count() const;
82113481Sgiacomo.travaglini@arm.com
82213481Sgiacomo.travaglini@arm.com  // Gets the number of disabled tests in this test case.
82313481Sgiacomo.travaglini@arm.com  int disabled_test_count() const;
82413481Sgiacomo.travaglini@arm.com
82513481Sgiacomo.travaglini@arm.com  // Gets the number of tests to be printed in the XML report.
82613481Sgiacomo.travaglini@arm.com  int reportable_test_count() const;
82713481Sgiacomo.travaglini@arm.com
82813481Sgiacomo.travaglini@arm.com  // Get the number of tests in this test case that should run.
82913481Sgiacomo.travaglini@arm.com  int test_to_run_count() const;
83013481Sgiacomo.travaglini@arm.com
83113481Sgiacomo.travaglini@arm.com  // Gets the number of all tests in this test case.
83213481Sgiacomo.travaglini@arm.com  int total_test_count() const;
83313481Sgiacomo.travaglini@arm.com
83413481Sgiacomo.travaglini@arm.com  // Returns true iff the test case passed.
83513481Sgiacomo.travaglini@arm.com  bool Passed() const { return !Failed(); }
83613481Sgiacomo.travaglini@arm.com
83713481Sgiacomo.travaglini@arm.com  // Returns true iff the test case failed.
83813481Sgiacomo.travaglini@arm.com  bool Failed() const { return failed_test_count() > 0; }
83913481Sgiacomo.travaglini@arm.com
84013481Sgiacomo.travaglini@arm.com  // Returns the elapsed time, in milliseconds.
84113481Sgiacomo.travaglini@arm.com  TimeInMillis elapsed_time() const { return elapsed_time_; }
84213481Sgiacomo.travaglini@arm.com
84313481Sgiacomo.travaglini@arm.com  // Returns the i-th test among all the tests. i can range from 0 to
84413481Sgiacomo.travaglini@arm.com  // total_test_count() - 1. If i is not in that range, returns NULL.
84513481Sgiacomo.travaglini@arm.com  const TestInfo* GetTestInfo(int i) const;
84613481Sgiacomo.travaglini@arm.com
84713481Sgiacomo.travaglini@arm.com  // Returns the TestResult that holds test properties recorded during
84813481Sgiacomo.travaglini@arm.com  // execution of SetUpTestCase and TearDownTestCase.
84913481Sgiacomo.travaglini@arm.com  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
85013481Sgiacomo.travaglini@arm.com
85113481Sgiacomo.travaglini@arm.com private:
85213481Sgiacomo.travaglini@arm.com  friend class Test;
85313481Sgiacomo.travaglini@arm.com  friend class internal::UnitTestImpl;
85413481Sgiacomo.travaglini@arm.com
85513481Sgiacomo.travaglini@arm.com  // Gets the (mutable) vector of TestInfos in this TestCase.
85613481Sgiacomo.travaglini@arm.com  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
85713481Sgiacomo.travaglini@arm.com
85813481Sgiacomo.travaglini@arm.com  // Gets the (immutable) vector of TestInfos in this TestCase.
85913481Sgiacomo.travaglini@arm.com  const std::vector<TestInfo*>& test_info_list() const {
86013481Sgiacomo.travaglini@arm.com    return test_info_list_;
86113481Sgiacomo.travaglini@arm.com  }
86213481Sgiacomo.travaglini@arm.com
86313481Sgiacomo.travaglini@arm.com  // Returns the i-th test among all the tests. i can range from 0 to
86413481Sgiacomo.travaglini@arm.com  // total_test_count() - 1. If i is not in that range, returns NULL.
86513481Sgiacomo.travaglini@arm.com  TestInfo* GetMutableTestInfo(int i);
86613481Sgiacomo.travaglini@arm.com
86713481Sgiacomo.travaglini@arm.com  // Sets the should_run member.
86813481Sgiacomo.travaglini@arm.com  void set_should_run(bool should) { should_run_ = should; }
86913481Sgiacomo.travaglini@arm.com
87013481Sgiacomo.travaglini@arm.com  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
87113481Sgiacomo.travaglini@arm.com  // destruction of the TestCase object.
87213481Sgiacomo.travaglini@arm.com  void AddTestInfo(TestInfo * test_info);
87313481Sgiacomo.travaglini@arm.com
87413481Sgiacomo.travaglini@arm.com  // Clears the results of all tests in this test case.
87513481Sgiacomo.travaglini@arm.com  void ClearResult();
87613481Sgiacomo.travaglini@arm.com
87713481Sgiacomo.travaglini@arm.com  // Clears the results of all tests in the given test case.
87813481Sgiacomo.travaglini@arm.com  static void ClearTestCaseResult(TestCase* test_case) {
87913481Sgiacomo.travaglini@arm.com    test_case->ClearResult();
88013481Sgiacomo.travaglini@arm.com  }
88113481Sgiacomo.travaglini@arm.com
88213481Sgiacomo.travaglini@arm.com  // Runs every test in this TestCase.
88313481Sgiacomo.travaglini@arm.com  void Run();
88413481Sgiacomo.travaglini@arm.com
88513481Sgiacomo.travaglini@arm.com  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
88613481Sgiacomo.travaglini@arm.com  // for catching exceptions thrown from SetUpTestCase().
88713481Sgiacomo.travaglini@arm.com  void RunSetUpTestCase() { (*set_up_tc_)(); }
88813481Sgiacomo.travaglini@arm.com
88913481Sgiacomo.travaglini@arm.com  // Runs TearDownTestCase() for this TestCase.  This wrapper is
89013481Sgiacomo.travaglini@arm.com  // needed for catching exceptions thrown from TearDownTestCase().
89113481Sgiacomo.travaglini@arm.com  void RunTearDownTestCase() { (*tear_down_tc_)(); }
89213481Sgiacomo.travaglini@arm.com
89313481Sgiacomo.travaglini@arm.com  // Returns true iff test passed.
89413481Sgiacomo.travaglini@arm.com  static bool TestPassed(const TestInfo* test_info) {
89513481Sgiacomo.travaglini@arm.com    return test_info->should_run() && test_info->result()->Passed();
89613481Sgiacomo.travaglini@arm.com  }
89713481Sgiacomo.travaglini@arm.com
89813481Sgiacomo.travaglini@arm.com  // Returns true iff test failed.
89913481Sgiacomo.travaglini@arm.com  static bool TestFailed(const TestInfo* test_info) {
90013481Sgiacomo.travaglini@arm.com    return test_info->should_run() && test_info->result()->Failed();
90113481Sgiacomo.travaglini@arm.com  }
90213481Sgiacomo.travaglini@arm.com
90313481Sgiacomo.travaglini@arm.com  // Returns true iff the test is disabled and will be reported in the XML
90413481Sgiacomo.travaglini@arm.com  // report.
90513481Sgiacomo.travaglini@arm.com  static bool TestReportableDisabled(const TestInfo* test_info) {
90613481Sgiacomo.travaglini@arm.com    return test_info->is_reportable() && test_info->is_disabled_;
90713481Sgiacomo.travaglini@arm.com  }
90813481Sgiacomo.travaglini@arm.com
90913481Sgiacomo.travaglini@arm.com  // Returns true iff test is disabled.
91013481Sgiacomo.travaglini@arm.com  static bool TestDisabled(const TestInfo* test_info) {
91113481Sgiacomo.travaglini@arm.com    return test_info->is_disabled_;
91213481Sgiacomo.travaglini@arm.com  }
91313481Sgiacomo.travaglini@arm.com
91413481Sgiacomo.travaglini@arm.com  // Returns true iff this test will appear in the XML report.
91513481Sgiacomo.travaglini@arm.com  static bool TestReportable(const TestInfo* test_info) {
91613481Sgiacomo.travaglini@arm.com    return test_info->is_reportable();
91713481Sgiacomo.travaglini@arm.com  }
91813481Sgiacomo.travaglini@arm.com
91913481Sgiacomo.travaglini@arm.com  // Returns true if the given test should run.
92013481Sgiacomo.travaglini@arm.com  static bool ShouldRunTest(const TestInfo* test_info) {
92113481Sgiacomo.travaglini@arm.com    return test_info->should_run();
92213481Sgiacomo.travaglini@arm.com  }
92313481Sgiacomo.travaglini@arm.com
92413481Sgiacomo.travaglini@arm.com  // Shuffles the tests in this test case.
92513481Sgiacomo.travaglini@arm.com  void ShuffleTests(internal::Random* random);
92613481Sgiacomo.travaglini@arm.com
92713481Sgiacomo.travaglini@arm.com  // Restores the test order to before the first shuffle.
92813481Sgiacomo.travaglini@arm.com  void UnshuffleTests();
92913481Sgiacomo.travaglini@arm.com
93013481Sgiacomo.travaglini@arm.com  // Name of the test case.
93113481Sgiacomo.travaglini@arm.com  std::string name_;
93213481Sgiacomo.travaglini@arm.com  // Name of the parameter type, or NULL if this is not a typed or a
93313481Sgiacomo.travaglini@arm.com  // type-parameterized test.
93413481Sgiacomo.travaglini@arm.com  const internal::scoped_ptr<const ::std::string> type_param_;
93513481Sgiacomo.travaglini@arm.com  // The vector of TestInfos in their original order.  It owns the
93613481Sgiacomo.travaglini@arm.com  // elements in the vector.
93713481Sgiacomo.travaglini@arm.com  std::vector<TestInfo*> test_info_list_;
93813481Sgiacomo.travaglini@arm.com  // Provides a level of indirection for the test list to allow easy
93913481Sgiacomo.travaglini@arm.com  // shuffling and restoring the test order.  The i-th element in this
94013481Sgiacomo.travaglini@arm.com  // vector is the index of the i-th test in the shuffled test list.
94113481Sgiacomo.travaglini@arm.com  std::vector<int> test_indices_;
94213481Sgiacomo.travaglini@arm.com  // Pointer to the function that sets up the test case.
94313481Sgiacomo.travaglini@arm.com  Test::SetUpTestCaseFunc set_up_tc_;
94413481Sgiacomo.travaglini@arm.com  // Pointer to the function that tears down the test case.
94513481Sgiacomo.travaglini@arm.com  Test::TearDownTestCaseFunc tear_down_tc_;
94613481Sgiacomo.travaglini@arm.com  // True iff any test in this test case should run.
94713481Sgiacomo.travaglini@arm.com  bool should_run_;
94813481Sgiacomo.travaglini@arm.com  // Elapsed time, in milliseconds.
94913481Sgiacomo.travaglini@arm.com  TimeInMillis elapsed_time_;
95013481Sgiacomo.travaglini@arm.com  // Holds test properties recorded during execution of SetUpTestCase and
95113481Sgiacomo.travaglini@arm.com  // TearDownTestCase.
95213481Sgiacomo.travaglini@arm.com  TestResult ad_hoc_test_result_;
95313481Sgiacomo.travaglini@arm.com
95413481Sgiacomo.travaglini@arm.com  // We disallow copying TestCases.
95513481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
95613481Sgiacomo.travaglini@arm.com};
95713481Sgiacomo.travaglini@arm.com
95813481Sgiacomo.travaglini@arm.com// An Environment object is capable of setting up and tearing down an
95913481Sgiacomo.travaglini@arm.com// environment.  You should subclass this to define your own
96013481Sgiacomo.travaglini@arm.com// environment(s).
96113481Sgiacomo.travaglini@arm.com//
96213481Sgiacomo.travaglini@arm.com// An Environment object does the set-up and tear-down in virtual
96313481Sgiacomo.travaglini@arm.com// methods SetUp() and TearDown() instead of the constructor and the
96413481Sgiacomo.travaglini@arm.com// destructor, as:
96513481Sgiacomo.travaglini@arm.com//
96613481Sgiacomo.travaglini@arm.com//   1. You cannot safely throw from a destructor.  This is a problem
96713481Sgiacomo.travaglini@arm.com//      as in some cases Google Test is used where exceptions are enabled, and
96813481Sgiacomo.travaglini@arm.com//      we may want to implement ASSERT_* using exceptions where they are
96913481Sgiacomo.travaglini@arm.com//      available.
97013481Sgiacomo.travaglini@arm.com//   2. You cannot use ASSERT_* directly in a constructor or
97113481Sgiacomo.travaglini@arm.com//      destructor.
97213481Sgiacomo.travaglini@arm.comclass Environment {
97313481Sgiacomo.travaglini@arm.com public:
97413481Sgiacomo.travaglini@arm.com  // The d'tor is virtual as we need to subclass Environment.
97513481Sgiacomo.travaglini@arm.com  virtual ~Environment() {}
97613481Sgiacomo.travaglini@arm.com
97713481Sgiacomo.travaglini@arm.com  // Override this to define how to set up the environment.
97813481Sgiacomo.travaglini@arm.com  virtual void SetUp() {}
97913481Sgiacomo.travaglini@arm.com
98013481Sgiacomo.travaglini@arm.com  // Override this to define how to tear down the environment.
98113481Sgiacomo.travaglini@arm.com  virtual void TearDown() {}
98213481Sgiacomo.travaglini@arm.com private:
98313481Sgiacomo.travaglini@arm.com  // If you see an error about overriding the following function or
98413481Sgiacomo.travaglini@arm.com  // about it being private, you have mis-spelled SetUp() as Setup().
98513481Sgiacomo.travaglini@arm.com  struct Setup_should_be_spelled_SetUp {};
98613481Sgiacomo.travaglini@arm.com  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
98713481Sgiacomo.travaglini@arm.com};
98813481Sgiacomo.travaglini@arm.com
98913481Sgiacomo.travaglini@arm.com// The interface for tracing execution of tests. The methods are organized in
99013481Sgiacomo.travaglini@arm.com// the order the corresponding events are fired.
99113481Sgiacomo.travaglini@arm.comclass TestEventListener {
99213481Sgiacomo.travaglini@arm.com public:
99313481Sgiacomo.travaglini@arm.com  virtual ~TestEventListener() {}
99413481Sgiacomo.travaglini@arm.com
99513481Sgiacomo.travaglini@arm.com  // Fired before any test activity starts.
99613481Sgiacomo.travaglini@arm.com  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
99713481Sgiacomo.travaglini@arm.com
99813481Sgiacomo.travaglini@arm.com  // Fired before each iteration of tests starts.  There may be more than
99913481Sgiacomo.travaglini@arm.com  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
100013481Sgiacomo.travaglini@arm.com  // index, starting from 0.
100113481Sgiacomo.travaglini@arm.com  virtual void OnTestIterationStart(const UnitTest& unit_test,
100213481Sgiacomo.travaglini@arm.com                                    int iteration) = 0;
100313481Sgiacomo.travaglini@arm.com
100413481Sgiacomo.travaglini@arm.com  // Fired before environment set-up for each iteration of tests starts.
100513481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
100613481Sgiacomo.travaglini@arm.com
100713481Sgiacomo.travaglini@arm.com  // Fired after environment set-up for each iteration of tests ends.
100813481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
100913481Sgiacomo.travaglini@arm.com
101013481Sgiacomo.travaglini@arm.com  // Fired before the test case starts.
101113481Sgiacomo.travaglini@arm.com  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
101213481Sgiacomo.travaglini@arm.com
101313481Sgiacomo.travaglini@arm.com  // Fired before the test starts.
101413481Sgiacomo.travaglini@arm.com  virtual void OnTestStart(const TestInfo& test_info) = 0;
101513481Sgiacomo.travaglini@arm.com
101613481Sgiacomo.travaglini@arm.com  // Fired after a failed assertion or a SUCCEED() invocation.
101713481Sgiacomo.travaglini@arm.com  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
101813481Sgiacomo.travaglini@arm.com
101913481Sgiacomo.travaglini@arm.com  // Fired after the test ends.
102013481Sgiacomo.travaglini@arm.com  virtual void OnTestEnd(const TestInfo& test_info) = 0;
102113481Sgiacomo.travaglini@arm.com
102213481Sgiacomo.travaglini@arm.com  // Fired after the test case ends.
102313481Sgiacomo.travaglini@arm.com  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
102413481Sgiacomo.travaglini@arm.com
102513481Sgiacomo.travaglini@arm.com  // Fired before environment tear-down for each iteration of tests starts.
102613481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
102713481Sgiacomo.travaglini@arm.com
102813481Sgiacomo.travaglini@arm.com  // Fired after environment tear-down for each iteration of tests ends.
102913481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
103013481Sgiacomo.travaglini@arm.com
103113481Sgiacomo.travaglini@arm.com  // Fired after each iteration of tests finishes.
103213481Sgiacomo.travaglini@arm.com  virtual void OnTestIterationEnd(const UnitTest& unit_test,
103313481Sgiacomo.travaglini@arm.com                                  int iteration) = 0;
103413481Sgiacomo.travaglini@arm.com
103513481Sgiacomo.travaglini@arm.com  // Fired after all test activities have ended.
103613481Sgiacomo.travaglini@arm.com  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
103713481Sgiacomo.travaglini@arm.com};
103813481Sgiacomo.travaglini@arm.com
103913481Sgiacomo.travaglini@arm.com// The convenience class for users who need to override just one or two
104013481Sgiacomo.travaglini@arm.com// methods and are not concerned that a possible change to a signature of
104113481Sgiacomo.travaglini@arm.com// the methods they override will not be caught during the build.  For
104213481Sgiacomo.travaglini@arm.com// comments about each method please see the definition of TestEventListener
104313481Sgiacomo.travaglini@arm.com// above.
104413481Sgiacomo.travaglini@arm.comclass EmptyTestEventListener : public TestEventListener {
104513481Sgiacomo.travaglini@arm.com public:
104613481Sgiacomo.travaglini@arm.com  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
104713481Sgiacomo.travaglini@arm.com  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
104813481Sgiacomo.travaglini@arm.com                                    int /*iteration*/) {}
104913481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
105013481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
105113481Sgiacomo.travaglini@arm.com  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
105213481Sgiacomo.travaglini@arm.com  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
105313481Sgiacomo.travaglini@arm.com  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
105413481Sgiacomo.travaglini@arm.com  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
105513481Sgiacomo.travaglini@arm.com  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
105613481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
105713481Sgiacomo.travaglini@arm.com  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
105813481Sgiacomo.travaglini@arm.com  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
105913481Sgiacomo.travaglini@arm.com                                  int /*iteration*/) {}
106013481Sgiacomo.travaglini@arm.com  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
106113481Sgiacomo.travaglini@arm.com};
106213481Sgiacomo.travaglini@arm.com
106313481Sgiacomo.travaglini@arm.com// TestEventListeners lets users add listeners to track events in Google Test.
106413481Sgiacomo.travaglini@arm.comclass GTEST_API_ TestEventListeners {
106513481Sgiacomo.travaglini@arm.com public:
106613481Sgiacomo.travaglini@arm.com  TestEventListeners();
106713481Sgiacomo.travaglini@arm.com  ~TestEventListeners();
106813481Sgiacomo.travaglini@arm.com
106913481Sgiacomo.travaglini@arm.com  // Appends an event listener to the end of the list. Google Test assumes
107013481Sgiacomo.travaglini@arm.com  // the ownership of the listener (i.e. it will delete the listener when
107113481Sgiacomo.travaglini@arm.com  // the test program finishes).
107213481Sgiacomo.travaglini@arm.com  void Append(TestEventListener* listener);
107313481Sgiacomo.travaglini@arm.com
107413481Sgiacomo.travaglini@arm.com  // Removes the given event listener from the list and returns it.  It then
107513481Sgiacomo.travaglini@arm.com  // becomes the caller's responsibility to delete the listener. Returns
107613481Sgiacomo.travaglini@arm.com  // NULL if the listener is not found in the list.
107713481Sgiacomo.travaglini@arm.com  TestEventListener* Release(TestEventListener* listener);
107813481Sgiacomo.travaglini@arm.com
107913481Sgiacomo.travaglini@arm.com  // Returns the standard listener responsible for the default console
108013481Sgiacomo.travaglini@arm.com  // output.  Can be removed from the listeners list to shut down default
108113481Sgiacomo.travaglini@arm.com  // console output.  Note that removing this object from the listener list
108213481Sgiacomo.travaglini@arm.com  // with Release transfers its ownership to the caller and makes this
108313481Sgiacomo.travaglini@arm.com  // function return NULL the next time.
108413481Sgiacomo.travaglini@arm.com  TestEventListener* default_result_printer() const {
108513481Sgiacomo.travaglini@arm.com    return default_result_printer_;
108613481Sgiacomo.travaglini@arm.com  }
108713481Sgiacomo.travaglini@arm.com
108813481Sgiacomo.travaglini@arm.com  // Returns the standard listener responsible for the default XML output
108913481Sgiacomo.travaglini@arm.com  // controlled by the --gtest_output=xml flag.  Can be removed from the
109013481Sgiacomo.travaglini@arm.com  // listeners list by users who want to shut down the default XML output
109113481Sgiacomo.travaglini@arm.com  // controlled by this flag and substitute it with custom one.  Note that
109213481Sgiacomo.travaglini@arm.com  // removing this object from the listener list with Release transfers its
109313481Sgiacomo.travaglini@arm.com  // ownership to the caller and makes this function return NULL the next
109413481Sgiacomo.travaglini@arm.com  // time.
109513481Sgiacomo.travaglini@arm.com  TestEventListener* default_xml_generator() const {
109613481Sgiacomo.travaglini@arm.com    return default_xml_generator_;
109713481Sgiacomo.travaglini@arm.com  }
109813481Sgiacomo.travaglini@arm.com
109913481Sgiacomo.travaglini@arm.com private:
110013481Sgiacomo.travaglini@arm.com  friend class TestCase;
110113481Sgiacomo.travaglini@arm.com  friend class TestInfo;
110213481Sgiacomo.travaglini@arm.com  friend class internal::DefaultGlobalTestPartResultReporter;
110313481Sgiacomo.travaglini@arm.com  friend class internal::NoExecDeathTest;
110413481Sgiacomo.travaglini@arm.com  friend class internal::TestEventListenersAccessor;
110513481Sgiacomo.travaglini@arm.com  friend class internal::UnitTestImpl;
110613481Sgiacomo.travaglini@arm.com
110713481Sgiacomo.travaglini@arm.com  // Returns repeater that broadcasts the TestEventListener events to all
110813481Sgiacomo.travaglini@arm.com  // subscribers.
110913481Sgiacomo.travaglini@arm.com  TestEventListener* repeater();
111013481Sgiacomo.travaglini@arm.com
111113481Sgiacomo.travaglini@arm.com  // Sets the default_result_printer attribute to the provided listener.
111213481Sgiacomo.travaglini@arm.com  // The listener is also added to the listener list and previous
111313481Sgiacomo.travaglini@arm.com  // default_result_printer is removed from it and deleted. The listener can
111413481Sgiacomo.travaglini@arm.com  // also be NULL in which case it will not be added to the list. Does
111513481Sgiacomo.travaglini@arm.com  // nothing if the previous and the current listener objects are the same.
111613481Sgiacomo.travaglini@arm.com  void SetDefaultResultPrinter(TestEventListener* listener);
111713481Sgiacomo.travaglini@arm.com
111813481Sgiacomo.travaglini@arm.com  // Sets the default_xml_generator attribute to the provided listener.  The
111913481Sgiacomo.travaglini@arm.com  // listener is also added to the listener list and previous
112013481Sgiacomo.travaglini@arm.com  // default_xml_generator is removed from it and deleted. The listener can
112113481Sgiacomo.travaglini@arm.com  // also be NULL in which case it will not be added to the list. Does
112213481Sgiacomo.travaglini@arm.com  // nothing if the previous and the current listener objects are the same.
112313481Sgiacomo.travaglini@arm.com  void SetDefaultXmlGenerator(TestEventListener* listener);
112413481Sgiacomo.travaglini@arm.com
112513481Sgiacomo.travaglini@arm.com  // Controls whether events will be forwarded by the repeater to the
112613481Sgiacomo.travaglini@arm.com  // listeners in the list.
112713481Sgiacomo.travaglini@arm.com  bool EventForwardingEnabled() const;
112813481Sgiacomo.travaglini@arm.com  void SuppressEventForwarding();
112913481Sgiacomo.travaglini@arm.com
113013481Sgiacomo.travaglini@arm.com  // The actual list of listeners.
113113481Sgiacomo.travaglini@arm.com  internal::TestEventRepeater* repeater_;
113213481Sgiacomo.travaglini@arm.com  // Listener responsible for the standard result output.
113313481Sgiacomo.travaglini@arm.com  TestEventListener* default_result_printer_;
113413481Sgiacomo.travaglini@arm.com  // Listener responsible for the creation of the XML output file.
113513481Sgiacomo.travaglini@arm.com  TestEventListener* default_xml_generator_;
113613481Sgiacomo.travaglini@arm.com
113713481Sgiacomo.travaglini@arm.com  // We disallow copying TestEventListeners.
113813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
113913481Sgiacomo.travaglini@arm.com};
114013481Sgiacomo.travaglini@arm.com
114113481Sgiacomo.travaglini@arm.com// A UnitTest consists of a vector of TestCases.
114213481Sgiacomo.travaglini@arm.com//
114313481Sgiacomo.travaglini@arm.com// This is a singleton class.  The only instance of UnitTest is
114413481Sgiacomo.travaglini@arm.com// created when UnitTest::GetInstance() is first called.  This
114513481Sgiacomo.travaglini@arm.com// instance is never deleted.
114613481Sgiacomo.travaglini@arm.com//
114713481Sgiacomo.travaglini@arm.com// UnitTest is not copyable.
114813481Sgiacomo.travaglini@arm.com//
114913481Sgiacomo.travaglini@arm.com// This class is thread-safe as long as the methods are called
115013481Sgiacomo.travaglini@arm.com// according to their specification.
115113481Sgiacomo.travaglini@arm.comclass GTEST_API_ UnitTest {
115213481Sgiacomo.travaglini@arm.com public:
115313481Sgiacomo.travaglini@arm.com  // Gets the singleton UnitTest object.  The first time this method
115413481Sgiacomo.travaglini@arm.com  // is called, a UnitTest object is constructed and returned.
115513481Sgiacomo.travaglini@arm.com  // Consecutive calls will return the same object.
115613481Sgiacomo.travaglini@arm.com  static UnitTest* GetInstance();
115713481Sgiacomo.travaglini@arm.com
115813481Sgiacomo.travaglini@arm.com  // Runs all tests in this UnitTest object and prints the result.
115913481Sgiacomo.travaglini@arm.com  // Returns 0 if successful, or 1 otherwise.
116013481Sgiacomo.travaglini@arm.com  //
116113481Sgiacomo.travaglini@arm.com  // This method can only be called from the main thread.
116213481Sgiacomo.travaglini@arm.com  //
116313481Sgiacomo.travaglini@arm.com  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
116413481Sgiacomo.travaglini@arm.com  int Run() GTEST_MUST_USE_RESULT_;
116513481Sgiacomo.travaglini@arm.com
116613481Sgiacomo.travaglini@arm.com  // Returns the working directory when the first TEST() or TEST_F()
116713481Sgiacomo.travaglini@arm.com  // was executed.  The UnitTest object owns the string.
116813481Sgiacomo.travaglini@arm.com  const char* original_working_dir() const;
116913481Sgiacomo.travaglini@arm.com
117013481Sgiacomo.travaglini@arm.com  // Returns the TestCase object for the test that's currently running,
117113481Sgiacomo.travaglini@arm.com  // or NULL if no test is running.
117213481Sgiacomo.travaglini@arm.com  const TestCase* current_test_case() const
117313481Sgiacomo.travaglini@arm.com      GTEST_LOCK_EXCLUDED_(mutex_);
117413481Sgiacomo.travaglini@arm.com
117513481Sgiacomo.travaglini@arm.com  // Returns the TestInfo object for the test that's currently running,
117613481Sgiacomo.travaglini@arm.com  // or NULL if no test is running.
117713481Sgiacomo.travaglini@arm.com  const TestInfo* current_test_info() const
117813481Sgiacomo.travaglini@arm.com      GTEST_LOCK_EXCLUDED_(mutex_);
117913481Sgiacomo.travaglini@arm.com
118013481Sgiacomo.travaglini@arm.com  // Returns the random seed used at the start of the current test run.
118113481Sgiacomo.travaglini@arm.com  int random_seed() const;
118213481Sgiacomo.travaglini@arm.com
118313481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
118413481Sgiacomo.travaglini@arm.com  // Returns the ParameterizedTestCaseRegistry object used to keep track of
118513481Sgiacomo.travaglini@arm.com  // value-parameterized tests and instantiate and register them.
118613481Sgiacomo.travaglini@arm.com  //
118713481Sgiacomo.travaglini@arm.com  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
118813481Sgiacomo.travaglini@arm.com  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
118913481Sgiacomo.travaglini@arm.com      GTEST_LOCK_EXCLUDED_(mutex_);
119013481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
119113481Sgiacomo.travaglini@arm.com
119213481Sgiacomo.travaglini@arm.com  // Gets the number of successful test cases.
119313481Sgiacomo.travaglini@arm.com  int successful_test_case_count() const;
119413481Sgiacomo.travaglini@arm.com
119513481Sgiacomo.travaglini@arm.com  // Gets the number of failed test cases.
119613481Sgiacomo.travaglini@arm.com  int failed_test_case_count() const;
119713481Sgiacomo.travaglini@arm.com
119813481Sgiacomo.travaglini@arm.com  // Gets the number of all test cases.
119913481Sgiacomo.travaglini@arm.com  int total_test_case_count() const;
120013481Sgiacomo.travaglini@arm.com
120113481Sgiacomo.travaglini@arm.com  // Gets the number of all test cases that contain at least one test
120213481Sgiacomo.travaglini@arm.com  // that should run.
120313481Sgiacomo.travaglini@arm.com  int test_case_to_run_count() const;
120413481Sgiacomo.travaglini@arm.com
120513481Sgiacomo.travaglini@arm.com  // Gets the number of successful tests.
120613481Sgiacomo.travaglini@arm.com  int successful_test_count() const;
120713481Sgiacomo.travaglini@arm.com
120813481Sgiacomo.travaglini@arm.com  // Gets the number of failed tests.
120913481Sgiacomo.travaglini@arm.com  int failed_test_count() const;
121013481Sgiacomo.travaglini@arm.com
121113481Sgiacomo.travaglini@arm.com  // Gets the number of disabled tests that will be reported in the XML report.
121213481Sgiacomo.travaglini@arm.com  int reportable_disabled_test_count() const;
121313481Sgiacomo.travaglini@arm.com
121413481Sgiacomo.travaglini@arm.com  // Gets the number of disabled tests.
121513481Sgiacomo.travaglini@arm.com  int disabled_test_count() const;
121613481Sgiacomo.travaglini@arm.com
121713481Sgiacomo.travaglini@arm.com  // Gets the number of tests to be printed in the XML report.
121813481Sgiacomo.travaglini@arm.com  int reportable_test_count() const;
121913481Sgiacomo.travaglini@arm.com
122013481Sgiacomo.travaglini@arm.com  // Gets the number of all tests.
122113481Sgiacomo.travaglini@arm.com  int total_test_count() const;
122213481Sgiacomo.travaglini@arm.com
122313481Sgiacomo.travaglini@arm.com  // Gets the number of tests that should run.
122413481Sgiacomo.travaglini@arm.com  int test_to_run_count() const;
122513481Sgiacomo.travaglini@arm.com
122613481Sgiacomo.travaglini@arm.com  // Gets the time of the test program start, in ms from the start of the
122713481Sgiacomo.travaglini@arm.com  // UNIX epoch.
122813481Sgiacomo.travaglini@arm.com  TimeInMillis start_timestamp() const;
122913481Sgiacomo.travaglini@arm.com
123013481Sgiacomo.travaglini@arm.com  // Gets the elapsed time, in milliseconds.
123113481Sgiacomo.travaglini@arm.com  TimeInMillis elapsed_time() const;
123213481Sgiacomo.travaglini@arm.com
123313481Sgiacomo.travaglini@arm.com  // Returns true iff the unit test passed (i.e. all test cases passed).
123413481Sgiacomo.travaglini@arm.com  bool Passed() const;
123513481Sgiacomo.travaglini@arm.com
123613481Sgiacomo.travaglini@arm.com  // Returns true iff the unit test failed (i.e. some test case failed
123713481Sgiacomo.travaglini@arm.com  // or something outside of all tests failed).
123813481Sgiacomo.travaglini@arm.com  bool Failed() const;
123913481Sgiacomo.travaglini@arm.com
124013481Sgiacomo.travaglini@arm.com  // Gets the i-th test case among all the test cases. i can range from 0 to
124113481Sgiacomo.travaglini@arm.com  // total_test_case_count() - 1. If i is not in that range, returns NULL.
124213481Sgiacomo.travaglini@arm.com  const TestCase* GetTestCase(int i) const;
124313481Sgiacomo.travaglini@arm.com
124413481Sgiacomo.travaglini@arm.com  // Returns the TestResult containing information on test failures and
124513481Sgiacomo.travaglini@arm.com  // properties logged outside of individual test cases.
124613481Sgiacomo.travaglini@arm.com  const TestResult& ad_hoc_test_result() const;
124713481Sgiacomo.travaglini@arm.com
124813481Sgiacomo.travaglini@arm.com  // Returns the list of event listeners that can be used to track events
124913481Sgiacomo.travaglini@arm.com  // inside Google Test.
125013481Sgiacomo.travaglini@arm.com  TestEventListeners& listeners();
125113481Sgiacomo.travaglini@arm.com
125213481Sgiacomo.travaglini@arm.com private:
125313481Sgiacomo.travaglini@arm.com  // Registers and returns a global test environment.  When a test
125413481Sgiacomo.travaglini@arm.com  // program is run, all global test environments will be set-up in
125513481Sgiacomo.travaglini@arm.com  // the order they were registered.  After all tests in the program
125613481Sgiacomo.travaglini@arm.com  // have finished, all global test environments will be torn-down in
125713481Sgiacomo.travaglini@arm.com  // the *reverse* order they were registered.
125813481Sgiacomo.travaglini@arm.com  //
125913481Sgiacomo.travaglini@arm.com  // The UnitTest object takes ownership of the given environment.
126013481Sgiacomo.travaglini@arm.com  //
126113481Sgiacomo.travaglini@arm.com  // This method can only be called from the main thread.
126213481Sgiacomo.travaglini@arm.com  Environment* AddEnvironment(Environment* env);
126313481Sgiacomo.travaglini@arm.com
126413481Sgiacomo.travaglini@arm.com  // Adds a TestPartResult to the current TestResult object.  All
126513481Sgiacomo.travaglini@arm.com  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
126613481Sgiacomo.travaglini@arm.com  // eventually call this to report their results.  The user code
126713481Sgiacomo.travaglini@arm.com  // should use the assertion macros instead of calling this directly.
126813481Sgiacomo.travaglini@arm.com  void AddTestPartResult(TestPartResult::Type result_type,
126913481Sgiacomo.travaglini@arm.com                         const char* file_name,
127013481Sgiacomo.travaglini@arm.com                         int line_number,
127113481Sgiacomo.travaglini@arm.com                         const std::string& message,
127213481Sgiacomo.travaglini@arm.com                         const std::string& os_stack_trace)
127313481Sgiacomo.travaglini@arm.com      GTEST_LOCK_EXCLUDED_(mutex_);
127413481Sgiacomo.travaglini@arm.com
127513481Sgiacomo.travaglini@arm.com  // Adds a TestProperty to the current TestResult object when invoked from
127613481Sgiacomo.travaglini@arm.com  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
127713481Sgiacomo.travaglini@arm.com  // from SetUpTestCase or TearDownTestCase, or to the global property set
127813481Sgiacomo.travaglini@arm.com  // when invoked elsewhere.  If the result already contains a property with
127913481Sgiacomo.travaglini@arm.com  // the same key, the value will be updated.
128013481Sgiacomo.travaglini@arm.com  void RecordProperty(const std::string& key, const std::string& value);
128113481Sgiacomo.travaglini@arm.com
128213481Sgiacomo.travaglini@arm.com  // Gets the i-th test case among all the test cases. i can range from 0 to
128313481Sgiacomo.travaglini@arm.com  // total_test_case_count() - 1. If i is not in that range, returns NULL.
128413481Sgiacomo.travaglini@arm.com  TestCase* GetMutableTestCase(int i);
128513481Sgiacomo.travaglini@arm.com
128613481Sgiacomo.travaglini@arm.com  // Accessors for the implementation object.
128713481Sgiacomo.travaglini@arm.com  internal::UnitTestImpl* impl() { return impl_; }
128813481Sgiacomo.travaglini@arm.com  const internal::UnitTestImpl* impl() const { return impl_; }
128913481Sgiacomo.travaglini@arm.com
129013481Sgiacomo.travaglini@arm.com  // These classes and funcions are friends as they need to access private
129113481Sgiacomo.travaglini@arm.com  // members of UnitTest.
129213481Sgiacomo.travaglini@arm.com  friend class Test;
129313481Sgiacomo.travaglini@arm.com  friend class internal::AssertHelper;
129413481Sgiacomo.travaglini@arm.com  friend class internal::ScopedTrace;
129513481Sgiacomo.travaglini@arm.com  friend class internal::StreamingListenerTest;
129613481Sgiacomo.travaglini@arm.com  friend class internal::UnitTestRecordPropertyTestHelper;
129713481Sgiacomo.travaglini@arm.com  friend Environment* AddGlobalTestEnvironment(Environment* env);
129813481Sgiacomo.travaglini@arm.com  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
129913481Sgiacomo.travaglini@arm.com  friend void internal::ReportFailureInUnknownLocation(
130013481Sgiacomo.travaglini@arm.com      TestPartResult::Type result_type,
130113481Sgiacomo.travaglini@arm.com      const std::string& message);
130213481Sgiacomo.travaglini@arm.com
130313481Sgiacomo.travaglini@arm.com  // Creates an empty UnitTest.
130413481Sgiacomo.travaglini@arm.com  UnitTest();
130513481Sgiacomo.travaglini@arm.com
130613481Sgiacomo.travaglini@arm.com  // D'tor
130713481Sgiacomo.travaglini@arm.com  virtual ~UnitTest();
130813481Sgiacomo.travaglini@arm.com
130913481Sgiacomo.travaglini@arm.com  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
131013481Sgiacomo.travaglini@arm.com  // Google Test trace stack.
131113481Sgiacomo.travaglini@arm.com  void PushGTestTrace(const internal::TraceInfo& trace)
131213481Sgiacomo.travaglini@arm.com      GTEST_LOCK_EXCLUDED_(mutex_);
131313481Sgiacomo.travaglini@arm.com
131413481Sgiacomo.travaglini@arm.com  // Pops a trace from the per-thread Google Test trace stack.
131513481Sgiacomo.travaglini@arm.com  void PopGTestTrace()
131613481Sgiacomo.travaglini@arm.com      GTEST_LOCK_EXCLUDED_(mutex_);
131713481Sgiacomo.travaglini@arm.com
131813481Sgiacomo.travaglini@arm.com  // Protects mutable state in *impl_.  This is mutable as some const
131913481Sgiacomo.travaglini@arm.com  // methods need to lock it too.
132013481Sgiacomo.travaglini@arm.com  mutable internal::Mutex mutex_;
132113481Sgiacomo.travaglini@arm.com
132213481Sgiacomo.travaglini@arm.com  // Opaque implementation object.  This field is never changed once
132313481Sgiacomo.travaglini@arm.com  // the object is constructed.  We don't mark it as const here, as
132413481Sgiacomo.travaglini@arm.com  // doing so will cause a warning in the constructor of UnitTest.
132513481Sgiacomo.travaglini@arm.com  // Mutable state in *impl_ is protected by mutex_.
132613481Sgiacomo.travaglini@arm.com  internal::UnitTestImpl* impl_;
132713481Sgiacomo.travaglini@arm.com
132813481Sgiacomo.travaglini@arm.com  // We disallow copying UnitTest.
132913481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
133013481Sgiacomo.travaglini@arm.com};
133113481Sgiacomo.travaglini@arm.com
133213481Sgiacomo.travaglini@arm.com// A convenient wrapper for adding an environment for the test
133313481Sgiacomo.travaglini@arm.com// program.
133413481Sgiacomo.travaglini@arm.com//
133513481Sgiacomo.travaglini@arm.com// You should call this before RUN_ALL_TESTS() is called, probably in
133613481Sgiacomo.travaglini@arm.com// main().  If you use gtest_main, you need to call this before main()
133713481Sgiacomo.travaglini@arm.com// starts for it to take effect.  For example, you can define a global
133813481Sgiacomo.travaglini@arm.com// variable like this:
133913481Sgiacomo.travaglini@arm.com//
134013481Sgiacomo.travaglini@arm.com//   testing::Environment* const foo_env =
134113481Sgiacomo.travaglini@arm.com//       testing::AddGlobalTestEnvironment(new FooEnvironment);
134213481Sgiacomo.travaglini@arm.com//
134313481Sgiacomo.travaglini@arm.com// However, we strongly recommend you to write your own main() and
134413481Sgiacomo.travaglini@arm.com// call AddGlobalTestEnvironment() there, as relying on initialization
134513481Sgiacomo.travaglini@arm.com// of global variables makes the code harder to read and may cause
134613481Sgiacomo.travaglini@arm.com// problems when you register multiple environments from different
134713481Sgiacomo.travaglini@arm.com// translation units and the environments have dependencies among them
134813481Sgiacomo.travaglini@arm.com// (remember that the compiler doesn't guarantee the order in which
134913481Sgiacomo.travaglini@arm.com// global variables from different translation units are initialized).
135013481Sgiacomo.travaglini@arm.cominline Environment* AddGlobalTestEnvironment(Environment* env) {
135113481Sgiacomo.travaglini@arm.com  return UnitTest::GetInstance()->AddEnvironment(env);
135213481Sgiacomo.travaglini@arm.com}
135313481Sgiacomo.travaglini@arm.com
135413481Sgiacomo.travaglini@arm.com// Initializes Google Test.  This must be called before calling
135513481Sgiacomo.travaglini@arm.com// RUN_ALL_TESTS().  In particular, it parses a command line for the
135613481Sgiacomo.travaglini@arm.com// flags that Google Test recognizes.  Whenever a Google Test flag is
135713481Sgiacomo.travaglini@arm.com// seen, it is removed from argv, and *argc is decremented.
135813481Sgiacomo.travaglini@arm.com//
135913481Sgiacomo.travaglini@arm.com// No value is returned.  Instead, the Google Test flag variables are
136013481Sgiacomo.travaglini@arm.com// updated.
136113481Sgiacomo.travaglini@arm.com//
136213481Sgiacomo.travaglini@arm.com// Calling the function for the second time has no user-visible effect.
136313481Sgiacomo.travaglini@arm.comGTEST_API_ void InitGoogleTest(int* argc, char** argv);
136413481Sgiacomo.travaglini@arm.com
136513481Sgiacomo.travaglini@arm.com// This overloaded version can be used in Windows programs compiled in
136613481Sgiacomo.travaglini@arm.com// UNICODE mode.
136713481Sgiacomo.travaglini@arm.comGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
136813481Sgiacomo.travaglini@arm.com
136913481Sgiacomo.travaglini@arm.comnamespace internal {
137013481Sgiacomo.travaglini@arm.com
137113481Sgiacomo.travaglini@arm.com// Separate the error generating code from the code path to reduce the stack
137213481Sgiacomo.travaglini@arm.com// frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers
137313481Sgiacomo.travaglini@arm.com// when calling EXPECT_* in a tight loop.
137413481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
137513481Sgiacomo.travaglini@arm.comAssertionResult CmpHelperEQFailure(const char* lhs_expression,
137613481Sgiacomo.travaglini@arm.com                                   const char* rhs_expression,
137713481Sgiacomo.travaglini@arm.com                                   const T1& lhs, const T2& rhs) {
137813481Sgiacomo.travaglini@arm.com  return EqFailure(lhs_expression,
137913481Sgiacomo.travaglini@arm.com                   rhs_expression,
138013481Sgiacomo.travaglini@arm.com                   FormatForComparisonFailureMessage(lhs, rhs),
138113481Sgiacomo.travaglini@arm.com                   FormatForComparisonFailureMessage(rhs, lhs),
138213481Sgiacomo.travaglini@arm.com                   false);
138313481Sgiacomo.travaglini@arm.com}
138413481Sgiacomo.travaglini@arm.com
138513481Sgiacomo.travaglini@arm.com// The helper function for {ASSERT|EXPECT}_EQ.
138613481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
138713481Sgiacomo.travaglini@arm.comAssertionResult CmpHelperEQ(const char* lhs_expression,
138813481Sgiacomo.travaglini@arm.com                            const char* rhs_expression,
138913481Sgiacomo.travaglini@arm.com                            const T1& lhs,
139013481Sgiacomo.travaglini@arm.com                            const T2& rhs) {
139113481Sgiacomo.travaglini@arm.comGTEST_DISABLE_MSC_WARNINGS_PUSH_(4389 /* signed/unsigned mismatch */)
139213481Sgiacomo.travaglini@arm.com  if (lhs == rhs) {
139313481Sgiacomo.travaglini@arm.com    return AssertionSuccess();
139413481Sgiacomo.travaglini@arm.com  }
139513481Sgiacomo.travaglini@arm.comGTEST_DISABLE_MSC_WARNINGS_POP_()
139613481Sgiacomo.travaglini@arm.com
139713481Sgiacomo.travaglini@arm.com  return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs);
139813481Sgiacomo.travaglini@arm.com}
139913481Sgiacomo.travaglini@arm.com
140013481Sgiacomo.travaglini@arm.com// With this overloaded version, we allow anonymous enums to be used
140113481Sgiacomo.travaglini@arm.com// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
140213481Sgiacomo.travaglini@arm.com// can be implicitly cast to BiggestInt.
140313481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression,
140413481Sgiacomo.travaglini@arm.com                                       const char* rhs_expression,
140513481Sgiacomo.travaglini@arm.com                                       BiggestInt lhs,
140613481Sgiacomo.travaglini@arm.com                                       BiggestInt rhs);
140713481Sgiacomo.travaglini@arm.com
140813481Sgiacomo.travaglini@arm.com// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
140913481Sgiacomo.travaglini@arm.com// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
141013481Sgiacomo.travaglini@arm.com// is a null pointer literal.  The following default implementation is
141113481Sgiacomo.travaglini@arm.com// for lhs_is_null_literal being false.
141213481Sgiacomo.travaglini@arm.comtemplate <bool lhs_is_null_literal>
141313481Sgiacomo.travaglini@arm.comclass EqHelper {
141413481Sgiacomo.travaglini@arm.com public:
141513481Sgiacomo.travaglini@arm.com  // This templatized version is for the general case.
141613481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2>
141713481Sgiacomo.travaglini@arm.com  static AssertionResult Compare(const char* lhs_expression,
141813481Sgiacomo.travaglini@arm.com                                 const char* rhs_expression,
141913481Sgiacomo.travaglini@arm.com                                 const T1& lhs,
142013481Sgiacomo.travaglini@arm.com                                 const T2& rhs) {
142113481Sgiacomo.travaglini@arm.com    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
142213481Sgiacomo.travaglini@arm.com  }
142313481Sgiacomo.travaglini@arm.com
142413481Sgiacomo.travaglini@arm.com  // With this overloaded version, we allow anonymous enums to be used
142513481Sgiacomo.travaglini@arm.com  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
142613481Sgiacomo.travaglini@arm.com  // enums can be implicitly cast to BiggestInt.
142713481Sgiacomo.travaglini@arm.com  //
142813481Sgiacomo.travaglini@arm.com  // Even though its body looks the same as the above version, we
142913481Sgiacomo.travaglini@arm.com  // cannot merge the two, as it will make anonymous enums unhappy.
143013481Sgiacomo.travaglini@arm.com  static AssertionResult Compare(const char* lhs_expression,
143113481Sgiacomo.travaglini@arm.com                                 const char* rhs_expression,
143213481Sgiacomo.travaglini@arm.com                                 BiggestInt lhs,
143313481Sgiacomo.travaglini@arm.com                                 BiggestInt rhs) {
143413481Sgiacomo.travaglini@arm.com    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
143513481Sgiacomo.travaglini@arm.com  }
143613481Sgiacomo.travaglini@arm.com};
143713481Sgiacomo.travaglini@arm.com
143813481Sgiacomo.travaglini@arm.com// This specialization is used when the first argument to ASSERT_EQ()
143913481Sgiacomo.travaglini@arm.com// is a null pointer literal, like NULL, false, or 0.
144013481Sgiacomo.travaglini@arm.comtemplate <>
144113481Sgiacomo.travaglini@arm.comclass EqHelper<true> {
144213481Sgiacomo.travaglini@arm.com public:
144313481Sgiacomo.travaglini@arm.com  // We define two overloaded versions of Compare().  The first
144413481Sgiacomo.travaglini@arm.com  // version will be picked when the second argument to ASSERT_EQ() is
144513481Sgiacomo.travaglini@arm.com  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
144613481Sgiacomo.travaglini@arm.com  // EXPECT_EQ(false, a_bool).
144713481Sgiacomo.travaglini@arm.com  template <typename T1, typename T2>
144813481Sgiacomo.travaglini@arm.com  static AssertionResult Compare(
144913481Sgiacomo.travaglini@arm.com      const char* lhs_expression,
145013481Sgiacomo.travaglini@arm.com      const char* rhs_expression,
145113481Sgiacomo.travaglini@arm.com      const T1& lhs,
145213481Sgiacomo.travaglini@arm.com      const T2& rhs,
145313481Sgiacomo.travaglini@arm.com      // The following line prevents this overload from being considered if T2
145413481Sgiacomo.travaglini@arm.com      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
145513481Sgiacomo.travaglini@arm.com      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
145613481Sgiacomo.travaglini@arm.com      // to match the Secret* in the other overload, which would otherwise make
145713481Sgiacomo.travaglini@arm.com      // this template match better.
145813481Sgiacomo.travaglini@arm.com      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
145913481Sgiacomo.travaglini@arm.com    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);
146013481Sgiacomo.travaglini@arm.com  }
146113481Sgiacomo.travaglini@arm.com
146213481Sgiacomo.travaglini@arm.com  // This version will be picked when the second argument to ASSERT_EQ() is a
146313481Sgiacomo.travaglini@arm.com  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
146413481Sgiacomo.travaglini@arm.com  template <typename T>
146513481Sgiacomo.travaglini@arm.com  static AssertionResult Compare(
146613481Sgiacomo.travaglini@arm.com      const char* lhs_expression,
146713481Sgiacomo.travaglini@arm.com      const char* rhs_expression,
146813481Sgiacomo.travaglini@arm.com      // We used to have a second template parameter instead of Secret*.  That
146913481Sgiacomo.travaglini@arm.com      // template parameter would deduce to 'long', making this a better match
147013481Sgiacomo.travaglini@arm.com      // than the first overload even without the first overload's EnableIf.
147113481Sgiacomo.travaglini@arm.com      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
147213481Sgiacomo.travaglini@arm.com      // non-pointer argument" (even a deduced integral argument), so the old
147313481Sgiacomo.travaglini@arm.com      // implementation caused warnings in user code.
147413481Sgiacomo.travaglini@arm.com      Secret* /* lhs (NULL) */,
147513481Sgiacomo.travaglini@arm.com      T* rhs) {
147613481Sgiacomo.travaglini@arm.com    // We already know that 'lhs' is a null pointer.
147713481Sgiacomo.travaglini@arm.com    return CmpHelperEQ(lhs_expression, rhs_expression,
147813481Sgiacomo.travaglini@arm.com                       static_cast<T*>(NULL), rhs);
147913481Sgiacomo.travaglini@arm.com  }
148013481Sgiacomo.travaglini@arm.com};
148113481Sgiacomo.travaglini@arm.com
148213481Sgiacomo.travaglini@arm.com// Separate the error generating code from the code path to reduce the stack
148313481Sgiacomo.travaglini@arm.com// frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers
148413481Sgiacomo.travaglini@arm.com// when calling EXPECT_OP in a tight loop.
148513481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
148613481Sgiacomo.travaglini@arm.comAssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2,
148713481Sgiacomo.travaglini@arm.com                                   const T1& val1, const T2& val2,
148813481Sgiacomo.travaglini@arm.com                                   const char* op) {
148913481Sgiacomo.travaglini@arm.com  return AssertionFailure()
149013481Sgiacomo.travaglini@arm.com         << "Expected: (" << expr1 << ") " << op << " (" << expr2
149113481Sgiacomo.travaglini@arm.com         << "), actual: " << FormatForComparisonFailureMessage(val1, val2)
149213481Sgiacomo.travaglini@arm.com         << " vs " << FormatForComparisonFailureMessage(val2, val1);
149313481Sgiacomo.travaglini@arm.com}
149413481Sgiacomo.travaglini@arm.com
149513481Sgiacomo.travaglini@arm.com// A macro for implementing the helper functions needed to implement
149613481Sgiacomo.travaglini@arm.com// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
149713481Sgiacomo.travaglini@arm.com// of similar code.
149813481Sgiacomo.travaglini@arm.com//
149913481Sgiacomo.travaglini@arm.com// For each templatized helper function, we also define an overloaded
150013481Sgiacomo.travaglini@arm.com// version for BiggestInt in order to reduce code bloat and allow
150113481Sgiacomo.travaglini@arm.com// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
150213481Sgiacomo.travaglini@arm.com// with gcc 4.
150313481Sgiacomo.travaglini@arm.com//
150413481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
150513481Sgiacomo.travaglini@arm.com
150613481Sgiacomo.travaglini@arm.com#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
150713481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>\
150813481Sgiacomo.travaglini@arm.comAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
150913481Sgiacomo.travaglini@arm.com                                   const T1& val1, const T2& val2) {\
151013481Sgiacomo.travaglini@arm.com  if (val1 op val2) {\
151113481Sgiacomo.travaglini@arm.com    return AssertionSuccess();\
151213481Sgiacomo.travaglini@arm.com  } else {\
151313481Sgiacomo.travaglini@arm.com    return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\
151413481Sgiacomo.travaglini@arm.com  }\
151513481Sgiacomo.travaglini@arm.com}\
151613481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelper##op_name(\
151713481Sgiacomo.travaglini@arm.com    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
151813481Sgiacomo.travaglini@arm.com
151913481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
152013481Sgiacomo.travaglini@arm.com
152113481Sgiacomo.travaglini@arm.com// Implements the helper function for {ASSERT|EXPECT}_NE
152213481Sgiacomo.travaglini@arm.comGTEST_IMPL_CMP_HELPER_(NE, !=);
152313481Sgiacomo.travaglini@arm.com// Implements the helper function for {ASSERT|EXPECT}_LE
152413481Sgiacomo.travaglini@arm.comGTEST_IMPL_CMP_HELPER_(LE, <=);
152513481Sgiacomo.travaglini@arm.com// Implements the helper function for {ASSERT|EXPECT}_LT
152613481Sgiacomo.travaglini@arm.comGTEST_IMPL_CMP_HELPER_(LT, <);
152713481Sgiacomo.travaglini@arm.com// Implements the helper function for {ASSERT|EXPECT}_GE
152813481Sgiacomo.travaglini@arm.comGTEST_IMPL_CMP_HELPER_(GE, >=);
152913481Sgiacomo.travaglini@arm.com// Implements the helper function for {ASSERT|EXPECT}_GT
153013481Sgiacomo.travaglini@arm.comGTEST_IMPL_CMP_HELPER_(GT, >);
153113481Sgiacomo.travaglini@arm.com
153213481Sgiacomo.travaglini@arm.com#undef GTEST_IMPL_CMP_HELPER_
153313481Sgiacomo.travaglini@arm.com
153413481Sgiacomo.travaglini@arm.com// The helper function for {ASSERT|EXPECT}_STREQ.
153513481Sgiacomo.travaglini@arm.com//
153613481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
153713481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,
153813481Sgiacomo.travaglini@arm.com                                          const char* s2_expression,
153913481Sgiacomo.travaglini@arm.com                                          const char* s1,
154013481Sgiacomo.travaglini@arm.com                                          const char* s2);
154113481Sgiacomo.travaglini@arm.com
154213481Sgiacomo.travaglini@arm.com// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
154313481Sgiacomo.travaglini@arm.com//
154413481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
154513481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression,
154613481Sgiacomo.travaglini@arm.com                                              const char* s2_expression,
154713481Sgiacomo.travaglini@arm.com                                              const char* s1,
154813481Sgiacomo.travaglini@arm.com                                              const char* s2);
154913481Sgiacomo.travaglini@arm.com
155013481Sgiacomo.travaglini@arm.com// The helper function for {ASSERT|EXPECT}_STRNE.
155113481Sgiacomo.travaglini@arm.com//
155213481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
155313481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
155413481Sgiacomo.travaglini@arm.com                                          const char* s2_expression,
155513481Sgiacomo.travaglini@arm.com                                          const char* s1,
155613481Sgiacomo.travaglini@arm.com                                          const char* s2);
155713481Sgiacomo.travaglini@arm.com
155813481Sgiacomo.travaglini@arm.com// The helper function for {ASSERT|EXPECT}_STRCASENE.
155913481Sgiacomo.travaglini@arm.com//
156013481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
156113481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
156213481Sgiacomo.travaglini@arm.com                                              const char* s2_expression,
156313481Sgiacomo.travaglini@arm.com                                              const char* s1,
156413481Sgiacomo.travaglini@arm.com                                              const char* s2);
156513481Sgiacomo.travaglini@arm.com
156613481Sgiacomo.travaglini@arm.com
156713481Sgiacomo.travaglini@arm.com// Helper function for *_STREQ on wide strings.
156813481Sgiacomo.travaglini@arm.com//
156913481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
157013481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression,
157113481Sgiacomo.travaglini@arm.com                                          const char* s2_expression,
157213481Sgiacomo.travaglini@arm.com                                          const wchar_t* s1,
157313481Sgiacomo.travaglini@arm.com                                          const wchar_t* s2);
157413481Sgiacomo.travaglini@arm.com
157513481Sgiacomo.travaglini@arm.com// Helper function for *_STRNE on wide strings.
157613481Sgiacomo.travaglini@arm.com//
157713481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
157813481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
157913481Sgiacomo.travaglini@arm.com                                          const char* s2_expression,
158013481Sgiacomo.travaglini@arm.com                                          const wchar_t* s1,
158113481Sgiacomo.travaglini@arm.com                                          const wchar_t* s2);
158213481Sgiacomo.travaglini@arm.com
158313481Sgiacomo.travaglini@arm.com}  // namespace internal
158413481Sgiacomo.travaglini@arm.com
158513481Sgiacomo.travaglini@arm.com// IsSubstring() and IsNotSubstring() are intended to be used as the
158613481Sgiacomo.travaglini@arm.com// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
158713481Sgiacomo.travaglini@arm.com// themselves.  They check whether needle is a substring of haystack
158813481Sgiacomo.travaglini@arm.com// (NULL is considered a substring of itself only), and return an
158913481Sgiacomo.travaglini@arm.com// appropriate error message when they fail.
159013481Sgiacomo.travaglini@arm.com//
159113481Sgiacomo.travaglini@arm.com// The {needle,haystack}_expr arguments are the stringified
159213481Sgiacomo.travaglini@arm.com// expressions that generated the two real arguments.
159313481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsSubstring(
159413481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
159513481Sgiacomo.travaglini@arm.com    const char* needle, const char* haystack);
159613481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsSubstring(
159713481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
159813481Sgiacomo.travaglini@arm.com    const wchar_t* needle, const wchar_t* haystack);
159913481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsNotSubstring(
160013481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
160113481Sgiacomo.travaglini@arm.com    const char* needle, const char* haystack);
160213481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsNotSubstring(
160313481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
160413481Sgiacomo.travaglini@arm.com    const wchar_t* needle, const wchar_t* haystack);
160513481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsSubstring(
160613481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
160713481Sgiacomo.travaglini@arm.com    const ::std::string& needle, const ::std::string& haystack);
160813481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsNotSubstring(
160913481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
161013481Sgiacomo.travaglini@arm.com    const ::std::string& needle, const ::std::string& haystack);
161113481Sgiacomo.travaglini@arm.com
161213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_WSTRING
161313481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsSubstring(
161413481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
161513481Sgiacomo.travaglini@arm.com    const ::std::wstring& needle, const ::std::wstring& haystack);
161613481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult IsNotSubstring(
161713481Sgiacomo.travaglini@arm.com    const char* needle_expr, const char* haystack_expr,
161813481Sgiacomo.travaglini@arm.com    const ::std::wstring& needle, const ::std::wstring& haystack);
161913481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_WSTRING
162013481Sgiacomo.travaglini@arm.com
162113481Sgiacomo.travaglini@arm.comnamespace internal {
162213481Sgiacomo.travaglini@arm.com
162313481Sgiacomo.travaglini@arm.com// Helper template function for comparing floating-points.
162413481Sgiacomo.travaglini@arm.com//
162513481Sgiacomo.travaglini@arm.com// Template parameter:
162613481Sgiacomo.travaglini@arm.com//
162713481Sgiacomo.travaglini@arm.com//   RawType: the raw floating-point type (either float or double)
162813481Sgiacomo.travaglini@arm.com//
162913481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
163013481Sgiacomo.travaglini@arm.comtemplate <typename RawType>
163113481Sgiacomo.travaglini@arm.comAssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression,
163213481Sgiacomo.travaglini@arm.com                                         const char* rhs_expression,
163313481Sgiacomo.travaglini@arm.com                                         RawType lhs_value,
163413481Sgiacomo.travaglini@arm.com                                         RawType rhs_value) {
163513481Sgiacomo.travaglini@arm.com  const FloatingPoint<RawType> lhs(lhs_value), rhs(rhs_value);
163613481Sgiacomo.travaglini@arm.com
163713481Sgiacomo.travaglini@arm.com  if (lhs.AlmostEquals(rhs)) {
163813481Sgiacomo.travaglini@arm.com    return AssertionSuccess();
163913481Sgiacomo.travaglini@arm.com  }
164013481Sgiacomo.travaglini@arm.com
164113481Sgiacomo.travaglini@arm.com  ::std::stringstream lhs_ss;
164213481Sgiacomo.travaglini@arm.com  lhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
164313481Sgiacomo.travaglini@arm.com         << lhs_value;
164413481Sgiacomo.travaglini@arm.com
164513481Sgiacomo.travaglini@arm.com  ::std::stringstream rhs_ss;
164613481Sgiacomo.travaglini@arm.com  rhs_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
164713481Sgiacomo.travaglini@arm.com         << rhs_value;
164813481Sgiacomo.travaglini@arm.com
164913481Sgiacomo.travaglini@arm.com  return EqFailure(lhs_expression,
165013481Sgiacomo.travaglini@arm.com                   rhs_expression,
165113481Sgiacomo.travaglini@arm.com                   StringStreamToString(&lhs_ss),
165213481Sgiacomo.travaglini@arm.com                   StringStreamToString(&rhs_ss),
165313481Sgiacomo.travaglini@arm.com                   false);
165413481Sgiacomo.travaglini@arm.com}
165513481Sgiacomo.travaglini@arm.com
165613481Sgiacomo.travaglini@arm.com// Helper function for implementing ASSERT_NEAR.
165713481Sgiacomo.travaglini@arm.com//
165813481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
165913481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
166013481Sgiacomo.travaglini@arm.com                                                const char* expr2,
166113481Sgiacomo.travaglini@arm.com                                                const char* abs_error_expr,
166213481Sgiacomo.travaglini@arm.com                                                double val1,
166313481Sgiacomo.travaglini@arm.com                                                double val2,
166413481Sgiacomo.travaglini@arm.com                                                double abs_error);
166513481Sgiacomo.travaglini@arm.com
166613481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
166713481Sgiacomo.travaglini@arm.com// A class that enables one to stream messages to assertion macros
166813481Sgiacomo.travaglini@arm.comclass GTEST_API_ AssertHelper {
166913481Sgiacomo.travaglini@arm.com public:
167013481Sgiacomo.travaglini@arm.com  // Constructor.
167113481Sgiacomo.travaglini@arm.com  AssertHelper(TestPartResult::Type type,
167213481Sgiacomo.travaglini@arm.com               const char* file,
167313481Sgiacomo.travaglini@arm.com               int line,
167413481Sgiacomo.travaglini@arm.com               const char* message);
167513481Sgiacomo.travaglini@arm.com  ~AssertHelper();
167613481Sgiacomo.travaglini@arm.com
167713481Sgiacomo.travaglini@arm.com  // Message assignment is a semantic trick to enable assertion
167813481Sgiacomo.travaglini@arm.com  // streaming; see the GTEST_MESSAGE_ macro below.
167913481Sgiacomo.travaglini@arm.com  void operator=(const Message& message) const;
168013481Sgiacomo.travaglini@arm.com
168113481Sgiacomo.travaglini@arm.com private:
168213481Sgiacomo.travaglini@arm.com  // We put our data in a struct so that the size of the AssertHelper class can
168313481Sgiacomo.travaglini@arm.com  // be as small as possible.  This is important because gcc is incapable of
168413481Sgiacomo.travaglini@arm.com  // re-using stack space even for temporary variables, so every EXPECT_EQ
168513481Sgiacomo.travaglini@arm.com  // reserves stack space for another AssertHelper.
168613481Sgiacomo.travaglini@arm.com  struct AssertHelperData {
168713481Sgiacomo.travaglini@arm.com    AssertHelperData(TestPartResult::Type t,
168813481Sgiacomo.travaglini@arm.com                     const char* srcfile,
168913481Sgiacomo.travaglini@arm.com                     int line_num,
169013481Sgiacomo.travaglini@arm.com                     const char* msg)
169113481Sgiacomo.travaglini@arm.com        : type(t), file(srcfile), line(line_num), message(msg) { }
169213481Sgiacomo.travaglini@arm.com
169313481Sgiacomo.travaglini@arm.com    TestPartResult::Type const type;
169413481Sgiacomo.travaglini@arm.com    const char* const file;
169513481Sgiacomo.travaglini@arm.com    int const line;
169613481Sgiacomo.travaglini@arm.com    std::string const message;
169713481Sgiacomo.travaglini@arm.com
169813481Sgiacomo.travaglini@arm.com   private:
169913481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
170013481Sgiacomo.travaglini@arm.com  };
170113481Sgiacomo.travaglini@arm.com
170213481Sgiacomo.travaglini@arm.com  AssertHelperData* const data_;
170313481Sgiacomo.travaglini@arm.com
170413481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
170513481Sgiacomo.travaglini@arm.com};
170613481Sgiacomo.travaglini@arm.com
170713481Sgiacomo.travaglini@arm.com}  // namespace internal
170813481Sgiacomo.travaglini@arm.com
170913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST
171013481Sgiacomo.travaglini@arm.com// The pure interface class that all value-parameterized tests inherit from.
171113481Sgiacomo.travaglini@arm.com// A value-parameterized class must inherit from both ::testing::Test and
171213481Sgiacomo.travaglini@arm.com// ::testing::WithParamInterface. In most cases that just means inheriting
171313481Sgiacomo.travaglini@arm.com// from ::testing::TestWithParam, but more complicated test hierarchies
171413481Sgiacomo.travaglini@arm.com// may need to inherit from Test and WithParamInterface at different levels.
171513481Sgiacomo.travaglini@arm.com//
171613481Sgiacomo.travaglini@arm.com// This interface has support for accessing the test parameter value via
171713481Sgiacomo.travaglini@arm.com// the GetParam() method.
171813481Sgiacomo.travaglini@arm.com//
171913481Sgiacomo.travaglini@arm.com// Use it with one of the parameter generator defining functions, like Range(),
172013481Sgiacomo.travaglini@arm.com// Values(), ValuesIn(), Bool(), and Combine().
172113481Sgiacomo.travaglini@arm.com//
172213481Sgiacomo.travaglini@arm.com// class FooTest : public ::testing::TestWithParam<int> {
172313481Sgiacomo.travaglini@arm.com//  protected:
172413481Sgiacomo.travaglini@arm.com//   FooTest() {
172513481Sgiacomo.travaglini@arm.com//     // Can use GetParam() here.
172613481Sgiacomo.travaglini@arm.com//   }
172713481Sgiacomo.travaglini@arm.com//   virtual ~FooTest() {
172813481Sgiacomo.travaglini@arm.com//     // Can use GetParam() here.
172913481Sgiacomo.travaglini@arm.com//   }
173013481Sgiacomo.travaglini@arm.com//   virtual void SetUp() {
173113481Sgiacomo.travaglini@arm.com//     // Can use GetParam() here.
173213481Sgiacomo.travaglini@arm.com//   }
173313481Sgiacomo.travaglini@arm.com//   virtual void TearDown {
173413481Sgiacomo.travaglini@arm.com//     // Can use GetParam() here.
173513481Sgiacomo.travaglini@arm.com//   }
173613481Sgiacomo.travaglini@arm.com// };
173713481Sgiacomo.travaglini@arm.com// TEST_P(FooTest, DoesBar) {
173813481Sgiacomo.travaglini@arm.com//   // Can use GetParam() method here.
173913481Sgiacomo.travaglini@arm.com//   Foo foo;
174013481Sgiacomo.travaglini@arm.com//   ASSERT_TRUE(foo.DoesBar(GetParam()));
174113481Sgiacomo.travaglini@arm.com// }
174213481Sgiacomo.travaglini@arm.com// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
174313481Sgiacomo.travaglini@arm.com
174413481Sgiacomo.travaglini@arm.comtemplate <typename T>
174513481Sgiacomo.travaglini@arm.comclass WithParamInterface {
174613481Sgiacomo.travaglini@arm.com public:
174713481Sgiacomo.travaglini@arm.com  typedef T ParamType;
174813481Sgiacomo.travaglini@arm.com  virtual ~WithParamInterface() {}
174913481Sgiacomo.travaglini@arm.com
175013481Sgiacomo.travaglini@arm.com  // The current parameter value. Is also available in the test fixture's
175113481Sgiacomo.travaglini@arm.com  // constructor. This member function is non-static, even though it only
175213481Sgiacomo.travaglini@arm.com  // references static data, to reduce the opportunity for incorrect uses
175313481Sgiacomo.travaglini@arm.com  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
175413481Sgiacomo.travaglini@arm.com  // uses a fixture whose parameter type is int.
175513481Sgiacomo.travaglini@arm.com  const ParamType& GetParam() const {
175613481Sgiacomo.travaglini@arm.com    GTEST_CHECK_(parameter_ != NULL)
175713481Sgiacomo.travaglini@arm.com        << "GetParam() can only be called inside a value-parameterized test "
175813481Sgiacomo.travaglini@arm.com        << "-- did you intend to write TEST_P instead of TEST_F?";
175913481Sgiacomo.travaglini@arm.com    return *parameter_;
176013481Sgiacomo.travaglini@arm.com  }
176113481Sgiacomo.travaglini@arm.com
176213481Sgiacomo.travaglini@arm.com private:
176313481Sgiacomo.travaglini@arm.com  // Sets parameter value. The caller is responsible for making sure the value
176413481Sgiacomo.travaglini@arm.com  // remains alive and unchanged throughout the current test.
176513481Sgiacomo.travaglini@arm.com  static void SetParam(const ParamType* parameter) {
176613481Sgiacomo.travaglini@arm.com    parameter_ = parameter;
176713481Sgiacomo.travaglini@arm.com  }
176813481Sgiacomo.travaglini@arm.com
176913481Sgiacomo.travaglini@arm.com  // Static value used for accessing parameter during a test lifetime.
177013481Sgiacomo.travaglini@arm.com  static const ParamType* parameter_;
177113481Sgiacomo.travaglini@arm.com
177213481Sgiacomo.travaglini@arm.com  // TestClass must be a subclass of WithParamInterface<T> and Test.
177313481Sgiacomo.travaglini@arm.com  template <class TestClass> friend class internal::ParameterizedTestFactory;
177413481Sgiacomo.travaglini@arm.com};
177513481Sgiacomo.travaglini@arm.com
177613481Sgiacomo.travaglini@arm.comtemplate <typename T>
177713481Sgiacomo.travaglini@arm.comconst T* WithParamInterface<T>::parameter_ = NULL;
177813481Sgiacomo.travaglini@arm.com
177913481Sgiacomo.travaglini@arm.com// Most value-parameterized classes can ignore the existence of
178013481Sgiacomo.travaglini@arm.com// WithParamInterface, and can just inherit from ::testing::TestWithParam.
178113481Sgiacomo.travaglini@arm.com
178213481Sgiacomo.travaglini@arm.comtemplate <typename T>
178313481Sgiacomo.travaglini@arm.comclass TestWithParam : public Test, public WithParamInterface<T> {
178413481Sgiacomo.travaglini@arm.com};
178513481Sgiacomo.travaglini@arm.com
178613481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_PARAM_TEST
178713481Sgiacomo.travaglini@arm.com
178813481Sgiacomo.travaglini@arm.com// Macros for indicating success/failure in test code.
178913481Sgiacomo.travaglini@arm.com
179013481Sgiacomo.travaglini@arm.com// ADD_FAILURE unconditionally adds a failure to the current test.
179113481Sgiacomo.travaglini@arm.com// SUCCEED generates a success - it doesn't automatically make the
179213481Sgiacomo.travaglini@arm.com// current test successful, as a test is only successful when it has
179313481Sgiacomo.travaglini@arm.com// no failure.
179413481Sgiacomo.travaglini@arm.com//
179513481Sgiacomo.travaglini@arm.com// EXPECT_* verifies that a certain condition is satisfied.  If not,
179613481Sgiacomo.travaglini@arm.com// it behaves like ADD_FAILURE.  In particular:
179713481Sgiacomo.travaglini@arm.com//
179813481Sgiacomo.travaglini@arm.com//   EXPECT_TRUE  verifies that a Boolean condition is true.
179913481Sgiacomo.travaglini@arm.com//   EXPECT_FALSE verifies that a Boolean condition is false.
180013481Sgiacomo.travaglini@arm.com//
180113481Sgiacomo.travaglini@arm.com// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
180213481Sgiacomo.travaglini@arm.com// that they will also abort the current function on failure.  People
180313481Sgiacomo.travaglini@arm.com// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
180413481Sgiacomo.travaglini@arm.com// writing data-driven tests often find themselves using ADD_FAILURE
180513481Sgiacomo.travaglini@arm.com// and EXPECT_* more.
180613481Sgiacomo.travaglini@arm.com
180713481Sgiacomo.travaglini@arm.com// Generates a nonfatal failure with a generic message.
180813481Sgiacomo.travaglini@arm.com#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
180913481Sgiacomo.travaglini@arm.com
181013481Sgiacomo.travaglini@arm.com// Generates a nonfatal failure at the given source file location with
181113481Sgiacomo.travaglini@arm.com// a generic message.
181213481Sgiacomo.travaglini@arm.com#define ADD_FAILURE_AT(file, line) \
181313481Sgiacomo.travaglini@arm.com  GTEST_MESSAGE_AT_(file, line, "Failed", \
181413481Sgiacomo.travaglini@arm.com                    ::testing::TestPartResult::kNonFatalFailure)
181513481Sgiacomo.travaglini@arm.com
181613481Sgiacomo.travaglini@arm.com// Generates a fatal failure with a generic message.
181713481Sgiacomo.travaglini@arm.com#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
181813481Sgiacomo.travaglini@arm.com
181913481Sgiacomo.travaglini@arm.com// Define this macro to 1 to omit the definition of FAIL(), which is a
182013481Sgiacomo.travaglini@arm.com// generic name and clashes with some other libraries.
182113481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_FAIL
182213481Sgiacomo.travaglini@arm.com# define FAIL() GTEST_FAIL()
182313481Sgiacomo.travaglini@arm.com#endif
182413481Sgiacomo.travaglini@arm.com
182513481Sgiacomo.travaglini@arm.com// Generates a success with a generic message.
182613481Sgiacomo.travaglini@arm.com#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
182713481Sgiacomo.travaglini@arm.com
182813481Sgiacomo.travaglini@arm.com// Define this macro to 1 to omit the definition of SUCCEED(), which
182913481Sgiacomo.travaglini@arm.com// is a generic name and clashes with some other libraries.
183013481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_SUCCEED
183113481Sgiacomo.travaglini@arm.com# define SUCCEED() GTEST_SUCCEED()
183213481Sgiacomo.travaglini@arm.com#endif
183313481Sgiacomo.travaglini@arm.com
183413481Sgiacomo.travaglini@arm.com// Macros for testing exceptions.
183513481Sgiacomo.travaglini@arm.com//
183613481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
183713481Sgiacomo.travaglini@arm.com//         Tests that the statement throws the expected exception.
183813481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_NO_THROW(statement):
183913481Sgiacomo.travaglini@arm.com//         Tests that the statement doesn't throw any exception.
184013481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_ANY_THROW(statement):
184113481Sgiacomo.travaglini@arm.com//         Tests that the statement throws an exception.
184213481Sgiacomo.travaglini@arm.com
184313481Sgiacomo.travaglini@arm.com#define EXPECT_THROW(statement, expected_exception) \
184413481Sgiacomo.travaglini@arm.com  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
184513481Sgiacomo.travaglini@arm.com#define EXPECT_NO_THROW(statement) \
184613481Sgiacomo.travaglini@arm.com  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
184713481Sgiacomo.travaglini@arm.com#define EXPECT_ANY_THROW(statement) \
184813481Sgiacomo.travaglini@arm.com  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
184913481Sgiacomo.travaglini@arm.com#define ASSERT_THROW(statement, expected_exception) \
185013481Sgiacomo.travaglini@arm.com  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
185113481Sgiacomo.travaglini@arm.com#define ASSERT_NO_THROW(statement) \
185213481Sgiacomo.travaglini@arm.com  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
185313481Sgiacomo.travaglini@arm.com#define ASSERT_ANY_THROW(statement) \
185413481Sgiacomo.travaglini@arm.com  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
185513481Sgiacomo.travaglini@arm.com
185613481Sgiacomo.travaglini@arm.com// Boolean assertions. Condition can be either a Boolean expression or an
185713481Sgiacomo.travaglini@arm.com// AssertionResult. For more information on how to use AssertionResult with
185813481Sgiacomo.travaglini@arm.com// these macros see comments on that class.
185913481Sgiacomo.travaglini@arm.com#define EXPECT_TRUE(condition) \
186013481Sgiacomo.travaglini@arm.com  GTEST_TEST_BOOLEAN_((condition), #condition, false, true, \
186113481Sgiacomo.travaglini@arm.com                      GTEST_NONFATAL_FAILURE_)
186213481Sgiacomo.travaglini@arm.com#define EXPECT_FALSE(condition) \
186313481Sgiacomo.travaglini@arm.com  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
186413481Sgiacomo.travaglini@arm.com                      GTEST_NONFATAL_FAILURE_)
186513481Sgiacomo.travaglini@arm.com#define ASSERT_TRUE(condition) \
186613481Sgiacomo.travaglini@arm.com  GTEST_TEST_BOOLEAN_((condition), #condition, false, true, \
186713481Sgiacomo.travaglini@arm.com                      GTEST_FATAL_FAILURE_)
186813481Sgiacomo.travaglini@arm.com#define ASSERT_FALSE(condition) \
186913481Sgiacomo.travaglini@arm.com  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
187013481Sgiacomo.travaglini@arm.com                      GTEST_FATAL_FAILURE_)
187113481Sgiacomo.travaglini@arm.com
187213481Sgiacomo.travaglini@arm.com// Includes the auto-generated header that implements a family of
187313481Sgiacomo.travaglini@arm.com// generic predicate assertion macros.
187413481Sgiacomo.travaglini@arm.com#include "gtest/gtest_pred_impl.h"
187513481Sgiacomo.travaglini@arm.com
187613481Sgiacomo.travaglini@arm.com// Macros for testing equalities and inequalities.
187713481Sgiacomo.travaglini@arm.com//
187813481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2
187913481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
188013481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
188113481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
188213481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
188313481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
188413481Sgiacomo.travaglini@arm.com//
188513481Sgiacomo.travaglini@arm.com// When they are not, Google Test prints both the tested expressions and
188613481Sgiacomo.travaglini@arm.com// their actual values.  The values must be compatible built-in types,
188713481Sgiacomo.travaglini@arm.com// or you will get a compiler error.  By "compatible" we mean that the
188813481Sgiacomo.travaglini@arm.com// values can be compared by the respective operator.
188913481Sgiacomo.travaglini@arm.com//
189013481Sgiacomo.travaglini@arm.com// Note:
189113481Sgiacomo.travaglini@arm.com//
189213481Sgiacomo.travaglini@arm.com//   1. It is possible to make a user-defined type work with
189313481Sgiacomo.travaglini@arm.com//   {ASSERT|EXPECT}_??(), but that requires overloading the
189413481Sgiacomo.travaglini@arm.com//   comparison operators and is thus discouraged by the Google C++
189513481Sgiacomo.travaglini@arm.com//   Usage Guide.  Therefore, you are advised to use the
189613481Sgiacomo.travaglini@arm.com//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
189713481Sgiacomo.travaglini@arm.com//   equal.
189813481Sgiacomo.travaglini@arm.com//
189913481Sgiacomo.travaglini@arm.com//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
190013481Sgiacomo.travaglini@arm.com//   pointers (in particular, C strings).  Therefore, if you use it
190113481Sgiacomo.travaglini@arm.com//   with two C strings, you are testing how their locations in memory
190213481Sgiacomo.travaglini@arm.com//   are related, not how their content is related.  To compare two C
190313481Sgiacomo.travaglini@arm.com//   strings by content, use {ASSERT|EXPECT}_STR*().
190413481Sgiacomo.travaglini@arm.com//
190513481Sgiacomo.travaglini@arm.com//   3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to
190613481Sgiacomo.travaglini@arm.com//   {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you
190713481Sgiacomo.travaglini@arm.com//   what the actual value is when it fails, and similarly for the
190813481Sgiacomo.travaglini@arm.com//   other comparisons.
190913481Sgiacomo.travaglini@arm.com//
191013481Sgiacomo.travaglini@arm.com//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
191113481Sgiacomo.travaglini@arm.com//   evaluate their arguments, which is undefined.
191213481Sgiacomo.travaglini@arm.com//
191313481Sgiacomo.travaglini@arm.com//   5. These macros evaluate their arguments exactly once.
191413481Sgiacomo.travaglini@arm.com//
191513481Sgiacomo.travaglini@arm.com// Examples:
191613481Sgiacomo.travaglini@arm.com//
191713481Sgiacomo.travaglini@arm.com//   EXPECT_NE(5, Foo());
191813481Sgiacomo.travaglini@arm.com//   EXPECT_EQ(NULL, a_pointer);
191913481Sgiacomo.travaglini@arm.com//   ASSERT_LT(i, array_size);
192013481Sgiacomo.travaglini@arm.com//   ASSERT_GT(records.size(), 0) << "There is no record left.";
192113481Sgiacomo.travaglini@arm.com
192213481Sgiacomo.travaglini@arm.com#define EXPECT_EQ(val1, val2) \
192313481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal:: \
192413481Sgiacomo.travaglini@arm.com                      EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \
192513481Sgiacomo.travaglini@arm.com                      val1, val2)
192613481Sgiacomo.travaglini@arm.com#define EXPECT_NE(val1, val2) \
192713481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
192813481Sgiacomo.travaglini@arm.com#define EXPECT_LE(val1, val2) \
192913481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
193013481Sgiacomo.travaglini@arm.com#define EXPECT_LT(val1, val2) \
193113481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
193213481Sgiacomo.travaglini@arm.com#define EXPECT_GE(val1, val2) \
193313481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
193413481Sgiacomo.travaglini@arm.com#define EXPECT_GT(val1, val2) \
193513481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
193613481Sgiacomo.travaglini@arm.com
193713481Sgiacomo.travaglini@arm.com#define GTEST_ASSERT_EQ(val1, val2) \
193813481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal:: \
193913481Sgiacomo.travaglini@arm.com                      EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \
194013481Sgiacomo.travaglini@arm.com                      val1, val2)
194113481Sgiacomo.travaglini@arm.com#define GTEST_ASSERT_NE(val1, val2) \
194213481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
194313481Sgiacomo.travaglini@arm.com#define GTEST_ASSERT_LE(val1, val2) \
194413481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
194513481Sgiacomo.travaglini@arm.com#define GTEST_ASSERT_LT(val1, val2) \
194613481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
194713481Sgiacomo.travaglini@arm.com#define GTEST_ASSERT_GE(val1, val2) \
194813481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
194913481Sgiacomo.travaglini@arm.com#define GTEST_ASSERT_GT(val1, val2) \
195013481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
195113481Sgiacomo.travaglini@arm.com
195213481Sgiacomo.travaglini@arm.com// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
195313481Sgiacomo.travaglini@arm.com// ASSERT_XY(), which clashes with some users' own code.
195413481Sgiacomo.travaglini@arm.com
195513481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_ASSERT_EQ
195613481Sgiacomo.travaglini@arm.com# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
195713481Sgiacomo.travaglini@arm.com#endif
195813481Sgiacomo.travaglini@arm.com
195913481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_ASSERT_NE
196013481Sgiacomo.travaglini@arm.com# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
196113481Sgiacomo.travaglini@arm.com#endif
196213481Sgiacomo.travaglini@arm.com
196313481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_ASSERT_LE
196413481Sgiacomo.travaglini@arm.com# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
196513481Sgiacomo.travaglini@arm.com#endif
196613481Sgiacomo.travaglini@arm.com
196713481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_ASSERT_LT
196813481Sgiacomo.travaglini@arm.com# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
196913481Sgiacomo.travaglini@arm.com#endif
197013481Sgiacomo.travaglini@arm.com
197113481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_ASSERT_GE
197213481Sgiacomo.travaglini@arm.com# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
197313481Sgiacomo.travaglini@arm.com#endif
197413481Sgiacomo.travaglini@arm.com
197513481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_ASSERT_GT
197613481Sgiacomo.travaglini@arm.com# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
197713481Sgiacomo.travaglini@arm.com#endif
197813481Sgiacomo.travaglini@arm.com
197913481Sgiacomo.travaglini@arm.com// C-string Comparisons.  All tests treat NULL and any non-NULL string
198013481Sgiacomo.travaglini@arm.com// as different.  Two NULLs are equal.
198113481Sgiacomo.travaglini@arm.com//
198213481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
198313481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
198413481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
198513481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
198613481Sgiacomo.travaglini@arm.com//
198713481Sgiacomo.travaglini@arm.com// For wide or narrow string objects, you can use the
198813481Sgiacomo.travaglini@arm.com// {ASSERT|EXPECT}_??() macros.
198913481Sgiacomo.travaglini@arm.com//
199013481Sgiacomo.travaglini@arm.com// Don't depend on the order in which the arguments are evaluated,
199113481Sgiacomo.travaglini@arm.com// which is undefined.
199213481Sgiacomo.travaglini@arm.com//
199313481Sgiacomo.travaglini@arm.com// These macros evaluate their arguments exactly once.
199413481Sgiacomo.travaglini@arm.com
199513481Sgiacomo.travaglini@arm.com#define EXPECT_STREQ(s1, s2) \
199613481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
199713481Sgiacomo.travaglini@arm.com#define EXPECT_STRNE(s1, s2) \
199813481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
199913481Sgiacomo.travaglini@arm.com#define EXPECT_STRCASEEQ(s1, s2) \
200013481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
200113481Sgiacomo.travaglini@arm.com#define EXPECT_STRCASENE(s1, s2)\
200213481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
200313481Sgiacomo.travaglini@arm.com
200413481Sgiacomo.travaglini@arm.com#define ASSERT_STREQ(s1, s2) \
200513481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2)
200613481Sgiacomo.travaglini@arm.com#define ASSERT_STRNE(s1, s2) \
200713481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
200813481Sgiacomo.travaglini@arm.com#define ASSERT_STRCASEEQ(s1, s2) \
200913481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2)
201013481Sgiacomo.travaglini@arm.com#define ASSERT_STRCASENE(s1, s2)\
201113481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
201213481Sgiacomo.travaglini@arm.com
201313481Sgiacomo.travaglini@arm.com// Macros for comparing floating-point numbers.
201413481Sgiacomo.travaglini@arm.com//
201513481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2):
201613481Sgiacomo.travaglini@arm.com//         Tests that two float values are almost equal.
201713481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2):
201813481Sgiacomo.travaglini@arm.com//         Tests that two double values are almost equal.
201913481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
202013481Sgiacomo.travaglini@arm.com//         Tests that v1 and v2 are within the given distance to each other.
202113481Sgiacomo.travaglini@arm.com//
202213481Sgiacomo.travaglini@arm.com// Google Test uses ULP-based comparison to automatically pick a default
202313481Sgiacomo.travaglini@arm.com// error bound that is appropriate for the operands.  See the
202413481Sgiacomo.travaglini@arm.com// FloatingPoint template class in gtest-internal.h if you are
202513481Sgiacomo.travaglini@arm.com// interested in the implementation details.
202613481Sgiacomo.travaglini@arm.com
202713481Sgiacomo.travaglini@arm.com#define EXPECT_FLOAT_EQ(val1, val2)\
202813481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
202913481Sgiacomo.travaglini@arm.com                      val1, val2)
203013481Sgiacomo.travaglini@arm.com
203113481Sgiacomo.travaglini@arm.com#define EXPECT_DOUBLE_EQ(val1, val2)\
203213481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
203313481Sgiacomo.travaglini@arm.com                      val1, val2)
203413481Sgiacomo.travaglini@arm.com
203513481Sgiacomo.travaglini@arm.com#define ASSERT_FLOAT_EQ(val1, val2)\
203613481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
203713481Sgiacomo.travaglini@arm.com                      val1, val2)
203813481Sgiacomo.travaglini@arm.com
203913481Sgiacomo.travaglini@arm.com#define ASSERT_DOUBLE_EQ(val1, val2)\
204013481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
204113481Sgiacomo.travaglini@arm.com                      val1, val2)
204213481Sgiacomo.travaglini@arm.com
204313481Sgiacomo.travaglini@arm.com#define EXPECT_NEAR(val1, val2, abs_error)\
204413481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
204513481Sgiacomo.travaglini@arm.com                      val1, val2, abs_error)
204613481Sgiacomo.travaglini@arm.com
204713481Sgiacomo.travaglini@arm.com#define ASSERT_NEAR(val1, val2, abs_error)\
204813481Sgiacomo.travaglini@arm.com  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
204913481Sgiacomo.travaglini@arm.com                      val1, val2, abs_error)
205013481Sgiacomo.travaglini@arm.com
205113481Sgiacomo.travaglini@arm.com// These predicate format functions work on floating-point values, and
205213481Sgiacomo.travaglini@arm.com// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
205313481Sgiacomo.travaglini@arm.com//
205413481Sgiacomo.travaglini@arm.com//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
205513481Sgiacomo.travaglini@arm.com
205613481Sgiacomo.travaglini@arm.com// Asserts that val1 is less than, or almost equal to, val2.  Fails
205713481Sgiacomo.travaglini@arm.com// otherwise.  In particular, it fails if either val1 or val2 is NaN.
205813481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
205913481Sgiacomo.travaglini@arm.com                                   float val1, float val2);
206013481Sgiacomo.travaglini@arm.comGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
206113481Sgiacomo.travaglini@arm.com                                    double val1, double val2);
206213481Sgiacomo.travaglini@arm.com
206313481Sgiacomo.travaglini@arm.com
206413481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
206513481Sgiacomo.travaglini@arm.com
206613481Sgiacomo.travaglini@arm.com// Macros that test for HRESULT failure and success, these are only useful
206713481Sgiacomo.travaglini@arm.com// on Windows, and rely on Windows SDK macros and APIs to compile.
206813481Sgiacomo.travaglini@arm.com//
206913481Sgiacomo.travaglini@arm.com//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
207013481Sgiacomo.travaglini@arm.com//
207113481Sgiacomo.travaglini@arm.com// When expr unexpectedly fails or succeeds, Google Test prints the
207213481Sgiacomo.travaglini@arm.com// expected result and the actual result with both a human-readable
207313481Sgiacomo.travaglini@arm.com// string representation of the error, if available, as well as the
207413481Sgiacomo.travaglini@arm.com// hex result code.
207513481Sgiacomo.travaglini@arm.com# define EXPECT_HRESULT_SUCCEEDED(expr) \
207613481Sgiacomo.travaglini@arm.com    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
207713481Sgiacomo.travaglini@arm.com
207813481Sgiacomo.travaglini@arm.com# define ASSERT_HRESULT_SUCCEEDED(expr) \
207913481Sgiacomo.travaglini@arm.com    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
208013481Sgiacomo.travaglini@arm.com
208113481Sgiacomo.travaglini@arm.com# define EXPECT_HRESULT_FAILED(expr) \
208213481Sgiacomo.travaglini@arm.com    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
208313481Sgiacomo.travaglini@arm.com
208413481Sgiacomo.travaglini@arm.com# define ASSERT_HRESULT_FAILED(expr) \
208513481Sgiacomo.travaglini@arm.com    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
208613481Sgiacomo.travaglini@arm.com
208713481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
208813481Sgiacomo.travaglini@arm.com
208913481Sgiacomo.travaglini@arm.com// Macros that execute statement and check that it doesn't generate new fatal
209013481Sgiacomo.travaglini@arm.com// failures in the current thread.
209113481Sgiacomo.travaglini@arm.com//
209213481Sgiacomo.travaglini@arm.com//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
209313481Sgiacomo.travaglini@arm.com//
209413481Sgiacomo.travaglini@arm.com// Examples:
209513481Sgiacomo.travaglini@arm.com//
209613481Sgiacomo.travaglini@arm.com//   EXPECT_NO_FATAL_FAILURE(Process());
209713481Sgiacomo.travaglini@arm.com//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
209813481Sgiacomo.travaglini@arm.com//
209913481Sgiacomo.travaglini@arm.com#define ASSERT_NO_FATAL_FAILURE(statement) \
210013481Sgiacomo.travaglini@arm.com    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
210113481Sgiacomo.travaglini@arm.com#define EXPECT_NO_FATAL_FAILURE(statement) \
210213481Sgiacomo.travaglini@arm.com    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
210313481Sgiacomo.travaglini@arm.com
210413481Sgiacomo.travaglini@arm.com// Causes a trace (including the source file path, the current line
210513481Sgiacomo.travaglini@arm.com// number, and the given message) to be included in every test failure
210613481Sgiacomo.travaglini@arm.com// message generated by code in the current scope.  The effect is
210713481Sgiacomo.travaglini@arm.com// undone when the control leaves the current scope.
210813481Sgiacomo.travaglini@arm.com//
210913481Sgiacomo.travaglini@arm.com// The message argument can be anything streamable to std::ostream.
211013481Sgiacomo.travaglini@arm.com//
211113481Sgiacomo.travaglini@arm.com// In the implementation, we include the current line number as part
211213481Sgiacomo.travaglini@arm.com// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
211313481Sgiacomo.travaglini@arm.com// to appear in the same block - as long as they are on different
211413481Sgiacomo.travaglini@arm.com// lines.
211513481Sgiacomo.travaglini@arm.com#define SCOPED_TRACE(message) \
211613481Sgiacomo.travaglini@arm.com  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
211713481Sgiacomo.travaglini@arm.com    __FILE__, __LINE__, ::testing::Message() << (message))
211813481Sgiacomo.travaglini@arm.com
211913481Sgiacomo.travaglini@arm.com// Compile-time assertion for type equality.
212013481Sgiacomo.travaglini@arm.com// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
212113481Sgiacomo.travaglini@arm.com// the same type.  The value it returns is not interesting.
212213481Sgiacomo.travaglini@arm.com//
212313481Sgiacomo.travaglini@arm.com// Instead of making StaticAssertTypeEq a class template, we make it a
212413481Sgiacomo.travaglini@arm.com// function template that invokes a helper class template.  This
212513481Sgiacomo.travaglini@arm.com// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
212613481Sgiacomo.travaglini@arm.com// defining objects of that type.
212713481Sgiacomo.travaglini@arm.com//
212813481Sgiacomo.travaglini@arm.com// CAVEAT:
212913481Sgiacomo.travaglini@arm.com//
213013481Sgiacomo.travaglini@arm.com// When used inside a method of a class template,
213113481Sgiacomo.travaglini@arm.com// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
213213481Sgiacomo.travaglini@arm.com// instantiated.  For example, given:
213313481Sgiacomo.travaglini@arm.com//
213413481Sgiacomo.travaglini@arm.com//   template <typename T> class Foo {
213513481Sgiacomo.travaglini@arm.com//    public:
213613481Sgiacomo.travaglini@arm.com//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
213713481Sgiacomo.travaglini@arm.com//   };
213813481Sgiacomo.travaglini@arm.com//
213913481Sgiacomo.travaglini@arm.com// the code:
214013481Sgiacomo.travaglini@arm.com//
214113481Sgiacomo.travaglini@arm.com//   void Test1() { Foo<bool> foo; }
214213481Sgiacomo.travaglini@arm.com//
214313481Sgiacomo.travaglini@arm.com// will NOT generate a compiler error, as Foo<bool>::Bar() is never
214413481Sgiacomo.travaglini@arm.com// actually instantiated.  Instead, you need:
214513481Sgiacomo.travaglini@arm.com//
214613481Sgiacomo.travaglini@arm.com//   void Test2() { Foo<bool> foo; foo.Bar(); }
214713481Sgiacomo.travaglini@arm.com//
214813481Sgiacomo.travaglini@arm.com// to cause a compiler error.
214913481Sgiacomo.travaglini@arm.comtemplate <typename T1, typename T2>
215013481Sgiacomo.travaglini@arm.combool StaticAssertTypeEq() {
215113481Sgiacomo.travaglini@arm.com  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
215213481Sgiacomo.travaglini@arm.com  return true;
215313481Sgiacomo.travaglini@arm.com}
215413481Sgiacomo.travaglini@arm.com
215513481Sgiacomo.travaglini@arm.com// Defines a test.
215613481Sgiacomo.travaglini@arm.com//
215713481Sgiacomo.travaglini@arm.com// The first parameter is the name of the test case, and the second
215813481Sgiacomo.travaglini@arm.com// parameter is the name of the test within the test case.
215913481Sgiacomo.travaglini@arm.com//
216013481Sgiacomo.travaglini@arm.com// The convention is to end the test case name with "Test".  For
216113481Sgiacomo.travaglini@arm.com// example, a test case for the Foo class can be named FooTest.
216213481Sgiacomo.travaglini@arm.com//
216313481Sgiacomo.travaglini@arm.com// Test code should appear between braces after an invocation of
216413481Sgiacomo.travaglini@arm.com// this macro.  Example:
216513481Sgiacomo.travaglini@arm.com//
216613481Sgiacomo.travaglini@arm.com//   TEST(FooTest, InitializesCorrectly) {
216713481Sgiacomo.travaglini@arm.com//     Foo foo;
216813481Sgiacomo.travaglini@arm.com//     EXPECT_TRUE(foo.StatusIsOK());
216913481Sgiacomo.travaglini@arm.com//   }
217013481Sgiacomo.travaglini@arm.com
217113481Sgiacomo.travaglini@arm.com// Note that we call GetTestTypeId() instead of GetTypeId<
217213481Sgiacomo.travaglini@arm.com// ::testing::Test>() here to get the type ID of testing::Test.  This
217313481Sgiacomo.travaglini@arm.com// is to work around a suspected linker bug when using Google Test as
217413481Sgiacomo.travaglini@arm.com// a framework on Mac OS X.  The bug causes GetTypeId<
217513481Sgiacomo.travaglini@arm.com// ::testing::Test>() to return different values depending on whether
217613481Sgiacomo.travaglini@arm.com// the call is from the Google Test framework itself or from user test
217713481Sgiacomo.travaglini@arm.com// code.  GetTestTypeId() is guaranteed to always return the same
217813481Sgiacomo.travaglini@arm.com// value, as it always calls GetTypeId<>() from the Google Test
217913481Sgiacomo.travaglini@arm.com// framework.
218013481Sgiacomo.travaglini@arm.com#define GTEST_TEST(test_case_name, test_name)\
218113481Sgiacomo.travaglini@arm.com  GTEST_TEST_(test_case_name, test_name, \
218213481Sgiacomo.travaglini@arm.com              ::testing::Test, ::testing::internal::GetTestTypeId())
218313481Sgiacomo.travaglini@arm.com
218413481Sgiacomo.travaglini@arm.com// Define this macro to 1 to omit the definition of TEST(), which
218513481Sgiacomo.travaglini@arm.com// is a generic name and clashes with some other libraries.
218613481Sgiacomo.travaglini@arm.com#if !GTEST_DONT_DEFINE_TEST
218713481Sgiacomo.travaglini@arm.com# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
218813481Sgiacomo.travaglini@arm.com#endif
218913481Sgiacomo.travaglini@arm.com
219013481Sgiacomo.travaglini@arm.com// Defines a test that uses a test fixture.
219113481Sgiacomo.travaglini@arm.com//
219213481Sgiacomo.travaglini@arm.com// The first parameter is the name of the test fixture class, which
219313481Sgiacomo.travaglini@arm.com// also doubles as the test case name.  The second parameter is the
219413481Sgiacomo.travaglini@arm.com// name of the test within the test case.
219513481Sgiacomo.travaglini@arm.com//
219613481Sgiacomo.travaglini@arm.com// A test fixture class must be declared earlier.  The user should put
219713481Sgiacomo.travaglini@arm.com// his test code between braces after using this macro.  Example:
219813481Sgiacomo.travaglini@arm.com//
219913481Sgiacomo.travaglini@arm.com//   class FooTest : public testing::Test {
220013481Sgiacomo.travaglini@arm.com//    protected:
220113481Sgiacomo.travaglini@arm.com//     virtual void SetUp() { b_.AddElement(3); }
220213481Sgiacomo.travaglini@arm.com//
220313481Sgiacomo.travaglini@arm.com//     Foo a_;
220413481Sgiacomo.travaglini@arm.com//     Foo b_;
220513481Sgiacomo.travaglini@arm.com//   };
220613481Sgiacomo.travaglini@arm.com//
220713481Sgiacomo.travaglini@arm.com//   TEST_F(FooTest, InitializesCorrectly) {
220813481Sgiacomo.travaglini@arm.com//     EXPECT_TRUE(a_.StatusIsOK());
220913481Sgiacomo.travaglini@arm.com//   }
221013481Sgiacomo.travaglini@arm.com//
221113481Sgiacomo.travaglini@arm.com//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
221213481Sgiacomo.travaglini@arm.com//     EXPECT_EQ(0, a_.size());
221313481Sgiacomo.travaglini@arm.com//     EXPECT_EQ(1, b_.size());
221413481Sgiacomo.travaglini@arm.com//   }
221513481Sgiacomo.travaglini@arm.com
221613481Sgiacomo.travaglini@arm.com#define TEST_F(test_fixture, test_name)\
221713481Sgiacomo.travaglini@arm.com  GTEST_TEST_(test_fixture, test_name, test_fixture, \
221813481Sgiacomo.travaglini@arm.com              ::testing::internal::GetTypeId<test_fixture>())
221913481Sgiacomo.travaglini@arm.com
222013481Sgiacomo.travaglini@arm.com}  // namespace testing
222113481Sgiacomo.travaglini@arm.com
222213481Sgiacomo.travaglini@arm.com// Use this function in main() to run all tests.  It returns 0 if all
222313481Sgiacomo.travaglini@arm.com// tests are successful, or 1 otherwise.
222413481Sgiacomo.travaglini@arm.com//
222513481Sgiacomo.travaglini@arm.com// RUN_ALL_TESTS() should be invoked after the command line has been
222613481Sgiacomo.travaglini@arm.com// parsed by InitGoogleTest().
222713481Sgiacomo.travaglini@arm.com//
222813481Sgiacomo.travaglini@arm.com// This function was formerly a macro; thus, it is in the global
222913481Sgiacomo.travaglini@arm.com// namespace and has an all-caps name.
223013481Sgiacomo.travaglini@arm.comint RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
223113481Sgiacomo.travaglini@arm.com
223213481Sgiacomo.travaglini@arm.cominline int RUN_ALL_TESTS() {
223313481Sgiacomo.travaglini@arm.com  return ::testing::UnitTest::GetInstance()->Run();
223413481Sgiacomo.travaglini@arm.com}
223513481Sgiacomo.travaglini@arm.com
223613481Sgiacomo.travaglini@arm.com#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
2237