text: #include "UnitTest++/UnitTestPP.h"
  #include "UnitTest++/CompositeTestReporter.h"
  
  using namespace UnitTest;
  
  namespace {
  
     TEST(ZeroReportersByDefault)
     {
        CHECK_EQUAL(0, CompositeTestReporter().GetReporterCount());
     }
  
     struct MockReporter : TestReporter
     {
        MockReporter()
           : testStartCalled(false)
           , testStartDetails(NULL)
           , failureCalled(false)
           , failureDetails(NULL)
           , failureStr(NULL)
           , testFinishCalled(false)
           , testFinishDetails(NULL)
           , testFinishSecondsElapsed(-1.0f)
           , summaryCalled(false)
           , summaryTotalTestCount(-1)
           , summaryFailureCount(-1)
           , summarySecondsElapsed(-1.0f)
        {}
  
        virtual void ReportTestStart(TestDetails const& test)
        {
           testStartCalled = true;
           testStartDetails = &test;
        }
  
        virtual void ReportFailure(TestDetails const& test, char const* failure)
        {
           failureCalled = true;
           failureDetails = &test;
           failureStr = failure;
        }
  
        virtual void ReportTestFinish(TestDetails const& test, float secondsElapsed)
        {
           testFinishCalled = true;
           testFinishDetails = &test;
           testFinishSecondsElapsed = secondsElapsed;
        }
  
        virtual void ReportSummary(int totalTestCount,
                                   int failedTestCount,
                                   int failureCount,
                                   float secondsElapsed)
        {
           summaryCalled = true;
           summaryTotalTestCount = totalTestCount;
           summaryFailedTestCount = failedTestCount;
           summaryFailureCount = failureCount;
           summarySecondsElapsed = secondsElapsed;
        }
  
        bool testStartCalled;
        TestDetails const* testStartDetails;
  
        bool failureCalled;
        TestDetails const* failureDetails;
        const char* failureStr;
  
        bool testFinishCalled;
        TestDetails const* testFinishDetails;
        float testFinishSecondsElapsed;
  
        bool summaryCalled;
        int summaryTotalTestCount;
        int summaryFailedTestCount;
        int summaryFailureCount;
        float summarySecondsElapsed;
     };
  
     TEST(AddReporter)
     {
        MockReporter r;
        CompositeTestReporter c;
  
        CHECK(c.AddReporter(&r));
        CHECK_EQUAL(1, c.GetReporterCount());
     }
  
     TEST(RemoveReporter)
     {
        MockReporter r;
        CompositeTestReporter c;
  
        c.AddReporter(&r);
        CHECK(c.RemoveReporter(&r));
        CHECK_EQUAL(0, c.GetReporterCount());
     }
  
     struct Fixture
     {
        Fixture()
        {
           c.AddReporter(&r0);
           c.AddReporter(&r1);
        }
  
        MockReporter r0, r1;
        CompositeTestReporter c;
     };
  
     TEST_FIXTURE(Fixture, ReportTestStartCallsReportTestStartOnAllAggregates)
     {
        TestDetails t("", "", "", 0);
        c.ReportTestStart(t);
  
        CHECK(r0.testStartCalled);
        CHECK_EQUAL(&t, r0.testStartDetails);
        CHECK(r1.testStartCalled);
        CHECK_EQUAL(&t, r1.testStartDetails);
     }
  
     TEST_FIXTURE(Fixture, ReportFailureCallsReportFailureOnAllAggregates)
     {
        TestDetails t("", "", "", 0);
        const char* failStr = "fail";
        c.ReportFailure(t, failStr);
  
        CHECK(r0.failureCalled);
        CHECK_EQUAL(&t, r0.failureDetails);
        CHECK_EQUAL(failStr, r0.failureStr);
  
        CHECK(r1.failureCalled);
        CHECK_EQUAL(&t, r1.failureDetails);
        CHECK_EQUAL(failStr, r1.failureStr);
     }
  
     TEST_FIXTURE(Fixture, ReportTestFinishCallsReportTestFinishOnAllAggregates)
     {
        TestDetails t("", "", "", 0);
        const float s = 1.2345f;
        c.ReportTestFinish(t, s);
  
        CHECK(r0.testFinishCalled);
        CHECK_EQUAL(&t, r0.testFinishDetails);
        CHECK_CLOSE(s, r0.testFinishSecondsElapsed, 0.00001f);
  
        CHECK(r1.testFinishCalled);
        CHECK_EQUAL(&t, r1.testFinishDetails);
        CHECK_CLOSE(s, r1.testFinishSecondsElapsed, 0.00001f);
     }
  
     TEST_FIXTURE(Fixture, ReportSummaryCallsReportSummaryOnAllAggregates)
     {
        TestDetails t("", "", "", 0);
        const int testCount = 3;
        const int failedTestCount = 4;
        const int failureCount = 5;
        const float secondsElapsed = 3.14159f;
  
        c.ReportSummary(testCount, failedTestCount, failureCount, secondsElapsed);
  
        CHECK(r0.summaryCalled);
        CHECK_EQUAL(testCount, r0.summaryTotalTestCount);
        CHECK_EQUAL(failedTestCount, r0.summaryFailedTestCount);
        CHECK_EQUAL(failureCount, r0.summaryFailureCount);
        CHECK_CLOSE(secondsElapsed, r0.summarySecondsElapsed, 0.00001f);
  
        CHECK(r1.summaryCalled);
        CHECK_EQUAL(testCount, r1.summaryTotalTestCount);
        CHECK_EQUAL(failedTestCount, r1.summaryFailedTestCount);
        CHECK_EQUAL(failureCount, r1.summaryFailureCount);
        CHECK_CLOSE(secondsElapsed, r1.summarySecondsElapsed, 0.00001f);
     }
  
  }
  