mirror of
https://github.com/holub/mame
synced 2025-04-30 19:57:11 +03:00
132 lines
3.3 KiB
C++
132 lines
3.3 KiB
C++
#include "Config.h"
|
|
#ifndef UNITTEST_NO_DEFERRED_REPORTER
|
|
|
|
#include "XmlTestReporter.h"
|
|
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <string>
|
|
|
|
using std::string;
|
|
using std::ostringstream;
|
|
using std::ostream;
|
|
|
|
namespace {
|
|
|
|
void ReplaceChar(string& str, char 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 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 totalTestCount, int failedTestCount,
|
|
int failureCount, float 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 totalTestCount, int failedTestCount,
|
|
int failureCount, float 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(std::string(it->failureStr));
|
|
string const message = BuildFailureMessage(result.failureFile, it->lineNumber, escapedMessage);
|
|
|
|
os << "<failure" << " message=\"" << message << "\"" << "/>";
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|