forked from mapnik/mapnik
-
Notifications
You must be signed in to change notification settings - Fork 1
/
catch_ext.hpp
41 lines (31 loc) · 1.51 KB
/
catch_ext.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef TEST_CATCH_EXT_HPP
#define TEST_CATCH_EXT_HPP
#include "catch.hpp"
#ifdef __clang__
# pragma clang system_header
#elif defined __GNUC__
# pragma GCC system_header
#endif
///////////////////////////////////////////////////////////////////////////////
// this checks the result of expr like INTERNAL_CATCH_TEST, but also uses
// resultDisposition for exceptions like INTERNAL_CATCH_NO_THROW
#define EXTERNAL_CATCH_NO_THROW_TEST( expr, resultDisposition, macroName ) \
do { \
Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
try { \
( __catchResult <= expr ).endExpression(); \
} \
catch( ... ) { \
__catchResult.useActiveException( resultDisposition ); \
} \
INTERNAL_CATCH_REACT( __catchResult ) \
} while( Catch::isTrue( false && (expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
//////
// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
#ifdef CATCH_CONFIG_PREFIX_ALL
#define CATCH_NOTHROW_CHECK( expr ) EXTERNAL_CATCH_NO_THROW_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_NOTHROW_CHECK" )
#else
// basically CHECK_NOTHROW(expr) && CHECK(expr), which cannot be done with those macros because they expand to statements
#define NOTHROW_CHECK( expr ) EXTERNAL_CATCH_NO_THROW_TEST( expr, Catch::ResultDisposition::ContinueOnFailure, "NOTHROW_CHECK" )
#endif
#endif // TEST_CATCH_EXT_HPP