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