1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2007, Google Inc. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// All rights reserved. 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Redistribution and use in source and binary forms, with or without 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// modification, are permitted provided that the following conditions are 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// met: 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Redistributions of source code must retain the above copyright 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// notice, this list of conditions and the following disclaimer. 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Redistributions in binary form must reproduce the above 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// copyright notice, this list of conditions and the following disclaimer 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in the documentation and/or other materials provided with the 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distribution. 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// * Neither the name of Google Inc. nor the names of its 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// contributors may be used to endorse or promote products derived from 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// this software without specific prior written permission. 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Author: wan@google.com (Zhanyong Wan) 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Utilities for testing Google Test itself and code that uses Google Test 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (e.g. frameworks built on top of Google Test). 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/gtest.h> 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace testing { 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A copyable object representing the result of a test part (i.e. an 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Don't inherit from TestPartResult as its destructor is not virtual. 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResult { 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // C'tor. TestPartResult does NOT have a default constructor. 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Always use this constructor (with parameters) to create a 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TestPartResult object. 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResult(TestPartResultType type, 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* file_name, 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int line_number, 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* message) 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : type_(type), 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott file_name_(file_name), 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott line_number_(line_number), 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott message_(message) { 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the outcome of the test part. 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultType type() const { return type_; } 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the name of the source file where the test part took place, or 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // NULL if it's unknown. 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* file_name() const { return file_name_.c_str(); } 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the line in the source file where the test part took place, 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // or -1 if it's unknown. 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int line_number() const { return line_number_; } 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Gets the message associated with the test part. 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* message() const { return message_.c_str(); } 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff the test part passed. 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool passed() const { return type_ == TPRT_SUCCESS; } 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff the test part failed. 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool failed() const { return type_ != TPRT_SUCCESS; } 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff the test part non-fatally failed. 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool nonfatally_failed() const { return type_ == TPRT_NONFATAL_FAILURE; } 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true iff the test part fatally failed. 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool fatally_failed() const { return type_ == TPRT_FATAL_FAILURE; } 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultType type_; 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The name of the source file where the test part took place, or 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // NULL if the source file is unknown. 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::String file_name_; 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The line in the source file where the test part took place, or -1 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // if the line number is unknown. 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int line_number_; 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::String message_; // The test failure message. 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Prints a TestPartResult object. 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::ostream& operator<<(std::ostream& os, const TestPartResult& result); 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// An array of TestPartResult objects. 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We define this class as we cannot use STL containers when compiling 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test with MSVC 7.1 and exceptions disabled. 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Don't inherit from TestPartResultArray as its destructor is not 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// virtual. 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResultArray { 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultArray(); 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ~TestPartResultArray(); 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Appends the given TestPartResult to the array. 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void Append(const TestPartResult& result); 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the TestPartResult at the given index (0-based). 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResult& GetTestPartResult(int index) const; 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the number of TestPartResult objects in the array. 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int size() const; 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Internally we use a list to simulate the array. Yes, this means 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // that random access is O(N) in time, but it's OK for its purpose. 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott internal::List<TestPartResult>* const list_; 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_DISALLOW_COPY_AND_ASSIGN(TestPartResultArray); 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This interface knows how to report a test part result. 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResultReporterInterface { 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~TestPartResultReporterInterface() {} 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void ReportTestPartResult(const TestPartResult& result) = 0; 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This helper class can be used to mock out Google Test failure reporting 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// so that we can test Google Test or code that builds on Google Test. 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// An object of this class appends a TestPartResult object to the 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestPartResultArray object given in the constructor whenever a 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test failure is reported. 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ScopedFakeTestPartResultReporter 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : public TestPartResultReporterInterface { 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The c'tor sets this object as the test part result reporter used 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // by Google Test. The 'result' parameter specifies where to report the 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // results. 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The d'tor restores the previous test part result reporter. 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual ~ScopedFakeTestPartResultReporter(); 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Appends the TestPartResult object to the TestPartResultArray 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // received in the constructor. 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This method is from the TestPartResultReporterInterface 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // interface. 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void ReportTestPartResult(const TestPartResult& result); 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultReporterInterface* const old_reporter_; 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultArray* const result_; 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_DISALLOW_COPY_AND_ASSIGN(ScopedFakeTestPartResultReporter); 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal { 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A helper class for implementing EXPECT_FATAL_FAILURE() and 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestPartResultArray contains exactly one failure that has the given 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// type and contains the given substring. If that's not the case, a 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// non-fatal failure will be generated. 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass SingleFailureChecker { 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The constructor remembers the arguments. 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SingleFailureChecker(const TestPartResultArray* results, 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestPartResultType type, 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* substr); 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ~SingleFailureChecker(); 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResultArray* const results_; 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const TestPartResultType type_; 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const String substr_; 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTEST_DISALLOW_COPY_AND_ASSIGN(SingleFailureChecker); 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace internal 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace testing 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A macro for testing Google Test assertions or code that's expected to 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// generate Google Test fatal failures. It verifies that the given 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// statement will cause exactly one fatal Google Test failure with 'substr' 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// being part of the failure message. 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implementation note: The verification is done in the destructor of 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SingleFailureChecker, to make sure that it's done even when 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'statement' throws an exception. 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Known restrictions: 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// - 'statement' cannot reference local non-static variables or 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// non-static members of the current object. 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// - 'statement' cannot return a value. 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// - You cannot stream a failure message to this macro. 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EXPECT_FATAL_FAILURE(statement, substr) do {\ 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class GTestExpectFatalFailureHelper {\ 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:\ 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void Execute() { statement; }\ 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott };\ 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::TestPartResultArray gtest_failures;\ 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::internal::SingleFailureChecker gtest_checker(\ 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >est_failures, ::testing::TPRT_FATAL_FAILURE, (substr));\ 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott {\ 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >est_failures);\ 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GTestExpectFatalFailureHelper::Execute();\ 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }\ 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } while (false) 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A macro for testing Google Test assertions or code that's expected to 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// generate Google Test non-fatal failures. It asserts that the given 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// statement will cause exactly one non-fatal Google Test failure with 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'substr' being part of the failure message. 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'statement' is allowed to reference local variables and members of 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the current object. 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implementation note: The verification is done in the destructor of 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SingleFailureChecker, to make sure that it's done even when 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'statement' throws an exception or aborts the function. 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Known restrictions: 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// - You cannot stream a failure message to this macro. 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EXPECT_NONFATAL_FAILURE(statement, substr) do {\ 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::TestPartResultArray gtest_failures;\ 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::internal::SingleFailureChecker gtest_checker(\ 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >est_failures, ::testing::TPRT_NONFATAL_FAILURE, (substr));\ 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott {\ 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott >est_failures);\ 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott statement;\ 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }\ 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } while (false) 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ 248