Skip to content

Commit 856d881

Browse files
committed
Introducing additional functionality to allow client code to stop a unit test
when an assert fails. The following macros have been added: REQUIRE_CHECK REQUIRE_EQUAL REQUIRE_CLOSE REQUIRE_ARRAY_EQUAL REQUIRE_ARRAY_CLOSE REQUIRE_ARRAY2D_CLOSE REQUIRE_THROW REQUIRE_ASSERT An example of when these type of checks are useful: std::vector<int> v = foo(); REQUIRE_EQUAL(3, v.size()); // test stops here on a fail // so we don't segfault looking at // v[0] below. CHECK_EQUAL(1, v[0]); CHECK_EQUAL(2, v[1]); CHECK_EQUAL(3, v[2]); When UNITTEST_NO_EXCEPTIONS is defined, the behavior of the REQUIRE_* macros falls back to match their CHECK_* counterparts. This means in the above example that we would segfault checking v[0] should v not be of size 3.
1 parent 9218ffc commit 856d881

File tree

12 files changed

+1158
-50
lines changed

12 files changed

+1158
-50
lines changed

UnitTest++/CheckMacros.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434
#error UnitTest++ redefines CHECK_ARRAY2D_CLOSE
3535
#endif
3636

37+
#ifdef IS_NOT_REQUIRED_CHECK
38+
#error UnitTest++ redefines IS_NOT_REQUIRED_CHECK
39+
#endif
40+
41+
#define IS_NOT_REQUIRED_CHECK false
42+
3743
#define CHECK(value) \
3844
UNITTEST_MULTILINE_MACRO_BEGIN \
3945
UT_TRY \
@@ -59,7 +65,7 @@
5965
UNITTEST_MULTILINE_MACRO_BEGIN \
6066
UT_TRY \
6167
({ \
62-
UnitTest::CheckEqual(*UnitTest::CurrentTest::Results(), expected, actual, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
68+
UnitTest::CheckEqual(*UnitTest::CurrentTest::Results(), expected, actual, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), IS_NOT_REQUIRED_CHECK); \
6369
}) \
6470
UT_CATCH (std::exception, e, \
6571
{ \
@@ -79,7 +85,7 @@
7985
UNITTEST_MULTILINE_MACRO_BEGIN \
8086
UT_TRY \
8187
({ \
82-
UnitTest::CheckClose(*UnitTest::CurrentTest::Results(), expected, actual, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
88+
UnitTest::CheckClose(*UnitTest::CurrentTest::Results(), expected, actual, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), IS_NOT_REQUIRED_CHECK); \
8389
}) \
8490
UT_CATCH (std::exception, e, \
8591
{ \
@@ -99,7 +105,7 @@
99105
UNITTEST_MULTILINE_MACRO_BEGIN \
100106
UT_TRY \
101107
({ \
102-
UnitTest::CheckArrayEqual(*UnitTest::CurrentTest::Results(), expected, actual, count, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
108+
UnitTest::CheckArrayEqual(*UnitTest::CurrentTest::Results(), expected, actual, count, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), IS_NOT_REQUIRED_CHECK); \
103109
}) \
104110
UT_CATCH (std::exception, e, \
105111
{ \
@@ -119,7 +125,7 @@
119125
UNITTEST_MULTILINE_MACRO_BEGIN \
120126
UT_TRY \
121127
({ \
122-
UnitTest::CheckArrayClose(*UnitTest::CurrentTest::Results(), expected, actual, count, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
128+
UnitTest::CheckArrayClose(*UnitTest::CurrentTest::Results(), expected, actual, count, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), IS_NOT_REQUIRED_CHECK); \
123129
}) \
124130
UT_CATCH (std::exception, e, \
125131
{ \
@@ -139,7 +145,7 @@
139145
UNITTEST_MULTILINE_MACRO_BEGIN \
140146
UT_TRY \
141147
({ \
142-
UnitTest::CheckArray2DClose(*UnitTest::CurrentTest::Results(), expected, actual, rows, columns, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__)); \
148+
UnitTest::CheckArray2DClose(*UnitTest::CurrentTest::Results(), expected, actual, rows, columns, tolerance, UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), IS_NOT_REQUIRED_CHECK); \
143149
}) \
144150
UT_CATCH (std::exception, e, \
145151
{ \

UnitTest++/Checks.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace UnitTest {
66
namespace {
77

88
void CheckStringsEqual(TestResults& results, char const* expected, char const* actual,
9-
TestDetails const& details)
9+
TestDetails const& details, bool const required)
1010
{
1111
using namespace std;
1212

@@ -16,34 +16,39 @@ void CheckStringsEqual(TestResults& results, char const* expected, char const* a
1616
stream << "Expected " << (expected ? expected : "<NULLPTR>") << " but was " << (actual ? actual : "<NULLPTR>");
1717

1818
results.OnTestFailure(details, stream.GetText());
19+
20+
if(required)
21+
{
22+
UT_THROW(RequiredCheckFailedException());
23+
}
1924
}
2025
}
2126

2227
}
2328

2429

2530
void CheckEqual(TestResults& results, char const* expected, char const* actual,
26-
TestDetails const& details)
31+
TestDetails const& details, bool const required)
2732
{
28-
CheckStringsEqual(results, expected, actual, details);
33+
CheckStringsEqual(results, expected, actual, details, required);
2934
}
3035

3136
void CheckEqual(TestResults& results, char* expected, char* actual,
32-
TestDetails const& details)
37+
TestDetails const& details, bool const required)
3338
{
34-
CheckStringsEqual(results, expected, actual, details);
39+
CheckStringsEqual(results, expected, actual, details, required);
3540
}
3641

3742
void CheckEqual(TestResults& results, char* expected, char const* actual,
38-
TestDetails const& details)
43+
TestDetails const& details, bool const required)
3944
{
40-
CheckStringsEqual(results, expected, actual, details);
45+
CheckStringsEqual(results, expected, actual, details, required);
4146
}
4247

4348
void CheckEqual(TestResults& results, char const* expected, char* actual,
44-
TestDetails const& details)
49+
TestDetails const& details, bool const required)
4550
{
46-
CheckStringsEqual(results, expected, actual, details);
51+
CheckStringsEqual(results, expected, actual, details, required);
4752
}
4853

4954

UnitTest++/Checks.h

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
#define UNITTEST_CHECKS_H
33

44
#include "Config.h"
5+
#include "ExceptionMacros.h"
56
#include "TestResults.h"
67
#include "MemoryOutStream.h"
8+
#include "RequiredCheckFailedException.h"
79

810
namespace UnitTest {
911

@@ -16,24 +18,29 @@ bool Check(Value const value)
1618

1719

1820
template< typename Expected, typename Actual >
19-
void CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details)
21+
void CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details, bool const required)
2022
{
2123
if (!(expected == actual))
2224
{
2325
UnitTest::MemoryOutStream stream;
2426
stream << "Expected " << expected << " but was " << actual;
2527

2628
results.OnTestFailure(details, stream.GetText());
29+
30+
if(required)
31+
{
32+
UT_THROW(RequiredCheckFailedException());
33+
}
2734
}
2835
}
2936

30-
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details);
37+
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details, bool const required);
3138

32-
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char* expected, char* actual, TestDetails const& details);
39+
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char* expected, char* actual, TestDetails const& details, bool const required);
3340

34-
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char* expected, char const* actual, TestDetails const& details);
41+
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char* expected, char const* actual, TestDetails const& details, bool const required);
3542

36-
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char const* expected, char* actual, TestDetails const& details);
43+
UNITTEST_LINKAGE void CheckEqual(TestResults& results, char const* expected, char* actual, TestDetails const& details, bool const required);
3744

3845
template< typename Expected, typename Actual, typename Tolerance >
3946
bool AreClose(Expected const& expected, Actual const& actual, Tolerance const& tolerance)
@@ -43,21 +50,26 @@ bool AreClose(Expected const& expected, Actual const& actual, Tolerance const& t
4350

4451
template< typename Expected, typename Actual, typename Tolerance >
4552
void CheckClose(TestResults& results, Expected const& expected, Actual const& actual, Tolerance const& tolerance,
46-
TestDetails const& details)
53+
TestDetails const& details, bool const required)
4754
{
4855
if (!AreClose(expected, actual, tolerance))
4956
{
5057
UnitTest::MemoryOutStream stream;
5158
stream << "Expected " << expected << " +/- " << tolerance << " but was " << actual;
5259

5360
results.OnTestFailure(details, stream.GetText());
61+
62+
if(required)
63+
{
64+
UT_THROW(RequiredCheckFailedException());
65+
}
5466
}
5567
}
5668

5769

5870
template< typename Expected, typename Actual >
5971
void CheckArrayEqual(TestResults& results, Expected const& expected, Actual const& actual,
60-
int const count, TestDetails const& details)
72+
int const count, TestDetails const& details, bool const required)
6173
{
6274
bool equal = true;
6375
for (int i = 0; i < count; ++i)
@@ -80,6 +92,11 @@ void CheckArrayEqual(TestResults& results, Expected const& expected, Actual cons
8092
stream << "]";
8193

8294
results.OnTestFailure(details, stream.GetText());
95+
96+
if(required)
97+
{
98+
UT_THROW(RequiredCheckFailedException());
99+
}
83100
}
84101
}
85102

@@ -94,7 +111,8 @@ bool ArrayAreClose(Expected const& expected, Actual const& actual, int const cou
94111

95112
template< typename Expected, typename Actual, typename Tolerance >
96113
void CheckArrayClose(TestResults& results, Expected const& expected, Actual const& actual,
97-
int const count, Tolerance const& tolerance, TestDetails const& details)
114+
int const count, Tolerance const& tolerance, TestDetails const& details,
115+
bool const required)
98116
{
99117
bool equal = ArrayAreClose(expected, actual, count, tolerance);
100118

@@ -112,12 +130,18 @@ void CheckArrayClose(TestResults& results, Expected const& expected, Actual cons
112130
stream << "]";
113131

114132
results.OnTestFailure(details, stream.GetText());
133+
134+
if(required)
135+
{
136+
UT_THROW(RequiredCheckFailedException());
137+
}
115138
}
116139
}
117140

118141
template< typename Expected, typename Actual, typename Tolerance >
119142
void CheckArray2DClose(TestResults& results, Expected const& expected, Actual const& actual,
120-
int const rows, int const columns, Tolerance const& tolerance, TestDetails const& details)
143+
int const rows, int const columns, Tolerance const& tolerance, TestDetails const& details,
144+
bool const required)
121145
{
122146
bool equal = true;
123147
for (int i = 0; i < rows; ++i)
@@ -150,6 +174,11 @@ void CheckArray2DClose(TestResults& results, Expected const& expected, Actual co
150174
stream << "]";
151175

152176
results.OnTestFailure(details, stream.GetText());
177+
178+
if(required)
179+
{
180+
UT_THROW(RequiredCheckFailedException());
181+
}
153182
}
154183
}
155184

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 "RequiredCheckFailedException.h"
1011
#include "CurrentTest.h"
1112

1213
#ifdef UNITTEST_NO_EXCEPTIONS
@@ -39,6 +40,7 @@ void ExecuteTest(T& testObject, TestDetails const& details, bool isMockTest)
3940
})
4041
#endif
4142
UT_CATCH(AssertException, e, { (void)e; })
43+
UT_CATCH(RequiredCheckFailedException, e, { (void)e; })
4244
UT_CATCH(std::exception, e,
4345
{
4446
MemoryOutStream stream;

0 commit comments

Comments
 (0)