1*2f083884Ss.makeev_local #include "UnitTest++/UnitTestPP.h"
2*2f083884Ss.makeev_local #include "RecordingReporter.h"
3*2f083884Ss.makeev_local #include "UnitTest++/ReportAssert.h"
4*2f083884Ss.makeev_local #include "UnitTest++/TestList.h"
5*2f083884Ss.makeev_local #include "UnitTest++/TimeHelpers.h"
6*2f083884Ss.makeev_local #include "UnitTest++/TimeConstraint.h"
7*2f083884Ss.makeev_local #include "UnitTest++/ReportAssertImpl.h"
8*2f083884Ss.makeev_local 
9*2f083884Ss.makeev_local using namespace UnitTest;
10*2f083884Ss.makeev_local 
11*2f083884Ss.makeev_local namespace
12*2f083884Ss.makeev_local {
13*2f083884Ss.makeev_local 
14*2f083884Ss.makeev_local     struct MockTest : public Test
15*2f083884Ss.makeev_local     {
MockTest__anon0a4b51480111::MockTest16*2f083884Ss.makeev_local         MockTest(char const* testName, bool const success_, bool const assert_, int const count_ = 1)
17*2f083884Ss.makeev_local         : Test(testName)
18*2f083884Ss.makeev_local         , success(success_)
19*2f083884Ss.makeev_local         , asserted(assert_)
20*2f083884Ss.makeev_local         , count(count_)
21*2f083884Ss.makeev_local         {
22*2f083884Ss.makeev_local         }
23*2f083884Ss.makeev_local 
RunImpl__anon0a4b51480111::MockTest24*2f083884Ss.makeev_local         virtual void RunImpl() const
25*2f083884Ss.makeev_local         {
26*2f083884Ss.makeev_local             TestResults& testResults_ = *CurrentTest::Results();
27*2f083884Ss.makeev_local 
28*2f083884Ss.makeev_local             for (int i=0; i < count; ++i)
29*2f083884Ss.makeev_local             {
30*2f083884Ss.makeev_local                 if (asserted)
31*2f083884Ss.makeev_local                 {
32*2f083884Ss.makeev_local                     ReportAssert("desc", "file", 0);
33*2f083884Ss.makeev_local                 }
34*2f083884Ss.makeev_local                 else if (!success)
35*2f083884Ss.makeev_local                 {
36*2f083884Ss.makeev_local                     testResults_.OnTestFailure(m_details, "message");
37*2f083884Ss.makeev_local                 }
38*2f083884Ss.makeev_local             }
39*2f083884Ss.makeev_local         }
40*2f083884Ss.makeev_local 
41*2f083884Ss.makeev_local         bool const success;
42*2f083884Ss.makeev_local         bool const asserted;
43*2f083884Ss.makeev_local         int const count;
44*2f083884Ss.makeev_local     };
45*2f083884Ss.makeev_local 
46*2f083884Ss.makeev_local     struct FixtureBase
47*2f083884Ss.makeev_local     {
FixtureBase__anon0a4b51480111::FixtureBase48*2f083884Ss.makeev_local         FixtureBase()
49*2f083884Ss.makeev_local         : runner(reporter)
50*2f083884Ss.makeev_local         {
51*2f083884Ss.makeev_local         }
52*2f083884Ss.makeev_local 
53*2f083884Ss.makeev_local         template <class Predicate>
RunTestsIf__anon0a4b51480111::FixtureBase54*2f083884Ss.makeev_local         int RunTestsIf(TestList const& list, char const* suiteName,
55*2f083884Ss.makeev_local                        const Predicate& predicate, int maxTestTimeInMs)
56*2f083884Ss.makeev_local         {
57*2f083884Ss.makeev_local             TestResults* oldResults = CurrentTest::Results();
58*2f083884Ss.makeev_local             const TestDetails* oldDetails = CurrentTest::Details();
59*2f083884Ss.makeev_local             int result = runner.RunTestsIf(list, suiteName, predicate, maxTestTimeInMs);
60*2f083884Ss.makeev_local             CurrentTest::Results() = oldResults;
61*2f083884Ss.makeev_local             CurrentTest::Details() = oldDetails;
62*2f083884Ss.makeev_local             return result;
63*2f083884Ss.makeev_local         }
64*2f083884Ss.makeev_local 
65*2f083884Ss.makeev_local         TestRunner runner;
66*2f083884Ss.makeev_local         RecordingReporter reporter;
67*2f083884Ss.makeev_local     };
68*2f083884Ss.makeev_local 
69*2f083884Ss.makeev_local     struct TestRunnerFixture : public FixtureBase
70*2f083884Ss.makeev_local     {
71*2f083884Ss.makeev_local         TestList list;
72*2f083884Ss.makeev_local     };
73*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,TestStartIsReportedCorrectly)74*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, TestStartIsReportedCorrectly)
75*2f083884Ss.makeev_local     {
76*2f083884Ss.makeev_local         MockTest test("goodtest", true, false);
77*2f083884Ss.makeev_local         list.Add(&test);
78*2f083884Ss.makeev_local 
79*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
80*2f083884Ss.makeev_local         CHECK_EQUAL(1, reporter.testRunCount);
81*2f083884Ss.makeev_local         CHECK_EQUAL("goodtest", reporter.lastStartedTest);
82*2f083884Ss.makeev_local     }
83*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,TestFinishIsReportedCorrectly)84*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, TestFinishIsReportedCorrectly)
85*2f083884Ss.makeev_local     {
86*2f083884Ss.makeev_local         MockTest test("goodtest", true, false);
87*2f083884Ss.makeev_local         list.Add(&test);
88*2f083884Ss.makeev_local 
89*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
90*2f083884Ss.makeev_local         CHECK_EQUAL(1, reporter.testFinishedCount);
91*2f083884Ss.makeev_local         CHECK_EQUAL("goodtest", reporter.lastFinishedTest);
92*2f083884Ss.makeev_local     }
93*2f083884Ss.makeev_local 
94*2f083884Ss.makeev_local     class SlowTest : public Test
95*2f083884Ss.makeev_local     {
96*2f083884Ss.makeev_local     public:
SlowTest()97*2f083884Ss.makeev_local         SlowTest()
98*2f083884Ss.makeev_local         : Test("slow", "somesuite", "filename", 123)
99*2f083884Ss.makeev_local         {
100*2f083884Ss.makeev_local         }
101*2f083884Ss.makeev_local 
RunImpl() const102*2f083884Ss.makeev_local         virtual void RunImpl() const
103*2f083884Ss.makeev_local         {
104*2f083884Ss.makeev_local             TimeHelpers::SleepMs(20);
105*2f083884Ss.makeev_local         }
106*2f083884Ss.makeev_local     };
107*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,TestFinishIsCalledWithCorrectTime)108*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, TestFinishIsCalledWithCorrectTime)
109*2f083884Ss.makeev_local     {
110*2f083884Ss.makeev_local         SlowTest test;
111*2f083884Ss.makeev_local         list.Add(&test);
112*2f083884Ss.makeev_local 
113*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
114*2f083884Ss.makeev_local         CHECK(reporter.lastFinishedTestTime >= 0.005f && reporter.lastFinishedTestTime <= 0.050f);
115*2f083884Ss.makeev_local     }
116*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,FailureCountIsZeroWhenNoTestsAreRun)117*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, FailureCountIsZeroWhenNoTestsAreRun)
118*2f083884Ss.makeev_local     {
119*2f083884Ss.makeev_local         CHECK_EQUAL(0, RunTestsIf(list, NULL, True(), 0));
120*2f083884Ss.makeev_local         CHECK_EQUAL(0, reporter.testRunCount);
121*2f083884Ss.makeev_local         CHECK_EQUAL(0, reporter.testFailedCount);
122*2f083884Ss.makeev_local     }
123*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,CallsReportFailureOncePerFailingTest)124*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, CallsReportFailureOncePerFailingTest)
125*2f083884Ss.makeev_local     {
126*2f083884Ss.makeev_local         MockTest test1("test", false, false);
127*2f083884Ss.makeev_local         list.Add(&test1);
128*2f083884Ss.makeev_local         MockTest test2("test", true, false);
129*2f083884Ss.makeev_local         list.Add(&test2);
130*2f083884Ss.makeev_local         MockTest test3("test", false, false);
131*2f083884Ss.makeev_local         list.Add(&test3);
132*2f083884Ss.makeev_local 
133*2f083884Ss.makeev_local         CHECK_EQUAL(2, RunTestsIf(list, NULL, True(), 0));
134*2f083884Ss.makeev_local         CHECK_EQUAL(2, reporter.testFailedCount);
135*2f083884Ss.makeev_local     }
136*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,TestsThatAssertAreReportedAsFailing)137*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, TestsThatAssertAreReportedAsFailing)
138*2f083884Ss.makeev_local     {
139*2f083884Ss.makeev_local         MockTest test("test", true, true);
140*2f083884Ss.makeev_local         list.Add(&test);
141*2f083884Ss.makeev_local 
142*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
143*2f083884Ss.makeev_local         CHECK_EQUAL(1, reporter.testFailedCount);
144*2f083884Ss.makeev_local     }
145*2f083884Ss.makeev_local 
146*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,ReporterNotifiedOfTestCount)147*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, ReporterNotifiedOfTestCount)
148*2f083884Ss.makeev_local     {
149*2f083884Ss.makeev_local         MockTest test1("test", true, false);
150*2f083884Ss.makeev_local         MockTest test2("test", true, false);
151*2f083884Ss.makeev_local         MockTest test3("test", true, false);
152*2f083884Ss.makeev_local         list.Add(&test1);
153*2f083884Ss.makeev_local         list.Add(&test2);
154*2f083884Ss.makeev_local         list.Add(&test3);
155*2f083884Ss.makeev_local 
156*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
157*2f083884Ss.makeev_local         CHECK_EQUAL(3, reporter.summaryTotalTestCount);
158*2f083884Ss.makeev_local     }
159*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,ReporterNotifiedOfFailedTests)160*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, ReporterNotifiedOfFailedTests)
161*2f083884Ss.makeev_local     {
162*2f083884Ss.makeev_local         MockTest test1("test", false, false, 2);
163*2f083884Ss.makeev_local         MockTest test2("test", true, false);
164*2f083884Ss.makeev_local         MockTest test3("test", false, false, 3);
165*2f083884Ss.makeev_local         list.Add(&test1);
166*2f083884Ss.makeev_local         list.Add(&test2);
167*2f083884Ss.makeev_local         list.Add(&test3);
168*2f083884Ss.makeev_local 
169*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
170*2f083884Ss.makeev_local         CHECK_EQUAL(2, reporter.summaryFailedTestCount);
171*2f083884Ss.makeev_local     }
172*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,ReporterNotifiedOfFailures)173*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, ReporterNotifiedOfFailures)
174*2f083884Ss.makeev_local     {
175*2f083884Ss.makeev_local         MockTest test1("test", false, false, 2);
176*2f083884Ss.makeev_local         MockTest test2("test", true, false);
177*2f083884Ss.makeev_local         MockTest test3("test", false, false, 3);
178*2f083884Ss.makeev_local         list.Add(&test1);
179*2f083884Ss.makeev_local         list.Add(&test2);
180*2f083884Ss.makeev_local         list.Add(&test3);
181*2f083884Ss.makeev_local 
182*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
183*2f083884Ss.makeev_local         CHECK_EQUAL(5, reporter.summaryFailureCount);
184*2f083884Ss.makeev_local     }
185*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,SlowTestPassesForHighTimeThreshold)186*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, SlowTestPassesForHighTimeThreshold)
187*2f083884Ss.makeev_local     {
188*2f083884Ss.makeev_local         SlowTest test;
189*2f083884Ss.makeev_local         list.Add(&test);
190*2f083884Ss.makeev_local 
191*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
192*2f083884Ss.makeev_local         CHECK_EQUAL(0, reporter.testFailedCount);
193*2f083884Ss.makeev_local     }
194*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,SlowTestFailsForLowTimeThreshold)195*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, SlowTestFailsForLowTimeThreshold)
196*2f083884Ss.makeev_local     {
197*2f083884Ss.makeev_local         SlowTest test;
198*2f083884Ss.makeev_local         list.Add(&test);
199*2f083884Ss.makeev_local 
200*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 3);
201*2f083884Ss.makeev_local         CHECK_EQUAL(1, reporter.testFailedCount);
202*2f083884Ss.makeev_local     }
203*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,SlowTestHasCorrectFailureInformation)204*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, SlowTestHasCorrectFailureInformation)
205*2f083884Ss.makeev_local     {
206*2f083884Ss.makeev_local         SlowTest test;
207*2f083884Ss.makeev_local         list.Add(&test);
208*2f083884Ss.makeev_local 
209*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 3);
210*2f083884Ss.makeev_local 
211*2f083884Ss.makeev_local         using namespace std;
212*2f083884Ss.makeev_local 
213*2f083884Ss.makeev_local         CHECK_EQUAL(test.m_details.testName, reporter.lastFailedTest);
214*2f083884Ss.makeev_local         CHECK(strstr(test.m_details.filename, reporter.lastFailedFile));
215*2f083884Ss.makeev_local         CHECK_EQUAL(test.m_details.lineNumber, reporter.lastFailedLine);
216*2f083884Ss.makeev_local 
217*2f083884Ss.makeev_local         CHECK(strstr(reporter.lastFailedMessage, "Global time constraint failed"));
218*2f083884Ss.makeev_local         CHECK(strstr(reporter.lastFailedMessage, "3ms"));
219*2f083884Ss.makeev_local     }
220*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,SlowTestWithTimeExemptionPasses)221*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, SlowTestWithTimeExemptionPasses)
222*2f083884Ss.makeev_local     {
223*2f083884Ss.makeev_local         class SlowExemptedTest : public Test
224*2f083884Ss.makeev_local         {
225*2f083884Ss.makeev_local         public:
226*2f083884Ss.makeev_local             SlowExemptedTest() : Test("slowexempted", "", 0) {}
227*2f083884Ss.makeev_local             virtual void RunImpl() const
228*2f083884Ss.makeev_local             {
229*2f083884Ss.makeev_local                 UNITTEST_TIME_CONSTRAINT_EXEMPT();
230*2f083884Ss.makeev_local                 TimeHelpers::SleepMs(20);
231*2f083884Ss.makeev_local             }
232*2f083884Ss.makeev_local         };
233*2f083884Ss.makeev_local 
234*2f083884Ss.makeev_local         SlowExemptedTest test;
235*2f083884Ss.makeev_local         list.Add(&test);
236*2f083884Ss.makeev_local 
237*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 3);
238*2f083884Ss.makeev_local         CHECK_EQUAL(0, reporter.testFailedCount);
239*2f083884Ss.makeev_local     }
240*2f083884Ss.makeev_local 
241*2f083884Ss.makeev_local     struct TestSuiteFixture : FixtureBase
242*2f083884Ss.makeev_local     {
TestSuiteFixture__anon0a4b51480111::TestSuiteFixture243*2f083884Ss.makeev_local         TestSuiteFixture()
244*2f083884Ss.makeev_local         : test1("TestInDefaultSuite")
245*2f083884Ss.makeev_local         , test2("TestInOtherSuite", "OtherSuite")
246*2f083884Ss.makeev_local         , test3("SecondTestInDefaultSuite")
247*2f083884Ss.makeev_local         {
248*2f083884Ss.makeev_local             list.Add(&test1);
249*2f083884Ss.makeev_local             list.Add(&test2);
250*2f083884Ss.makeev_local         }
251*2f083884Ss.makeev_local 
252*2f083884Ss.makeev_local         Test test1;
253*2f083884Ss.makeev_local         Test test2;
254*2f083884Ss.makeev_local         Test test3;
255*2f083884Ss.makeev_local         TestList list;
256*2f083884Ss.makeev_local     };
257*2f083884Ss.makeev_local 
TEST_FIXTURE(TestSuiteFixture,TestRunnerRunsAllSuitesIfNullSuiteIsPassed)258*2f083884Ss.makeev_local     TEST_FIXTURE(TestSuiteFixture, TestRunnerRunsAllSuitesIfNullSuiteIsPassed)
259*2f083884Ss.makeev_local     {
260*2f083884Ss.makeev_local         RunTestsIf(list, NULL, True(), 0);
261*2f083884Ss.makeev_local         CHECK_EQUAL(2, reporter.summaryTotalTestCount);
262*2f083884Ss.makeev_local     }
263*2f083884Ss.makeev_local 
TEST_FIXTURE(TestSuiteFixture,TestRunnerRunsOnlySpecifiedSuite)264*2f083884Ss.makeev_local     TEST_FIXTURE(TestSuiteFixture,TestRunnerRunsOnlySpecifiedSuite)
265*2f083884Ss.makeev_local     {
266*2f083884Ss.makeev_local         RunTestsIf(list, "OtherSuite", True(), 0);
267*2f083884Ss.makeev_local         CHECK_EQUAL(1, reporter.summaryTotalTestCount);
268*2f083884Ss.makeev_local         CHECK_EQUAL("TestInOtherSuite", reporter.lastFinishedTest);
269*2f083884Ss.makeev_local     }
270*2f083884Ss.makeev_local 
271*2f083884Ss.makeev_local     struct RunTestIfNameIs
272*2f083884Ss.makeev_local     {
RunTestIfNameIs__anon0a4b51480111::RunTestIfNameIs273*2f083884Ss.makeev_local         RunTestIfNameIs(char const* name_)
274*2f083884Ss.makeev_local         : name(name_)
275*2f083884Ss.makeev_local         {
276*2f083884Ss.makeev_local         }
277*2f083884Ss.makeev_local 
operator ()__anon0a4b51480111::RunTestIfNameIs278*2f083884Ss.makeev_local         bool operator()(const Test* const test) const
279*2f083884Ss.makeev_local         {
280*2f083884Ss.makeev_local             using namespace std;
281*2f083884Ss.makeev_local             return (0 == strcmp(test->m_details.testName, name));
282*2f083884Ss.makeev_local         }
283*2f083884Ss.makeev_local 
284*2f083884Ss.makeev_local         char const* name;
285*2f083884Ss.makeev_local     };
286*2f083884Ss.makeev_local 
TEST(TestMockPredicateBehavesCorrectly)287*2f083884Ss.makeev_local     TEST(TestMockPredicateBehavesCorrectly)
288*2f083884Ss.makeev_local     {
289*2f083884Ss.makeev_local         RunTestIfNameIs predicate("pass");
290*2f083884Ss.makeev_local 
291*2f083884Ss.makeev_local         Test pass("pass");
292*2f083884Ss.makeev_local         Test fail("fail");
293*2f083884Ss.makeev_local 
294*2f083884Ss.makeev_local         CHECK(predicate(&pass));
295*2f083884Ss.makeev_local         CHECK(!predicate(&fail));
296*2f083884Ss.makeev_local     }
297*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,TestRunnerRunsTestsThatPassPredicate)298*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, TestRunnerRunsTestsThatPassPredicate)
299*2f083884Ss.makeev_local     {
300*2f083884Ss.makeev_local         Test should_run("goodtest");
301*2f083884Ss.makeev_local         list.Add(&should_run);
302*2f083884Ss.makeev_local 
303*2f083884Ss.makeev_local         Test should_not_run("badtest");
304*2f083884Ss.makeev_local         list.Add(&should_not_run);
305*2f083884Ss.makeev_local 
306*2f083884Ss.makeev_local         RunTestsIf(list, NULL, RunTestIfNameIs("goodtest"), 0);
307*2f083884Ss.makeev_local         CHECK_EQUAL(1, reporter.testRunCount);
308*2f083884Ss.makeev_local         CHECK_EQUAL("goodtest", reporter.lastStartedTest);
309*2f083884Ss.makeev_local     }
310*2f083884Ss.makeev_local 
TEST_FIXTURE(TestRunnerFixture,TestRunnerOnlyRunsTestsInSpecifiedSuiteAndThatPassPredicate)311*2f083884Ss.makeev_local     TEST_FIXTURE(TestRunnerFixture, TestRunnerOnlyRunsTestsInSpecifiedSuiteAndThatPassPredicate)
312*2f083884Ss.makeev_local     {
313*2f083884Ss.makeev_local         Test runningTest1("goodtest", "suite");
314*2f083884Ss.makeev_local         Test skippedTest2("goodtest");
315*2f083884Ss.makeev_local         Test skippedTest3("badtest", "suite");
316*2f083884Ss.makeev_local         Test skippedTest4("badtest");
317*2f083884Ss.makeev_local 
318*2f083884Ss.makeev_local         list.Add(&runningTest1);
319*2f083884Ss.makeev_local         list.Add(&skippedTest2);
320*2f083884Ss.makeev_local         list.Add(&skippedTest3);
321*2f083884Ss.makeev_local         list.Add(&skippedTest4);
322*2f083884Ss.makeev_local 
323*2f083884Ss.makeev_local         RunTestsIf(list, "suite", RunTestIfNameIs("goodtest"), 0);
324*2f083884Ss.makeev_local 
325*2f083884Ss.makeev_local         CHECK_EQUAL(1, reporter.testRunCount);
326*2f083884Ss.makeev_local         CHECK_EQUAL("goodtest", reporter.lastStartedTest);
327*2f083884Ss.makeev_local         CHECK_EQUAL("suite", reporter.lastStartedSuite);
328*2f083884Ss.makeev_local     }
329*2f083884Ss.makeev_local 
330*2f083884Ss.makeev_local }