2222
2323#include " check.h"
2424#include " color.h"
25+ #include " config.h"
2526#include " errorlogger.h"
2627#include " platform.h"
2728#include " settings.h"
2829#include " standards.h"
2930
3031#include < cstddef>
3132#include < cstdint>
33+ #include < exception>
3234#include < list>
3335#include < memory>
3436#include < sstream>
@@ -69,6 +71,8 @@ class TestFixture : public ErrorLogger {
6971 virtual void teardownTestInternal () {}
7072 std::string getLocationStr (const char * filename, unsigned int linenr) const ;
7173
74+ class AssertFailedError : public std ::exception {};
75+
7276 void assert_ (const char * filename, unsigned int linenr, bool condition, const std::string& msg = " " ) const ;
7377
7478 template <typename T>
@@ -113,9 +117,9 @@ class TestFixture : public ErrorLogger {
113117 const char current[], const std::string &actual) const ;
114118 void todoAssertEquals (const char * filename, unsigned int linenr, long long wanted,
115119 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 ;
119123 static std::string deleteLineNumber (const std::string &message);
120124
121125 void setVerbose (bool v) {
@@ -279,7 +283,7 @@ class TestFixture : public ErrorLogger {
279283private:
280284 // Helper function to be called when an assertEquals assertion fails.
281285 // 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 ;
283287
284288 std::ostringstream mOutput ;
285289 std::ostringstream mErrout ;
@@ -309,14 +313,13 @@ class TestInstance {
309313 std::unique_ptr<TestFixture> impl;
310314};
311315
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 )
313317
314- // TODO: the asserts do not actually assert i.e. do stop executing the test
315318#define ASSERT ( CONDITION ) assert_(__FILE__, __LINE__, (CONDITION))
316319#define ASSERT_LOC ( CONDITION, FILE_, LINE_ ) assert_(FILE_, LINE_, (CONDITION))
317320#define ASSERT_LOC_MSG ( CONDITION, MSG, FILE_, LINE_ ) assert_(FILE_, LINE_, (CONDITION), MSG)
318321// *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 )
320323// *INDENT-ON*
321324#define ASSERT_EQUALS_WITHOUT_LINENUMBERS ( EXPECTED, ACTUAL ) assertEqualsWithoutLineNumbers(__FILE__, __LINE__, EXPECTED, ACTUAL)
322325#define ASSERT_EQUALS_DOUBLE ( EXPECTED, ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE)
@@ -328,15 +331,17 @@ class TestInstance {
328331#define ASSERT_EQUALS_ENUM_LOC_MSG ( EXPECTED, ACTUAL, MSG, FILE_, LINE_ ) assertEqualsEnum(FILE_, LINE_, (EXPECTED), (ACTUAL), MSG)
329332#define TODO_ASSERT_EQUALS_ENUM ( WANTED, CURRENT, ACTUAL ) todoAssertEqualsEnum(__FILE__, __LINE__, WANTED, CURRENT, ACTUAL)
330333#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 )
336339#define TODO_ASSERT ( CONDITION ) do { const bool condition=(CONDITION); todoAssertEquals (__FILE__, __LINE__, true , false , condition); } while (false )
337340#define TODO_ASSERT_EQUALS ( WANTED, CURRENT, ACTUAL ) todoAssertEquals(__FILE__, __LINE__, WANTED, CURRENT, ACTUAL)
338341
342+ // *INDENT-OFF*
339343#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*
340345
341346#define PLATFORM ( P, T ) do { std::string errstr; assertEquals (__FILE__, __LINE__, true , P.set (Platform::toString (T), errstr, {exename}), errstr); } while (false )
342347
0 commit comments