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.
710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ~ScopedFakeTestPartResultReporter() override;
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.
780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  void ReportTestPartResult(const TestPartResult &result) override;
790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  void Init();
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const InterceptMode intercept_mode_;
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TestPartResultReporterInterface* old_reporter_;
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  TestPartResultArray* const result_;
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmannamespace internal {
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A helper class for implementing EXPECT_FATAL_FAILURE() and
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// TestPartResultArray contains exactly one failure that has the given
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// type and contains the given substring.  If that's not the case, a
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// non-fatal failure will be generated.
9757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerclass GTEST_API_ SingleFailureChecker {
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman public:
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  // The constructor remembers the arguments.
1007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  SingleFailureChecker(const TestPartResultArray* results,
101190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer                       TestPartResult::Type type,
102b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                       const string& substr);
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  ~SingleFailureChecker();
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman private:
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  const TestPartResultArray* const results_;
106190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  const TestPartResult::Type type_;
107b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  const string substr_;
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman};
1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace internal
1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}  // namespace testing
1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A set of macros for testing Google Test assertions or code that's expected
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to generate Google Test fatal failures.  It verifies that the given
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// statement will cause exactly one fatal Google Test failure with 'substr'
1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// being part of the failure message.
1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// affects and considers failures generated in the current thread and
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The verification of the assertion is done correctly even when the statement
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// throws an exception or aborts the current function.
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Known restrictions:
1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - 'statement' cannot reference local non-static variables or
1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     non-static members of the current object.
1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - 'statement' cannot return a value.
1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - You cannot stream a failure message to this macro.
1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note that even though the implementations of the following two
1357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// macros are much alike, we cannot refactor them to use a common
1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// helper macro, due to some peculiarity in how the preprocessor
1377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// gtest_unittest.cc will fail to compile if we do that.
1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FATAL_FAILURE(statement, substr) \
1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do { \
1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    class GTestExpectFatalFailureHelper {\
1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     public:\
1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      static void Execute() { statement; }\
1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    };\
1457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
147190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter:: \
1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTestExpectFatalFailureHelper::Execute();\
1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
154190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do { \
1587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    class GTestExpectFatalFailureHelper {\
1597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman     public:\
1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      static void Execute() { statement; }\
1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    };\
1627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
1637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
164190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter:: \
1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          INTERCEPT_ALL_THREADS, &gtest_failures);\
1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      GTestExpectFatalFailureHelper::Execute();\
1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
171190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A macro for testing Google Test assertions or code that's expected to
1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// generate Google Test non-fatal failures.  It asserts that the given
1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// statement will cause exactly one non-fatal Google Test failure with 'substr'
1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// being part of the failure message.
1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
1797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// affects and considers failures generated in the current thread and
1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 'statement' is allowed to reference local variables and members of
1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the current object.
1847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The verification of the assertion is done correctly even when the statement
1867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// throws an exception or aborts the current function.
1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Known restrictions:
1897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   - You cannot stream a failure message to this macro.
1907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
1917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note that even though the implementations of the following two
1927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// macros are much alike, we cannot refactor them to use a common
1937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// helper macro, due to some peculiarity in how the preprocessor
194190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// works.  If we do that, the code won't compile when the user gives
195190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
196190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// expands to code containing an unprotected comma.  The
197190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
198190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// catches that.
199190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//
200190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// For the same reason, we have to write
201190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//   if (::testing::internal::AlwaysTrue()) { statement; }
202190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// instead of
203190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
204190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// to avoid an MSVC warning on unreachable code.
2057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NONFATAL_FAILURE(statement, substr) \
2067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do {\
2077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
2087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
209190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
210190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        (substr));\
2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
2127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter:: \
2147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
215190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      if (::testing::internal::AlwaysTrue()) { statement; }\
2167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
217190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
2187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
2207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  do {\
2217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::TestPartResultArray gtest_failures;\
2227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ::testing::internal::SingleFailureChecker gtest_checker(\
223190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
224190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer        (substr));\
2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    {\
2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
2287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          &gtest_failures);\
229190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer      if (::testing::internal::AlwaysTrue()) { statement; }\
2307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    }\
231190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer  } while (::testing::internal::AlwaysFalse())
2327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
234