13d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Copyright 2008, Google Inc.
23d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// All rights reserved.
33d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
43d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Redistribution and use in source and binary forms, with or without
53d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// modification, are permitted provided that the following conditions are
63d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// met:
73d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
83d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions of source code must retain the above copyright
93d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// notice, this list of conditions and the following disclaimer.
103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions in binary form must reproduce the above
113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// copyright notice, this list of conditions and the following disclaimer
123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the documentation and/or other materials provided with the
133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// distribution.
143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Neither the name of Google Inc. nor the names of its
153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// contributors may be used to endorse or promote products derived from
163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// this software without specific prior written permission.
173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Author: mheule@google.com (Markus Heule)
313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include <iosfwd>
373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include <vector>
383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-internal.h"
393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-string.h"
403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace testing {
423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A copyable object representing the result of a test part (i.e. an
443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Don't inherit from TestPartResult as its destructor is not virtual.
473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_API_ TestPartResult {
483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // The possible outcomes of a test part (i.e. an assertion or an
503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  enum Type {
523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    kSuccess,          // Succeeded.
533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    kNonFatalFailure,  // Failed but the test can continue.
543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    kFatalFailure      // Failed and the test should be terminated.
553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  };
563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // C'tor.  TestPartResult does NOT have a default constructor.
583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Always use this constructor (with parameters) to create a
593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // TestPartResult object.
603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  TestPartResult(Type a_type,
613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                 const char* a_file_name,
623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                 int a_line_number,
633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                 const char* a_message)
643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      : type_(a_type),
653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        file_name_(a_file_name),
663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        line_number_(a_line_number),
673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        summary_(ExtractSummary(a_message)),
683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        message_(a_message) {
693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Gets the outcome of the test part.
723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Type type() const { return type_; }
733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Gets the name of the source file where the test part took place, or
753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // NULL if it's unknown.
763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const char* file_name() const { return file_name_.c_str(); }
773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Gets the line in the source file where the test part took place,
793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // or -1 if it's unknown.
803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  int line_number() const { return line_number_; }
813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Gets the summary of the failure message.
833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const char* summary() const { return summary_.c_str(); }
843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Gets the message associated with the test part.
863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const char* message() const { return message_.c_str(); }
873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Returns true iff the test part passed.
893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  bool passed() const { return type_ == kSuccess; }
903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Returns true iff the test part failed.
923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  bool failed() const { return type_ != kSuccess; }
933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Returns true iff the test part non-fatally failed.
953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Returns true iff the test part fatally failed.
983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  bool fatally_failed() const { return type_ == kFatalFailure; }
993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Type type_;
1013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Gets the summary of the failure message by omitting the stack
1033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // trace in it.
1043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static internal::String ExtractSummary(const char* message);
1053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // The name of the source file where the test part took place, or
1073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // NULL if the source file is unknown.
1083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  internal::String file_name_;
1093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // The line in the source file where the test part took place, or -1
1103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // if the line number is unknown.
1113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  int line_number_;
1123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  internal::String summary_;  // The test failure summary.
1133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  internal::String message_;  // The test failure message.
1143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Prints a TestPartResult object.
1173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
1183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// An array of TestPartResult objects.
1203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
1213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Don't inherit from TestPartResultArray as its destructor is not
1223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// virtual.
1233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_API_ TestPartResultArray {
1243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  TestPartResultArray() {}
1263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Appends the given TestPartResult to the array.
1283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  void Append(const TestPartResult& result);
1293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Returns the TestPartResult at the given index (0-based).
1313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  const TestPartResult& GetTestPartResult(int index) const;
1323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  // Returns the number of TestPartResult objects in the array.
1343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  int size() const;
1353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  std::vector<TestPartResult> array_;
1383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
1403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This interface knows how to report a test part result.
1433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass TestPartResultReporterInterface {
1443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~TestPartResultReporterInterface() {}
1463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
1483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace internal {
1513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
1533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// statement generates new fatal failures. To do so it registers itself as the
1543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// current test part result reporter. Besides checking if fatal failures were
1553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// reported, it only delegates the reporting to the former result reporter.
1563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// The original result reporter is restored in the destructor.
1573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
1583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_API_ HasNewFatalFailureHelper
1593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    : public TestPartResultReporterInterface {
1603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  HasNewFatalFailureHelper();
1623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual ~HasNewFatalFailureHelper();
1633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  virtual void ReportTestPartResult(const TestPartResult& result);
1643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
1653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private:
1663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  bool has_new_fatal_failure_;
1673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  TestPartResultReporterInterface* original_reporter_;
1683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
1703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace internal
1733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace testing
1753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
177