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 >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ 1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman {\ 1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::ScopedFakeTestPartResultReporter:: \ 1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman INTERCEPT_ONLY_CURRENT_THREAD, >est_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 >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ 1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman {\ 1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::ScopedFakeTestPartResultReporter:: \ 1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman INTERCEPT_ALL_THREADS, >est_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 >est_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, >est_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 >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ 223190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer (substr));\ 2247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman {\ 2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\ 2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman >est_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