1
// Copyright 2008, Google Inc.
2
// All rights reserved.
4
// Redistribution and use in source and binary forms, with or without
5
// modification, are permitted provided that the following conditions are
8
// * Redistributions of source code must retain the above copyright
9
// notice, this list of conditions and the following disclaimer.
10
// * Redistributions in binary form must reproduce the above
11
// copyright notice, this list of conditions and the following disclaimer
12
// in the documentation and/or other materials provided with the
14
// * Neither the name of Google Inc. nor the names of its
15
// contributors may be used to endorse or promote products derived from
16
// this software without specific prior written permission.
18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
// Author: mheule@google.com (Markus Heule)
33
#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
34
#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
37
#include <gtest/internal/gtest-internal.h>
38
#include <gtest/internal/gtest-string.h>
42
// The possible outcomes of a test part (i.e. an assertion or an
43
// explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
44
enum TestPartResultType {
45
TPRT_SUCCESS, // Succeeded.
46
TPRT_NONFATAL_FAILURE, // Failed but the test can continue.
47
TPRT_FATAL_FAILURE // Failed and the test should be terminated.
50
// A copyable object representing the result of a test part (i.e. an
51
// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
53
// Don't inherit from TestPartResult as its destructor is not virtual.
54
class TestPartResult {
56
// C'tor. TestPartResult does NOT have a default constructor.
57
// Always use this constructor (with parameters) to create a
58
// TestPartResult object.
59
TestPartResult(TestPartResultType type,
60
const char* file_name,
64
file_name_(file_name),
65
line_number_(line_number),
66
summary_(ExtractSummary(message)),
70
// Gets the outcome of the test part.
71
TestPartResultType type() const { return type_; }
73
// Gets the name of the source file where the test part took place, or
74
// NULL if it's unknown.
75
const char* file_name() const { return file_name_.c_str(); }
77
// Gets the line in the source file where the test part took place,
78
// or -1 if it's unknown.
79
int line_number() const { return line_number_; }
81
// Gets the summary of the failure message.
82
const char* summary() const { return summary_.c_str(); }
84
// Gets the message associated with the test part.
85
const char* message() const { return message_.c_str(); }
87
// Returns true iff the test part passed.
88
bool passed() const { return type_ == TPRT_SUCCESS; }
90
// Returns true iff the test part failed.
91
bool failed() const { return type_ != TPRT_SUCCESS; }
93
// Returns true iff the test part non-fatally failed.
94
bool nonfatally_failed() const { return type_ == TPRT_NONFATAL_FAILURE; }
96
// Returns true iff the test part fatally failed.
97
bool fatally_failed() const { return type_ == TPRT_FATAL_FAILURE; }
99
TestPartResultType type_;
101
// Gets the summary of the failure message by omitting the stack
103
static internal::String ExtractSummary(const char* message);
105
// The name of the source file where the test part took place, or
106
// NULL if the source file is unknown.
107
internal::String file_name_;
108
// The line in the source file where the test part took place, or -1
109
// if the line number is unknown.
111
internal::String summary_; // The test failure summary.
112
internal::String message_; // The test failure message.
115
// Prints a TestPartResult object.
116
std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
118
// An array of TestPartResult objects.
120
// We define this class as we cannot use STL containers when compiling
121
// Google Test with MSVC 7.1 and exceptions disabled.
123
// Don't inherit from TestPartResultArray as its destructor is not
125
class TestPartResultArray {
127
TestPartResultArray();
128
~TestPartResultArray();
130
// Appends the given TestPartResult to the array.
131
void Append(const TestPartResult& result);
133
// Returns the TestPartResult at the given index (0-based).
134
const TestPartResult& GetTestPartResult(int index) const;
136
// Returns the number of TestPartResult objects in the array.
139
// Internally we use a list to simulate the array. Yes, this means
140
// that random access is O(N) in time, but it's OK for its purpose.
141
internal::List<TestPartResult>* const list_;
143
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
146
// This interface knows how to report a test part result.
147
class TestPartResultReporterInterface {
149
virtual ~TestPartResultReporterInterface() {}
151
virtual void ReportTestPartResult(const TestPartResult& result) = 0;
156
// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
157
// statement generates new fatal failures. To do so it registers itself as the
158
// current test part result reporter. Besides checking if fatal failures were
159
// reported, it only delegates the reporting to the former result reporter.
160
// The original result reporter is restored in the destructor.
161
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
162
class HasNewFatalFailureHelper : public TestPartResultReporterInterface {
164
HasNewFatalFailureHelper();
165
virtual ~HasNewFatalFailureHelper();
166
virtual void ReportTestPartResult(const TestPartResult& result);
167
bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
169
bool has_new_fatal_failure_;
170
TestPartResultReporterInterface* original_reporter_;
172
GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
175
} // namespace internal
177
} // namespace testing
179
#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_