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