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