17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2008, Google Inc.
27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All rights reserved.
37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met:
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions of source code must retain the above copyright
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer.
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions in binary form must reproduce the above
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution.
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Neither the name of Google Inc. nor the names of its
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission.
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Author: mheule@google.com (Markus Heule)
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <iosfwd>
3757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#include <vector>
38b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-internal.h"
39b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-string.h"
407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing {
427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A copyable object representing the result of a test part (i.e. an
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't inherit from TestPartResult as its destructor is not virtual.
4757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestPartResult {
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
49190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // The possible outcomes of a test part (i.e. an assertion or an
50190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
51190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  enum Type {
52190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    kSuccess,          // Succeeded.
53190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    kNonFatalFailure,  // Failed but the test can continue.
54190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    kFatalFailure      // Failed and the test should be terminated.
55190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  };
56190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // C'tor.  TestPartResult does NOT have a default constructor.
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Always use this constructor (with parameters) to create a
597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // TestPartResult object.
6057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  TestPartResult(Type a_type,
6157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                 const char* a_file_name,
6257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                 int a_line_number,
6357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer                 const char* a_message)
6457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer      : type_(a_type),
6557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer        file_name_(a_file_name),
6657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer        line_number_(a_line_number),
6757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer        summary_(ExtractSummary(a_message)),
6857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer        message_(a_message) {
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the outcome of the test part.
72190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Type type() const { return type_; }
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the name of the source file where the test part took place, or
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // NULL if it's unknown.
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* file_name() const { return file_name_.c_str(); }
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the line in the source file where the test part took place,
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // or -1 if it's unknown.
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int line_number() const { return line_number_; }
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the summary of the failure message.
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* summary() const { return summary_.c_str(); }
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the message associated with the test part.
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* message() const { return message_.c_str(); }
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
8894c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru  // Returns true iff the test part passed.
89190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool passed() const { return type_ == kSuccess; }
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9194c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru  // Returns true iff the test part failed.
92190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool failed() const { return type_ != kSuccess; }
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9494c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru  // Returns true iff the test part non-fatally failed.
95190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
9794c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru  // Returns true iff the test part fatally failed.
98190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  bool fatally_failed() const { return type_ == kFatalFailure; }
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
100190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  Type type_;
1017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Gets the summary of the failure message by omitting the stack
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // trace in it.
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  static internal::String ExtractSummary(const char* message);
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The name of the source file where the test part took place, or
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // NULL if the source file is unknown.
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::String file_name_;
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The line in the source file where the test part took place, or -1
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // if the line number is unknown.
1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int line_number_;
1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::String summary_;  // The test failure summary.
1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  internal::String message_;  // The test failure message.
1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Prints a TestPartResult object.
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// An array of TestPartResult objects.
1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't inherit from TestPartResultArray as its destructor is not
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// virtual.
12357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestPartResultArray {
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
12557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  TestPartResultArray() {}
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Appends the given TestPartResult to the array.
1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void Append(const TestPartResult& result);
1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the TestPartResult at the given index (0-based).
1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const TestPartResult& GetTestPartResult(int index) const;
1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Returns the number of TestPartResult objects in the array.
1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  int size() const;
13557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer
1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
13757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  std::vector<TestPartResult> array_;
1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This interface knows how to report a test part result.
1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass TestPartResultReporterInterface {
1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
145354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka  virtual ~TestPartResultReporterInterface();
1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// statement generates new fatal failures. To do so it registers itself as the
1547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// current test part result reporter. Besides checking if fatal failures were
1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// reported, it only delegates the reporting to the former result reporter.
1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The original result reporter is restored in the destructor.
1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
15857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ HasNewFatalFailureHelper
15957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer    : public TestPartResultReporterInterface {
1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  HasNewFatalFailureHelper();
1620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ~HasNewFatalFailureHelper() override;
1630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void ReportTestPartResult(const TestPartResult &result) override;
1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  bool has_new_fatal_failure_;
1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TestPartResultReporterInterface* original_reporter_;
1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
177