1 #include "make_unique.h"
2 #include "JUnitTestReportWriter.h"
3 #include "StdStreamUtils.h"
4 #include "xml/Writer.h"
5 #include "string_format.h"
6 
CJUnitTestReportWriter()7 CJUnitTestReportWriter::CJUnitTestReportWriter()
8 {
9 	m_reportNode = std::make_unique<Framework::Xml::CNode>("", true);
10 	auto testSuitesNode = new Framework::Xml::CNode("testsuites", true);
11 	m_reportNode->InsertNode(testSuitesNode);
12 
13 	m_testSuiteNode = new Framework::Xml::CNode("testsuite", true);
14 	testSuitesNode->InsertNode(m_testSuiteNode);
15 }
16 
~CJUnitTestReportWriter()17 CJUnitTestReportWriter::~CJUnitTestReportWriter()
18 {
19 }
20 
ReportTestEntry(const std::string & testName,const TESTRESULT & result)21 void CJUnitTestReportWriter::ReportTestEntry(const std::string& testName, const TESTRESULT& result)
22 {
23 	auto testCaseNode = new Framework::Xml::CNode("testcase", true);
24 	testCaseNode->InsertAttribute("name", testName.c_str());
25 
26 	if(!result.succeeded)
27 	{
28 		std::string failureDetails;
29 		for(const auto& lineDiff : result.lineDiffs)
30 		{
31 			auto failureLine = string_format(
32 			    "result   : %s\r\n"
33 			    "expected : %s\r\n"
34 			    "\r\n",
35 			    lineDiff.result.c_str(), lineDiff.expected.c_str());
36 			failureDetails += failureLine;
37 		}
38 		auto resultNode = new Framework::Xml::CNode("failure", true);
39 		resultNode->InsertTextNode(failureDetails.c_str());
40 		testCaseNode->InsertNode(resultNode);
41 	}
42 
43 	m_testSuiteNode->InsertNode(testCaseNode);
44 
45 	m_testCount++;
46 }
47 
Write(const fs::path & reportPath)48 void CJUnitTestReportWriter::Write(const fs::path& reportPath)
49 {
50 	m_testSuiteNode->InsertAttribute("tests", string_format("%d", m_testCount).c_str());
51 	auto testOutputFileStream = Framework::CreateOutputStdStream(reportPath.native());
52 	Framework::Xml::CWriter::WriteDocument(testOutputFileStream, m_reportNode.get());
53 }
54