8000 Merge pull request #95 from pjohnmeyer/paxos1977-pjohnmeyer-RequiredM… · unittest-cpp/unittest-cpp@983a990 · GitHub
[go: up one dir, main page]

Skip to content

Commit 983a990

Browse files
committed
Merge pull request #95 from pjohnmeyer/paxos1977-pjohnmeyer-RequiredMacro
Add REQUIRE macro for stopping tests early
2 parents 5b34768 + 073a1ea commit 983a990

18 files changed

+1667
-8
lines changed

UnitTest++/CheckMacros.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "ExceptionMacros.h"
66
#include "Checks.h"
77
#include "AssertException.h"
8+
#include "RequiredCheckException.h"
89
#include "MemoryOutStream.h"
910
#include "TestDetails.h"
1011
#include "CurrentTest.h"
@@ -37,10 +38,11 @@
3738
#define CHECK(value) \
3839
UNITTEST_MULTILINE_MACRO_BEGIN \
3940
UT_TRY \
40-
({ \
41+
({ \
4142
if (!UnitTest::Check(value)) \
4243
UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), #value); \
4344
}) \
45+
UT_RETHROW (UnitTest::RequiredCheckException) \
4446
UT_CATCH (std::exception, e, \
4547
{ \
4648
UnitTest::MemoryOutStream message; \
@@ -58,9 +60,10 @@
5860
#define CHECK_EQUAL(expected, actual) \
5961
UNITTEST_MULTILINE_MACRO_BEGIN \
6062
UT_TRY \
61-
({ \
63+
({ \
6264
UnitTest::CheckEqual(*UnitTest::CurrentTest::Results(), expected, actual, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
6365
}) \
66+
UT_RETHROW (UnitTest::RequiredCheckException) \
6467
UT_CATCH (std::exception, e, \
6568
{ \
6669
UnitTest::MemoryOutStream message; \
6972
message.GetText()); \
7073
}) \
7174
UT_CATCH_ALL \
72-
({ \
75+
({ \
7376
UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
7477
"Unhandled exception in CHECK_EQUAL(" #expected ", " #actual ")"); \
7578
}) \
@@ -78,9 +81,10 @@
7881
#define CHECK_CLOSE(expected, actual, tolerance) \
7982
UNITTEST_MULTILINE_MACRO_BEGIN \
8083
UT_TRY \
81-
({ \
84+
({ \
8285
UnitTest::CheckClose(*UnitTest::CurrentTest::Results(), expected, actual, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
8386
}) \
87+
UT_RETHROW (UnitTest::RequiredCheckException) \
8488
UT_CATCH (std::exception, e, \
8589
{ \
8690
UnitTest::MemoryOutStream message; \
@@ -89,7 +93,7 @@
8993
message.GetText()); \
9094
}) \
9195
UT_CATCH_ALL \
92-
({ \
96+
({ \
9397
UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \
9498
"Unhandled exception in CHECK_CLOSE(" #expected ", " #actual ")"); \
9599
}) \
@@ -101,6 +105,7 @@
101105
({ \
102106
UnitTest::CheckArrayEqual(*UnitTest::CurrentTest::Results(), expected, actual, count, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
103107
}) \
108+
UT_RETHROW (UnitTest::RequiredCheckException) \
104109
UT_CATCH (std::exception, e, \
105110
{ \
106111
UnitTest::MemoryOutStream message; \
@@ -121,6 +126,7 @@
121126
({ \
122127
UnitTest::CheckArrayClose(*UnitTest::CurrentTest::Results(), expected, actual, count, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
123128
}) \
129+
UT_RETHROW (UnitTest::RequiredCheckException) \
124130
UT_CATCH (std::exception, e, \
125131
{ \
126132
UnitTest::MemoryOutStream message; \
@@ -141,6 +147,7 @@
141147
({ \
142148
UnitTest::CheckArray2DClose(*UnitTest::CurrentTest::Results(), expected, actual, rows, columns, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
143149
}) \
150+
UT_RETHROW (UnitTest::RequiredCheckException) \
144151
UT_CATCH (std::exception, e, \
145152
{ \
146153
UnitTest::MemoryOutStream message; \

UnitTest++/ExceptionMacros.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
#ifndef UNITTEST_NO_EXCEPTIONS
77
#define UT_TRY(x) try x
88
#define UT_THROW(x) throw x
9+
#define UT_RETHROW(ExceptionType) catch(ExceptionType&) { throw; }
910
#define UT_CATCH(ExceptionType, ExceptionName, CatchBody) catch(ExceptionType& ExceptionName) CatchBody
1011
#define UT_CATCH_ALL(CatchBody) catch(...) CatchBody
1112
#else
1213
#define UT_TRY(x) x
1314
#define UT_THROW(x)
15+
#define UT_RETHROW()
1416
#define UT_CATCH(ExceptionType, ExceptionName, CatchBody)
1517
#define UT_CATCH_ALL(CatchBody)
1618
#endif

UnitTest++/ExecuteTest.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "TestResults.h"
88
#include "MemoryOutStream.h"
99
#include "AssertException.h"
10+
#include "RequiredCheckException.h"
1011
#include "CurrentTest.h"
1112

1213
#ifdef UNITTEST_NO_EXCEPTIONS
@@ -38,6 +39,7 @@ namespace UnitTest {
3839
testObject.RunImpl();
3940
})
4041
#endif
42+
UT_CATCH(RequiredCheckException, e, { (void)e; })
4143
UT_CATCH(AssertException, e, { (void)e; })
4244
UT_CATCH(std::exception, e,
4345
{

UnitTest++/Makefile.am

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
lib_LTLIBRARIES = UnitTest++/libUnitTest++.la
22
pkgincludedir = $(includedir)/UnitTest++/
3-
nobase_pkginclude_HEADERS = UnitTest++/UnitTest++.h UnitTest++/UnitTestPP.h UnitTest++/Config.h UnitTest++/HelperMacros.h UnitTest++/Test.h UnitTest++/TestDetails.h UnitTest++/TestList.h UnitTest++/TestSuite.h UnitTest++/TestResults.h UnitTest++/TestMacros.h UnitTest++/CheckMacros.h UnitTest++/TestRunner.h UnitTest++/TimeConstraint.h UnitTest++/ExecuteTest.h UnitTest++/AssertException.h UnitTest++/MemoryOutStream.h UnitTest++/CurrentTest.h UnitTest++/Checks.h UnitTest++/TimeHelpers.h UnitTest++/ExceptionMacros.h UnitTest++/ReportAssert.h UnitTest++/ReportAssertImpl.h UnitTest++/TestReporter.h UnitTest++/TestReporterStdout.h UnitTest++/CompositeTestReporter.h UnitTest++/DeferredTestReporter.h UnitTest++/DeferredTestResult.h
4-
UnitTest___libUnitTest___la_SOURCES = UnitTest++/AssertException.cpp UnitTest++/Test.cpp UnitTest++/Checks.cpp UnitTest++/TestRunner.cpp UnitTest++/TestResults.cpp UnitTest++/TestReporter.cpp UnitTest++/TestReporterStdout.cpp UnitTest++/ReportAssert.cpp UnitTest++/TestList.cpp UnitTest++/TimeConstraint.cpp UnitTest++/TestDetails.cpp UnitTest++/MemoryOutStream.cpp UnitTest++/DeferredTestReporter.cpp UnitTest++/DeferredTestResult.cpp UnitTest++/XmlTestReporter.cpp UnitTest++/CurrentTest.cpp UnitTest++/CompositeTestReporter.cpp
3+
nobase_pkginclude_HEADERS = UnitTest++/AssertException.h UnitTest++/CheckMacros.h UnitTest++/Checks.h UnitTest++/CompositeTestReporter.h UnitTest++/Config.h UnitTest++/CurrentTest.h UnitTest++/DeferredTestReporter.h UnitTest++/DeferredTestResult.h UnitTest++/ExceptionMacros.h UnitTest++/ExecuteTest.h UnitTest++/HelperMacros.h UnitTest++/MemoryOutStream.h UnitTest++/ReportAssert.h UnitTest++/ReportAssertImpl.h UnitTest++/RequireMacros.h UnitTest++/RequiredCheckException.h UnitTest++/RequiredCheckTestReporter.h UnitTest++/Test.h UnitTest++/TestDetails.h UnitTest++/TestList.h UnitTest++/TestMacros.h UnitTest++/TestReporter.h UnitTest++/TestReporterStdout.h UnitTest++/TestResults.h UnitTest++/TestRunner.h UnitTest++/TestSuite.h UnitTest++/ThrowingTestReporter.h UnitTest++/TimeConstraint.h UnitTest++/TimeHelpers.h UnitTest++/UnitTest++.h UnitTest++/UnitTestPP.h UnitTest++/XmlTestReporter.h
4+
UnitTest___libUnitTest___la_SOURCES = UnitTest++/AssertException.cpp UnitTest++/Checks.cpp UnitTest++/CompositeTestReporter.cpp UnitTest++/CurrentTest.cpp UnitTest++/DeferredTestReporter.cpp UnitTest++/DeferredTestResult.cpp UnitTest++/MemoryOutStream.cpp UnitTest++/ReportAssert.cpp UnitTest++/RequiredCheckException.cpp UnitTest++/RequiredCheckTestReporter.cpp UnitTest++/Test.cpp UnitTest++/TestDetails.cpp UnitTest++/TestList.cpp UnitTest++/TestReporter.cpp UnitTest++/TestReporterStdout.cpp UnitTest++/TestResults.cpp UnitTest++/TestRunner.cpp UnitTest++/ThrowingTestReporter.cpp UnitTest++/TimeConstraint.cpp UnitTest++/XmlTestReporter.cpp
55

66
if WINDOWS
77
nobase_pkginclude_HEADERS += UnitTest++/Win32/TimeHelpers.h

UnitTest++/RequireMacros.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef UNITTEST_REQUIREMACROS_H
2+
#define UNITTEST_REQUIREMACROS_H
3+
4+
#include "RequiredCheckTestReporter.h"
5+
6+
#ifdef REQUIRE
7+
#error UnitTest++ redefines REQUIRE
8+
#endif
9+
10+
#ifndef UNITTEST_NO_EXCEPTIONS
11+
#define REQUIRE for(UnitTest::RequiredCheckTestReporter decoratedReporter(*UnitTest::CurrentTest::Results()); decoratedReporter.Next(); )
12+
#endif
13+
14+
#ifdef UNITTEST_NO_EXCEPTIONS
15+
#define REQUIRE
16+
#endif
17+
18+
#endif

UnitTest++/RequiredCheckException.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#include "RequiredCheckException.h"
2+
3+
#ifndef UNITTEST_NO_EXCEPTIONS
4+
5+
namespace UnitTest {
6+
7+
RequiredCheckException::RequiredCheckException()
8+
{
9+
}
10+
11+
RequiredCheckException::~RequiredCheckException() throw()
12+
{
13+
}
14+
15+
}
16+
17+
#endif

UnitTest++/RequiredCheckException.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#ifndef UNITTEST_REQUIREDCHECKEXCEPTION_H
2+
#define UNITTEST_REQUIREDCHECKEXCEPTION_H
3+
4+
#include "Config.h"
5+
#ifndef UNITTEST_NO_EXCEPTIONS
6+
7+
#include "HelperMacros.h"
8+
#include <exception>
9+
10+
namespace UnitTest {
11+
12+
class UNITTEST_LINKAGE RequiredCheckException : public std::exception
13+
{
14+
public:
15+
RequiredCheckException();
16+
virtual ~RequiredCheckException() throw();
17+
};
18+
19+
}
20+
21+
#endif
22+
23+
#endif
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "RequiredCheckTestReporter.h"
2+
3+
#include "CurrentTest.h"
4+
#include "TestResults.h"
5+
6+
namespace UnitTest {
7+
8+
RequiredCheckTestReporter::RequiredCheckTestReporter(TestResults& results)
9+
: m_results(results)
10+
, m_originalTestReporter(results.m_testReporter)
11+
, m_throwingReporter(results.m_testReporter)
12+
, m_continue(0)
13+
{
14+
m_results.m_testReporter = &m_throwingReporter;
15+
}
16+
17+
RequiredCheckTestReporter::~RequiredCheckTestReporter()
18+
{
19+
m_results.m_testReporter = m_originalTestReporter;
20+
}
21+
22+
bool RequiredCheckTestReporter::Next()
23+
{
24+
return m_continue++ == 0;
25+
}
26+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef UNITTEST_REQUIRED_CHECK_TEST_REPORTER_H
2+
#define UNITTEST_REQUIRED_CHECK_TEST_REPORTER_H
3+
4+
#include "HelperMacros.h"
5+
#include "ThrowingTestReporter.h"
6+
7+
namespace UnitTest {
8+
9+
class TestResults;
10+
11+
// This RAII class decorates the current TestReporter with
12+
// a version that throws after reporting a failure.
13+
class UNITTEST_LINKAGE RequiredCheckTestReporter
14+
{
15+
public:
16+
explicit RequiredCheckTestReporter(TestResults& results);
17+
~RequiredCheckTestReporter();
18+
19+
bool Next();
20+
21+
private:
22+
TestResults& m_results;
23+
TestReporter* m_originalTestReporter;
24+
ThrowingTestReporter m_throwingReporter;
25+
int m_continue;
26+
};
27+
}
28+
29+
#endif
30+

UnitTest++/TestResults.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
namespace UnitTest {
77

8+
class RequiredCheckTestReporter;
89
class TestReporter;
910
class TestDetails;
1011

@@ -22,6 +23,8 @@ namespace UnitTest {
2223
int GetFailureCount() const;
2324

2425
private:
26+
friend class RequiredCheckTestReporter;
27+
2528
TestReporter* m_testReporter;
2629
int m_totalTestCount;
2730
int m_failedTestCount;

UnitTest++/ThrowingTestReporter.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include "ThrowingTestReporter.h"
2+
#include "RequiredCheckException.h"
3+
4+
namespace UnitTest {
5+
6+
ThrowingTestReporter::ThrowingTestReporter(TestReporter* decoratedReporter)
7+
: m_decoratedReporter(decoratedReporter)
8+
{}
9+
10+
//virtual
11+
ThrowingTestReporter::~ThrowingTestReporter()
12+
{}
13+
14+
//virtual
15+
void ThrowingTestReporter::ReportTestStart(TestDetails const& test)
16+
{
17+
if(m_decoratedReporter)
18+
{
19+
m_decoratedReporter->ReportTestStart(test);
20+
}
21+
}
22+
23+
//virtual
24+
void ThrowingTestReporter::ReportFailure(TestDetails const& test, char const* failure)
25+
{
26+
if(m_decoratedReporter)
27+
{
28+
m_decoratedReporter->ReportFailure(test, failure);
29+
}
30+
throw RequiredCheckException();
31+
}
32+
33+
//virtual
34+
void ThrowingTestReporter::ReportTestFinish(TestDetails const& test, float secondsElapsed)
35+
{
36+
if(m_decoratedReporter)
37+
{
38+
m_decoratedReporter->ReportTestFinish(test, secondsElapsed);
39+
}
40+
}
41+
42+
//virtual
43+
void ThrowingTestReporter::ReportSummary(int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed)
44+
{
45+
if(m_decoratedReporter)
46+
{
47 497A +
m_decoratedReporter->ReportSummary(totalTestCount, failedTestCount, failureCount, secondsElapsed);
48+
}
49+
}
50+
51+
}

0 commit comments

Comments
 (0)
0