| #include "UnitTest++/Config.h" |
| #ifndef UNITTEST_NO_DEFERRED_REPORTER |
| |
| #include "UnitTest++/UnitTestPP.h" |
| #include "UnitTest++/XmlTestReporter.h" |
| |
| #include <sstream> |
| |
| using namespace UnitTest; |
| using std::ostringstream; |
| |
| namespace |
| { |
| |
| #ifndef UNITTEST_MEMORYOUTSTREAM_IS_STD_OSTRINGSTREAM |
| |
| // Overload to let MemoryOutStream accept std::string |
| MemoryOutStream& operator<<(MemoryOutStream& s, const std::string& value) |
| { |
| s << value.c_str(); |
| return s; |
| } |
| |
| #endif |
| |
| struct XmlTestReporterFixture |
| { |
| XmlTestReporterFixture() |
| : reporter(output) |
| { |
| } |
| |
| ostringstream output; |
| XmlTestReporter reporter; |
| }; |
| |
| TEST_FIXTURE(XmlTestReporterFixture, MultipleCharactersAreEscaped) |
| { |
| TestDetails const details("TestName", "suite", "filename.h", 4321); |
| |
| reporter.ReportTestStart(details); |
| reporter.ReportFailure(details, "\"\"\'\'&&<<>>"); |
| reporter.ReportTestFinish(details, 0.1f); |
| reporter.ReportSummary(1, 2, 3, 0.1f); |
| |
| char const* expected = |
| "<?xml version=\"1.0\"?>" |
| "<unittest-results tests=\"1\" failedtests=\"2\" failures=\"3\" time=\"0.1\">" |
| "<test suite=\"suite\" name=\"TestName\" time=\"0.1\">" |
| "<failure message=\"filename.h(4321) : " |
| """''&&<<>>\"/>" |
| "</test>" |
| "</unittest-results>"; |
| |
| CHECK_EQUAL(expected, output.str().c_str()); |
| } |
| |
| TEST_FIXTURE(XmlTestReporterFixture, OutputIsCachedUntilReportSummaryIsCalled) |
| { |
| TestDetails const details("", "", "", 0); |
| |
| reporter.ReportTestStart(details); |
| reporter.ReportFailure(details, "message"); |
| reporter.ReportTestFinish(details, 1.0F); |
| CHECK(output.str().empty()); |
| |
| reporter.ReportSummary(1, 1, 1, 1.0f); |
| CHECK(!output.str().empty()); |
| } |
| |
| TEST_FIXTURE(XmlTestReporterFixture, EmptyReportSummaryFormat) |
| { |
| reporter.ReportSummary(0, 0, 0, 0.1f); |
| |
| const char *expected = |
| "<?xml version=\"1.0\"?>" |
| "<unittest-results tests=\"0\" failedtests=\"0\" failures=\"0\" time=\"0.1\">" |
| "</unittest-results>"; |
| |
| CHECK_EQUAL(expected, output.str().c_str()); |
| } |
| |
| TEST_FIXTURE(XmlTestReporterFixture, SingleSuccessfulTestReportSummaryFormat) |
| { |
| TestDetails const details("TestName", "DefaultSuite", "", 0); |
| |
| reporter.ReportTestStart(details); |
| reporter.ReportSummary(1, 0, 0, 0.1f); |
| |
| const char *expected = |
| "<?xml version=\"1.0\"?>" |
| "<unittest-results tests=\"1\" failedtests=\"0\" failures=\"0\" time=\"0.1\">" |
| "<test suite=\"DefaultSuite\" name=\"TestName\" time=\"0\"/>" |
| "</unittest-results>"; |
| |
| CHECK_EQUAL(expected, output.str().c_str()); |
| } |
| |
| TEST_FIXTURE(XmlTestReporterFixture, SingleFailedTestReportSummaryFormat) |
| { |
| TestDetails const details("A Test", "suite", "A File", 4321); |
| |
| reporter.ReportTestStart(details); |
| reporter.ReportFailure(details, "A Failure"); |
| reporter.ReportSummary(1, 1, 1, 0.1f); |
| |
| const char *expected = |
| "<?xml version=\"1.0\"?>" |
| "<unittest-results tests=\"1\" failedtests=\"1\" failures=\"1\" time=\"0.1\">" |
| "<test suite=\"suite\" name=\"A Test\" time=\"0\">" |
| "<failure message=\"A File(4321) : A Failure\"/>" |
| "</test>" |
| "</unittest-results>"; |
| |
| CHECK_EQUAL(expected, output.str().c_str()); |
| } |
| |
| TEST_FIXTURE(XmlTestReporterFixture, FailureMessageIsXMLEscaped) |
| { |
| TestDetails const details("TestName", "suite", "filename.h", 4321); |
| |
| reporter.ReportTestStart(details); |
| reporter.ReportFailure(details, "\"\'&<>"); |
| reporter.ReportTestFinish(details, 0.1f); |
| reporter.ReportSummary(1, 1, 1, 0.1f); |
| |
| char const* expected = |
| "<?xml version=\"1.0\"?>" |
| "<unittest-results tests=\"1\" failedtests=\"1\" failures=\"1\" time=\"0.1\">" |
| "<test suite=\"suite\" name=\"TestName\" time=\"0.1\">" |
| "<failure message=\"filename.h(4321) : "'&<>\"/>" |
| "</test>" |
| "</unittest-results>"; |
| |
| CHECK_EQUAL(expected, output.str().c_str()); |
| } |
| |
| TEST_FIXTURE(XmlTestReporterFixture, OneFailureAndOneSuccess) |
| { |
| TestDetails const failedDetails("FailedTest", "suite", "fail.h", 1); |
| reporter.ReportTestStart(failedDetails); |
| reporter.ReportFailure(failedDetails, "expected 1 but was 2"); |
| reporter.ReportTestFinish(failedDetails, 0.1f); |
| |
| TestDetails const succeededDetails("SucceededTest", "suite", "", 0); |
| reporter.ReportTestStart(succeededDetails); |
| reporter.ReportTestFinish(succeededDetails, 1.0f); |
| reporter.ReportSummary(2, 1, 1, 1.1f); |
| |
| char const* expected = |
| "<?xml version=\"1.0\"?>" |
| "<unittest-results tests=\"2\" failedtests=\"1\" failures=\"1\" time=\"1.1\">" |
| "<test suite=\"suite\" name=\"FailedTest\" time=\"0.1\">" |
| "<failure message=\"fail.h(1) : expected 1 but was 2\"/>" |
| "</test>" |
| "<test suite=\"suite\" name=\"SucceededTest\" time=\"1\"/>" |
| "</unittest-results>"; |
| |
| CHECK_EQUAL(expected, output.str().c_str()); |
| } |
| |
| TEST_FIXTURE(XmlTestReporterFixture, MultipleFailures) |
| { |
| TestDetails const failedDetails1("FailedTest", "suite", "fail.h", 1); |
| TestDetails const failedDetails2("FailedTest", "suite", "fail.h", 31); |
| |
| reporter.ReportTestStart(failedDetails1); |
| reporter.ReportFailure(failedDetails1, "expected 1 but was 2"); |
| reporter.ReportFailure(failedDetails2, "expected one but was two"); |
| reporter.ReportTestFinish(failedDetails1, 0.1f); |
| |
| reporter.ReportSummary(1, 1, 2, 1.1f); |
| |
| char const* expected = |
| "<?xml version=\"1.0\"?>" |
| "<unittest-results tests=\"1\" failedtests=\"1\" failures=\"2\" time=\"1.1\">" |
| "<test suite=\"suite\" name=\"FailedTest\" time=\"0.1\">" |
| "<failure message=\"fail.h(1) : expected 1 but was 2\"/>" |
| "<failure message=\"fail.h(31) : expected one but was two\"/>" |
| "</test>" |
| "</unittest-results>"; |
| |
| CHECK_EQUAL(expected, output.str().c_str()); |
| } |
| |
| } |
| |
| #endif |