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// The Google C++ Testing Framework (Google Test) 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "gtest/gtest-test-part.h" 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Indicates that this translation unit is part of Google Test's 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// implementation. It must come before gtest-internal-inl.h is 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// included, or there will be a compiler error. This trick is to 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// prevent a user from accidentally including gtest-internal-inl.h in 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// his code. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTEST_IMPLEMENTATION_ 1 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "src/gtest-internal-inl.h" 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#undef GTEST_IMPLEMENTATION_ 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing internal::GetUnitTestImpl; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Gets the summary of the failure message by omitting the stack trace 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in it. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinternal::String TestPartResult::ExtractSummary(const char* message) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* const stack_trace = strstr(message, internal::kStackTraceMarker); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return stack_trace == NULL ? internal::String(message) : 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch internal::String(message, stack_trace - message); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Prints a TestPartResult object. 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) { 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return os 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << result.file_name() << ":" << result.line_number() << ": " 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << (result.type() == TestPartResult::kSuccess ? "Success" : 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Non-fatal failure") << ":\n" 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << result.message() << std::endl; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Appends a TestPartResult to the array. 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TestPartResultArray::Append(const TestPartResult& result) { 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch array_.push_back(result); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the TestPartResult at the given index (0-based). 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (index < 0 || index >= size()) { 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch printf("\nInvalid index (%d) into TestPartResultArray.\n", index); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch internal::posix::Abort(); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return array_[index]; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of TestPartResult objects in the array. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint TestPartResultArray::size() const { 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return static_cast<int>(array_.size()); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal { 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHasNewFatalFailureHelper::HasNewFatalFailureHelper() 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : has_new_fatal_failure_(false), 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch original_reporter_(GetUnitTestImpl()-> 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetTestPartResultReporterForCurrentThread()) { 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochHasNewFatalFailureHelper::~HasNewFatalFailureHelper() { 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch original_reporter_); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid HasNewFatalFailureHelper::ReportTestPartResult( 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TestPartResult& result) { 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (result.fatally_failed()) 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch has_new_fatal_failure_ = true; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch original_reporter_->ReportTestPartResult(result); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace internal 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace testing 111