XmlTestReporter.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "XmlTestReporter.h"
  2. #include "Config.h"
  3. #include <iostream>
  4. #include <sstream>
  5. #include <string>
  6. using std::string;
  7. using std::ostringstream;
  8. using std::ostream;
  9. namespace {
  10. void ReplaceChar(string& str, char c, string const& replacement)
  11. {
  12. for (size_t pos = str.find(c); pos != string::npos; pos = str.find(c, pos + 1))
  13. str.replace(pos, 1, replacement);
  14. }
  15. string XmlEscape(string const& value)
  16. {
  17. string escaped = value;
  18. ReplaceChar(escaped, '&', "&amp;");
  19. ReplaceChar(escaped, '<', "&lt;");
  20. ReplaceChar(escaped, '>', "&gt;");
  21. ReplaceChar(escaped, '\'', "&apos;");
  22. ReplaceChar(escaped, '\"', "&quot;");
  23. return escaped;
  24. }
  25. string BuildFailureMessage(string const& file, int line, string const& message)
  26. {
  27. ostringstream failureMessage;
  28. failureMessage << file << "(" << line << ") : " << message;
  29. return failureMessage.str();
  30. }
  31. }
  32. namespace UnitTest {
  33. XmlTestReporter::XmlTestReporter(ostream& ostream)
  34. : m_ostream(ostream)
  35. {
  36. }
  37. void XmlTestReporter::ReportSummary(int totalTestCount, int failedTestCount,
  38. int failureCount, float secondsElapsed)
  39. {
  40. AddXmlElement(m_ostream, NULL);
  41. BeginResults(m_ostream, totalTestCount, failedTestCount, failureCount, secondsElapsed);
  42. DeferredTestResultList const& results = GetResults();
  43. for (DeferredTestResultList::const_iterator i = results.begin(); i != results.end(); ++i)
  44. {
  45. BeginTest(m_ostream, *i);
  46. if (i->failed)
  47. AddFailure(m_ostream, *i);
  48. EndTest(m_ostream, *i);
  49. }
  50. EndResults(m_ostream);
  51. }
  52. void XmlTestReporter::AddXmlElement(ostream& os, char const* encoding)
  53. {
  54. os << "<?xml version=\"1.0\"";
  55. if (encoding != NULL)
  56. os << " encoding=\"" << encoding << "\"";
  57. os << "?>";
  58. }
  59. void XmlTestReporter::BeginResults(std::ostream& os, int totalTestCount, int failedTestCount,
  60. int failureCount, float secondsElapsed)
  61. {
  62. os << "<unittest-results"
  63. << " tests=\"" << totalTestCount << "\""
  64. << " failedtests=\"" << failedTestCount << "\""
  65. << " failures=\"" << failureCount << "\""
  66. << " time=\"" << secondsElapsed << "\""
  67. << ">";
  68. }
  69. void XmlTestReporter::EndResults(std::ostream& os)
  70. {
  71. os << "</unittest-results>";
  72. }
  73. void XmlTestReporter::BeginTest(std::ostream& os, DeferredTestResult const& result)
  74. {
  75. os << "<test"
  76. << " suite=\"" << result.suiteName << "\""
  77. << " name=\"" << result.testName << "\""
  78. << " time=\"" << result.timeElapsed << "\"";
  79. }
  80. void XmlTestReporter::EndTest(std::ostream& os, DeferredTestResult const& result)
  81. {
  82. if (result.failed)
  83. os << "</test>";
  84. else
  85. os << "/>";
  86. }
  87. void XmlTestReporter::AddFailure(std::ostream& os, DeferredTestResult const& result)
  88. {
  89. os << ">"; // close <test> element
  90. for (DeferredTestResult::FailureVec::const_iterator it = result.failures.begin();
  91. it != result.failures.end();
  92. ++it)
  93. {
  94. string const escapedMessage = XmlEscape(it->second);
  95. string const message = BuildFailureMessage(result.failureFile, it->first, escapedMessage);
  96. os << "<failure" << " message=\"" << message << "\"" << "/>";
  97. }
  98. }
  99. }