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