1*2f083884Ss.makeev_local #include "UnitTest++/UnitTestPP.h"
2*2f083884Ss.makeev_local #include "RecordingReporter.h"
3*2f083884Ss.makeev_local
4*2f083884Ss.makeev_local #include <cstring>
5*2f083884Ss.makeev_local
6*2f083884Ss.makeev_local using namespace UnitTest;
7*2f083884Ss.makeev_local
8*2f083884Ss.makeev_local
9*2f083884Ss.makeev_local namespace {
10*2f083884Ss.makeev_local
11*2f083884Ss.makeev_local
TEST(CheckEqualWithUnsignedLong)12*2f083884Ss.makeev_local TEST(CheckEqualWithUnsignedLong)
13*2f083884Ss.makeev_local {
14*2f083884Ss.makeev_local TestResults results;
15*2f083884Ss.makeev_local unsigned long something = 2;
16*2f083884Ss.makeev_local CHECK_EQUAL(something, something);
17*2f083884Ss.makeev_local }
18*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsFailsOnDifferentStrings)19*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsFailsOnDifferentStrings)
20*2f083884Ss.makeev_local {
21*2f083884Ss.makeev_local char txt1[] = "Hello";
22*2f083884Ss.makeev_local char txt2[] = "Hallo";
23*2f083884Ss.makeev_local TestResults results;
24*2f083884Ss.makeev_local CheckEqual(results, txt1, txt2, TestDetails("", "", "", 0));
25*2f083884Ss.makeev_local CHECK_EQUAL(1, results.GetFailureCount());
26*2f083884Ss.makeev_local }
27*2f083884Ss.makeev_local
28*2f083884Ss.makeev_local char txt1[] = "Hello"; // non-const on purpose so no folding of duplicate data
29*2f083884Ss.makeev_local char txt2[] = "Hello";
30*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnContentsNonConstNonConst)31*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnContentsNonConstNonConst)
32*2f083884Ss.makeev_local {
33*2f083884Ss.makeev_local char const* const p1 = txt1;
34*2f083884Ss.makeev_local char const* const p2 = txt2;
35*2f083884Ss.makeev_local TestResults results;
36*2f083884Ss.makeev_local CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
37*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
38*2f083884Ss.makeev_local }
39*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnContentsConstConst)40*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnContentsConstConst)
41*2f083884Ss.makeev_local {
42*2f083884Ss.makeev_local char* const p1 = txt1;
43*2f083884Ss.makeev_local char* const p2 = txt2;
44*2f083884Ss.makeev_local TestResults results;
45*2f083884Ss.makeev_local CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
46*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
47*2f083884Ss.makeev_local }
48*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnContentsNonConstConst)49*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnContentsNonConstConst)
50*2f083884Ss.makeev_local {
51*2f083884Ss.makeev_local char* const p1 = txt1;
52*2f083884Ss.makeev_local char const* const p2 = txt2;
53*2f083884Ss.makeev_local TestResults results;
54*2f083884Ss.makeev_local CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
55*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
56*2f083884Ss.makeev_local }
57*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnContentsConstNonConst)58*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnContentsConstNonConst)
59*2f083884Ss.makeev_local {
60*2f083884Ss.makeev_local char const* const p1 = txt1;
61*2f083884Ss.makeev_local char* const p2 = txt2;
62*2f083884Ss.makeev_local TestResults results;
63*2f083884Ss.makeev_local CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
64*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
65*2f083884Ss.makeev_local }
66*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnContentsWithALiteral)67*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnContentsWithALiteral)
68*2f083884Ss.makeev_local {
69*2f083884Ss.makeev_local char const* const p1 = txt1;
70*2f083884Ss.makeev_local TestResults results;
71*2f083884Ss.makeev_local CheckEqual(results, "Hello", p1, TestDetails("", "", "", 0));
72*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
73*2f083884Ss.makeev_local }
74*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnNullExpected)75*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnNullExpected)
76*2f083884Ss.makeev_local {
77*2f083884Ss.makeev_local char const* const expected = "hi";
78*2f083884Ss.makeev_local char const* const actual = NULL;
79*2f083884Ss.makeev_local TestResults results;
80*2f083884Ss.makeev_local CheckEqual(results, expected, actual, TestDetails("", "", "", 0));
81*2f083884Ss.makeev_local CHECK_EQUAL (1, results.GetFailureCount());
82*2f083884Ss.makeev_local }
83*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnNullActual)84*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnNullActual)
85*2f083884Ss.makeev_local {
86*2f083884Ss.makeev_local char const* const expected = NULL;
87*2f083884Ss.makeev_local char const* const actual = "hi";
88*2f083884Ss.makeev_local TestResults results;
89*2f083884Ss.makeev_local CheckEqual(results, expected, actual, TestDetails("", "", "", 0));
90*2f083884Ss.makeev_local CHECK_EQUAL (1, results.GetFailureCount());
91*2f083884Ss.makeev_local }
92*2f083884Ss.makeev_local
TEST(CheckEqualsWithStringsWorksOnNullExpectedAndActual)93*2f083884Ss.makeev_local TEST(CheckEqualsWithStringsWorksOnNullExpectedAndActual)
94*2f083884Ss.makeev_local {
95*2f083884Ss.makeev_local char const* const expected = NULL;
96*2f083884Ss.makeev_local char const* const actual = NULL;
97*2f083884Ss.makeev_local TestResults results;
98*2f083884Ss.makeev_local CheckEqual(results, expected, actual, TestDetails("", "", "", 0));
99*2f083884Ss.makeev_local CHECK_EQUAL (0, results.GetFailureCount());
100*2f083884Ss.makeev_local }
101*2f083884Ss.makeev_local
TEST(CheckEqualFailureIncludesCheckExpectedAndActual)102*2f083884Ss.makeev_local TEST(CheckEqualFailureIncludesCheckExpectedAndActual)
103*2f083884Ss.makeev_local {
104*2f083884Ss.makeev_local RecordingReporter reporter;
105*2f083884Ss.makeev_local TestResults results(&reporter);
106*2f083884Ss.makeev_local const int something = 2;
107*2f083884Ss.makeev_local CheckEqual(results, 1, something, TestDetails("", "", "", 0));
108*2f083884Ss.makeev_local
109*2f083884Ss.makeev_local using namespace std;
110*2f083884Ss.makeev_local CHECK(strstr(reporter.lastFailedMessage, "xpected 1"));
111*2f083884Ss.makeev_local CHECK(strstr(reporter.lastFailedMessage, "was 2"));
112*2f083884Ss.makeev_local }
113*2f083884Ss.makeev_local
TEST(CheckEqualFailureIncludesDetails)114*2f083884Ss.makeev_local TEST(CheckEqualFailureIncludesDetails)
115*2f083884Ss.makeev_local {
116*2f083884Ss.makeev_local RecordingReporter reporter;
117*2f083884Ss.makeev_local TestResults results(&reporter);
118*2f083884Ss.makeev_local TestDetails const details("mytest", "mysuite", "file.h", 101);
119*2f083884Ss.makeev_local
120*2f083884Ss.makeev_local CheckEqual(results, 1, 2, details);
121*2f083884Ss.makeev_local
122*2f083884Ss.makeev_local CHECK_EQUAL("mytest", reporter.lastFailedTest);
123*2f083884Ss.makeev_local CHECK_EQUAL("mysuite", reporter.lastFailedSuite);
124*2f083884Ss.makeev_local CHECK_EQUAL("file.h", reporter.lastFailedFile);
125*2f083884Ss.makeev_local CHECK_EQUAL(101, reporter.lastFailedLine);
126*2f083884Ss.makeev_local }
127*2f083884Ss.makeev_local
TEST(CheckCloseTrue)128*2f083884Ss.makeev_local TEST(CheckCloseTrue)
129*2f083884Ss.makeev_local {
130*2f083884Ss.makeev_local TestResults results;
131*2f083884Ss.makeev_local CheckClose(results, 3.001f, 3.0f, 0.1f, TestDetails("", "", "", 0));
132*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
133*2f083884Ss.makeev_local }
134*2f083884Ss.makeev_local
TEST(CheckCloseFalse)135*2f083884Ss.makeev_local TEST(CheckCloseFalse)
136*2f083884Ss.makeev_local {
137*2f083884Ss.makeev_local TestResults results;
138*2f083884Ss.makeev_local CheckClose(results, 3.12f, 3.0f, 0.1f, TestDetails("", "", "", 0));
139*2f083884Ss.makeev_local CHECK_EQUAL(1, results.GetFailureCount());
140*2f083884Ss.makeev_local }
141*2f083884Ss.makeev_local
TEST(CheckCloseWithZeroEpsilonWorksForSameNumber)142*2f083884Ss.makeev_local TEST(CheckCloseWithZeroEpsilonWorksForSameNumber)
143*2f083884Ss.makeev_local {
144*2f083884Ss.makeev_local TestResults results;
145*2f083884Ss.makeev_local CheckClose(results, 0.1f, 0.1f, 0, TestDetails("", "", "", 0));
146*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
147*2f083884Ss.makeev_local }
148*2f083884Ss.makeev_local
TEST(CheckCloseWithNaNFails)149*2f083884Ss.makeev_local TEST(CheckCloseWithNaNFails)
150*2f083884Ss.makeev_local {
151*2f083884Ss.makeev_local const unsigned int bitpattern = 0xFFFFFFFF;
152*2f083884Ss.makeev_local float nan;
153*2f083884Ss.makeev_local UNIITEST_NS_QUAL_STD(memcpy)(&nan, &bitpattern, sizeof(bitpattern));
154*2f083884Ss.makeev_local
155*2f083884Ss.makeev_local TestResults results;
156*2f083884Ss.makeev_local CheckClose(results, 3.0f, nan, 0.1f, TestDetails("", "", "", 0));
157*2f083884Ss.makeev_local CHECK_EQUAL(1, results.GetFailureCount());
158*2f083884Ss.makeev_local }
159*2f083884Ss.makeev_local
TEST(CheckCloseWithNaNAgainstItselfFails)160*2f083884Ss.makeev_local TEST(CheckCloseWithNaNAgainstItselfFails)
161*2f083884Ss.makeev_local {
162*2f083884Ss.makeev_local const unsigned int bitpattern = 0xFFFFFFFF;
163*2f083884Ss.makeev_local float nan;
164*2f083884Ss.makeev_local UNIITEST_NS_QUAL_STD(memcpy)(&nan, &bitpattern, sizeof(bitpattern));
165*2f083884Ss.makeev_local
166*2f083884Ss.makeev_local TestResults results;
167*2f083884Ss.makeev_local CheckClose(results, nan, nan, 0.1f, TestDetails("", "", "", 0));
168*2f083884Ss.makeev_local CHECK_EQUAL(1, results.GetFailureCount());
169*2f083884Ss.makeev_local }
170*2f083884Ss.makeev_local
TEST(CheckCloseFailureIncludesCheckExpectedAndActual)171*2f083884Ss.makeev_local TEST(CheckCloseFailureIncludesCheckExpectedAndActual)
172*2f083884Ss.makeev_local {
173*2f083884Ss.makeev_local RecordingReporter reporter;
174*2f083884Ss.makeev_local TestResults results(&reporter);
175*2f083884Ss.makeev_local const float expected = 0.9f;
176*2f083884Ss.makeev_local const float actual = 1.1f;
177*2f083884Ss.makeev_local CheckClose(results, expected, actual, 0.01f, TestDetails("", "", "", 0));
178*2f083884Ss.makeev_local
179*2f083884Ss.makeev_local using namespace std;
180*2f083884Ss.makeev_local CHECK(strstr(reporter.lastFailedMessage, "xpected 0.9"));
181*2f083884Ss.makeev_local CHECK(strstr(reporter.lastFailedMessage, "was 1.1"));
182*2f083884Ss.makeev_local }
183*2f083884Ss.makeev_local
TEST(CheckCloseFailureIncludesTolerance)184*2f083884Ss.makeev_local TEST(CheckCloseFailureIncludesTolerance)
185*2f083884Ss.makeev_local {
186*2f083884Ss.makeev_local RecordingReporter reporter;
187*2f083884Ss.makeev_local TestResults results(&reporter);
188*2f083884Ss.makeev_local CheckClose(results, 2, 3, 0.01f, TestDetails("", "", "", 0));
189*2f083884Ss.makeev_local
190*2f083884Ss.makeev_local using namespace std;
191*2f083884Ss.makeev_local CHECK(strstr(reporter.lastFailedMessage, "0.01"));
192*2f083884Ss.makeev_local }
193*2f083884Ss.makeev_local
TEST(CheckCloseFailureIncludesDetails)194*2f083884Ss.makeev_local TEST(CheckCloseFailureIncludesDetails)
195*2f083884Ss.makeev_local {
196*2f083884Ss.makeev_local RecordingReporter reporter;
197*2f083884Ss.makeev_local TestResults results(&reporter);
198*2f083884Ss.makeev_local TestDetails const details("mytest", "mysuite", "header.h", 10);
199*2f083884Ss.makeev_local
200*2f083884Ss.makeev_local CheckClose(results, 2, 3, 0.01f, details);
201*2f083884Ss.makeev_local
202*2f083884Ss.makeev_local CHECK_EQUAL("mytest", reporter.lastFailedTest);
203*2f083884Ss.makeev_local CHECK_EQUAL("mysuite", reporter.lastFailedSuite);
204*2f083884Ss.makeev_local CHECK_EQUAL("header.h", reporter.lastFailedFile);
205*2f083884Ss.makeev_local CHECK_EQUAL(10, reporter.lastFailedLine);
206*2f083884Ss.makeev_local }
207*2f083884Ss.makeev_local
208*2f083884Ss.makeev_local
TEST(CheckArrayEqualTrue)209*2f083884Ss.makeev_local TEST(CheckArrayEqualTrue)
210*2f083884Ss.makeev_local {
211*2f083884Ss.makeev_local TestResults results;
212*2f083884Ss.makeev_local
213*2f083884Ss.makeev_local int const array[3] = { 1, 2, 3 };
214*2f083884Ss.makeev_local CheckArrayEqual(results, array, array, 3, TestDetails("", "", "", 0));
215*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
216*2f083884Ss.makeev_local }
217*2f083884Ss.makeev_local
TEST(CheckArrayEqualFalse)218*2f083884Ss.makeev_local TEST(CheckArrayEqualFalse)
219*2f083884Ss.makeev_local {
220*2f083884Ss.makeev_local TestResults results;
221*2f083884Ss.makeev_local
222*2f083884Ss.makeev_local int const array1[3] = { 1, 2, 3 };
223*2f083884Ss.makeev_local int const array2[3] = { 1, 2, 2 };
224*2f083884Ss.makeev_local CheckArrayEqual(results, array1, array2, 3, TestDetails("", "", "", 0));
225*2f083884Ss.makeev_local CHECK_EQUAL(1, results.GetFailureCount());
226*2f083884Ss.makeev_local }
227*2f083884Ss.makeev_local
TEST(CheckArrayCloseTrue)228*2f083884Ss.makeev_local TEST(CheckArrayCloseTrue)
229*2f083884Ss.makeev_local {
230*2f083884Ss.makeev_local TestResults results;
231*2f083884Ss.makeev_local
232*2f083884Ss.makeev_local float const array1[3] = { 1.0f, 1.5f, 2.0f };
233*2f083884Ss.makeev_local float const array2[3] = { 1.01f, 1.51f, 2.01f };
234*2f083884Ss.makeev_local CheckArrayClose(results, array1, array2, 3, 0.02f, TestDetails("", "", "", 0));
235*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
236*2f083884Ss.makeev_local }
237*2f083884Ss.makeev_local
TEST(CheckArrayCloseFalse)238*2f083884Ss.makeev_local TEST(CheckArrayCloseFalse)
239*2f083884Ss.makeev_local {
240*2f083884Ss.makeev_local TestResults results;
241*2f083884Ss.makeev_local
242*2f083884Ss.makeev_local float const array1[3] = { 1.0f, 1.5f, 2.0f };
243*2f083884Ss.makeev_local float const array2[3] = { 1.01f, 1.51f, 2.01f };
244*2f083884Ss.makeev_local CheckArrayClose(results, array1, array2, 3, 0.001f, TestDetails("", "", "", 0));
245*2f083884Ss.makeev_local CHECK_EQUAL(1, results.GetFailureCount());
246*2f083884Ss.makeev_local }
247*2f083884Ss.makeev_local
TEST(CheckArrayCloseFailureIncludesDetails)248*2f083884Ss.makeev_local TEST(CheckArrayCloseFailureIncludesDetails)
249*2f083884Ss.makeev_local {
250*2f083884Ss.makeev_local RecordingReporter reporter;
251*2f083884Ss.makeev_local TestResults results(&reporter);
252*2f083884Ss.makeev_local TestDetails const details("arrayCloseTest", "arrayCloseSuite", "file", 1337);
253*2f083884Ss.makeev_local
254*2f083884Ss.makeev_local float const array1[3] = { 1.0f, 1.5f, 2.0f };
255*2f083884Ss.makeev_local float const array2[3] = { 1.01f, 1.51f, 2.01f };
256*2f083884Ss.makeev_local CheckArrayClose(results, array1, array2, 3, 0.001f, details);
257*2f083884Ss.makeev_local
258*2f083884Ss.makeev_local CHECK_EQUAL("arrayCloseTest", reporter.lastFailedTest);
259*2f083884Ss.makeev_local CHECK_EQUAL("arrayCloseSuite", reporter.lastFailedSuite);
260*2f083884Ss.makeev_local CHECK_EQUAL("file", reporter.lastFailedFile);
261*2f083884Ss.makeev_local CHECK_EQUAL(1337, reporter.lastFailedLine);
262*2f083884Ss.makeev_local }
263*2f083884Ss.makeev_local
264*2f083884Ss.makeev_local
TEST(CheckArray2DCloseTrue)265*2f083884Ss.makeev_local TEST(CheckArray2DCloseTrue)
266*2f083884Ss.makeev_local {
267*2f083884Ss.makeev_local TestResults results;
268*2f083884Ss.makeev_local
269*2f083884Ss.makeev_local float const array1[3][3] = { { 1.0f, 1.5f, 2.0f },
270*2f083884Ss.makeev_local { 2.0f, 2.5f, 3.0f },
271*2f083884Ss.makeev_local { 3.0f, 3.5f, 4.0f } };
272*2f083884Ss.makeev_local float const array2[3][3] = { { 1.01f, 1.51f, 2.01f },
273*2f083884Ss.makeev_local { 2.01f, 2.51f, 3.01f },
274*2f083884Ss.makeev_local { 3.01f, 3.51f, 4.01f } };
275*2f083884Ss.makeev_local CheckArray2DClose(results, array1, array2, 3, 3, 0.02f, TestDetails("", "", "", 0));
276*2f083884Ss.makeev_local CHECK_EQUAL(0, results.GetFailureCount());
277*2f083884Ss.makeev_local }
278*2f083884Ss.makeev_local
TEST(CheckArray2DCloseFalse)279*2f083884Ss.makeev_local TEST(CheckArray2DCloseFalse)
280*2f083884Ss.makeev_local {
281*2f083884Ss.makeev_local TestResults results;
282*2f083884Ss.makeev_local
283*2f083884Ss.makeev_local float const array1[3][3] = { { 1.0f, 1.5f, 2.0f },
284*2f083884Ss.makeev_local { 2.0f, 2.5f, 3.0f },
285*2f083884Ss.makeev_local { 3.0f, 3.5f, 4.0f } };
286*2f083884Ss.makeev_local float const array2[3][3] = { { 1.01f, 1.51f, 2.01f },
287*2f083884Ss.makeev_local { 2.01f, 2.51f, 3.01f },
288*2f083884Ss.makeev_local { 3.01f, 3.51f, 4.01f } };
289*2f083884Ss.makeev_local CheckArray2DClose(results, array1, array2, 3, 3, 0.001f, TestDetails("", "", "", 0));
290*2f083884Ss.makeev_local CHECK_EQUAL(1, results.GetFailureCount());
291*2f083884Ss.makeev_local }
292*2f083884Ss.makeev_local
TEST(CheckCloseWithDoublesSucceeds)293*2f083884Ss.makeev_local TEST(CheckCloseWithDoublesSucceeds)
294*2f083884Ss.makeev_local {
295*2f083884Ss.makeev_local CHECK_CLOSE(0.5, 0.5, 0.0001);
296*2f083884Ss.makeev_local }
297*2f083884Ss.makeev_local
TEST(CheckArray2DCloseFailureIncludesDetails)298*2f083884Ss.makeev_local TEST(CheckArray2DCloseFailureIncludesDetails)
299*2f083884Ss.makeev_local {
300*2f083884Ss.makeev_local RecordingReporter reporter;
301*2f083884Ss.makeev_local TestResults results(&reporter);
302*2f083884Ss.makeev_local TestDetails const details("array2DCloseTest", "array2DCloseSuite", "file", 1234);
303*2f083884Ss.makeev_local
304*2f083884Ss.makeev_local float const array1[3][3] = { { 1.0f, 1.5f, 2.0f },
305*2f083884Ss.makeev_local { 2.0f, 2.5f, 3.0f },
306*2f083884Ss.makeev_local { 3.0f, 3.5f, 4.0f } };
307*2f083884Ss.makeev_local float const array2[3][3] = { { 1.01f, 1.51f, 2.01f },
308*2f083884Ss.makeev_local { 2.01f, 2.51f, 3.01f },
309*2f083884Ss.makeev_local { 3.01f, 3.51f, 4.01f } };
310*2f083884Ss.makeev_local CheckArray2DClose(results, array1, array2, 3, 3, 0.001f, details);
311*2f083884Ss.makeev_local
312*2f083884Ss.makeev_local CHECK_EQUAL("array2DCloseTest", reporter.lastFailedTest);
313*2f083884Ss.makeev_local CHECK_EQUAL("array2DCloseSuite", reporter.lastFailedSuite);
314*2f083884Ss.makeev_local CHECK_EQUAL("file", reporter.lastFailedFile);
315*2f083884Ss.makeev_local CHECK_EQUAL(1234, reporter.lastFailedLine);
316*2f083884Ss.makeev_local }
317*2f083884Ss.makeev_local
318*2f083884Ss.makeev_local }
319