1 #include "UnitTest++/Config.h" 2 3 #ifndef UNITTEST_NO_DEFERRED_REPORTER 4 5 #include "UnitTest++/UnitTestPP.h" 6 #include "UnitTest++/DeferredTestReporter.h" 7 #include <cstring> 8 9 namespace UnitTest 10 { 11 12 namespace 13 { 14 15 #ifndef UNITTEST_MEMORYOUTSTREAM_IS_STD_OSTRINGSTREAM 16 MemoryOutStream& operator <<(MemoryOutStream& lhs, const std::string& rhs) 17 { 18 lhs << rhs.c_str(); 19 return lhs; 20 } 21 #endif 22 23 struct MockDeferredTestReporter : public DeferredTestReporter 24 { 25 virtual void ReportSummary(int, int, int, float) 26 { 27 } 28 }; 29 30 struct DeferredTestReporterFixture 31 { 32 DeferredTestReporterFixture() 33 : testName("UniqueTestName") 34 , testSuite("UniqueTestSuite") 35 , fileName("filename.h") 36 , lineNumber(12) 37 , details(testName.c_str(), testSuite.c_str(), fileName.c_str(), lineNumber) 38 { 39 } 40 41 MockDeferredTestReporter reporter; 42 std::string const testName; 43 std::string const testSuite; 44 std::string const fileName; 45 int const lineNumber; 46 TestDetails const details; 47 }; 48 49 TEST_FIXTURE(DeferredTestReporterFixture, ReportTestStartCreatesANewDeferredTest) 50 { 51 reporter.ReportTestStart(details); 52 CHECK_EQUAL(1, (int)reporter.GetResults().size()); 53 } 54 55 TEST_FIXTURE(DeferredTestReporterFixture, ReportTestStartCapturesTestNameAndSuite) 56 { 57 reporter.ReportTestStart(details); 58 59 DeferredTestResult const& result = reporter.GetResults().at(0); 60 CHECK_EQUAL(testName.c_str(), result.testName.c_str()); 61 CHECK_EQUAL(testSuite.c_str(), result.suiteName.c_str()); 62 } 63 64 TEST_FIXTURE(DeferredTestReporterFixture, ReportTestEndCapturesTestTime) 65 { 66 float const elapsed = 123.45f; 67 reporter.ReportTestStart(details); 68 reporter.ReportTestFinish(details, elapsed); 69 70 DeferredTestResult const& result = reporter.GetResults().at(0); 71 CHECK_CLOSE(elapsed, result.timeElapsed, 0.0001f); 72 } 73 74 TEST_FIXTURE(DeferredTestReporterFixture, ReportFailureSavesFailureDetails) 75 { 76 char const* failure = "failure"; 77 78 reporter.ReportTestStart(details); 79 reporter.ReportFailure(details, failure); 80 81 DeferredTestResult const& result = reporter.GetResults().at(0); 82 CHECK(result.failed == true); 83 CHECK_EQUAL(fileName.c_str(), result.failureFile.c_str()); 84 } 85 86 TEST_FIXTURE(DeferredTestReporterFixture, ReportFailureSavesFailureDetailsForMultipleFailures) 87 { 88 char const* failure1 = "failure 1"; 89 char const* failure2 = "failure 2"; 90 91 reporter.ReportTestStart(details); 92 reporter.ReportFailure(details, failure1); 93 reporter.ReportFailure(details, failure2); 94 95 DeferredTestResult const& result = reporter.GetResults().at(0); 96 CHECK_EQUAL(2, (int)result.failures.size()); 97 CHECK_EQUAL(failure1, result.failures[0].failureStr); 98 CHECK_EQUAL(failure2, result.failures[1].failureStr); 99 } 100 101 TEST_FIXTURE(DeferredTestReporterFixture, DeferredTestReporterTakesCopyOfFailureMessage) 102 { 103 reporter.ReportTestStart(details); 104 105 char failureMessage[128]; 106 char const* goodStr = "Real failure message"; 107 char const* badStr = "Bogus failure message"; 108 109 using namespace std; 110 111 strcpy(failureMessage, goodStr); 112 reporter.ReportFailure(details, failureMessage); 113 strcpy(failureMessage, badStr); 114 115 DeferredTestResult const& result = reporter.GetResults().at(0); 116 DeferredTestFailure const& failure = result.failures.at(0); 117 CHECK_EQUAL(goodStr, failure.failureStr); 118 } 119 120 }} 121 122 #endif 123