8000 testrunner: actually bail out on failed assert (#7436) · firewave/cppcheck@c78d1f2 · GitHub
[go: up one dir, main page]

Skip to content

Commit c78d1f2

Browse files
authored
testrunner: actually bail out on failed assert (danmar#7436)
1 parent f4580f9 commit c78d1f2

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

test/fixture.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ void TestFixture::assert_(const char * const filename, const unsigned int linenr
169169
errmsg << getLocationStr(filename, linenr) << ": Assertion failed." << std::endl << "_____" << std::endl;
170170
if (!msg.empty())
171171
errmsg << "Hint:" << std::endl << msg << std::endl;
172+
throw AssertFailedError();
172173
}
173174
}
174175

@@ -183,6 +184,7 @@ void TestFixture::assertFailure(const char* const filename, const unsigned int l
183184
if (!msg.empty())
184185
errmsg << "Hint:" << std::endl << msg << std::endl;
185186
errmsg << "_____" << std::endl;
187+
throw AssertFailedError();
186188
}
187189

188190
void TestFixture::assertEquals(const char * const filename, const unsigned int linenr, const std::string &expected, const std::string &actual, const std::string &msg) const
@@ -289,25 +291,28 @@ void TestFixture::assertThrow(const char * const filename, const unsigned int li
289291
++fails_counter;
290292
errmsg << getLocationStr(filename, linenr) << ": Assertion succeeded. "
291293
<< "The expected exception was thrown" << std::endl << "_____" << std::endl;
294+
throw AssertFailedError();
292295
}
293296

294297
void TestFixture::assertThrowFail(const char * const filename, const unsigned int linenr) const
295298
{
296299
++fails_counter;
297300
errmsg << getLocationStr(filename, linenr) << ": Assertion failed. "
298301
<< "The expected exception was not thrown" << std::endl << "_____" << std::endl;
302+
throw AssertFailedError();
299303
}
300304

301-
void TestFixture::assertNoThrowFail(const char * const filename, const unsigned int linenr) const
305+
void TestFixture::assertNoThrowFail(const char * const filename, const unsigned int linenr, bool bailout) const
302306
{
303-
++fails_counter;
304-
305307
std::string ex_msg;
306308

307309
try {
308310
// cppcheck-suppress rethrowNoCurrentException
309311
throw;
310312
}
313+
catch (const AssertFailedError&) {
314+
return;
315+
}
311316
catch (const InternalError& e) {
312317
ex_msg = e.errorMessage;
313318
}
@@ -318,8 +323,11 @@ void TestFixture::assertNoThrowFail(const char * const filename, const unsigned
318323
ex_msg = "unknown exception";
319324
}
320325

326+
++fails_counter;
321327
errmsg << getLocationStr(filename, linenr) << ": Assertion failed. "
322328
<< "Unexpected exception was thrown: " << ex_msg << std::endl << "_____" << std::endl;
329+
if (bailout)
330+
throw AssertFailedError();
323331
}
324332

325333
void TestFixture::printHelp()

test/fixture.h

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
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 {
279283
private:
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

Comments
 (0)
0