15 #ifndef INCG_IRIS_IUTEST_SPI_HPP_
16 #define INCG_IRIS_IUTEST_SPI_HPP_
22 #if !defined(IUTEST_USE_GTEST)
24 #if defined(_MSC_VER) && !defined(__clang__)
27 # define __LINE__Var 0
37 #define IUTEST_ASSERT_FATAL_FAILURE(statement, substr) \
38 IUTEST_TEST_FATAL_FAILURE_(statement, #statement, substr, IUTEST_ASSERT_FAILURE)
44 #define IUTEST_ASSERT_NONFATAL_FAILURE(statement, substr) \
45 IUTEST_TEST_NONFATAL_FAILURE_(statement, #statement, substr, IUTEST_ASSERT_FAILURE)
51 #define IUTEST_EXPECT_FATAL_FAILURE(statement, substr) \
52 IUTEST_TEST_FATAL_FAILURE_(statement, #statement, substr, IUTEST_EXPECT_FAILURE)
58 #define IUTEST_EXPECT_NONFATAL_FAILURE(statement, substr) \
59 IUTEST_TEST_NONFATAL_FAILURE_(statement, #statement, substr, IUTEST_EXPECT_FAILURE)
67 #if IUTEST_HAS_SPI_LAMBDA_SUPPORT
69 #if IUTEST_HAS_EXCEPTIONS && IUTEST_USE_THROW_ON_ASSERTION_FAILURE
70 # define IIUT_SPI_STATEMENT_EXECUTER(statement) [&](){ try { \
71 ::iutest::detail::ScopedSPITestFlag guard; \
76 # define IIUT_SPI_STATEMENT_EXECUTER(statement) \
77 [&](){ ::iutest::detail::ScopedSPITestFlag guard; statement; }()
80 #define IUTEST_TEST_FATAL_FAILURE_(statement, text, substr, on_failure) \
81 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
82 if( ::iutest::AssertionResult iutest_spi_ar = [&]() -> ::iutest::AssertionResult { \
83 ::iutest::detail::SPIFailureChecker< \
84 ::iutest::TestPartResult::kFatalFailure> iutest_failure_checker; \
85 IIUT_SPI_STATEMENT_EXECUTER(statement); \
86 return iutest_failure_checker.GetResult(substr); \
90 on_failure(iutest_spi_ar.message())
92 #define IUTEST_TEST_NONFATAL_FAILURE_(statement, text, substr, on_failure) \
93 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
94 if( ::iutest::AssertionResult iutest_spi_ar = [&]() -> ::iutest::AssertionResult { \
95 ::iutest::detail::SPIFailureChecker< \
96 ::iutest::TestPartResult::kNonFatalFailure> iutest_failure_checker; \
97 IIUT_SPI_STATEMENT_EXECUTER(statement); \
98 return iutest_failure_checker.GetResult(substr); \
102 on_failure(iutest_spi_ar.message())
106 #if IUTEST_HAS_EXCEPTIONS && IUTEST_USE_THROW_ON_ASSERTION_FAILURE
107 # define IIUT_SPI_STATEMENT_EXECUTER(statement) struct IUTestFatalFailureStatement { \
108 static void Execute() { ::iutest::detail::ScopedSPITestFlag guard; \
109 try { statement; } catch(...) {} } \
111 IUTestFatalFailureStatement::Execute()
113 # define IIUT_SPI_STATEMENT_EXECUTER(statement) struct IUTestFatalFailureStatement { \
114 static void Execute() { ::iutest::detail::ScopedSPITestFlag guard; statement; } \
116 IUTestFatalFailureStatement::Execute()
119 #define IUTEST_TEST_FATAL_FAILURE_(statement, text, substr, on_failure) \
120 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
121 if( ::iutest::AssertionResult iutest_spi_ar = ::iutest::AssertionSuccess() ) { \
122 ::iutest::detail::SPIFailureChecker< \
123 ::iutest::TestPartResult::kFatalFailure> iutest_failure_checker; \
124 IIUT_SPI_STATEMENT_EXECUTER(statement); \
125 ::iutest::AssertionResult ar = iutest_failure_checker.GetResult(substr); \
127 iutest_spi_ar << ar.message(); \
128 goto IUTEST_PP_CAT(iutest_label_test_fatalfailure_, __LINE__); \
131 IUTEST_PP_CAT(iutest_label_test_fatalfailure_, __LINE__): \
132 on_failure(iutest_spi_ar.message())
134 #define IUTEST_TEST_NONFATAL_FAILURE_(statement, text, substr, on_failure) \
135 IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
136 if( ::iutest::AssertionResult iutest_spi_ar = ::iutest::AssertionSuccess() ) { \
137 ::iutest::detail::SPIFailureChecker< \
138 ::iutest::TestPartResult::kNonFatalFailure> iutest_failure_checker; \
139 IIUT_SPI_STATEMENT_EXECUTER(statement); \
140 ::iutest::AssertionResult ar = iutest_failure_checker.GetResult(substr); \
142 iutest_spi_ar << ar.message(); \
143 goto IUTEST_PP_CAT(iutest_label_test_fatalfailure_, __LINE__); \
146 IUTEST_PP_CAT(iutest_label_test_fatalfailure_, __LINE__): \
147 on_failure(iutest_spi_ar.message())
167 template<TestPartResult::Type Type>
168 class SPIFailureChecker
169 :
public NewTestPartResultCheckHelper::Collector<NoTestPartResultReporter>
172 AssertionResult GetResult(const ::std::string& substr)
174 const char* expected =
176 const size_t num = count();
180 <<
"\n Actual: " << num <<
" failures\n";
181 for(
size_t i=0; i < num; ++i )
183 ar << GetTestPartResult(i);
188 const TestPartResult& tr = GetTestPartResult(0);
189 if( tr.type() != Type )
192 <<
"\"\n Actual:\n" << tr;
195 if( strstr(tr.message(), substr.c_str()) == NULL )
198 <<
" containing \"" << substr
199 <<
"\"\n Actual:\n" << tr;
208 class ScopedSPITestFlag :
public TestFlag::ScopedGuard
223 #include "gtest/iutest_spi_switch.hpp"
227 #endif // INCG_IRIS_IUTEST_SPI_HPP_