18b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Copyright 2008, Google Inc.
28b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// All rights reserved.
38b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//
48b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Redistribution and use in source and binary forms, with or without
58b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// modification, are permitted provided that the following conditions are
68b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// met:
78b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//
88b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//     * Redistributions of source code must retain the above copyright
98b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// notice, this list of conditions and the following disclaimer.
108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//     * Redistributions in binary form must reproduce the above
118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// copyright notice, this list of conditions and the following disclaimer
128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// in the documentation and/or other materials provided with the
138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// distribution.
148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//     * Neither the name of Google Inc. nor the names of its
158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// contributors may be used to endorse or promote products derived from
168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// this software without specific prior written permission.
178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//
188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
208b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
268b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//
308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Author: mheule@google.com (Markus Heule)
318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//
328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <iosfwd>
378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include <vector>
388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include "gtest/internal/gtest-internal.h"
398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#include "gtest/internal/gtest-string.h"
408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
418b92989c89bec8632aa47dc58dc162f199d62edcJames Zernnamespace testing {
428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// A copyable object representing the result of a test part (i.e. an
448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//
468b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Don't inherit from TestPartResult as its destructor is not virtual.
478b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_API_ TestPartResult {
488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public:
498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // The possible outcomes of a test part (i.e. an assertion or an
508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  enum Type {
528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    kSuccess,          // Succeeded.
538b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    kNonFatalFailure,  // Failed but the test can continue.
548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    kFatalFailure      // Failed and the test should be terminated.
558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  };
568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // C'tor.  TestPartResult does NOT have a default constructor.
588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Always use this constructor (with parameters) to create a
598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // TestPartResult object.
608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  TestPartResult(Type a_type,
618b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                 const char* a_file_name,
628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                 int a_line_number,
638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern                 const char* a_message)
648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern      : type_(a_type),
658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern        file_name_(a_file_name == NULL ? "" : a_file_name),
668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern        line_number_(a_line_number),
678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern        summary_(ExtractSummary(a_message)),
688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern        message_(a_message) {
698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  }
708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Gets the outcome of the test part.
728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  Type type() const { return type_; }
738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Gets the name of the source file where the test part took place, or
758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // NULL if it's unknown.
768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const char* file_name() const {
778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    return file_name_.empty() ? NULL : file_name_.c_str();
788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  }
798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
808b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Gets the line in the source file where the test part took place,
818b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // or -1 if it's unknown.
828b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  int line_number() const { return line_number_; }
838b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
848b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Gets the summary of the failure message.
858b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const char* summary() const { return summary_.c_str(); }
868b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
878b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Gets the message associated with the test part.
888b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const char* message() const { return message_.c_str(); }
898b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
908b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Returns true iff the test part passed.
918b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  bool passed() const { return type_ == kSuccess; }
928b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
938b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Returns true iff the test part failed.
948b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  bool failed() const { return type_ != kSuccess; }
958b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
968b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Returns true iff the test part non-fatally failed.
978b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
988b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
998b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Returns true iff the test part fatally failed.
1008b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  bool fatally_failed() const { return type_ == kFatalFailure; }
1018b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1028b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private:
1038b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  Type type_;
1048b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1058b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Gets the summary of the failure message by omitting the stack
1068b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // trace in it.
1078b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  static std::string ExtractSummary(const char* message);
1088b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1098b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // The name of the source file where the test part took place, or
1108b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // "" if the source file is unknown.
1118b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  std::string file_name_;
1128b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // The line in the source file where the test part took place, or -1
1138b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // if the line number is unknown.
1148b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  int line_number_;
1158b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  std::string summary_;  // The test failure summary.
1168b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  std::string message_;  // The test failure message.
1178b92989c89bec8632aa47dc58dc162f199d62edcJames Zern};
1188b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1198b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Prints a TestPartResult object.
1208b92989c89bec8632aa47dc58dc162f199d62edcJames Zernstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
1218b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1228b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// An array of TestPartResult objects.
1238b92989c89bec8632aa47dc58dc162f199d62edcJames Zern//
1248b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// Don't inherit from TestPartResultArray as its destructor is not
1258b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// virtual.
1268b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_API_ TestPartResultArray {
1278b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public:
1288b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  TestPartResultArray() {}
1298b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1308b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Appends the given TestPartResult to the array.
1318b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  void Append(const TestPartResult& result);
1328b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1338b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Returns the TestPartResult at the given index (0-based).
1348b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  const TestPartResult& GetTestPartResult(int index) const;
1358b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1368b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  // Returns the number of TestPartResult objects in the array.
1378b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  int size() const;
1388b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1398b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private:
1408b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  std::vector<TestPartResult> array_;
1418b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1428b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
1438b92989c89bec8632aa47dc58dc162f199d62edcJames Zern};
1448b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1458b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This interface knows how to report a test part result.
1468b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass TestPartResultReporterInterface {
1478b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public:
1488b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  virtual ~TestPartResultReporterInterface() {}
1498b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1508b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
1518b92989c89bec8632aa47dc58dc162f199d62edcJames Zern};
1528b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1538b92989c89bec8632aa47dc58dc162f199d62edcJames Zernnamespace internal {
1548b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1558b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
1568b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// statement generates new fatal failures. To do so it registers itself as the
1578b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// current test part result reporter. Besides checking if fatal failures were
1588b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// reported, it only delegates the reporting to the former result reporter.
1598b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// The original result reporter is restored in the destructor.
1608b92989c89bec8632aa47dc58dc162f199d62edcJames Zern// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
1618b92989c89bec8632aa47dc58dc162f199d62edcJames Zernclass GTEST_API_ HasNewFatalFailureHelper
1628b92989c89bec8632aa47dc58dc162f199d62edcJames Zern    : public TestPartResultReporterInterface {
1638b92989c89bec8632aa47dc58dc162f199d62edcJames Zern public:
1648b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  HasNewFatalFailureHelper();
1658b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  virtual ~HasNewFatalFailureHelper();
1668b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  virtual void ReportTestPartResult(const TestPartResult& result);
1678b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
1688b92989c89bec8632aa47dc58dc162f199d62edcJames Zern private:
1698b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  bool has_new_fatal_failure_;
1708b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  TestPartResultReporterInterface* original_reporter_;
1718b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1728b92989c89bec8632aa47dc58dc162f199d62edcJames Zern  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
1738b92989c89bec8632aa47dc58dc162f199d62edcJames Zern};
1748b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1758b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}  // namespace internal
1768b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1778b92989c89bec8632aa47dc58dc162f199d62edcJames Zern}  // namespace testing
1788b92989c89bec8632aa47dc58dc162f199d62edcJames Zern
1798b92989c89bec8632aa47dc58dc162f199d62edcJames Zern#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
180