22
22
23
23
#include " check.h"
24
24
#include " color.h"
25
+ #include " config.h"
25
26
#include " errorlogger.h"
26
27
#include " platform.h"
27
28
#include " settings.h"
28
29
#include " standards.h"
29
30
30
31
#include < cstddef>
31
32
#include < cstdint>
33
+ #include < exception>
32
34
#include < list>
33
35
#include < memory>
34
36
#include < sstream>
@@ -69,6 +71,8 @@ class TestFixture : public ErrorLogger {
69
71
virtual void teardownTestInternal () {}
70
72
std::string getLocationStr (const char * filename, unsigned int linenr) const ;
71
73
74
+ class AssertFailedError : public std ::exception {};
75
+
72
76
void assert_ (const char * filename, unsigned int linenr, bool condition, const std::string& msg = " " ) const ;
73
77
74
78
template <typename T>
@@ -113,9 +117,9 @@ class TestFixture : public ErrorLogger {
113
117
const char current[], const std::string &actual) const ;
114
118
void todoAssertEquals (const char * filename, unsigned int linenr, long long wanted,
115
119
long long current, long long actual) const ;
116
- void assertThrow (const char * filename, unsigned int linenr) const ;
117
- void assertThrowFail (const char * filename, unsigned int linenr) const ;
118
- void assertNoThrowFail (const char * filename, unsigned int linenr) const ;
120
+ NORETURN void assertThrow (const char * filename, unsigned int linenr) const ;
121
+ NORETURN void assertThrowFail (const char * filename, unsigned int linenr) const ;
122
+ void assertNoThrowFail (const char * filename, unsigned int linenr, bool bailout ) const ;
119
123
static std::string deleteLineNumber (const std::string &message);
120
124
121
125
void setVerbose (bool v) {
@@ -279,7 +283,7 @@ class TestFixture : public ErrorLogger {
279
283
private:
280
284
// Helper function to be called when an assertEquals assertion fails.
281
285
// Writes the appropriate failure message to errmsg and increments fails_counter
282
- void assertFailure (const char * filename, unsigned int linenr, const std::string& expected, const std::string& actual, const std::string& msg) const ;
286
+ NORETURN void assertFailure (const char * filename, unsigned int linenr, const std::string& expected, const std::string& actual, const std::string& msg) const ;
283
287
284
288
std::ostringstream mOutput ;
285
289
std::ostringstream mErrout ;
@@ -309,14 +313,13 @@ class TestInstance {
309
313
std::unique_ptr<TestFixture> impl;
310
314
};
311
315
312
- #define TEST_CASE ( NAME ) do { if (prepareTest (#NAME)) { setVerbose (false ); try { NAME (); teardownTest (); } catch (...) { assertNoThrowFail (__FILE__, __LINE__); } } } while (false )
316
+ #define TEST_CASE ( NAME ) do { if (prepareTest (#NAME)) { setVerbose (false ); try { NAME (); teardownTest (); } catch (const AssertFailedError&) {} catch ( ...) { assertNoThrowFail (__FILE__, __LINE__, false ); } } } while (false )
313
317
314
- // TODO: the asserts do not actually assert i.e. do stop executing the test
315
318
#define ASSERT ( CONDITION ) assert_(__FILE__, __LINE__, (CONDITION))
316
319
#define ASSERT_LOC ( CONDITION, FILE_, LINE_ ) assert_(FILE_, LINE_, (CONDITION))
317
320
#define ASSERT_LOC_MSG ( CONDITION, MSG, FILE_, LINE_ ) assert_(FILE_, LINE_, (CONDITION), MSG)
318
321
// *INDENT-OFF*
319
- #define ASSERT_EQUALS ( EXPECTED, ACTUAL ) do { try { assertEquals (__FILE__, __LINE__, (EXPECTED), (ACTUAL)); } catch (...) { assertNoThrowFail (__FILE__, __LINE__); } } while (false )
322
+ #define ASSERT_EQUALS ( EXPECTED, ACTUAL ) do { try { assertEquals (__FILE__, __LINE__, (EXPECTED), (ACTUAL)); } catch ( const AssertFailedError&) { throw ; } catch (...) { assertNoThrowFail (__FILE__, __LINE__, true ); } } while (false )
320
323
// *INDENT-ON*
321
324
#define ASSERT_EQUALS_WITHOUT_LINENUMBERS ( EXPECTED, ACTUAL ) assertEqualsWithoutLineNumbers(__FILE__, __LINE__, EXPECTED, ACTUAL)
322
325
#define ASSERT_EQUALS_DOUBLE ( EXPECTED, ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE)
@@ -328,15 +331,17 @@ class TestInstance {
328
331
#define ASSERT_EQUALS_ENUM_LOC_MSG ( EXPECTED, ACTUAL, MSG, FILE_, LINE_ ) assertEqualsEnum(FILE_, LINE_, (EXPECTED), (ACTUAL), MSG)
329
332
#define TODO_ASSERT_EQUALS_ENUM ( WANTED, CURRENT, ACTUAL ) todoAssertEqualsEnum(__FILE__, __LINE__, WANTED, CURRENT, ACTUAL)
330
333
#define ASSERT_THROW_EQUALS ( CMD, EXCEPTION, EXPECTED ) do { try { (void )(CMD); assertThrowFail (__FILE__, __LINE__); } catch (const EXCEPTION&e) { assertEquals (__FILE__, __LINE__, EXPECTED, e.errorMessage ); } catch (...) { assertThrowFail (__FILE__, __LINE__); } } while (false )
331
- #define ASSERT_THROW_EQUALS_2 ( CMD, EXCEPTION, EXPECTED ) do { try { (void )(CMD); assertThrowFail (__FILE__, __LINE__); } catch (const EXCEPTION&e) { assertEquals (__FILE__, __LINE__, EXPECTED, e.what ()); } catch (...) { assertThrowFail (__FILE__, __LINE__); } } while (false )
332
- #define ASSERT_THROW_INTERNAL ( CMD, TYPE ) do { try { (void )(CMD); assertThrowFail (__FILE__, __LINE__); } catch (const InternalError& e) { assertEqualsEnum (__FILE__, __LINE__, InternalError::TYPE, e.type ); } catch (...) { assertThrowFail (__FILE__, __LINE__); } } while (false )
333
- #define ASSERT_THROW_INTERNAL_EQUALS ( CMD, TYPE, EXPECTED ) do { try { (void )(CMD); assertThrowFail (__FILE__, __LINE__); } catch (const InternalError& e) { assertEqualsEnum (__FILE__, __LINE__, InternalError::TYPE, e.type ); assertEquals (__FILE__, __LINE__, EXPECTED, e.errorMessage ); } catch (...) { assertThrowFail (__FILE__, __LINE__); } } while (false )
334
- #define ASSERT_NO_THROW ( CMD ) do { try { (void )(CMD); } catch (...) { assertNoThrowFail (__FILE__, __LINE__); } } while (false )
335
- #define TODO_ASSERT_THROW ( CMD, EXCEPTION ) do { try { (void )(CMD); } catch (const EXCEPTION&) {} catch (...) { assertThrow (__FILE__, __LINE__); } } while (false )
334
+ #define ASSERT_THROW_EQUALS_2 ( CMD, EXCEPTION, EXPECTED ) do { try { (void )(CMD); assertThrowFail (__FILE__, __LINE__); } catch (const AssertFailedError&) { throw ; } catch ( const EXCEPTION&e) { assertEquals (__FILE__, __LINE__, EXPECTED, e.what ()); } catch (...) { assertThrowFail (__FILE__, __LINE__); } } while (false )
335
+ #define ASSERT_THROW_INTERNAL ( CMD, TYPE ) do { try { (void )(CMD); assertThrowFail (__FILE__, __LINE__); } catch (const AssertFailedError&) { throw ; } catch ( const InternalError& e) { assertEqualsEnum (__FILE__, __LINE__, InternalError::TYPE, e.type ); } catch (...) { assertThrowFail (__FILE__, __LINE__); } } while (false )
336
+ #define ASSERT_THROW_INTERNAL_EQUALS ( CMD, TYPE, EXPECTED ) do { try { (void )(CMD); assertThrowFail (__FILE__, __LINE__); } catch (const AssertFailedError&) { throw ; } catch ( const InternalError& e) { assertEqualsEnum (__FILE__, __LINE__, InternalError::TYPE, e.type ); assertEquals (__FILE__, __LINE__, EXPECTED, e.errorMessage ); } catch (...) { assertThrowFail (__FILE__, __LINE__); } } while (false )
337
+ #define ASSERT_NO_THROW ( CMD ) do { try { (void )(CMD); } catch (const AssertFailedError&) { throw ; } catch ( ...) { assertNoThrowFail (__FILE__, __LINE__, true ); } } while (false )
338
+ #define TODO_ASSERT_THROW ( CMD, EXCEPTION ) do { try { (void )(CMD); } catch (const AssertFailedError&) { throw ; } catch ( const EXCEPTION&) {} catch (...) { assertThrow (__FILE__, __LINE__); } } while (false )
336
339
#define TODO_ASSERT ( CONDITION ) do { const bool condition=(CONDITION); todoAssertEquals (__FILE__, __LINE__, true , false , condition); } while (false )
337
340
#define TODO_ASSERT_EQUALS ( WANTED, CURRENT, ACTUAL ) todoAssertEquals(__FILE__, __LINE__, WANTED, CURRENT, ACTUAL)
338
341
342
+ // *INDENT-OFF*
339
343
#define REGISTER_TEST ( CLASSNAME ) namespace { class CLASSNAME ## Instance : public TestInstance { public: CLASSNAME ## Instance() : TestInstance(#CLASSNAME) {} TestFixture* create () override { impl.reset (new CLASSNAME); return impl.get (); } }; CLASSNAME ## Instance instance_ ## CLASSNAME; }
344
+ // *INDENT-ON*
340
345
341
346
#define PLATFORM ( P, T ) do { std::string errstr; assertEquals (__FILE__, __LINE__, true , P.set (Platform::toString (T), errstr, {exename}), errstr); } while (false )
342
347
0 commit comments