#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);
 
   }
 
 
 
}