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