1fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Copyright 2008, Google Inc. 2fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// All rights reserved. 3fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// 4fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Redistribution and use in source and binary forms, with or without 5fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// modification, are permitted provided that the following conditions are 6fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// met: 7fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// 8fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// * Redistributions of source code must retain the above copyright 9fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// notice, this list of conditions and the following disclaimer. 10fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// * Redistributions in binary form must reproduce the above 11fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// copyright notice, this list of conditions and the following disclaimer 12fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// in the documentation and/or other materials provided with the 13fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// distribution. 14fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// * Neither the name of Google Inc. nor the names of its 15fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// contributors may be used to endorse or promote products derived from 16fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// this software without specific prior written permission. 17fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// 18fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// 30fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Author: mheule@google.com (Markus Heule) 31fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// 32fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// The Google C++ Testing Framework (Google Test) 33fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 34fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt#include "gtest/gtest-test-part.h" 35fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 36fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Indicates that this translation unit is part of Google Test's 37fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// implementation. It must come before gtest-internal-inl.h is 38fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// included, or there will be a compiler error. This trick is to 39fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// prevent a user from accidentally including gtest-internal-inl.h in 40fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// his code. 41fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt#define GTEST_IMPLEMENTATION_ 1 42fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt#include "src/gtest-internal-inl.h" 43fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt#undef GTEST_IMPLEMENTATION_ 44fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 45fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtnamespace testing { 46fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 47fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtusing internal::GetUnitTestImpl; 48fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 49fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Gets the summary of the failure message by omitting the stack trace 50fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// in it. 51fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtinternal::String TestPartResult::ExtractSummary(const char* message) { 52fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt const char* const stack_trace = strstr(message, internal::kStackTraceMarker); 53fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt return stack_trace == NULL ? internal::String(message) : 54fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt internal::String(message, stack_trace - message); 55fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 56fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 57fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Prints a TestPartResult object. 58fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) { 59fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt return os 60fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt << result.file_name() << ":" << result.line_number() << ": " 61fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt << (result.type() == TestPartResult::kSuccess ? "Success" : 62fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : 63fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt "Non-fatal failure") << ":\n" 64fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt << result.message() << std::endl; 65fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 66fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 67fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Appends a TestPartResult to the array. 68fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtvoid TestPartResultArray::Append(const TestPartResult& result) { 69fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt array_.push_back(result); 70fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 71fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 72fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Returns the TestPartResult at the given index (0-based). 73fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { 74fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt if (index < 0 || index >= size()) { 75fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt printf("\nInvalid index (%d) into TestPartResultArray.\n", index); 76fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt internal::posix::Abort(); 77fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt } 78fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 79fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt return array_[index]; 80fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 81fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 82fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt// Returns the number of TestPartResult objects in the array. 83fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtint TestPartResultArray::size() const { 84fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt return static_cast<int>(array_.size()); 85fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 86fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 87fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtnamespace internal { 88fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 89fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric AnholtHasNewFatalFailureHelper::HasNewFatalFailureHelper() 90fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt : has_new_fatal_failure_(false), 91fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt original_reporter_(GetUnitTestImpl()-> 92fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt GetTestPartResultReporterForCurrentThread()) { 93fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); 94fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 95fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 96fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric AnholtHasNewFatalFailureHelper::~HasNewFatalFailureHelper() { 97fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( 98fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt original_reporter_); 99fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 100fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 101fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholtvoid HasNewFatalFailureHelper::ReportTestPartResult( 102fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt const TestPartResult& result) { 103fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt if (result.fatally_failed()) 104fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt has_new_fatal_failure_ = true; 105fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt original_reporter_->ReportTestPartResult(result); 106fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} 107fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 108fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} // namespace internal 109fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt 110fe358c0ffa4acb7ecab10fda68ba9740497d2e7fEric Anholt} // namespace testing 111