1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2007, Google Inc.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// All rights reserved.
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Redistribution and use in source and binary forms, with or without
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// modification, are permitted provided that the following conditions are
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// met:
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     * Redistributions of source code must retain the above copyright
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// notice, this list of conditions and the following disclaimer.
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     * Redistributions in binary form must reproduce the above
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// copyright notice, this list of conditions and the following disclaimer
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in the documentation and/or other materials provided with the
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distribution.
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     * Neither the name of Google Inc. nor the names of its
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// contributors may be used to endorse or promote products derived from
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// this software without specific prior written permission.
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Author: wan@google.com (Zhanyong Wan)
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Utilities for testing Google Test itself and code that uses Google Test
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// (e.g. frameworks built on top of Google Test).
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <gtest/gtest.h>
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace testing {
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A copyable object representing the result of a test part (i.e. an
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Don't inherit from TestPartResult as its destructor is not virtual.
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResult {
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // C'tor.  TestPartResult does NOT have a default constructor.
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Always use this constructor (with parameters) to create a
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // TestPartResult object.
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestPartResult(TestPartResultType type,
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 const char* file_name,
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 int line_number,
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 const char* message)
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      : type_(type),
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        file_name_(file_name),
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        line_number_(line_number),
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        message_(message) {
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Gets the outcome of the test part.
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestPartResultType type() const { return type_; }
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Gets the name of the source file where the test part took place, or
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // NULL if it's unknown.
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* file_name() const { return file_name_.c_str(); }
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Gets the line in the source file where the test part took place,
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // or -1 if it's unknown.
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int line_number() const { return line_number_; }
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Gets the message associated with the test part.
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* message() const { return message_.c_str(); }
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true iff the test part passed.
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool passed() const { return type_ == TPRT_SUCCESS; }
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true iff the test part failed.
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool failed() const { return type_ != TPRT_SUCCESS; }
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true iff the test part non-fatally failed.
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool nonfatally_failed() const { return type_ == TPRT_NONFATAL_FAILURE; }
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true iff the test part fatally failed.
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool fatally_failed() const { return type_ == TPRT_FATAL_FAILURE; }
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestPartResultType type_;
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The name of the source file where the test part took place, or
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // NULL if the source file is unknown.
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  internal::String file_name_;
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The line in the source file where the test part took place, or -1
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // if the line number is unknown.
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int line_number_;
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  internal::String message_;  // The test failure message.
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Prints a TestPartResult object.
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// An array of TestPartResult objects.
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We define this class as we cannot use STL containers when compiling
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test with MSVC 7.1 and exceptions disabled.
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Don't inherit from TestPartResultArray as its destructor is not
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// virtual.
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResultArray {
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestPartResultArray();
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ~TestPartResultArray();
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Appends the given TestPartResult to the array.
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Append(const TestPartResult& result);
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the TestPartResult at the given index (0-based).
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const TestPartResult& GetTestPartResult(int index) const;
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the number of TestPartResult objects in the array.
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int size() const;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Internally we use a list to simulate the array.  Yes, this means
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // that random access is O(N) in time, but it's OK for its purpose.
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  internal::List<TestPartResult>* const list_;
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_DISALLOW_COPY_AND_ASSIGN(TestPartResultArray);
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This interface knows how to report a test part result.
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TestPartResultReporterInterface {
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~TestPartResultReporterInterface() {}
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This helper class can be used to mock out Google Test failure reporting
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// so that we can test Google Test or code that builds on Google Test.
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// An object of this class appends a TestPartResult object to the
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestPartResultArray object given in the constructor whenever a
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Google Test failure is reported.
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ScopedFakeTestPartResultReporter
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    : public TestPartResultReporterInterface {
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The c'tor sets this object as the test part result reporter used
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // by Google Test.  The 'result' parameter specifies where to report the
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // results.
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The d'tor restores the previous test part result reporter.
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~ScopedFakeTestPartResultReporter();
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Appends the TestPartResult object to the TestPartResultArray
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // received in the constructor.
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This method is from the TestPartResultReporterInterface
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // interface.
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void ReportTestPartResult(const TestPartResult& result);
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestPartResultReporterInterface* const old_reporter_;
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestPartResultArray* const result_;
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_DISALLOW_COPY_AND_ASSIGN(ScopedFakeTestPartResultReporter);
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace internal {
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A helper class for implementing EXPECT_FATAL_FAILURE() and
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TestPartResultArray contains exactly one failure that has the given
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// type and contains the given substring.  If that's not the case, a
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// non-fatal failure will be generated.
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass SingleFailureChecker {
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The constructor remembers the arguments.
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SingleFailureChecker(const TestPartResultArray* results,
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                       TestPartResultType type,
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                       const char* substr);
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ~SingleFailureChecker();
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const TestPartResultArray* const results_;
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const TestPartResultType type_;
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const String substr_;
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GTEST_DISALLOW_COPY_AND_ASSIGN(SingleFailureChecker);
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace internal
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace testing
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A macro for testing Google Test assertions or code that's expected to
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// generate Google Test fatal failures.  It verifies that the given
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// statement will cause exactly one fatal Google Test failure with 'substr'
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// being part of the failure message.
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implementation note: The verification is done in the destructor of
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SingleFailureChecker, to make sure that it's done even when
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'statement' throws an exception.
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Known restrictions:
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   - 'statement' cannot reference local non-static variables or
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//     non-static members of the current object.
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   - 'statement' cannot return a value.
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   - You cannot stream a failure message to this macro.
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EXPECT_FATAL_FAILURE(statement, substr) do {\
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    class GTestExpectFatalFailureHelper {\
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     public:\
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      static void Execute() { statement; }\
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    };\
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::testing::TestPartResultArray gtest_failures;\
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::testing::internal::SingleFailureChecker gtest_checker(\
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        &gtest_failures, ::testing::TPRT_FATAL_FAILURE, (substr));\
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {\
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          &gtest_failures);\
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      GTestExpectFatalFailureHelper::Execute();\
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }\
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } while (false)
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A macro for testing Google Test assertions or code that's expected to
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// generate Google Test non-fatal failures.  It asserts that the given
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// statement will cause exactly one non-fatal Google Test failure with
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'substr' being part of the failure message.
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'statement' is allowed to reference local variables and members of
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the current object.
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Implementation note: The verification is done in the destructor of
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// SingleFailureChecker, to make sure that it's done even when
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 'statement' throws an exception or aborts the function.
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Known restrictions:
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//   - You cannot stream a failure message to this macro.
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EXPECT_NONFATAL_FAILURE(statement, substr) do {\
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::testing::TestPartResultArray gtest_failures;\
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::testing::internal::SingleFailureChecker gtest_checker(\
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        &gtest_failures, ::testing::TPRT_NONFATAL_FAILURE, (substr));\
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {\
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          &gtest_failures);\
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      statement;\
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }\
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } while (false)
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
248