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 }