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// The Google C++ Testing Framework (Google Test)
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
34b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest-test-part.h"
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Indicates that this translation unit is part of Google Test's
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// implementation.  It must come before gtest-internal-inl.h is
387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// included, or there will be a compiler error.  This trick is to
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// prevent a user from accidentally including gtest-internal-inl.h in
407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// his code.
41e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#define GTEST_IMPLEMENTATION_ 1
42efbdf7f2320649512569143611f53177c27ba9f6Chandler Carruth#include "src/gtest-internal-inl.h"
43e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer#undef GTEST_IMPLEMENTATION_
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing {
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
47190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerusing internal::GetUnitTestImpl;
48190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Gets the summary of the failure message by omitting the stack trace
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in it.
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninternal::String TestPartResult::ExtractSummary(const char* message) {
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  return stack_trace == NULL ? internal::String(message) :
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      internal::String(message, stack_trace - message);
557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Prints a TestPartResult object.
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
59190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  return os
60190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      << result.file_name() << ":" << result.line_number() << ": "
61190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      << (result.type() == TestPartResult::kSuccess ? "Success" :
62190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
63190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer          "Non-fatal failure") << ":\n"
64190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      << result.message() << std::endl;
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Appends a TestPartResult to the array.
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanvoid TestPartResultArray::Append(const TestPartResult& result) {
6957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  array_.push_back(result);
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Returns the TestPartResult at the given index (0-based).
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (index < 0 || index >= size()) {
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
76190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer    internal::posix::Abort();
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  }
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
7957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  return array_[index];
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Returns the number of TestPartResult objects in the array.
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanint TestPartResultArray::size() const {
8457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer  return static_cast<int>(array_.size());
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanHasNewFatalFailureHelper::HasNewFatalFailureHelper()
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    : has_new_fatal_failure_(false),
91190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      original_reporter_(GetUnitTestImpl()->
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                         GetTestPartResultReporterForCurrentThread()) {
93190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanHasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
97190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      original_reporter_);
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanvoid HasNewFatalFailureHelper::ReportTestPartResult(
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    const TestPartResult& result) {
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (result.fatally_failed())
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    has_new_fatal_failure_ = true;
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  original_reporter_->ReportTestPartResult(result);
1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
111