1 #ifndef UNITTEST_CHECKS_H
2 #define UNITTEST_CHECKS_H
3
4 #include "Config.h"
5 #include "TestResults.h"
6 #include "MemoryOutStream.h"
7
8 namespace UnitTest {
9
10
11 template< typename Value >
Check(Value const value)12 bool Check(Value const value)
13 {
14 return !!value; // doing double negative to avoid silly VS warnings
15 }
16
17
18 template< typename Expected, typename Actual >
CheckEqual(TestResults & results,Expected const & expected,Actual const & actual,TestDetails const & details)19 void CheckEqual(TestResults& results, Expected const& expected, Actual const& actual, TestDetails const& details)
20 {
21 if (!(expected == actual))
22 {
23 UnitTest::MemoryOutStream stream;
24 stream << "Expected " << expected << " but was " << actual;
25
26 results.OnTestFailure(details, stream.GetText());
27 }
28 }
29
30 UNITTEST_LINKAGE void CheckEqual(TestResults& results, char const* expected, char const* actual, TestDetails const& details);
31
32 UNITTEST_LINKAGE void CheckEqual(TestResults& results, char* expected, char* actual, TestDetails const& details);
33
34 UNITTEST_LINKAGE void CheckEqual(TestResults& results, char* expected, char const* actual, TestDetails const& details);
35
36 UNITTEST_LINKAGE void CheckEqual(TestResults& results, char const* expected, char* actual, TestDetails const& details);
37
38 template< typename Expected, typename Actual, typename Tolerance >
AreClose(Expected const & expected,Actual const & actual,Tolerance const & tolerance)39 bool AreClose(Expected const& expected, Actual const& actual, Tolerance const& tolerance)
40 {
41 return (actual >= (expected - tolerance)) && (actual <= (expected + tolerance));
42 }
43
44 template< typename Expected, typename Actual, typename Tolerance >
CheckClose(TestResults & results,Expected const & expected,Actual const & actual,Tolerance const & tolerance,TestDetails const & details)45 void CheckClose(TestResults& results, Expected const& expected, Actual const& actual, Tolerance const& tolerance,
46 TestDetails const& details)
47 {
48 if (!AreClose(expected, actual, tolerance))
49 {
50 UnitTest::MemoryOutStream stream;
51 stream << "Expected " << expected << " +/- " << tolerance << " but was " << actual;
52
53 results.OnTestFailure(details, stream.GetText());
54 }
55 }
56
57
58 template< typename Expected, typename Actual >
CheckArrayEqual(TestResults & results,Expected const & expected,Actual const & actual,int const count,TestDetails const & details)59 void CheckArrayEqual(TestResults& results, Expected const& expected, Actual const& actual,
60 int const count, TestDetails const& details)
61 {
62 bool equal = true;
63 for (int i = 0; i < count; ++i)
64 equal &= (expected[i] == actual[i]);
65
66 if (!equal)
67 {
68 UnitTest::MemoryOutStream stream;
69
70 stream << "Expected [ ";
71
72 for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex)
73 stream << expected[expectedIndex] << " ";
74
75 stream << "] but was [ ";
76
77 for (int actualIndex = 0; actualIndex < count; ++actualIndex)
78 stream << actual[actualIndex] << " ";
79
80 stream << "]";
81
82 results.OnTestFailure(details, stream.GetText());
83 }
84 }
85
86 template< typename Expected, typename Actual, typename Tolerance >
ArrayAreClose(Expected const & expected,Actual const & actual,int const count,Tolerance const & tolerance)87 bool ArrayAreClose(Expected const& expected, Actual const& actual, int const count, Tolerance const& tolerance)
88 {
89 bool equal = true;
90 for (int i = 0; i < count; ++i)
91 equal &= AreClose(expected[i], actual[i], tolerance);
92 return equal;
93 }
94
95 template< typename Expected, typename Actual, typename Tolerance >
CheckArrayClose(TestResults & results,Expected const & expected,Actual const & actual,int const count,Tolerance const & tolerance,TestDetails const & details)96 void CheckArrayClose(TestResults& results, Expected const& expected, Actual const& actual,
97 int const count, Tolerance const& tolerance, TestDetails const& details)
98 {
99 bool equal = ArrayAreClose(expected, actual, count, tolerance);
100
101 if (!equal)
102 {
103 UnitTest::MemoryOutStream stream;
104
105 stream << "Expected [ ";
106 for (int expectedIndex = 0; expectedIndex < count; ++expectedIndex)
107 stream << expected[expectedIndex] << " ";
108 stream << "] +/- " << tolerance << " but was [ ";
109
110 for (int actualIndex = 0; actualIndex < count; ++actualIndex)
111 stream << actual[actualIndex] << " ";
112 stream << "]";
113
114 results.OnTestFailure(details, stream.GetText());
115 }
116 }
117
118 template< typename Expected, typename Actual, typename Tolerance >
CheckArray2DClose(TestResults & results,Expected const & expected,Actual const & actual,int const rows,int const columns,Tolerance const & tolerance,TestDetails const & details)119 void CheckArray2DClose(TestResults& results, Expected const& expected, Actual const& actual,
120 int const rows, int const columns, Tolerance const& tolerance, TestDetails const& details)
121 {
122 bool equal = true;
123 for (int i = 0; i < rows; ++i)
124 equal &= ArrayAreClose(expected[i], actual[i], columns, tolerance);
125
126 if (!equal)
127 {
128 UnitTest::MemoryOutStream stream;
129
130 stream << "Expected [ ";
131
132 for (int expectedRow = 0; expectedRow < rows; ++expectedRow)
133 {
134 stream << "[ ";
135 for (int expectedColumn = 0; expectedColumn < columns; ++expectedColumn)
136 stream << expected[expectedRow][expectedColumn] << " ";
137 stream << "] ";
138 }
139
140 stream << "] +/- " << tolerance << " but was [ ";
141
142 for (int actualRow = 0; actualRow < rows; ++actualRow)
143 {
144 stream << "[ ";
145 for (int actualColumn = 0; actualColumn < columns; ++actualColumn)
146 stream << actual[actualRow][actualColumn] << " ";
147 stream << "] ";
148 }
149
150 stream << "]";
151
152 results.OnTestFailure(details, stream.GetText());
153 }
154 }
155
156 }
157
158 #endif
159