17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2008, Google Inc. 27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All rights reserved. 37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without 57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are 67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met: 77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Redistributions of source code must retain the above copyright 97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer. 107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Redistributions in binary form must reproduce the above 117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer 127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the 137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution. 147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// * Neither the name of Google Inc. nor the names of its 157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from 167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission. 177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Author: mheule@google.com (Markus Heule) 317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ 347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ 357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <iosfwd> 3757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#include <vector> 38b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-internal.h" 39b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/internal/gtest-string.h" 407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing { 427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A copyable object representing the result of a test part (i.e. an 447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). 457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't inherit from TestPartResult as its destructor is not virtual. 4757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestPartResult { 487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 49190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // The possible outcomes of a test part (i.e. an assertion or an 50190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). 51190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer enum Type { 52190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer kSuccess, // Succeeded. 53190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer kNonFatalFailure, // Failed but the test can continue. 54190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer kFatalFailure // Failed and the test should be terminated. 55190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer }; 56190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // C'tor. TestPartResult does NOT have a default constructor. 587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Always use this constructor (with parameters) to create a 597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // TestPartResult object. 6057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer TestPartResult(Type a_type, 6157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer const char* a_file_name, 6257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer int a_line_number, 6357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer const char* a_message) 6457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer : type_(a_type), 6557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer file_name_(a_file_name), 6657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer line_number_(a_line_number), 6757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer summary_(ExtractSummary(a_message)), 6857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer message_(a_message) { 697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Gets the outcome of the test part. 72190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Type type() const { return type_; } 737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Gets the name of the source file where the test part took place, or 757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // NULL if it's unknown. 767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const char* file_name() const { return file_name_.c_str(); } 777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Gets the line in the source file where the test part took place, 797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // or -1 if it's unknown. 807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman int line_number() const { return line_number_; } 817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Gets the summary of the failure message. 837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const char* summary() const { return summary_.c_str(); } 847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Gets the message associated with the test part. 867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const char* message() const { return message_.c_str(); } 877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8894c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru // Returns true iff the test part passed. 89190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer bool passed() const { return type_ == kSuccess; } 907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 9194c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru // Returns true iff the test part failed. 92190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer bool failed() const { return type_ != kSuccess; } 937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 9494c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru // Returns true iff the test part non-fatally failed. 95190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer bool nonfatally_failed() const { return type_ == kNonFatalFailure; } 967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 9794c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru // Returns true iff the test part fatally failed. 98190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer bool fatally_failed() const { return type_ == kFatalFailure; } 997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 100190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Type type_; 1017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Gets the summary of the failure message by omitting the stack 1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // trace in it. 1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman static internal::String ExtractSummary(const char* message); 1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // The name of the source file where the test part took place, or 1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // NULL if the source file is unknown. 1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman internal::String file_name_; 1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // The line in the source file where the test part took place, or -1 1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // if the line number is unknown. 1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman int line_number_; 1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman internal::String summary_; // The test failure summary. 1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman internal::String message_; // The test failure message. 1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Prints a TestPartResult object. 1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstd::ostream& operator<<(std::ostream& os, const TestPartResult& result); 1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// An array of TestPartResult objects. 1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't inherit from TestPartResultArray as its destructor is not 1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// virtual. 12357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ TestPartResultArray { 1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 12557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer TestPartResultArray() {} 1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Appends the given TestPartResult to the array. 1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman void Append(const TestPartResult& result); 1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Returns the TestPartResult at the given index (0-based). 1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const TestPartResult& GetTestPartResult(int index) const; 1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Returns the number of TestPartResult objects in the array. 1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman int size() const; 13557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 13757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer std::vector<TestPartResult> array_; 1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); 1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This interface knows how to report a test part result. 1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass TestPartResultReporterInterface { 1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 145354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka virtual ~TestPartResultReporterInterface(); 1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman virtual void ReportTestPartResult(const TestPartResult& result) = 0; 1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal { 1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a 1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// statement generates new fatal failures. To do so it registers itself as the 1547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// current test part result reporter. Besides checking if fatal failures were 1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// reported, it only delegates the reporting to the former result reporter. 1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The original result reporter is restored in the destructor. 1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. 15857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ HasNewFatalFailureHelper 15957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer : public TestPartResultReporterInterface { 1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public: 1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman HasNewFatalFailureHelper(); 1620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ~HasNewFatalFailureHelper() override; 1630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar void ReportTestPartResult(const TestPartResult &result) override; 1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman bool has_new_fatal_failure() const { return has_new_fatal_failure_; } 1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private: 1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman bool has_new_fatal_failure_; 1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman TestPartResultReporterInterface* original_reporter_; 1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); 1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}; 1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} // namespace internal 1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} // namespace testing 1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ 177