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