17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2007, 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: wan@google.com (Zhanyong Wan)
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Utilities for testing Google Test itself and code that uses Google Test
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (e.g. frameworks built on top of Google Test).
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
38b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad#include "gtest/gtest.h"
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace testing {
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This helper class can be used to mock out Google Test failure reporting
437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// so that we can test Google Test or code that builds on Google Test.
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// An object of this class appends a TestPartResult object to the
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TestPartResultArray object given in the constructor whenever a Google Test
477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// failure is reported. It can either intercept only failures that are
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// generated in the same thread that created this object or it can intercept
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// all generated failures. The scope of this mock object can be controlled with
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the second argument to the two arguments constructor.
5157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ ScopedFakeTestPartResultReporter
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    : public TestPartResultReporterInterface {
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The two possible mocking modes of this object.
557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  enum InterceptMode {
567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    INTERCEPT_ALL_THREADS           // Intercepts all failures.
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  };
597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The c'tor sets this object as the test part result reporter used
617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // by Google Test.  The 'result' parameter specifies where to report the
627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // results. This reporter will only catch failures generated in the current
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // thread. DEPRECATED
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Same as above, but you can choose the interception scope of this object.
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                   TestPartResultArray* result);
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The d'tor restores the previous test part result reporter.
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual ~ScopedFakeTestPartResultReporter();
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // Appends the TestPartResult object to the TestPartResultArray
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // received in the constructor.
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  //
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // This method is from the TestPartResultReporterInterface
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // interface.
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  virtual void ReportTestPartResult(const TestPartResult& result);
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void Init();
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const InterceptMode intercept_mode_;
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TestPartResultReporterInterface* old_reporter_;
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TestPartResultArray* const result_;
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A helper class for implementing EXPECT_FATAL_FAILURE() and
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TestPartResultArray contains exactly one failure that has the given
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// type and contains the given substring.  If that's not the case, a
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// non-fatal failure will be generated.
9657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ SingleFailureChecker {
977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The constructor remembers the arguments.
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  SingleFailureChecker(const TestPartResultArray* results,
100190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                       TestPartResult::Type type,
101b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                       const string& substr);
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ~SingleFailureChecker();
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const TestPartResultArray* const results_;
105190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestPartResult::Type type_;
106b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const string substr_;
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A set of macros for testing Google Test assertions or code that's expected
1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to generate Google Test fatal failures.  It verifies that the given
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// statement will cause exactly one fatal Google Test failure with 'substr'
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// being part of the failure message.
1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// affects and considers failures generated in the current thread and
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The verification of the assertion is done correctly even when the statement
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// throws an exception or aborts the current function.
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Known restrictions:
1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - 'statement' cannot reference local non-static variables or
1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     non-static members of the current object.
1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - 'statement' cannot return a value.
1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - You cannot stream a failure message to this macro.
1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note that even though the implementations of the following two
1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// macros are much alike, we cannot refactor them to use a common
1357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// helper macro, due to some peculiarity in how the preprocessor
1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
1377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// gtest_unittest.cc will fail to compile if we do that.
1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FATAL_FAILURE(statement, substr) \
1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do { \
1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    class GTestExpectFatalFailureHelper {\
1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     public:\
1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      static void Execute() { statement; }\
1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    };\
1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
1457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
146190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter:: \
1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTestExpectFatalFailureHelper::Execute();\
1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
153190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
1547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do { \
1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    class GTestExpectFatalFailureHelper {\
1587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     public:\
1597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      static void Execute() { statement; }\
1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    };\
1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
1627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
163190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter:: \
1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          INTERCEPT_ALL_THREADS, &gtest_failures);\
1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTestExpectFatalFailureHelper::Execute();\
1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
170190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A macro for testing Google Test assertions or code that's expected to
1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// generate Google Test non-fatal failures.  It asserts that the given
1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// statement will cause exactly one non-fatal Google Test failure with 'substr'
1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// being part of the failure message.
1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// affects and considers failures generated in the current thread and
1797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 'statement' is allowed to reference local variables and members of
1827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the current object.
1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The verification of the assertion is done correctly even when the statement
1857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// throws an exception or aborts the current function.
1867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Known restrictions:
1887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - You cannot stream a failure message to this macro.
1897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note that even though the implementations of the following two
1917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// macros are much alike, we cannot refactor them to use a common
1927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// helper macro, due to some peculiarity in how the preprocessor
193190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// works.  If we do that, the code won't compile when the user gives
194190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
195190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// expands to code containing an unprotected comma.  The
196190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
197190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// catches that.
198190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
199190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// For the same reason, we have to write
200190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//   if (::testing::internal::AlwaysTrue()) { statement; }
201190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// instead of
202190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
203190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// to avoid an MSVC warning on unreachable code.
2047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NONFATAL_FAILURE(statement, substr) \
2057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do {\
2067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
2077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
208190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
209190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        (substr));\
2107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter:: \
2137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
214190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      if (::testing::internal::AlwaysTrue()) { statement; }\
2157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
216190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
2177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
2197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do {\
2207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
2217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
222190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
223190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        (substr));\
2247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          &gtest_failures);\
228190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      if (::testing::internal::AlwaysTrue()) { statement; }\
2297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
230190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
2317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
233