Mercurial > fife-parpg
view ext/UnitTest++/src/XmlTestReporter.cpp @ 196:1587ff8fa3a0
* Correct path splitting patch by Beliar :-)
* Fixes issues in case you check out the FIFE trunk into a directory called "engine"
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 01 Mar 2009 13:46:45 +0000 |
parents | 0d325e9d5953 |
children |
line wrap: on
line source
#include "XmlTestReporter.h" #include <iostream> #include <sstream> #include <string> using std::string; using std::ostringstream; using std::ostream; namespace { void ReplaceChar(string& str, char const c, string const& replacement) { for (size_t pos = str.find(c); pos != string::npos; pos = str.find(c, pos + 1)) str.replace(pos, 1, replacement); } string XmlEscape(string const& value) { string escaped = value; ReplaceChar(escaped, '&', "&"); ReplaceChar(escaped, '<', "<"); ReplaceChar(escaped, '>', ">"); ReplaceChar(escaped, '\'', "'"); ReplaceChar(escaped, '\"', """); return escaped; } string BuildFailureMessage(string const& file, int const line, string const& message) { ostringstream failureMessage; failureMessage << file << "(" << line << ") : " << message; return failureMessage.str(); } } namespace UnitTest { XmlTestReporter::XmlTestReporter(ostream& ostream) : m_ostream(ostream) { } void XmlTestReporter::ReportSummary(int const totalTestCount, int const failedTestCount, int const failureCount, float const secondsElapsed) { AddXmlElement(m_ostream, NULL); BeginResults(m_ostream, totalTestCount, failedTestCount, failureCount, secondsElapsed); DeferredTestResultList const& results = GetResults(); for (DeferredTestResultList::const_iterator i = results.begin(); i != results.end(); ++i) { BeginTest(m_ostream, *i); if (i->failed) AddFailure(m_ostream, *i); EndTest(m_ostream, *i); } EndResults(m_ostream); } void XmlTestReporter::AddXmlElement(ostream& os, char const* encoding) { os << "<?xml version=\"1.0\""; if (encoding != NULL) os << " encoding=\"" << encoding << "\""; os << "?>"; } void XmlTestReporter::BeginResults(std::ostream& os, int const totalTestCount, int const failedTestCount, int const failureCount, float const secondsElapsed) { os << "<unittest-results" << " tests=\"" << totalTestCount << "\"" << " failedtests=\"" << failedTestCount << "\"" << " failures=\"" << failureCount << "\"" << " time=\"" << secondsElapsed << "\"" << ">"; } void XmlTestReporter::EndResults(std::ostream& os) { os << "</unittest-results>"; } void XmlTestReporter::BeginTest(std::ostream& os, DeferredTestResult const& result) { os << "<test" << " suite=\"" << result.suiteName << "\"" << " name=\"" << result.testName << "\"" << " time=\"" << result.timeElapsed << "\""; } void XmlTestReporter::EndTest(std::ostream& os, DeferredTestResult const& result) { if (result.failed) os << "</test>"; else os << "/>"; } void XmlTestReporter::AddFailure(std::ostream& os, DeferredTestResult const& result) { os << ">"; // close <test> element for (DeferredTestResult::FailureVec::const_iterator it = result.failures.begin(); it != result.failures.end(); ++it) { string const escapedMessage = XmlEscape(it->second); string const message = BuildFailureMessage(result.failureFile, it->first, escapedMessage); os << "<failure" << " message=\"" << message << "\"" << "/>"; } } }