1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2008, Google Inc.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: mheule@google.com (Markus Heule)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <iosfwd>
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/internal/gtest-internal.h"
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/internal/gtest-string.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A copyable object representing the result of a test part (i.e. an
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Don't inherit from TestPartResult as its destructor is not virtual.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GTEST_API_ TestPartResult {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The possible outcomes of a test part (i.e. an assertion or an
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum Type {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kSuccess,          // Succeeded.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kNonFatalFailure,  // Failed but the test can continue.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kFatalFailure      // Failed and the test should be terminated.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // C'tor.  TestPartResult does NOT have a default constructor.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Always use this constructor (with parameters) to create a
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TestPartResult object.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestPartResult(Type a_type,
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* a_file_name,
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 int a_line_number,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const char* a_message)
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : type_(a_type),
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        file_name_(a_file_name),
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        line_number_(a_line_number),
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        summary_(ExtractSummary(a_message)),
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        message_(a_message) {
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the outcome of the test part.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Type type() const { return type_; }
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the name of the source file where the test part took place, or
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NULL if it's unknown.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* file_name() const { return file_name_.c_str(); }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the line in the source file where the test part took place,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or -1 if it's unknown.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int line_number() const { return line_number_; }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the summary of the failure message.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* summary() const { return summary_.c_str(); }
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the message associated with the test part.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* message() const { return message_.c_str(); }
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true iff the test part passed.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool passed() const { return type_ == kSuccess; }
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true iff the test part failed.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool failed() const { return type_ != kSuccess; }
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true iff the test part non-fatally failed.
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true iff the test part fatally failed.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool fatally_failed() const { return type_ == kFatalFailure; }
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Type type_;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the summary of the failure message by omitting the stack
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // trace in it.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static internal::String ExtractSummary(const char* message);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The name of the source file where the test part took place, or
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NULL if the source file is unknown.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  internal::String file_name_;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The line in the source file where the test part took place, or -1
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if the line number is unknown.
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int line_number_;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  internal::String summary_;  // The test failure summary.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  internal::String message_;  // The test failure message.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Prints a TestPartResult object.
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An array of TestPartResult objects.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Don't inherit from TestPartResultArray as its destructor is not
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// virtual.
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GTEST_API_ TestPartResultArray {
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestPartResultArray() {}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Appends the given TestPartResult to the array.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Append(const TestPartResult& result);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the TestPartResult at the given index (0-based).
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const TestPartResult& GetTestPartResult(int index) const;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the number of TestPartResult objects in the array.
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int size() const;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<TestPartResult> array_;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This interface knows how to report a test part result.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestPartResultReporterInterface {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~TestPartResultReporterInterface() {}
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// statement generates new fatal failures. To do so it registers itself as the
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// current test part result reporter. Besides checking if fatal failures were
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// reported, it only delegates the reporting to the former result reporter.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The original result reporter is restored in the destructor.
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GTEST_API_ HasNewFatalFailureHelper
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public TestPartResultReporterInterface {
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HasNewFatalFailureHelper();
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~HasNewFatalFailureHelper();
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ReportTestPartResult(const TestPartResult& result);
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool has_new_fatal_failure_;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestPartResultReporterInterface* original_reporter_;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
177