1*2f083884Ss.makeev_local #include "UnitTest++/UnitTestPP.h"
2*2f083884Ss.makeev_local #include "UnitTest++/CurrentTest.h"
3*2f083884Ss.makeev_local #include "RecordingReporter.h"
4*2f083884Ss.makeev_local #include "ScopedCurrentTest.h"
5*2f083884Ss.makeev_local 
6*2f083884Ss.makeev_local using namespace std;
7*2f083884Ss.makeev_local 
8*2f083884Ss.makeev_local namespace {
9*2f083884Ss.makeev_local 
TEST(CheckSucceedsOnTrue)10*2f083884Ss.makeev_local TEST(CheckSucceedsOnTrue)
11*2f083884Ss.makeev_local {
12*2f083884Ss.makeev_local     bool failure = true;
13*2f083884Ss.makeev_local     {
14*2f083884Ss.makeev_local         RecordingReporter reporter;
15*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
16*2f083884Ss.makeev_local 
17*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
18*2f083884Ss.makeev_local 		CHECK(true);
19*2f083884Ss.makeev_local 
20*2f083884Ss.makeev_local 		failure = (testResults.GetFailureCount() > 0);
21*2f083884Ss.makeev_local     }
22*2f083884Ss.makeev_local 
23*2f083884Ss.makeev_local     CHECK(!failure);
24*2f083884Ss.makeev_local }
25*2f083884Ss.makeev_local 
TEST(CheckFailsOnFalse)26*2f083884Ss.makeev_local TEST(CheckFailsOnFalse)
27*2f083884Ss.makeev_local {
28*2f083884Ss.makeev_local     bool failure = false;
29*2f083884Ss.makeev_local     {
30*2f083884Ss.makeev_local         RecordingReporter reporter;
31*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
32*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
33*2f083884Ss.makeev_local         CHECK(false);
34*2f083884Ss.makeev_local         failure = (testResults.GetFailureCount() > 0);
35*2f083884Ss.makeev_local     }
36*2f083884Ss.makeev_local 
37*2f083884Ss.makeev_local     CHECK(failure);
38*2f083884Ss.makeev_local }
39*2f083884Ss.makeev_local 
TEST(FailureReportsCorrectTestName)40*2f083884Ss.makeev_local TEST(FailureReportsCorrectTestName)
41*2f083884Ss.makeev_local {
42*2f083884Ss.makeev_local     RecordingReporter reporter;
43*2f083884Ss.makeev_local     {
44*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
45*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
46*2f083884Ss.makeev_local         CHECK(false);
47*2f083884Ss.makeev_local     }
48*2f083884Ss.makeev_local 
49*2f083884Ss.makeev_local     CHECK_EQUAL(m_details.testName, reporter.lastFailedTest);
50*2f083884Ss.makeev_local }
51*2f083884Ss.makeev_local 
TEST(CheckFailureIncludesCheckContents)52*2f083884Ss.makeev_local TEST(CheckFailureIncludesCheckContents)
53*2f083884Ss.makeev_local {
54*2f083884Ss.makeev_local     RecordingReporter reporter;
55*2f083884Ss.makeev_local     {
56*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
57*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
58*2f083884Ss.makeev_local         const bool yaddayadda = false;
59*2f083884Ss.makeev_local         CHECK(yaddayadda);
60*2f083884Ss.makeev_local     }
61*2f083884Ss.makeev_local 
62*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "yaddayadda"));
63*2f083884Ss.makeev_local }
64*2f083884Ss.makeev_local 
TEST(CheckEqualSucceedsOnEqual)65*2f083884Ss.makeev_local TEST(CheckEqualSucceedsOnEqual)
66*2f083884Ss.makeev_local {
67*2f083884Ss.makeev_local     bool failure = true;
68*2f083884Ss.makeev_local     {
69*2f083884Ss.makeev_local         RecordingReporter reporter;
70*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
71*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
72*2f083884Ss.makeev_local         CHECK_EQUAL(1, 1);
73*2f083884Ss.makeev_local         failure = (testResults.GetFailureCount() > 0);
74*2f083884Ss.makeev_local     }
75*2f083884Ss.makeev_local 
76*2f083884Ss.makeev_local     CHECK(!failure);
77*2f083884Ss.makeev_local }
78*2f083884Ss.makeev_local 
TEST(CheckEqualFailsOnNotEqual)79*2f083884Ss.makeev_local TEST(CheckEqualFailsOnNotEqual)
80*2f083884Ss.makeev_local {
81*2f083884Ss.makeev_local     bool failure = false;
82*2f083884Ss.makeev_local     {
83*2f083884Ss.makeev_local         RecordingReporter reporter;
84*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
85*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
86*2f083884Ss.makeev_local         CHECK_EQUAL(1, 2);
87*2f083884Ss.makeev_local         failure = (testResults.GetFailureCount() > 0);
88*2f083884Ss.makeev_local     }
89*2f083884Ss.makeev_local 
90*2f083884Ss.makeev_local     CHECK(failure);
91*2f083884Ss.makeev_local }
92*2f083884Ss.makeev_local 
TEST(CheckEqualFailureContainsCorrectDetails)93*2f083884Ss.makeev_local TEST(CheckEqualFailureContainsCorrectDetails)
94*2f083884Ss.makeev_local {
95*2f083884Ss.makeev_local     int line = 0;
96*2f083884Ss.makeev_local     RecordingReporter reporter;
97*2f083884Ss.makeev_local     {
98*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
99*2f083884Ss.makeev_local 		UnitTest::TestDetails const testDetails("testName", "suiteName", "filename", -1);
100*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults, &testDetails);
101*2f083884Ss.makeev_local 
102*2f083884Ss.makeev_local 		CHECK_EQUAL(1, 123);    line = __LINE__;
103*2f083884Ss.makeev_local     }
104*2f083884Ss.makeev_local 
105*2f083884Ss.makeev_local     CHECK_EQUAL("testName", reporter.lastFailedTest);
106*2f083884Ss.makeev_local     CHECK_EQUAL("suiteName", reporter.lastFailedSuite);
107*2f083884Ss.makeev_local     CHECK_EQUAL("filename", reporter.lastFailedFile);
108*2f083884Ss.makeev_local     CHECK_EQUAL(line, reporter.lastFailedLine);
109*2f083884Ss.makeev_local }
110*2f083884Ss.makeev_local 
111*2f083884Ss.makeev_local int g_sideEffect = 0;
FunctionWithSideEffects()112*2f083884Ss.makeev_local int FunctionWithSideEffects()
113*2f083884Ss.makeev_local {
114*2f083884Ss.makeev_local     ++g_sideEffect;
115*2f083884Ss.makeev_local     return 1;
116*2f083884Ss.makeev_local }
117*2f083884Ss.makeev_local 
TEST(CheckEqualDoesNotHaveSideEffectsWhenPassing)118*2f083884Ss.makeev_local TEST(CheckEqualDoesNotHaveSideEffectsWhenPassing)
119*2f083884Ss.makeev_local {
120*2f083884Ss.makeev_local     g_sideEffect = 0;
121*2f083884Ss.makeev_local     {
122*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
123*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
124*2f083884Ss.makeev_local         CHECK_EQUAL(1, FunctionWithSideEffects());
125*2f083884Ss.makeev_local     }
126*2f083884Ss.makeev_local     CHECK_EQUAL(1, g_sideEffect);
127*2f083884Ss.makeev_local }
128*2f083884Ss.makeev_local 
TEST(CheckEqualDoesNotHaveSideEffectsWhenFailing)129*2f083884Ss.makeev_local TEST(CheckEqualDoesNotHaveSideEffectsWhenFailing)
130*2f083884Ss.makeev_local {
131*2f083884Ss.makeev_local     g_sideEffect = 0;
132*2f083884Ss.makeev_local     {
133*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
134*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
135*2f083884Ss.makeev_local         CHECK_EQUAL(2, FunctionWithSideEffects());
136*2f083884Ss.makeev_local     }
137*2f083884Ss.makeev_local     CHECK_EQUAL(1, g_sideEffect);
138*2f083884Ss.makeev_local }
139*2f083884Ss.makeev_local 
140*2f083884Ss.makeev_local 
TEST(CheckCloseSucceedsOnEqual)141*2f083884Ss.makeev_local TEST(CheckCloseSucceedsOnEqual)
142*2f083884Ss.makeev_local {
143*2f083884Ss.makeev_local     bool failure = true;
144*2f083884Ss.makeev_local     {
145*2f083884Ss.makeev_local         RecordingReporter reporter;
146*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
147*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
148*2f083884Ss.makeev_local         CHECK_CLOSE (1.0f, 1.001f, 0.01f);
149*2f083884Ss.makeev_local         failure = (testResults.GetFailureCount() > 0);
150*2f083884Ss.makeev_local     }
151*2f083884Ss.makeev_local 
152*2f083884Ss.makeev_local     CHECK(!failure);
153*2f083884Ss.makeev_local }
154*2f083884Ss.makeev_local 
TEST(CheckCloseFailsOnNotEqual)155*2f083884Ss.makeev_local TEST(CheckCloseFailsOnNotEqual)
156*2f083884Ss.makeev_local {
157*2f083884Ss.makeev_local     bool failure = false;
158*2f083884Ss.makeev_local     {
159*2f083884Ss.makeev_local         RecordingReporter reporter;
160*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
161*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
162*2f083884Ss.makeev_local         CHECK_CLOSE (1.0f, 1.1f, 0.01f);
163*2f083884Ss.makeev_local         failure = (testResults.GetFailureCount() > 0);
164*2f083884Ss.makeev_local     }
165*2f083884Ss.makeev_local 
166*2f083884Ss.makeev_local     CHECK(failure);
167*2f083884Ss.makeev_local }
168*2f083884Ss.makeev_local 
TEST(CheckCloseFailureContainsCorrectDetails)169*2f083884Ss.makeev_local TEST(CheckCloseFailureContainsCorrectDetails)
170*2f083884Ss.makeev_local {
171*2f083884Ss.makeev_local     int line = 0;
172*2f083884Ss.makeev_local     RecordingReporter reporter;
173*2f083884Ss.makeev_local     {
174*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
175*2f083884Ss.makeev_local 		UnitTest::TestDetails testDetails("test", "suite", "filename", -1);
176*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults, &testDetails);
177*2f083884Ss.makeev_local 
178*2f083884Ss.makeev_local 		CHECK_CLOSE (1.0f, 1.1f, 0.01f);    line = __LINE__;
179*2f083884Ss.makeev_local     }
180*2f083884Ss.makeev_local 
181*2f083884Ss.makeev_local     CHECK_EQUAL("test", reporter.lastFailedTest);
182*2f083884Ss.makeev_local     CHECK_EQUAL("suite", reporter.lastFailedSuite);
183*2f083884Ss.makeev_local     CHECK_EQUAL("filename", reporter.lastFailedFile);
184*2f083884Ss.makeev_local     CHECK_EQUAL(line, reporter.lastFailedLine);
185*2f083884Ss.makeev_local }
186*2f083884Ss.makeev_local 
TEST(CheckCloseDoesNotHaveSideEffectsWhenPassing)187*2f083884Ss.makeev_local TEST(CheckCloseDoesNotHaveSideEffectsWhenPassing)
188*2f083884Ss.makeev_local {
189*2f083884Ss.makeev_local     g_sideEffect = 0;
190*2f083884Ss.makeev_local     {
191*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
192*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
193*2f083884Ss.makeev_local         CHECK_CLOSE (1, FunctionWithSideEffects(), 0.1f);
194*2f083884Ss.makeev_local     }
195*2f083884Ss.makeev_local     CHECK_EQUAL(1, g_sideEffect);
196*2f083884Ss.makeev_local }
197*2f083884Ss.makeev_local 
TEST(CheckCloseDoesNotHaveSideEffectsWhenFailing)198*2f083884Ss.makeev_local TEST(CheckCloseDoesNotHaveSideEffectsWhenFailing)
199*2f083884Ss.makeev_local {
200*2f083884Ss.makeev_local     g_sideEffect = 0;
201*2f083884Ss.makeev_local     {
202*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
203*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
204*2f083884Ss.makeev_local         CHECK_CLOSE (2, FunctionWithSideEffects(), 0.1f);
205*2f083884Ss.makeev_local     }
206*2f083884Ss.makeev_local     CHECK_EQUAL(1, g_sideEffect);
207*2f083884Ss.makeev_local }
208*2f083884Ss.makeev_local 
TEST(CheckArrayCloseSucceedsOnEqual)209*2f083884Ss.makeev_local TEST(CheckArrayCloseSucceedsOnEqual)
210*2f083884Ss.makeev_local {
211*2f083884Ss.makeev_local     bool failure = true;
212*2f083884Ss.makeev_local     {
213*2f083884Ss.makeev_local         RecordingReporter reporter;
214*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
215*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
216*2f083884Ss.makeev_local         const float data[4] = { 0, 1, 2, 3 };
217*2f083884Ss.makeev_local         CHECK_ARRAY_CLOSE (data, data, 4, 0.01f);
218*2f083884Ss.makeev_local         failure = (testResults.GetFailureCount() > 0);
219*2f083884Ss.makeev_local     }
220*2f083884Ss.makeev_local 
221*2f083884Ss.makeev_local     CHECK(!failure);
222*2f083884Ss.makeev_local }
223*2f083884Ss.makeev_local 
TEST(CheckArrayCloseFailsOnNotEqual)224*2f083884Ss.makeev_local TEST(CheckArrayCloseFailsOnNotEqual)
225*2f083884Ss.makeev_local {
226*2f083884Ss.makeev_local     bool failure = false;
227*2f083884Ss.makeev_local     {
228*2f083884Ss.makeev_local         RecordingReporter reporter;
229*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
230*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
231*2f083884Ss.makeev_local 
232*2f083884Ss.makeev_local 		int const data1[4] = { 0, 1, 2, 3 };
233*2f083884Ss.makeev_local         int const data2[4] = { 0, 1, 3, 3 };
234*2f083884Ss.makeev_local 		CHECK_ARRAY_CLOSE (data1, data2, 4, 0.01f);
235*2f083884Ss.makeev_local 
236*2f083884Ss.makeev_local 		failure = (testResults.GetFailureCount() > 0);
237*2f083884Ss.makeev_local     }
238*2f083884Ss.makeev_local 
239*2f083884Ss.makeev_local     CHECK(failure);
240*2f083884Ss.makeev_local }
241*2f083884Ss.makeev_local 
TEST(CheckArrayCloseFailureIncludesCheckExpectedAndActual)242*2f083884Ss.makeev_local TEST(CheckArrayCloseFailureIncludesCheckExpectedAndActual)
243*2f083884Ss.makeev_local {
244*2f083884Ss.makeev_local     RecordingReporter reporter;
245*2f083884Ss.makeev_local     {
246*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
247*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
248*2f083884Ss.makeev_local 
249*2f083884Ss.makeev_local 		int const data1[4] = { 0, 1, 2, 3 };
250*2f083884Ss.makeev_local         int const data2[4] = { 0, 1, 3, 3 };
251*2f083884Ss.makeev_local         CHECK_ARRAY_CLOSE (data1, data2, 4, 0.01f);
252*2f083884Ss.makeev_local     }
253*2f083884Ss.makeev_local 
254*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "xpected [ 0 1 2 3 ]"));
255*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "was [ 0 1 3 3 ]"));
256*2f083884Ss.makeev_local }
257*2f083884Ss.makeev_local 
TEST(CheckArrayCloseFailureContainsCorrectDetails)258*2f083884Ss.makeev_local TEST(CheckArrayCloseFailureContainsCorrectDetails)
259*2f083884Ss.makeev_local {
260*2f083884Ss.makeev_local     int line = 0;
261*2f083884Ss.makeev_local     RecordingReporter reporter;
262*2f083884Ss.makeev_local     {
263*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
264*2f083884Ss.makeev_local 		UnitTest::TestDetails testDetails("arrayCloseTest", "arrayCloseSuite", "filename", -1);
265*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults, &testDetails);
266*2f083884Ss.makeev_local 
267*2f083884Ss.makeev_local 		int const data1[4] = { 0, 1, 2, 3 };
268*2f083884Ss.makeev_local         int const data2[4] = { 0, 1, 3, 3 };
269*2f083884Ss.makeev_local         CHECK_ARRAY_CLOSE (data1, data2, 4, 0.01f);     line = __LINE__;
270*2f083884Ss.makeev_local     }
271*2f083884Ss.makeev_local 
272*2f083884Ss.makeev_local     CHECK_EQUAL("arrayCloseTest", reporter.lastFailedTest);
273*2f083884Ss.makeev_local     CHECK_EQUAL("arrayCloseSuite", reporter.lastFailedSuite);
274*2f083884Ss.makeev_local     CHECK_EQUAL("filename", reporter.lastFailedFile);
275*2f083884Ss.makeev_local     CHECK_EQUAL(line, reporter.lastFailedLine);
276*2f083884Ss.makeev_local }
277*2f083884Ss.makeev_local 
TEST(CheckArrayCloseFailureIncludesTolerance)278*2f083884Ss.makeev_local TEST(CheckArrayCloseFailureIncludesTolerance)
279*2f083884Ss.makeev_local {
280*2f083884Ss.makeev_local     RecordingReporter reporter;
281*2f083884Ss.makeev_local     {
282*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
283*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
284*2f083884Ss.makeev_local 
285*2f083884Ss.makeev_local 		float const data1[4] = { 0, 1, 2, 3 };
286*2f083884Ss.makeev_local         float const data2[4] = { 0, 1, 3, 3 };
287*2f083884Ss.makeev_local         CHECK_ARRAY_CLOSE (data1, data2, 4, 0.01f);
288*2f083884Ss.makeev_local     }
289*2f083884Ss.makeev_local 
290*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "0.01"));
291*2f083884Ss.makeev_local }
292*2f083884Ss.makeev_local 
TEST(CheckArrayEqualSuceedsOnEqual)293*2f083884Ss.makeev_local TEST(CheckArrayEqualSuceedsOnEqual)
294*2f083884Ss.makeev_local {
295*2f083884Ss.makeev_local     bool failure = true;
296*2f083884Ss.makeev_local     {
297*2f083884Ss.makeev_local         RecordingReporter reporter;
298*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
299*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
300*2f083884Ss.makeev_local 
301*2f083884Ss.makeev_local 		const float data[4] = { 0, 1, 2, 3 };
302*2f083884Ss.makeev_local         CHECK_ARRAY_EQUAL (data, data, 4);
303*2f083884Ss.makeev_local 
304*2f083884Ss.makeev_local 		failure = (testResults.GetFailureCount() > 0);
305*2f083884Ss.makeev_local     }
306*2f083884Ss.makeev_local 
307*2f083884Ss.makeev_local     CHECK(!failure);
308*2f083884Ss.makeev_local }
309*2f083884Ss.makeev_local 
TEST(CheckArrayEqualFailsOnNotEqual)310*2f083884Ss.makeev_local TEST(CheckArrayEqualFailsOnNotEqual)
311*2f083884Ss.makeev_local {
312*2f083884Ss.makeev_local     bool failure = false;
313*2f083884Ss.makeev_local     {
314*2f083884Ss.makeev_local         RecordingReporter reporter;
315*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
316*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
317*2f083884Ss.makeev_local 
318*2f083884Ss.makeev_local 		int const data1[4] = { 0, 1, 2, 3 };
319*2f083884Ss.makeev_local         int const data2[4] = { 0, 1, 3, 3 };
320*2f083884Ss.makeev_local         CHECK_ARRAY_EQUAL (data1, data2, 4);
321*2f083884Ss.makeev_local 
322*2f083884Ss.makeev_local 		failure = (testResults.GetFailureCount() > 0);
323*2f083884Ss.makeev_local     }
324*2f083884Ss.makeev_local 
325*2f083884Ss.makeev_local     CHECK(failure);
326*2f083884Ss.makeev_local }
327*2f083884Ss.makeev_local 
TEST(CheckArrayEqualFailureIncludesCheckExpectedAndActual)328*2f083884Ss.makeev_local TEST(CheckArrayEqualFailureIncludesCheckExpectedAndActual)
329*2f083884Ss.makeev_local {
330*2f083884Ss.makeev_local     RecordingReporter reporter;
331*2f083884Ss.makeev_local     {
332*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
333*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
334*2f083884Ss.makeev_local 
335*2f083884Ss.makeev_local 		int const data1[4] = { 0, 1, 2, 3 };
336*2f083884Ss.makeev_local         int const data2[4] = { 0, 1, 3, 3 };
337*2f083884Ss.makeev_local         CHECK_ARRAY_EQUAL (data1, data2, 4);
338*2f083884Ss.makeev_local     }
339*2f083884Ss.makeev_local 
340*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "xpected [ 0 1 2 3 ]"));
341*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "was [ 0 1 3 3 ]"));
342*2f083884Ss.makeev_local }
343*2f083884Ss.makeev_local 
TEST(CheckArrayEqualFailureContainsCorrectInfo)344*2f083884Ss.makeev_local TEST(CheckArrayEqualFailureContainsCorrectInfo)
345*2f083884Ss.makeev_local {
346*2f083884Ss.makeev_local     int line = 0;
347*2f083884Ss.makeev_local     RecordingReporter reporter;
348*2f083884Ss.makeev_local     {
349*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
350*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
351*2f083884Ss.makeev_local 
352*2f083884Ss.makeev_local 		int const data1[4] = { 0, 1, 2, 3 };
353*2f083884Ss.makeev_local         int const data2[4] = { 0, 1, 3, 3 };
354*2f083884Ss.makeev_local         CHECK_ARRAY_EQUAL (data1, data2, 4);     line = __LINE__;
355*2f083884Ss.makeev_local     }
356*2f083884Ss.makeev_local 
357*2f083884Ss.makeev_local     CHECK_EQUAL("CheckArrayEqualFailureContainsCorrectInfo", reporter.lastFailedTest);
358*2f083884Ss.makeev_local     CHECK_EQUAL(__FILE__, reporter.lastFailedFile);
359*2f083884Ss.makeev_local     CHECK_EQUAL(line, reporter.lastFailedLine);
360*2f083884Ss.makeev_local }
361*2f083884Ss.makeev_local 
FunctionWithSideEffects2()362*2f083884Ss.makeev_local float const* FunctionWithSideEffects2()
363*2f083884Ss.makeev_local {
364*2f083884Ss.makeev_local     ++g_sideEffect;
365*2f083884Ss.makeev_local     static float const data[] = {1,2,3,4};
366*2f083884Ss.makeev_local     return data;
367*2f083884Ss.makeev_local }
368*2f083884Ss.makeev_local 
TEST(CheckArrayCloseDoesNotHaveSideEffectsWhenPassing)369*2f083884Ss.makeev_local TEST(CheckArrayCloseDoesNotHaveSideEffectsWhenPassing)
370*2f083884Ss.makeev_local {
371*2f083884Ss.makeev_local     g_sideEffect = 0;
372*2f083884Ss.makeev_local     {
373*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
374*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
375*2f083884Ss.makeev_local 
376*2f083884Ss.makeev_local 		const float data[] = { 0, 1, 2, 3 };
377*2f083884Ss.makeev_local         CHECK_ARRAY_CLOSE (data, FunctionWithSideEffects2(), 4, 0.01f);
378*2f083884Ss.makeev_local     }
379*2f083884Ss.makeev_local     CHECK_EQUAL(1, g_sideEffect);
380*2f083884Ss.makeev_local }
381*2f083884Ss.makeev_local 
TEST(CheckArrayCloseDoesNotHaveSideEffectsWhenFailing)382*2f083884Ss.makeev_local TEST(CheckArrayCloseDoesNotHaveSideEffectsWhenFailing)
383*2f083884Ss.makeev_local {
384*2f083884Ss.makeev_local     g_sideEffect = 0;
385*2f083884Ss.makeev_local     {
386*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
387*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
388*2f083884Ss.makeev_local 
389*2f083884Ss.makeev_local 		const float data[] = { 0, 1, 3, 3 };
390*2f083884Ss.makeev_local         CHECK_ARRAY_CLOSE (data, FunctionWithSideEffects2(), 4, 0.01f);
391*2f083884Ss.makeev_local     }
392*2f083884Ss.makeev_local 
393*2f083884Ss.makeev_local 	CHECK_EQUAL(1, g_sideEffect);
394*2f083884Ss.makeev_local }
395*2f083884Ss.makeev_local 
TEST(CheckArray2DCloseSucceedsOnEqual)396*2f083884Ss.makeev_local TEST(CheckArray2DCloseSucceedsOnEqual)
397*2f083884Ss.makeev_local {
398*2f083884Ss.makeev_local     bool failure = true;
399*2f083884Ss.makeev_local     {
400*2f083884Ss.makeev_local         RecordingReporter reporter;
401*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
402*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
403*2f083884Ss.makeev_local 
404*2f083884Ss.makeev_local 		const float data[2][2] = { {0, 1}, {2, 3} };
405*2f083884Ss.makeev_local         CHECK_ARRAY2D_CLOSE (data, data, 2, 2, 0.01f);
406*2f083884Ss.makeev_local 
407*2f083884Ss.makeev_local 		failure = (testResults.GetFailureCount() > 0);
408*2f083884Ss.makeev_local     }
409*2f083884Ss.makeev_local 
410*2f083884Ss.makeev_local     CHECK(!failure);
411*2f083884Ss.makeev_local }
412*2f083884Ss.makeev_local 
TEST(CheckArray2DCloseFailsOnNotEqual)413*2f083884Ss.makeev_local TEST(CheckArray2DCloseFailsOnNotEqual)
414*2f083884Ss.makeev_local {
415*2f083884Ss.makeev_local     bool failure = false;
416*2f083884Ss.makeev_local     {
417*2f083884Ss.makeev_local         RecordingReporter reporter;
418*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
419*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
420*2f083884Ss.makeev_local 
421*2f083884Ss.makeev_local 		int const data1[2][2] = { {0, 1}, {2, 3} };
422*2f083884Ss.makeev_local         int const data2[2][2] = { {0, 1}, {3, 3} };
423*2f083884Ss.makeev_local         CHECK_ARRAY2D_CLOSE (data1, data2, 2, 2, 0.01f);
424*2f083884Ss.makeev_local 
425*2f083884Ss.makeev_local 		failure = (testResults.GetFailureCount() > 0);
426*2f083884Ss.makeev_local     }
427*2f083884Ss.makeev_local 
428*2f083884Ss.makeev_local     CHECK(failure);
429*2f083884Ss.makeev_local }
430*2f083884Ss.makeev_local 
TEST(CheckArray2DCloseFailureIncludesCheckExpectedAndActual)431*2f083884Ss.makeev_local TEST(CheckArray2DCloseFailureIncludesCheckExpectedAndActual)
432*2f083884Ss.makeev_local {
433*2f083884Ss.makeev_local     RecordingReporter reporter;
434*2f083884Ss.makeev_local     {
435*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
436*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
437*2f083884Ss.makeev_local 
438*2f083884Ss.makeev_local 		int const data1[2][2] = { {0, 1}, {2, 3} };
439*2f083884Ss.makeev_local         int const data2[2][2] = { {0, 1}, {3, 3} };
440*2f083884Ss.makeev_local 
441*2f083884Ss.makeev_local 		CHECK_ARRAY2D_CLOSE (data1, data2, 2, 2, 0.01f);
442*2f083884Ss.makeev_local     }
443*2f083884Ss.makeev_local 
444*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "xpected [ [ 0 1 ] [ 2 3 ] ]"));
445*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "was [ [ 0 1 ] [ 3 3 ] ]"));
446*2f083884Ss.makeev_local }
447*2f083884Ss.makeev_local 
TEST(CheckArray2DCloseFailureContainsCorrectDetails)448*2f083884Ss.makeev_local TEST(CheckArray2DCloseFailureContainsCorrectDetails)
449*2f083884Ss.makeev_local {
450*2f083884Ss.makeev_local     int line = 0;
451*2f083884Ss.makeev_local     RecordingReporter reporter;
452*2f083884Ss.makeev_local     {
453*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
454*2f083884Ss.makeev_local 		UnitTest::TestDetails testDetails("array2DCloseTest", "array2DCloseSuite", "filename", -1);
455*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults, &testDetails);
456*2f083884Ss.makeev_local 
457*2f083884Ss.makeev_local 		int const data1[2][2] = { {0, 1}, {2, 3} };
458*2f083884Ss.makeev_local         int const data2[2][2] = { {0, 1}, {3, 3} };
459*2f083884Ss.makeev_local 		CHECK_ARRAY2D_CLOSE (data1, data2, 2, 2, 0.01f);     line = __LINE__;
460*2f083884Ss.makeev_local     }
461*2f083884Ss.makeev_local 
462*2f083884Ss.makeev_local     CHECK_EQUAL("array2DCloseTest", reporter.lastFailedTest);
463*2f083884Ss.makeev_local     CHECK_EQUAL("array2DCloseSuite", reporter.lastFailedSuite);
464*2f083884Ss.makeev_local     CHECK_EQUAL("filename", reporter.lastFailedFile);
465*2f083884Ss.makeev_local     CHECK_EQUAL(line, reporter.lastFailedLine);
466*2f083884Ss.makeev_local }
467*2f083884Ss.makeev_local 
TEST(CheckArray2DCloseFailureIncludesTolerance)468*2f083884Ss.makeev_local TEST(CheckArray2DCloseFailureIncludesTolerance)
469*2f083884Ss.makeev_local {
470*2f083884Ss.makeev_local     RecordingReporter reporter;
471*2f083884Ss.makeev_local     {
472*2f083884Ss.makeev_local         UnitTest::TestResults testResults(&reporter);
473*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
474*2f083884Ss.makeev_local 
475*2f083884Ss.makeev_local 		float const data1[2][2] = { {0, 1}, {2, 3} };
476*2f083884Ss.makeev_local         float const data2[2][2] = { {0, 1}, {3, 3} };
477*2f083884Ss.makeev_local         CHECK_ARRAY2D_CLOSE (data1, data2, 2, 2, 0.01f);
478*2f083884Ss.makeev_local     }
479*2f083884Ss.makeev_local 
480*2f083884Ss.makeev_local     CHECK(strstr(reporter.lastFailedMessage, "0.01"));
481*2f083884Ss.makeev_local }
482*2f083884Ss.makeev_local 
FunctionWithSideEffects3()483*2f083884Ss.makeev_local float const* const* FunctionWithSideEffects3()
484*2f083884Ss.makeev_local {
485*2f083884Ss.makeev_local     ++g_sideEffect;
486*2f083884Ss.makeev_local     static float const data1[] = {0,1};
487*2f083884Ss.makeev_local     static float const data2[] = {2,3};
488*2f083884Ss.makeev_local     static const float* const data[] = {data1, data2};
489*2f083884Ss.makeev_local     return data;
490*2f083884Ss.makeev_local }
491*2f083884Ss.makeev_local 
TEST(CheckArray2DCloseDoesNotHaveSideEffectsWhenPassing)492*2f083884Ss.makeev_local TEST(CheckArray2DCloseDoesNotHaveSideEffectsWhenPassing)
493*2f083884Ss.makeev_local {
494*2f083884Ss.makeev_local     g_sideEffect = 0;
495*2f083884Ss.makeev_local     {
496*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
497*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
498*2f083884Ss.makeev_local 
499*2f083884Ss.makeev_local 		const float data[2][2] = { {0, 1}, {2, 3} };
500*2f083884Ss.makeev_local         CHECK_ARRAY2D_CLOSE (data, FunctionWithSideEffects3(), 2, 2, 0.01f);
501*2f083884Ss.makeev_local     }
502*2f083884Ss.makeev_local     CHECK_EQUAL(1, g_sideEffect);
503*2f083884Ss.makeev_local }
504*2f083884Ss.makeev_local 
TEST(CheckArray2DCloseDoesNotHaveSideEffectsWhenFailing)505*2f083884Ss.makeev_local TEST(CheckArray2DCloseDoesNotHaveSideEffectsWhenFailing)
506*2f083884Ss.makeev_local {
507*2f083884Ss.makeev_local     g_sideEffect = 0;
508*2f083884Ss.makeev_local     {
509*2f083884Ss.makeev_local         UnitTest::TestResults testResults;
510*2f083884Ss.makeev_local 		ScopedCurrentTest scopedResults(testResults);
511*2f083884Ss.makeev_local 
512*2f083884Ss.makeev_local 		const float data[2][2] = { {0, 1}, {3, 3} };
513*2f083884Ss.makeev_local         CHECK_ARRAY2D_CLOSE (data, FunctionWithSideEffects3(), 2, 2, 0.01f);
514*2f083884Ss.makeev_local     }
515*2f083884Ss.makeev_local     CHECK_EQUAL(1, g_sideEffect);
516*2f083884Ss.makeev_local }
517*2f083884Ss.makeev_local 
518*2f083884Ss.makeev_local }
519