xref: /aosp_15_r20/external/libcxx/test/support/rapid-cxx-test.hpp (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker #ifndef RAPID_CXX_TEST_HPP
2*58b9f456SAndroid Build Coastguard Worker #define RAPID_CXX_TEST_HPP
3*58b9f456SAndroid Build Coastguard Worker 
4*58b9f456SAndroid Build Coastguard Worker # include <cstddef>
5*58b9f456SAndroid Build Coastguard Worker # include <cstdlib>
6*58b9f456SAndroid Build Coastguard Worker # include <cstdio>
7*58b9f456SAndroid Build Coastguard Worker # include <cstring>
8*58b9f456SAndroid Build Coastguard Worker # include <cassert>
9*58b9f456SAndroid Build Coastguard Worker 
10*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h"
11*58b9f456SAndroid Build Coastguard Worker 
12*58b9f456SAndroid Build Coastguard Worker #if !defined(RAPID_CXX_TEST_NO_SYSTEM_HEADER) || !defined(__GNUC__)
13*58b9f456SAndroid Build Coastguard Worker #pragma GCC system_header
14*58b9f456SAndroid Build Coastguard Worker #endif
15*58b9f456SAndroid Build Coastguard Worker 
16*58b9f456SAndroid Build Coastguard Worker # define RAPID_CXX_TEST_PP_CAT(x, y) RAPID_CXX_TEST_PP_CAT_2(x, y)
17*58b9f456SAndroid Build Coastguard Worker # define RAPID_CXX_TEST_PP_CAT_2(x, y) x##y
18*58b9f456SAndroid Build Coastguard Worker 
19*58b9f456SAndroid Build Coastguard Worker # define RAPID_CXX_TEST_PP_STR(...) RAPID_CXX_TEST_PP_STR_2(__VA_ARGS__)
20*58b9f456SAndroid Build Coastguard Worker # define RAPID_CXX_TEST_PP_STR_2(...) #__VA_ARGS__
21*58b9f456SAndroid Build Coastguard Worker 
22*58b9f456SAndroid Build Coastguard Worker # if defined(__GNUC__)
23*58b9f456SAndroid Build Coastguard Worker #   define TEST_FUNC_NAME() __PRETTY_FUNCTION__
24*58b9f456SAndroid Build Coastguard Worker #   define RAPID_CXX_TEST_UNUSED __attribute__((unused))
25*58b9f456SAndroid Build Coastguard Worker # else
26*58b9f456SAndroid Build Coastguard Worker #   define TEST_FUNC_NAME() __func__
27*58b9f456SAndroid Build Coastguard Worker #   define RAPID_CXX_TEST_UNUSED
28*58b9f456SAndroid Build Coastguard Worker # endif
29*58b9f456SAndroid Build Coastguard Worker 
30*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
31*58b9f456SAndroid Build Coastguard Worker //                          TEST_SUITE
32*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
33*58b9f456SAndroid Build Coastguard Worker # define TEST_SUITE(Name)                                           \
34*58b9f456SAndroid Build Coastguard Worker namespace Name                                                      \
35*58b9f456SAndroid Build Coastguard Worker {                                                                   \
36*58b9f456SAndroid Build Coastguard Worker     inline ::rapid_cxx_test::test_suite & get_test_suite()          \
37*58b9f456SAndroid Build Coastguard Worker     {                                                               \
38*58b9f456SAndroid Build Coastguard Worker         static ::rapid_cxx_test::test_suite m_suite(#Name);         \
39*58b9f456SAndroid Build Coastguard Worker         return m_suite;                                             \
40*58b9f456SAndroid Build Coastguard Worker     }                                                               \
41*58b9f456SAndroid Build Coastguard Worker                                                                     \
42*58b9f456SAndroid Build Coastguard Worker     inline int unit_test_main(int, char**)                          \
43*58b9f456SAndroid Build Coastguard Worker     {                                                               \
44*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_runner runner(get_test_suite());     \
45*58b9f456SAndroid Build Coastguard Worker         return runner.run();                                        \
46*58b9f456SAndroid Build Coastguard Worker     }                                                               \
47*58b9f456SAndroid Build Coastguard Worker }                                                                   \
48*58b9f456SAndroid Build Coastguard Worker int main(int argc, char **argv)                                     \
49*58b9f456SAndroid Build Coastguard Worker {                                                                   \
50*58b9f456SAndroid Build Coastguard Worker     return Name::unit_test_main(argc, argv);                        \
51*58b9f456SAndroid Build Coastguard Worker }                                                                   \
52*58b9f456SAndroid Build Coastguard Worker namespace Name                                                      \
53*58b9f456SAndroid Build Coastguard Worker { /* namespace closed in TEST_SUITE_END */
54*58b9f456SAndroid Build Coastguard Worker #
55*58b9f456SAndroid Build Coastguard Worker 
56*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
57*58b9f456SAndroid Build Coastguard Worker //                         TEST_SUITE_END
58*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
59*58b9f456SAndroid Build Coastguard Worker # define TEST_SUITE_END()                                       \
60*58b9f456SAndroid Build Coastguard Worker } /* namespace opened in TEST_SUITE(...) */
61*58b9f456SAndroid Build Coastguard Worker #
62*58b9f456SAndroid Build Coastguard Worker 
63*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
64*58b9f456SAndroid Build Coastguard Worker //                          TEST_CASE
65*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
66*58b9f456SAndroid Build Coastguard Worker 
67*58b9f456SAndroid Build Coastguard Worker # if !defined(__clang__)
68*58b9f456SAndroid Build Coastguard Worker #
69*58b9f456SAndroid Build Coastguard Worker # define TEST_CASE(Name)                                                                                \
70*58b9f456SAndroid Build Coastguard Worker     void Name();                                                                                        \
71*58b9f456SAndroid Build Coastguard Worker     static void RAPID_CXX_TEST_PP_CAT(Name, _invoker)()                                                 \
72*58b9f456SAndroid Build Coastguard Worker     {                                                                                                   \
73*58b9f456SAndroid Build Coastguard Worker         Name();                                                                                         \
74*58b9f456SAndroid Build Coastguard Worker     }                                                                                                   \
75*58b9f456SAndroid Build Coastguard Worker     static ::rapid_cxx_test::registrar                                                                  \
76*58b9f456SAndroid Build Coastguard Worker     RAPID_CXX_TEST_PP_CAT(rapid_cxx_test_registrar_, Name)(                                         \
77*58b9f456SAndroid Build Coastguard Worker         get_test_suite()                                                                                \
78*58b9f456SAndroid Build Coastguard Worker       , ::rapid_cxx_test::test_case(__FILE__, #Name, __LINE__, & RAPID_CXX_TEST_PP_CAT(Name, _invoker)) \
79*58b9f456SAndroid Build Coastguard Worker       );                                                                                                \
80*58b9f456SAndroid Build Coastguard Worker     void Name()
81*58b9f456SAndroid Build Coastguard Worker #
82*58b9f456SAndroid Build Coastguard Worker # else /* __clang__ */
83*58b9f456SAndroid Build Coastguard Worker #
84*58b9f456SAndroid Build Coastguard Worker # define TEST_CASE(Name)                                                                                \
85*58b9f456SAndroid Build Coastguard Worker     void Name();                                                                                        \
86*58b9f456SAndroid Build Coastguard Worker     static void RAPID_CXX_TEST_PP_CAT(Name, _invoker)()                                                 \
87*58b9f456SAndroid Build Coastguard Worker     {                                                                                                   \
88*58b9f456SAndroid Build Coastguard Worker         Name();                                                                                         \
89*58b9f456SAndroid Build Coastguard Worker     }                                                                                                   \
90*58b9f456SAndroid Build Coastguard Worker     _Pragma("clang diagnostic push")                                                                    \
91*58b9f456SAndroid Build Coastguard Worker     _Pragma("clang diagnostic ignored \"-Wglobal-constructors\"")                                       \
92*58b9f456SAndroid Build Coastguard Worker     static ::rapid_cxx_test::registrar                                                                  \
93*58b9f456SAndroid Build Coastguard Worker     RAPID_CXX_TEST_PP_CAT(rapid_cxx_test_registrar_, Name)(                                         \
94*58b9f456SAndroid Build Coastguard Worker         get_test_suite()                                                                                \
95*58b9f456SAndroid Build Coastguard Worker       , ::rapid_cxx_test::test_case(__FILE__, #Name, __LINE__, & RAPID_CXX_TEST_PP_CAT(Name, _invoker)) \
96*58b9f456SAndroid Build Coastguard Worker       );                                                                                                \
97*58b9f456SAndroid Build Coastguard Worker     _Pragma("clang diagnostic pop")                                                                     \
98*58b9f456SAndroid Build Coastguard Worker     void Name()
99*58b9f456SAndroid Build Coastguard Worker #
100*58b9f456SAndroid Build Coastguard Worker # endif /* !defined(__clang__) */
101*58b9f456SAndroid Build Coastguard Worker 
102*58b9f456SAndroid Build Coastguard Worker 
103*58b9f456SAndroid Build Coastguard Worker # define TEST_SET_CHECKPOINT() ::rapid_cxx_test::set_checkpoint(__FILE__, TEST_FUNC_NAME(), __LINE__)
104*58b9f456SAndroid Build Coastguard Worker 
105*58b9f456SAndroid Build Coastguard Worker #define RAPID_CXX_TEST_OUTCOME()
106*58b9f456SAndroid Build Coastguard Worker 
107*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
108*58b9f456SAndroid Build Coastguard Worker //                              TEST_UNSUPPORTED
109*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
110*58b9f456SAndroid Build Coastguard Worker # define TEST_UNSUPPORTED()                                                                 \
111*58b9f456SAndroid Build Coastguard Worker     do {                                                                                    \
112*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                              \
113*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                                 \
114*58b9f456SAndroid Build Coastguard Worker           ::rapid_cxx_test::failure_type::unsupported, __FILE__, TEST_FUNC_NAME(), __LINE__ \
115*58b9f456SAndroid Build Coastguard Worker           , "", ""                                                                          \
116*58b9f456SAndroid Build Coastguard Worker         );                                                                                  \
117*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                       \
118*58b9f456SAndroid Build Coastguard Worker         return;                                                                             \
119*58b9f456SAndroid Build Coastguard Worker     } while (false)
120*58b9f456SAndroid Build Coastguard Worker #
121*58b9f456SAndroid Build Coastguard Worker 
122*58b9f456SAndroid Build Coastguard Worker 
123*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
124*58b9f456SAndroid Build Coastguard Worker //                            BASIC ASSERTIONS
125*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
126*58b9f456SAndroid Build Coastguard Worker # define TEST_WARN(...)                                                                \
127*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
128*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
129*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
130*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
131*58b9f456SAndroid Build Coastguard Worker             , "TEST_WARN(" #__VA_ARGS__ ")", ""                                        \
132*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
133*58b9f456SAndroid Build Coastguard Worker         if (not (__VA_ARGS__)) {                                                       \
134*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::warn;                           \
135*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
136*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
137*58b9f456SAndroid Build Coastguard Worker     } while (false)
138*58b9f456SAndroid Build Coastguard Worker #
139*58b9f456SAndroid Build Coastguard Worker 
140*58b9f456SAndroid Build Coastguard Worker # define TEST_CHECK(...)                                                               \
141*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
142*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
143*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
144*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
145*58b9f456SAndroid Build Coastguard Worker             , "TEST_CHECK(" #__VA_ARGS__ ")", ""                                       \
146*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
147*58b9f456SAndroid Build Coastguard Worker         if (not (__VA_ARGS__)) {                                                       \
148*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::check;                          \
149*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
150*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
151*58b9f456SAndroid Build Coastguard Worker     } while (false)
152*58b9f456SAndroid Build Coastguard Worker #
153*58b9f456SAndroid Build Coastguard Worker 
154*58b9f456SAndroid Build Coastguard Worker # define TEST_REQUIRE(...)                                                             \
155*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
156*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
157*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
158*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
159*58b9f456SAndroid Build Coastguard Worker             , "TEST_REQUIRE(" #__VA_ARGS__ ")", ""                                     \
160*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
161*58b9f456SAndroid Build Coastguard Worker         if (not (__VA_ARGS__)) {                                                       \
162*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::require;                        \
163*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
164*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
165*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
166*58b9f456SAndroid Build Coastguard Worker             return;                                                                    \
167*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
168*58b9f456SAndroid Build Coastguard Worker     } while (false)
169*58b9f456SAndroid Build Coastguard Worker #
170*58b9f456SAndroid Build Coastguard Worker 
171*58b9f456SAndroid Build Coastguard Worker # define TEST_ASSERT(...)                                                              \
172*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
173*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
174*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
175*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
176*58b9f456SAndroid Build Coastguard Worker             , "TEST_ASSERT(" #__VA_ARGS__ ")", ""                                      \
177*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
178*58b9f456SAndroid Build Coastguard Worker         if (not (__VA_ARGS__)) {                                                       \
179*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::assert;                         \
180*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
181*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
182*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
183*58b9f456SAndroid Build Coastguard Worker             std::abort();                                                              \
184*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
185*58b9f456SAndroid Build Coastguard Worker     } while (false)
186*58b9f456SAndroid Build Coastguard Worker #
187*58b9f456SAndroid Build Coastguard Worker 
188*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
189*58b9f456SAndroid Build Coastguard Worker //                    TEST_CHECK_NO_THROW / TEST_CHECK_THROW
190*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
191*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS
192*58b9f456SAndroid Build Coastguard Worker 
193*58b9f456SAndroid Build Coastguard Worker # define TEST_CHECK_NO_THROW(...)                                                      \
194*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
195*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
196*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
197*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
198*58b9f456SAndroid Build Coastguard Worker             , "TEST_CHECK_NO_THROW(" #__VA_ARGS__ ")", ""                              \
199*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
200*58b9f456SAndroid Build Coastguard Worker         try {                                                                          \
201*58b9f456SAndroid Build Coastguard Worker             (static_cast<void>(__VA_ARGS__));                                          \
202*58b9f456SAndroid Build Coastguard Worker         } catch (...) {                                                                \
203*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::check;                          \
204*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
205*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
206*58b9f456SAndroid Build Coastguard Worker     } while (false)
207*58b9f456SAndroid Build Coastguard Worker #
208*58b9f456SAndroid Build Coastguard Worker 
209*58b9f456SAndroid Build Coastguard Worker # define TEST_CHECK_THROW(Except, ...)                                                 \
210*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
211*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
212*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
213*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
214*58b9f456SAndroid Build Coastguard Worker             , "TEST_CHECK_THROW(" #Except "," #__VA_ARGS__ ")", ""                     \
215*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
216*58b9f456SAndroid Build Coastguard Worker         try {                                                                          \
217*58b9f456SAndroid Build Coastguard Worker             (static_cast<void>(__VA_ARGS__));                                          \
218*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::check;                          \
219*58b9f456SAndroid Build Coastguard Worker         } catch (Except const &) {}                                                    \
220*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
221*58b9f456SAndroid Build Coastguard Worker     } while (false)
222*58b9f456SAndroid Build Coastguard Worker #
223*58b9f456SAndroid Build Coastguard Worker 
224*58b9f456SAndroid Build Coastguard Worker #define TEST_CHECK_THROW_RESULT(Except, Checker, ...)                          \
225*58b9f456SAndroid Build Coastguard Worker   do {                                                                         \
226*58b9f456SAndroid Build Coastguard Worker     TEST_SET_CHECKPOINT();                                                     \
227*58b9f456SAndroid Build Coastguard Worker     ::rapid_cxx_test::test_outcome m_f(::rapid_cxx_test::failure_type::none,   \
228*58b9f456SAndroid Build Coastguard Worker                                        __FILE__, TEST_FUNC_NAME(), __LINE__,   \
229*58b9f456SAndroid Build Coastguard Worker                                        "TEST_CHECK_THROW_RESULT(" #Except      \
230*58b9f456SAndroid Build Coastguard Worker                                        "," #Checker "," #__VA_ARGS__ ")",      \
231*58b9f456SAndroid Build Coastguard Worker                                        "");                                    \
232*58b9f456SAndroid Build Coastguard Worker     try {                                                                      \
233*58b9f456SAndroid Build Coastguard Worker       (static_cast<void>(__VA_ARGS__));                                        \
234*58b9f456SAndroid Build Coastguard Worker       m_f.type = ::rapid_cxx_test::failure_type::check;                        \
235*58b9f456SAndroid Build Coastguard Worker     } catch (Except const& Caught) {                                           \
236*58b9f456SAndroid Build Coastguard Worker       Checker(Caught);                                                         \
237*58b9f456SAndroid Build Coastguard Worker     }                                                                          \
238*58b9f456SAndroid Build Coastguard Worker     ::rapid_cxx_test::get_reporter().report(m_f);                              \
239*58b9f456SAndroid Build Coastguard Worker   } while (false)
240*58b9f456SAndroid Build Coastguard Worker #
241*58b9f456SAndroid Build Coastguard Worker 
242*58b9f456SAndroid Build Coastguard Worker #else // TEST_HAS_NO_EXCEPTIONS
243*58b9f456SAndroid Build Coastguard Worker 
244*58b9f456SAndroid Build Coastguard Worker # define TEST_CHECK_NO_THROW(...)                                                      \
245*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
246*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
247*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
248*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
249*58b9f456SAndroid Build Coastguard Worker             , "TEST_CHECK_NO_THROW(" #__VA_ARGS__ ")", ""                              \
250*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
251*58b9f456SAndroid Build Coastguard Worker         (static_cast<void>(__VA_ARGS__));                                              \
252*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
253*58b9f456SAndroid Build Coastguard Worker     } while (false)
254*58b9f456SAndroid Build Coastguard Worker #
255*58b9f456SAndroid Build Coastguard Worker 
256*58b9f456SAndroid Build Coastguard Worker #define TEST_CHECK_THROW(Except, ...) ((void)0)
257*58b9f456SAndroid Build Coastguard Worker #define TEST_CHECK_THROW_RESULT(Except, Checker, ...) ((void)0)
258*58b9f456SAndroid Build Coastguard Worker 
259*58b9f456SAndroid Build Coastguard Worker #endif // TEST_HAS_NO_EXCEPTIONS
260*58b9f456SAndroid Build Coastguard Worker 
261*58b9f456SAndroid Build Coastguard Worker 
262*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
263*58b9f456SAndroid Build Coastguard Worker //                    TEST_REQUIRE_NO_THROW / TEST_REQUIRE_THROWs
264*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
265*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS
266*58b9f456SAndroid Build Coastguard Worker 
267*58b9f456SAndroid Build Coastguard Worker # define TEST_REQUIRE_NO_THROW(...)                                                    \
268*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
269*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
270*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
271*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
272*58b9f456SAndroid Build Coastguard Worker             , "TEST_REQUIRE_NO_THROW(" #__VA_ARGS__ ")", ""                            \
273*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
274*58b9f456SAndroid Build Coastguard Worker         try {                                                                          \
275*58b9f456SAndroid Build Coastguard Worker             (static_cast<void>(__VA_ARGS__));                                          \
276*58b9f456SAndroid Build Coastguard Worker         } catch (...) {                                                                \
277*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::require;                        \
278*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
279*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
280*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
281*58b9f456SAndroid Build Coastguard Worker             return;                                                                    \
282*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
283*58b9f456SAndroid Build Coastguard Worker     } while (false)
284*58b9f456SAndroid Build Coastguard Worker #
285*58b9f456SAndroid Build Coastguard Worker 
286*58b9f456SAndroid Build Coastguard Worker # define TEST_REQUIRE_THROW(Except, ...)                                               \
287*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
288*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
289*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
290*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
291*58b9f456SAndroid Build Coastguard Worker             , "TEST_REQUIRE_THROW(" #Except "," #__VA_ARGS__ ")", ""                   \
292*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
293*58b9f456SAndroid Build Coastguard Worker         try {                                                                          \
294*58b9f456SAndroid Build Coastguard Worker             (static_cast<void>(__VA_ARGS__));                                          \
295*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::require;                        \
296*58b9f456SAndroid Build Coastguard Worker         } catch (Except const &) {}                                                    \
297*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
298*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
299*58b9f456SAndroid Build Coastguard Worker             return;                                                                    \
300*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
301*58b9f456SAndroid Build Coastguard Worker     } while (false)
302*58b9f456SAndroid Build Coastguard Worker #
303*58b9f456SAndroid Build Coastguard Worker 
304*58b9f456SAndroid Build Coastguard Worker #else // TEST_HAS_NO_EXCEPTIONS
305*58b9f456SAndroid Build Coastguard Worker 
306*58b9f456SAndroid Build Coastguard Worker # define TEST_REQUIRE_NO_THROW(...)                                                    \
307*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
308*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
309*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
310*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
311*58b9f456SAndroid Build Coastguard Worker             , "TEST_REQUIRE_NO_THROW(" #__VA_ARGS__ ")", ""                            \
312*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
313*58b9f456SAndroid Build Coastguard Worker         (static_cast<void>(__VA_ARGS__));                                              \
314*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
315*58b9f456SAndroid Build Coastguard Worker     } while (false)
316*58b9f456SAndroid Build Coastguard Worker #
317*58b9f456SAndroid Build Coastguard Worker 
318*58b9f456SAndroid Build Coastguard Worker #define TEST_REQUIRE_THROW(Except, ...) ((void)0)
319*58b9f456SAndroid Build Coastguard Worker 
320*58b9f456SAndroid Build Coastguard Worker #endif // TEST_HAS_NO_EXCEPTIONS
321*58b9f456SAndroid Build Coastguard Worker 
322*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
323*58b9f456SAndroid Build Coastguard Worker //                    TEST_ASSERT_NO_THROW / TEST_ASSERT_THROW
324*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
325*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS
326*58b9f456SAndroid Build Coastguard Worker 
327*58b9f456SAndroid Build Coastguard Worker # define TEST_ASSERT_NO_THROW(...)                                                     \
328*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
329*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
330*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
331*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
332*58b9f456SAndroid Build Coastguard Worker             , "TEST_ASSERT_NO_THROW(" #__VA_ARGS__ ")", ""                             \
333*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
334*58b9f456SAndroid Build Coastguard Worker         try {                                                                          \
335*58b9f456SAndroid Build Coastguard Worker             (static_cast<void>(__VA_ARGS__));                                          \
336*58b9f456SAndroid Build Coastguard Worker         } catch (...) {                                                                \
337*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::assert;                         \
338*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
339*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
340*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
341*58b9f456SAndroid Build Coastguard Worker             std::abort();                                                              \
342*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
343*58b9f456SAndroid Build Coastguard Worker     } while (false)
344*58b9f456SAndroid Build Coastguard Worker #
345*58b9f456SAndroid Build Coastguard Worker 
346*58b9f456SAndroid Build Coastguard Worker # define TEST_ASSERT_THROW(Except, ...)                                                \
347*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
348*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
349*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
350*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
351*58b9f456SAndroid Build Coastguard Worker             , "TEST_ASSERT_THROW(" #Except "," #__VA_ARGS__ ")", ""                    \
352*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
353*58b9f456SAndroid Build Coastguard Worker         try {                                                                          \
354*58b9f456SAndroid Build Coastguard Worker             (static_cast<void>(__VA_ARGS__));                                          \
355*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::assert;                         \
356*58b9f456SAndroid Build Coastguard Worker         } catch (Except const &) {}                                                    \
357*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
358*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
359*58b9f456SAndroid Build Coastguard Worker             std::abort();                                                              \
360*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
361*58b9f456SAndroid Build Coastguard Worker     } while (false)
362*58b9f456SAndroid Build Coastguard Worker #
363*58b9f456SAndroid Build Coastguard Worker 
364*58b9f456SAndroid Build Coastguard Worker #else // TEST_HAS_NO_EXCEPTIONS
365*58b9f456SAndroid Build Coastguard Worker 
366*58b9f456SAndroid Build Coastguard Worker # define TEST_ASSERT_NO_THROW(...)                                                     \
367*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
368*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
369*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
370*58b9f456SAndroid Build Coastguard Worker             ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__ \
371*58b9f456SAndroid Build Coastguard Worker             , "TEST_ASSERT_NO_THROW(" #__VA_ARGS__ ")", ""                             \
372*58b9f456SAndroid Build Coastguard Worker             );                                                                         \
373*58b9f456SAndroid Build Coastguard Worker         (static_cast<void>(__VA_ARGS__));                                              \
374*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
375*58b9f456SAndroid Build Coastguard Worker     } while (false)
376*58b9f456SAndroid Build Coastguard Worker #
377*58b9f456SAndroid Build Coastguard Worker 
378*58b9f456SAndroid Build Coastguard Worker #define TEST_ASSERT_THROW(Except, ...) ((void)0)
379*58b9f456SAndroid Build Coastguard Worker 
380*58b9f456SAndroid Build Coastguard Worker #endif // TEST_HAS_NO_EXCEPTIONS
381*58b9f456SAndroid Build Coastguard Worker 
382*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
383*58b9f456SAndroid Build Coastguard Worker //
384*58b9f456SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
385*58b9f456SAndroid Build Coastguard Worker 
386*58b9f456SAndroid Build Coastguard Worker # define TEST_WARN_EQUAL_COLLECTIONS(...)                                              \
387*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
388*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
389*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
390*58b9f456SAndroid Build Coastguard Worker           ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__   \
391*58b9f456SAndroid Build Coastguard Worker           , "TEST_WARN_EQUAL_COLLECTIONS(" #__VA_ARGS__ ")", ""                        \
392*58b9f456SAndroid Build Coastguard Worker         );                                                                             \
393*58b9f456SAndroid Build Coastguard Worker         if (not ::rapid_cxx_test::detail::check_equal_collections_impl(__VA_ARGS__)) { \
394*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::warn;                           \
395*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
396*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
397*58b9f456SAndroid Build Coastguard Worker     } while (false)
398*58b9f456SAndroid Build Coastguard Worker #
399*58b9f456SAndroid Build Coastguard Worker 
400*58b9f456SAndroid Build Coastguard Worker # define TEST_CHECK_EQUAL_COLLECTIONS(...)                                             \
401*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
402*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
403*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
404*58b9f456SAndroid Build Coastguard Worker           ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__   \
405*58b9f456SAndroid Build Coastguard Worker           , "TEST_CHECK_EQUAL_COLLECTIONS(" #__VA_ARGS__ ")", ""                       \
406*58b9f456SAndroid Build Coastguard Worker         );                                                                             \
407*58b9f456SAndroid Build Coastguard Worker         if (not ::rapid_cxx_test::detail::check_equal_collections_impl(__VA_ARGS__)) { \
408*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::check;                          \
409*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
410*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
411*58b9f456SAndroid Build Coastguard Worker     } while (false)
412*58b9f456SAndroid Build Coastguard Worker #
413*58b9f456SAndroid Build Coastguard Worker 
414*58b9f456SAndroid Build Coastguard Worker # define TEST_REQUIRE_EQUAL_COLLECTIONS(...)                                           \
415*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
416*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
417*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
418*58b9f456SAndroid Build Coastguard Worker           ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__   \
419*58b9f456SAndroid Build Coastguard Worker           , "TEST_REQUIRE_EQUAL_COLLECTIONS(" #__VA_ARGS__ ")", ""                     \
420*58b9f456SAndroid Build Coastguard Worker         );                                                                             \
421*58b9f456SAndroid Build Coastguard Worker         if (not ::rapid_cxx_test::detail::check_equal_collections_impl(__VA_ARGS__)) { \
422*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::require;                        \
423*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
424*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
425*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
426*58b9f456SAndroid Build Coastguard Worker             return;                                                                    \
427*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
428*58b9f456SAndroid Build Coastguard Worker     } while (false)
429*58b9f456SAndroid Build Coastguard Worker #
430*58b9f456SAndroid Build Coastguard Worker 
431*58b9f456SAndroid Build Coastguard Worker # define TEST_ASSERT_EQUAL_COLLECTIONS(...)                                            \
432*58b9f456SAndroid Build Coastguard Worker     do {                                                                               \
433*58b9f456SAndroid Build Coastguard Worker         TEST_SET_CHECKPOINT();                                                         \
434*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::test_outcome m_f(                                            \
435*58b9f456SAndroid Build Coastguard Worker           ::rapid_cxx_test::failure_type::none, __FILE__, TEST_FUNC_NAME(), __LINE__   \
436*58b9f456SAndroid Build Coastguard Worker           , "TEST_ASSERT_EQUAL_COLLECTIONS(" #__VA_ARGS__ ")", ""                      \
437*58b9f456SAndroid Build Coastguard Worker         );                                                                             \
438*58b9f456SAndroid Build Coastguard Worker         if (not ::rapid_cxx_test::detail::check_equal_collections_impl(__VA_ARGS__)) { \
439*58b9f456SAndroid Build Coastguard Worker             m_f.type = ::rapid_cxx_test::failure_type::assert;                         \
440*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
441*58b9f456SAndroid Build Coastguard Worker         ::rapid_cxx_test::get_reporter().report(m_f);                                  \
442*58b9f456SAndroid Build Coastguard Worker         if (m_f.type != ::rapid_cxx_test::failure_type::none) {                        \
443*58b9f456SAndroid Build Coastguard Worker           ::std::abort();                                                              \
444*58b9f456SAndroid Build Coastguard Worker         }                                                                              \
445*58b9f456SAndroid Build Coastguard Worker     } while (false)
446*58b9f456SAndroid Build Coastguard Worker #
447*58b9f456SAndroid Build Coastguard Worker 
448*58b9f456SAndroid Build Coastguard Worker namespace rapid_cxx_test
449*58b9f456SAndroid Build Coastguard Worker {
450*58b9f456SAndroid Build Coastguard Worker     typedef void (*invoker_t)();
451*58b9f456SAndroid Build Coastguard Worker 
452*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
453*58b9f456SAndroid Build Coastguard Worker     struct test_case
454*58b9f456SAndroid Build Coastguard Worker     {
test_caserapid_cxx_test::test_case455*58b9f456SAndroid Build Coastguard Worker         test_case()
456*58b9f456SAndroid Build Coastguard Worker             : file(""), func(""), line(0), invoke(NULL)
457*58b9f456SAndroid Build Coastguard Worker         {}
458*58b9f456SAndroid Build Coastguard Worker 
test_caserapid_cxx_test::test_case459*58b9f456SAndroid Build Coastguard Worker         test_case(const char* file1, const char* func1, std::size_t line1,
460*58b9f456SAndroid Build Coastguard Worker                   invoker_t invoke1)
461*58b9f456SAndroid Build Coastguard Worker             : file(file1), func(func1), line(line1), invoke(invoke1)
462*58b9f456SAndroid Build Coastguard Worker         {}
463*58b9f456SAndroid Build Coastguard Worker 
464*58b9f456SAndroid Build Coastguard Worker         const char *file;
465*58b9f456SAndroid Build Coastguard Worker         const char *func;
466*58b9f456SAndroid Build Coastguard Worker         std::size_t line;
467*58b9f456SAndroid Build Coastguard Worker         invoker_t invoke;
468*58b9f456SAndroid Build Coastguard Worker     };
469*58b9f456SAndroid Build Coastguard Worker 
470*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
471*58b9f456SAndroid Build Coastguard Worker     struct failure_type
472*58b9f456SAndroid Build Coastguard Worker     {
473*58b9f456SAndroid Build Coastguard Worker         enum enum_type {
474*58b9f456SAndroid Build Coastguard Worker             none,
475*58b9f456SAndroid Build Coastguard Worker             unsupported,
476*58b9f456SAndroid Build Coastguard Worker             warn,
477*58b9f456SAndroid Build Coastguard Worker             check,
478*58b9f456SAndroid Build Coastguard Worker             require,
479*58b9f456SAndroid Build Coastguard Worker             assert,
480*58b9f456SAndroid Build Coastguard Worker             uncaught_exception
481*58b9f456SAndroid Build Coastguard Worker         };
482*58b9f456SAndroid Build Coastguard Worker     };
483*58b9f456SAndroid Build Coastguard Worker 
484*58b9f456SAndroid Build Coastguard Worker     typedef failure_type::enum_type failure_type_t;
485*58b9f456SAndroid Build Coastguard Worker 
486*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
487*58b9f456SAndroid Build Coastguard Worker     struct test_outcome
488*58b9f456SAndroid Build Coastguard Worker     {
test_outcomerapid_cxx_test::test_outcome489*58b9f456SAndroid Build Coastguard Worker         test_outcome()
490*58b9f456SAndroid Build Coastguard Worker             : type(failure_type::none),
491*58b9f456SAndroid Build Coastguard Worker               file(""), func(""), line(0),
492*58b9f456SAndroid Build Coastguard Worker               expression(""), message("")
493*58b9f456SAndroid Build Coastguard Worker         {}
494*58b9f456SAndroid Build Coastguard Worker 
test_outcomerapid_cxx_test::test_outcome495*58b9f456SAndroid Build Coastguard Worker         test_outcome(failure_type_t type1, const char* file1, const char* func1,
496*58b9f456SAndroid Build Coastguard Worker                      std::size_t line1, const char* expression1,
497*58b9f456SAndroid Build Coastguard Worker                      const char* message1)
498*58b9f456SAndroid Build Coastguard Worker             : type(type1), file(file1), func(func1), line(line1),
499*58b9f456SAndroid Build Coastguard Worker               expression(expression1), message(message1)
500*58b9f456SAndroid Build Coastguard Worker         {
501*58b9f456SAndroid Build Coastguard Worker             trim_func_string();
502*58b9f456SAndroid Build Coastguard Worker         }
503*58b9f456SAndroid Build Coastguard Worker 
504*58b9f456SAndroid Build Coastguard Worker         failure_type_t type;
505*58b9f456SAndroid Build Coastguard Worker         const char *file;
506*58b9f456SAndroid Build Coastguard Worker         const char *func;
507*58b9f456SAndroid Build Coastguard Worker         std::size_t line;
508*58b9f456SAndroid Build Coastguard Worker         const char *expression;
509*58b9f456SAndroid Build Coastguard Worker         const char *message;
510*58b9f456SAndroid Build Coastguard Worker 
511*58b9f456SAndroid Build Coastguard Worker     private:
trim_file_stringrapid_cxx_test::test_outcome512*58b9f456SAndroid Build Coastguard Worker         void trim_file_string() {
513*58b9f456SAndroid Build Coastguard Worker             const char* f_start  = file;
514*58b9f456SAndroid Build Coastguard Worker             const char* prev_start = f_start;
515*58b9f456SAndroid Build Coastguard Worker             const char* last_start = f_start;
516*58b9f456SAndroid Build Coastguard Worker             char last;
517*58b9f456SAndroid Build Coastguard Worker             while ((last = *f_start) != '\0') {
518*58b9f456SAndroid Build Coastguard Worker                 ++f_start;
519*58b9f456SAndroid Build Coastguard Worker                 if (last == '/' && *f_start) {
520*58b9f456SAndroid Build Coastguard Worker                     prev_start = last_start;
521*58b9f456SAndroid Build Coastguard Worker                     last_start = f_start;
522*58b9f456SAndroid Build Coastguard Worker                 }
523*58b9f456SAndroid Build Coastguard Worker             }
524*58b9f456SAndroid Build Coastguard Worker             file = prev_start;
525*58b9f456SAndroid Build Coastguard Worker         }
trim_func_stringrapid_cxx_test::test_outcome526*58b9f456SAndroid Build Coastguard Worker       void trim_func_string() {
527*58b9f456SAndroid Build Coastguard Worker           const char* void_loc = ::strstr(func, "void ");
528*58b9f456SAndroid Build Coastguard Worker           if (void_loc == func) {
529*58b9f456SAndroid Build Coastguard Worker               func += strlen("void ");
530*58b9f456SAndroid Build Coastguard Worker           }
531*58b9f456SAndroid Build Coastguard Worker           const char* namespace_loc = ::strstr(func, "::");
532*58b9f456SAndroid Build Coastguard Worker           if (namespace_loc) {
533*58b9f456SAndroid Build Coastguard Worker               func = namespace_loc + 2;
534*58b9f456SAndroid Build Coastguard Worker           }
535*58b9f456SAndroid Build Coastguard Worker       }
536*58b9f456SAndroid Build Coastguard Worker     };
537*58b9f456SAndroid Build Coastguard Worker 
538*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
539*58b9f456SAndroid Build Coastguard Worker     struct checkpoint
540*58b9f456SAndroid Build Coastguard Worker     {
541*58b9f456SAndroid Build Coastguard Worker         const char *file;
542*58b9f456SAndroid Build Coastguard Worker         const char *func;
543*58b9f456SAndroid Build Coastguard Worker         std::size_t line;
544*58b9f456SAndroid Build Coastguard Worker     };
545*58b9f456SAndroid Build Coastguard Worker 
546*58b9f456SAndroid Build Coastguard Worker     namespace detail
547*58b9f456SAndroid Build Coastguard Worker     {
global_checkpoint()548*58b9f456SAndroid Build Coastguard Worker         inline checkpoint & global_checkpoint()
549*58b9f456SAndroid Build Coastguard Worker         {
550*58b9f456SAndroid Build Coastguard Worker             static checkpoint cp = {"", "", 0};
551*58b9f456SAndroid Build Coastguard Worker             return cp;
552*58b9f456SAndroid Build Coastguard Worker         }
553*58b9f456SAndroid Build Coastguard Worker     }
554*58b9f456SAndroid Build Coastguard Worker 
555*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
set_checkpoint(const char * file,const char * func,std::size_t line)556*58b9f456SAndroid Build Coastguard Worker     inline void set_checkpoint(const char* file, const char* func, std::size_t line)
557*58b9f456SAndroid Build Coastguard Worker     {
558*58b9f456SAndroid Build Coastguard Worker         checkpoint& cp = detail::global_checkpoint();
559*58b9f456SAndroid Build Coastguard Worker         cp.file = file;
560*58b9f456SAndroid Build Coastguard Worker         cp.func = func;
561*58b9f456SAndroid Build Coastguard Worker         cp.line = line;
562*58b9f456SAndroid Build Coastguard Worker     }
563*58b9f456SAndroid Build Coastguard Worker 
564*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
get_checkpoint()565*58b9f456SAndroid Build Coastguard Worker     inline checkpoint const & get_checkpoint()
566*58b9f456SAndroid Build Coastguard Worker     {
567*58b9f456SAndroid Build Coastguard Worker         return detail::global_checkpoint();
568*58b9f456SAndroid Build Coastguard Worker     }
569*58b9f456SAndroid Build Coastguard Worker 
570*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
571*58b9f456SAndroid Build Coastguard Worker     class test_suite
572*58b9f456SAndroid Build Coastguard Worker     {
573*58b9f456SAndroid Build Coastguard Worker     public:
574*58b9f456SAndroid Build Coastguard Worker         typedef test_case const* iterator;
575*58b9f456SAndroid Build Coastguard Worker         typedef iterator const_iterator;
576*58b9f456SAndroid Build Coastguard Worker 
577*58b9f456SAndroid Build Coastguard Worker     public:
test_suite(const char * xname)578*58b9f456SAndroid Build Coastguard Worker         test_suite(const char *xname)
579*58b9f456SAndroid Build Coastguard Worker           : m_name(xname), m_tests(), m_size(0)
580*58b9f456SAndroid Build Coastguard Worker         {
581*58b9f456SAndroid Build Coastguard Worker             assert(xname);
582*58b9f456SAndroid Build Coastguard Worker         }
583*58b9f456SAndroid Build Coastguard Worker 
584*58b9f456SAndroid Build Coastguard Worker     public:
name() const585*58b9f456SAndroid Build Coastguard Worker         const char *name() const { return m_name; }
586*58b9f456SAndroid Build Coastguard Worker 
size() const587*58b9f456SAndroid Build Coastguard Worker         std::size_t size() const { return m_size; }
588*58b9f456SAndroid Build Coastguard Worker 
operator [](std::size_t i) const589*58b9f456SAndroid Build Coastguard Worker         test_case const & operator[](std::size_t i) const
590*58b9f456SAndroid Build Coastguard Worker         {
591*58b9f456SAndroid Build Coastguard Worker             assert(i < m_size);
592*58b9f456SAndroid Build Coastguard Worker             return m_tests[i];
593*58b9f456SAndroid Build Coastguard Worker         }
594*58b9f456SAndroid Build Coastguard Worker 
begin() const595*58b9f456SAndroid Build Coastguard Worker         const_iterator begin() const
596*58b9f456SAndroid Build Coastguard Worker         { return m_tests; }
597*58b9f456SAndroid Build Coastguard Worker 
end() const598*58b9f456SAndroid Build Coastguard Worker         const_iterator end() const
599*58b9f456SAndroid Build Coastguard Worker         {
600*58b9f456SAndroid Build Coastguard Worker             return m_tests + m_size;
601*58b9f456SAndroid Build Coastguard Worker         }
602*58b9f456SAndroid Build Coastguard Worker 
603*58b9f456SAndroid Build Coastguard Worker     public:
register_test(test_case tc)604*58b9f456SAndroid Build Coastguard Worker         std::size_t register_test(test_case tc)
605*58b9f456SAndroid Build Coastguard Worker         {
606*58b9f456SAndroid Build Coastguard Worker             static std::size_t test_case_max = sizeof(m_tests) / sizeof(test_case);
607*58b9f456SAndroid Build Coastguard Worker             assert(m_size < test_case_max);
608*58b9f456SAndroid Build Coastguard Worker             m_tests[m_size] = tc;
609*58b9f456SAndroid Build Coastguard Worker             return m_size++;
610*58b9f456SAndroid Build Coastguard Worker         }
611*58b9f456SAndroid Build Coastguard Worker 
612*58b9f456SAndroid Build Coastguard Worker     private:
613*58b9f456SAndroid Build Coastguard Worker         test_suite(test_suite const &);
614*58b9f456SAndroid Build Coastguard Worker         test_suite & operator=(test_suite const &);
615*58b9f456SAndroid Build Coastguard Worker 
616*58b9f456SAndroid Build Coastguard Worker     private:
617*58b9f456SAndroid Build Coastguard Worker         const char* m_name;
618*58b9f456SAndroid Build Coastguard Worker         // Since fast compile times in a priority, we use simple containers
619*58b9f456SAndroid Build Coastguard Worker         // with hard limits.
620*58b9f456SAndroid Build Coastguard Worker         test_case m_tests[256];
621*58b9f456SAndroid Build Coastguard Worker         std::size_t m_size;
622*58b9f456SAndroid Build Coastguard Worker     };
623*58b9f456SAndroid Build Coastguard Worker 
624*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
625*58b9f456SAndroid Build Coastguard Worker     class registrar
626*58b9f456SAndroid Build Coastguard Worker     {
627*58b9f456SAndroid Build Coastguard Worker     public:
registrar(test_suite & st,test_case tc)628*58b9f456SAndroid Build Coastguard Worker         registrar(test_suite & st, test_case tc)
629*58b9f456SAndroid Build Coastguard Worker         {
630*58b9f456SAndroid Build Coastguard Worker             st.register_test(tc);
631*58b9f456SAndroid Build Coastguard Worker         }
632*58b9f456SAndroid Build Coastguard Worker     };
633*58b9f456SAndroid Build Coastguard Worker 
634*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
635*58b9f456SAndroid Build Coastguard Worker     class test_reporter
636*58b9f456SAndroid Build Coastguard Worker     {
637*58b9f456SAndroid Build Coastguard Worker     public:
test_reporter()638*58b9f456SAndroid Build Coastguard Worker         test_reporter()
639*58b9f456SAndroid Build Coastguard Worker             : m_testcases(0), m_testcase_failures(0), m_unsupported(0),
640*58b9f456SAndroid Build Coastguard Worker               m_assertions(0), m_warning_failures(0), m_check_failures(0),
641*58b9f456SAndroid Build Coastguard Worker               m_require_failures(0), m_uncaught_exceptions(0), m_failure()
642*58b9f456SAndroid Build Coastguard Worker         {
643*58b9f456SAndroid Build Coastguard Worker         }
644*58b9f456SAndroid Build Coastguard Worker 
test_case_begin()645*58b9f456SAndroid Build Coastguard Worker         void test_case_begin()
646*58b9f456SAndroid Build Coastguard Worker         {
647*58b9f456SAndroid Build Coastguard Worker             ++m_testcases;
648*58b9f456SAndroid Build Coastguard Worker             clear_failure();
649*58b9f456SAndroid Build Coastguard Worker         }
650*58b9f456SAndroid Build Coastguard Worker 
test_case_end()651*58b9f456SAndroid Build Coastguard Worker         void test_case_end()
652*58b9f456SAndroid Build Coastguard Worker         {
653*58b9f456SAndroid Build Coastguard Worker             if (m_failure.type != failure_type::none
654*58b9f456SAndroid Build Coastguard Worker                 && m_failure.type !=  failure_type::unsupported) {
655*58b9f456SAndroid Build Coastguard Worker                 ++m_testcase_failures;
656*58b9f456SAndroid Build Coastguard Worker             }
657*58b9f456SAndroid Build Coastguard Worker         }
658*58b9f456SAndroid Build Coastguard Worker 
659*58b9f456SAndroid Build Coastguard Worker # if defined(__GNUC__)
660*58b9f456SAndroid Build Coastguard Worker #   pragma GCC diagnostic push
661*58b9f456SAndroid Build Coastguard Worker #   pragma GCC diagnostic ignored "-Wswitch-default"
662*58b9f456SAndroid Build Coastguard Worker # endif
663*58b9f456SAndroid Build Coastguard Worker         // Each assertion and failure is reported through this function.
report(test_outcome o)664*58b9f456SAndroid Build Coastguard Worker         void report(test_outcome o)
665*58b9f456SAndroid Build Coastguard Worker         {
666*58b9f456SAndroid Build Coastguard Worker             ++m_assertions;
667*58b9f456SAndroid Build Coastguard Worker             switch (o.type)
668*58b9f456SAndroid Build Coastguard Worker             {
669*58b9f456SAndroid Build Coastguard Worker             case failure_type::none:
670*58b9f456SAndroid Build Coastguard Worker                 break;
671*58b9f456SAndroid Build Coastguard Worker             case failure_type::unsupported:
672*58b9f456SAndroid Build Coastguard Worker                 ++m_unsupported;
673*58b9f456SAndroid Build Coastguard Worker                 m_failure = o;
674*58b9f456SAndroid Build Coastguard Worker                 break;
675*58b9f456SAndroid Build Coastguard Worker             case failure_type::warn:
676*58b9f456SAndroid Build Coastguard Worker                 ++m_warning_failures;
677*58b9f456SAndroid Build Coastguard Worker                 report_error(o);
678*58b9f456SAndroid Build Coastguard Worker                 break;
679*58b9f456SAndroid Build Coastguard Worker             case failure_type::check:
680*58b9f456SAndroid Build Coastguard Worker                 ++m_check_failures;
681*58b9f456SAndroid Build Coastguard Worker                 report_error(o);
682*58b9f456SAndroid Build Coastguard Worker                 m_failure = o;
683*58b9f456SAndroid Build Coastguard Worker                 break;
684*58b9f456SAndroid Build Coastguard Worker             case failure_type::require:
685*58b9f456SAndroid Build Coastguard Worker                 ++m_require_failures;
686*58b9f456SAndroid Build Coastguard Worker                 report_error(o);
687*58b9f456SAndroid Build Coastguard Worker                 m_failure = o;
688*58b9f456SAndroid Build Coastguard Worker                 break;
689*58b9f456SAndroid Build Coastguard Worker             case failure_type::assert:
690*58b9f456SAndroid Build Coastguard Worker                 report_error(o);
691*58b9f456SAndroid Build Coastguard Worker                 break;
692*58b9f456SAndroid Build Coastguard Worker             case failure_type::uncaught_exception:
693*58b9f456SAndroid Build Coastguard Worker                 ++m_uncaught_exceptions;
694*58b9f456SAndroid Build Coastguard Worker                 std::fprintf(stderr
695*58b9f456SAndroid Build Coastguard Worker                     , "Test case FAILED with uncaught exception:\n"
696*58b9f456SAndroid Build Coastguard Worker                       "    last checkpoint near %s::%lu %s\n\n"
697*58b9f456SAndroid Build Coastguard Worker                     , o.file, o.line, o.func
698*58b9f456SAndroid Build Coastguard Worker                     );
699*58b9f456SAndroid Build Coastguard Worker                 m_failure = o;
700*58b9f456SAndroid Build Coastguard Worker                 break;
701*58b9f456SAndroid Build Coastguard Worker             }
702*58b9f456SAndroid Build Coastguard Worker         }
703*58b9f456SAndroid Build Coastguard Worker # if defined(__GNUC__)
704*58b9f456SAndroid Build Coastguard Worker #   pragma GCC diagnostic pop
705*58b9f456SAndroid Build Coastguard Worker # endif
706*58b9f456SAndroid Build Coastguard Worker 
current_failure() const707*58b9f456SAndroid Build Coastguard Worker         test_outcome current_failure() const
708*58b9f456SAndroid Build Coastguard Worker         {
709*58b9f456SAndroid Build Coastguard Worker             return m_failure;
710*58b9f456SAndroid Build Coastguard Worker         }
711*58b9f456SAndroid Build Coastguard Worker 
clear_failure()712*58b9f456SAndroid Build Coastguard Worker         void clear_failure()
713*58b9f456SAndroid Build Coastguard Worker         {
714*58b9f456SAndroid Build Coastguard Worker             m_failure.type = failure_type::none;
715*58b9f456SAndroid Build Coastguard Worker             m_failure.file = "";
716*58b9f456SAndroid Build Coastguard Worker             m_failure.func = "";
717*58b9f456SAndroid Build Coastguard Worker             m_failure.line = 0;
718*58b9f456SAndroid Build Coastguard Worker             m_failure.expression = "";
719*58b9f456SAndroid Build Coastguard Worker             m_failure.message = "";
720*58b9f456SAndroid Build Coastguard Worker         }
721*58b9f456SAndroid Build Coastguard Worker 
test_case_count() const722*58b9f456SAndroid Build Coastguard Worker         std::size_t test_case_count() const
723*58b9f456SAndroid Build Coastguard Worker         { return m_testcases; }
724*58b9f456SAndroid Build Coastguard Worker 
test_case_failure_count() const725*58b9f456SAndroid Build Coastguard Worker         std::size_t test_case_failure_count() const
726*58b9f456SAndroid Build Coastguard Worker         { return m_testcase_failures; }
727*58b9f456SAndroid Build Coastguard Worker 
unsupported_count() const728*58b9f456SAndroid Build Coastguard Worker         std::size_t unsupported_count() const
729*58b9f456SAndroid Build Coastguard Worker         { return m_unsupported; }
730*58b9f456SAndroid Build Coastguard Worker 
assertion_count() const731*58b9f456SAndroid Build Coastguard Worker         std::size_t assertion_count() const
732*58b9f456SAndroid Build Coastguard Worker         { return m_assertions; }
733*58b9f456SAndroid Build Coastguard Worker 
warning_failure_count() const734*58b9f456SAndroid Build Coastguard Worker         std::size_t warning_failure_count() const
735*58b9f456SAndroid Build Coastguard Worker         { return m_warning_failures; }
736*58b9f456SAndroid Build Coastguard Worker 
check_failure_count() const737*58b9f456SAndroid Build Coastguard Worker         std::size_t check_failure_count() const
738*58b9f456SAndroid Build Coastguard Worker         { return m_check_failures; }
739*58b9f456SAndroid Build Coastguard Worker 
require_failure_count() const740*58b9f456SAndroid Build Coastguard Worker         std::size_t require_failure_count() const
741*58b9f456SAndroid Build Coastguard Worker         { return m_require_failures; }
742*58b9f456SAndroid Build Coastguard Worker 
failure_count() const743*58b9f456SAndroid Build Coastguard Worker         std::size_t failure_count() const
744*58b9f456SAndroid Build Coastguard Worker         { return m_check_failures + m_require_failures + m_uncaught_exceptions; }
745*58b9f456SAndroid Build Coastguard Worker 
746*58b9f456SAndroid Build Coastguard Worker         // Print a summary of what was run and the outcome.
print_summary(const char * suitename) const747*58b9f456SAndroid Build Coastguard Worker         void print_summary(const char* suitename) const
748*58b9f456SAndroid Build Coastguard Worker         {
749*58b9f456SAndroid Build Coastguard Worker             FILE* out = failure_count() ? stderr : stdout;
750*58b9f456SAndroid Build Coastguard Worker             std::size_t testcases_run = m_testcases - m_unsupported;
751*58b9f456SAndroid Build Coastguard Worker             std::fprintf(out, "Summary for testsuite %s:\n", suitename);
752*58b9f456SAndroid Build Coastguard Worker             std::fprintf(out, "    %lu of %lu test cases passed.\n", testcases_run - m_testcase_failures, testcases_run);
753*58b9f456SAndroid Build Coastguard Worker             std::fprintf(out, "    %lu of %lu assertions passed.\n", m_assertions - (m_warning_failures + m_check_failures + m_require_failures), m_assertions);
754*58b9f456SAndroid Build Coastguard Worker             std::fprintf(out, "    %lu unsupported test case%s.\n", m_unsupported, (m_unsupported != 1 ? "s" : ""));
755*58b9f456SAndroid Build Coastguard Worker         }
756*58b9f456SAndroid Build Coastguard Worker 
757*58b9f456SAndroid Build Coastguard Worker     private:
758*58b9f456SAndroid Build Coastguard Worker         test_reporter(test_reporter const &);
759*58b9f456SAndroid Build Coastguard Worker         test_reporter const & operator=(test_reporter const &);
760*58b9f456SAndroid Build Coastguard Worker 
report_error(test_outcome o) const761*58b9f456SAndroid Build Coastguard Worker         void report_error(test_outcome o) const
762*58b9f456SAndroid Build Coastguard Worker         {
763*58b9f456SAndroid Build Coastguard Worker             std::fprintf(stderr, "In %s:%lu Assertion %s failed.\n    in file: %s\n    %s\n"
764*58b9f456SAndroid Build Coastguard Worker                 , o.func, o.line, o.expression, o.file,  o.message ? o.message : ""
765*58b9f456SAndroid Build Coastguard Worker               );
766*58b9f456SAndroid Build Coastguard Worker         }
767*58b9f456SAndroid Build Coastguard Worker 
768*58b9f456SAndroid Build Coastguard Worker     private:
769*58b9f456SAndroid Build Coastguard Worker         // counts of testcases, failed testcases, and unsupported testcases.
770*58b9f456SAndroid Build Coastguard Worker         std::size_t m_testcases;
771*58b9f456SAndroid Build Coastguard Worker         std::size_t m_testcase_failures;
772*58b9f456SAndroid Build Coastguard Worker         std::size_t m_unsupported;
773*58b9f456SAndroid Build Coastguard Worker 
774*58b9f456SAndroid Build Coastguard Worker         // counts of assertions and assertion failures.
775*58b9f456SAndroid Build Coastguard Worker         std::size_t m_assertions;
776*58b9f456SAndroid Build Coastguard Worker         std::size_t m_warning_failures;
777*58b9f456SAndroid Build Coastguard Worker         std::size_t m_check_failures;
778*58b9f456SAndroid Build Coastguard Worker         std::size_t m_require_failures;
779*58b9f456SAndroid Build Coastguard Worker         std::size_t m_uncaught_exceptions;
780*58b9f456SAndroid Build Coastguard Worker 
781*58b9f456SAndroid Build Coastguard Worker         // The last failure. This is cleared between testcases.
782*58b9f456SAndroid Build Coastguard Worker         test_outcome m_failure;
783*58b9f456SAndroid Build Coastguard Worker     };
784*58b9f456SAndroid Build Coastguard Worker 
785*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
get_reporter()786*58b9f456SAndroid Build Coastguard Worker     inline test_reporter & get_reporter()
787*58b9f456SAndroid Build Coastguard Worker     {
788*58b9f456SAndroid Build Coastguard Worker         static test_reporter o;
789*58b9f456SAndroid Build Coastguard Worker         return o;
790*58b9f456SAndroid Build Coastguard Worker     }
791*58b9f456SAndroid Build Coastguard Worker 
792*58b9f456SAndroid Build Coastguard Worker     ////////////////////////////////////////////////////////////////////////////
793*58b9f456SAndroid Build Coastguard Worker     class test_runner
794*58b9f456SAndroid Build Coastguard Worker     {
795*58b9f456SAndroid Build Coastguard Worker     public:
test_runner(test_suite & ts)796*58b9f456SAndroid Build Coastguard Worker         test_runner(test_suite & ts)
797*58b9f456SAndroid Build Coastguard Worker           : m_ts(ts)
798*58b9f456SAndroid Build Coastguard Worker         {}
799*58b9f456SAndroid Build Coastguard Worker 
800*58b9f456SAndroid Build Coastguard Worker     public:
run()801*58b9f456SAndroid Build Coastguard Worker         int run()
802*58b9f456SAndroid Build Coastguard Worker         {
803*58b9f456SAndroid Build Coastguard Worker             // for each testcase
804*58b9f456SAndroid Build Coastguard Worker             for (test_suite::const_iterator b = m_ts.begin(), e = m_ts.end();
805*58b9f456SAndroid Build Coastguard Worker                  b != e; ++b)
806*58b9f456SAndroid Build Coastguard Worker             {
807*58b9f456SAndroid Build Coastguard Worker                 test_case const& tc = *b;
808*58b9f456SAndroid Build Coastguard Worker                 set_checkpoint(tc.file, tc.func, tc.line);
809*58b9f456SAndroid Build Coastguard Worker                 get_reporter().test_case_begin();
810*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS
811*58b9f456SAndroid Build Coastguard Worker                 try {
812*58b9f456SAndroid Build Coastguard Worker #endif
813*58b9f456SAndroid Build Coastguard Worker                     tc.invoke();
814*58b9f456SAndroid Build Coastguard Worker #ifndef TEST_HAS_NO_EXCEPTIONS
815*58b9f456SAndroid Build Coastguard Worker                 } catch (...) {
816*58b9f456SAndroid Build Coastguard Worker                     test_outcome o;
817*58b9f456SAndroid Build Coastguard Worker                     o.type = failure_type::uncaught_exception;
818*58b9f456SAndroid Build Coastguard Worker                     o.file = get_checkpoint().file;
819*58b9f456SAndroid Build Coastguard Worker                     o.func = get_checkpoint().func;
820*58b9f456SAndroid Build Coastguard Worker                     o.line = get_checkpoint().line;
821*58b9f456SAndroid Build Coastguard Worker                     o.expression = "";
822*58b9f456SAndroid Build Coastguard Worker                     o.message = "";
823*58b9f456SAndroid Build Coastguard Worker                     get_reporter().report(o);
824*58b9f456SAndroid Build Coastguard Worker                 }
825*58b9f456SAndroid Build Coastguard Worker #endif
826*58b9f456SAndroid Build Coastguard Worker                 get_reporter().test_case_end();
827*58b9f456SAndroid Build Coastguard Worker             }
828*58b9f456SAndroid Build Coastguard Worker             auto exit_code = get_reporter().failure_count() ? EXIT_FAILURE : EXIT_SUCCESS;
829*58b9f456SAndroid Build Coastguard Worker             if (exit_code == EXIT_FAILURE || get_reporter().unsupported_count())
830*58b9f456SAndroid Build Coastguard Worker               get_reporter().print_summary(m_ts.name());
831*58b9f456SAndroid Build Coastguard Worker             return exit_code;
832*58b9f456SAndroid Build Coastguard Worker         }
833*58b9f456SAndroid Build Coastguard Worker 
834*58b9f456SAndroid Build Coastguard Worker     private:
835*58b9f456SAndroid Build Coastguard Worker         test_runner(test_runner const &);
836*58b9f456SAndroid Build Coastguard Worker         test_runner operator=(test_runner const &);
837*58b9f456SAndroid Build Coastguard Worker 
838*58b9f456SAndroid Build Coastguard Worker         test_suite & m_ts;
839*58b9f456SAndroid Build Coastguard Worker     };
840*58b9f456SAndroid Build Coastguard Worker 
841*58b9f456SAndroid Build Coastguard Worker     namespace detail
842*58b9f456SAndroid Build Coastguard Worker     {
843*58b9f456SAndroid Build Coastguard Worker         template <class Iter1, class Iter2>
check_equal_collections_impl(Iter1 start1,Iter1 const end1,Iter2 start2,Iter2 const end2)844*58b9f456SAndroid Build Coastguard Worker         bool check_equal_collections_impl(
845*58b9f456SAndroid Build Coastguard Worker             Iter1 start1, Iter1 const end1
846*58b9f456SAndroid Build Coastguard Worker           , Iter2 start2, Iter2 const end2
847*58b9f456SAndroid Build Coastguard Worker           )
848*58b9f456SAndroid Build Coastguard Worker         {
849*58b9f456SAndroid Build Coastguard Worker             while (start1 != end1 && start2 != end2) {
850*58b9f456SAndroid Build Coastguard Worker                 if (*start1 != *start2) {
851*58b9f456SAndroid Build Coastguard Worker                     return false;
852*58b9f456SAndroid Build Coastguard Worker                 }
853*58b9f456SAndroid Build Coastguard Worker                 ++start1; ++start2;
854*58b9f456SAndroid Build Coastguard Worker             }
855*58b9f456SAndroid Build Coastguard Worker             return (start1 == end1 && start2 == end2);
856*58b9f456SAndroid Build Coastguard Worker         }
857*58b9f456SAndroid Build Coastguard Worker     }                                                       // namespace detail
858*58b9f456SAndroid Build Coastguard Worker 
859*58b9f456SAndroid Build Coastguard Worker }                                                    // namespace rapid_cxx_test
860*58b9f456SAndroid Build Coastguard Worker 
861*58b9f456SAndroid Build Coastguard Worker 
862*58b9f456SAndroid Build Coastguard Worker # if defined(__GNUC__)
863*58b9f456SAndroid Build Coastguard Worker #   pragma GCC diagnostic pop
864*58b9f456SAndroid Build Coastguard Worker # endif
865*58b9f456SAndroid Build Coastguard Worker 
866*58b9f456SAndroid Build Coastguard Worker #endif /* RAPID_CXX_TEST_HPP */
867