package fitnesse.reporting.history; import fitnesse.FitNesseVersion; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import fitnesse.testsystems.TestSummary; import fitnesse.util.XmlUtil; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Writer; import java.util.ArrayList; import java.util.List; public class TestExecutionReport extends ExecutionReport { private List<TestResult> results = new ArrayList<>(); public TestExecutionReport(FitNesseVersion version, String rootPath) { super(version, rootPath); } public TestExecutionReport(InputStream input) throws IOException, SAXException, InvalidReportException { Document xmlDoc = XmlUtil.newDocument(input); unpackXml(xmlDoc); } public TestExecutionReport(File file) throws IOException, SAXException, InvalidReportException { Document xmlDoc = XmlUtil.newDocument(file); unpackXml(xmlDoc); } public TestExecutionReport(Document xmlDocument) throws InvalidReportException { unpackXml(xmlDocument); } @Override protected void unpackResults(Element testResults) { NodeList xmlResults = testResults.getElementsByTagName("result"); for (int resultIndex = 0; resultIndex < xmlResults.getLength(); resultIndex++) { unpackResult(xmlResults, resultIndex); } } private void unpackResult(NodeList xmlResults, int resultIndex) { Element xmlResult = (Element) xmlResults.item(resultIndex); TestResult result = new TestResult(); result.content = XmlUtil.getTextValue(xmlResult, "content"); result.right = XmlUtil.getTextValue(xmlResult, "right"); result.wrong = XmlUtil.getTextValue(xmlResult, "wrong"); result.ignores = XmlUtil.getTextValue(xmlResult, "ignores"); result.exceptions = XmlUtil.getTextValue(xmlResult, "exceptions"); result.relativePageName = XmlUtil.getTextValue(xmlResult, "relativePageName"); result.tags = XmlUtil.getTextValue(xmlResult, "tags"); result.dateString = XmlUtil.getTextValue(xmlResult, "date"); result.runTimeInMillis = XmlUtil.getTextValue(xmlResult, "runTimeInMillis"); Element xmlInstructions = XmlUtil.getElementByTagName(xmlResult, "instructions"); if (xmlInstructions != null) { unpackInstructions(result, xmlInstructions); } addResult(result); } private void unpackInstructions(TestResult result, Element xmlInstructions) { NodeList xmlInstructionResults = xmlInstructions.getElementsByTagName("instructionResult"); for (int instructionIndex = 0; instructionIndex < xmlInstructionResults.getLength(); instructionIndex++) { Element instructionElement = (Element) xmlInstructionResults.item(instructionIndex); String instruction = XmlUtil.getTextValue(instructionElement, "instruction"); String slimResult = XmlUtil.getTextValue(instructionElement, "slimResult"); InstructionResult instructionResult = new InstructionResult(); instructionResult.instruction = instruction; instructionResult.slimResult = slimResult; result.instructions.add(instructionResult); unpackExpectations(instructionElement, instructionResult); } } private void unpackExpectations(Element instructionElement, InstructionResult instructionResult) { NodeList xmlExpectations = instructionElement.getElementsByTagName("expectation"); for (int expectationIndex = 0; expectationIndex < xmlExpectations.getLength(); expectationIndex++) { Element expectationElement = (Element) xmlExpectations.item(expectationIndex); Expectation expectation = new Expectation(); instructionResult.addExpectation(expectation); expectation.status = XmlUtil.getTextValue(expectationElement, "status"); expectation.instructionId = XmlUtil.getTextValue(expectationElement, "instructionId"); expectation.col = XmlUtil.getTextValue(expectationElement, "col"); expectation.row = XmlUtil.getTextValue(expectationElement, "row"); expectation.type = XmlUtil.getTextValue(expectationElement, "type"); expectation.actual = XmlUtil.getTextValue(expectationElement, "actual"); expectation.expected = XmlUtil.getTextValue(expectationElement, "expected"); expectation.evaluationMessage = XmlUtil.getTextValue(expectationElement, "evaluationMessage"); } } public List<TestResult> getResults() { return new ArrayList<>(results); } public void addResult(TestResult currentResult) { results.add(currentResult); } public void toXml(Writer writer, VelocityEngine velocityEngine) { VelocityContext velocityContext = new VelocityContext(); velocityContext.put("response", this); Template template = velocityEngine.getTemplate("testResults.vm"); template.merge(velocityContext, writer); } public TestSummary getAssertionCounts() { TestSummary assertionCounts = new TestSummary(); for (TestResult result : results) { assertionCounts.add(result.getTestSummary()); } return assertionCounts; } public String getContentsOfReport(int reportNumber) { return results.get(reportNumber).getContent(); } public static class TestResult { public String right; public String wrong; public String ignores; public String exceptions; public String content; public String relativePageName; public List<InstructionResult> instructions = new ArrayList<>(); public String tags; public String dateString; public long startTime; public String runTimeInMillis; public String getRight() { return right; } public String getWrong() { return wrong; } public String getIgnores() { return ignores; } public String getExceptions() { return exceptions; } public String getDateString() { return dateString; } public String getRunTimeInMillis() { return runTimeInMillis; } public String getContent() { return content; } public String getRelativePageName() { return relativePageName; } public List<InstructionResult> getInstructions() { return instructions; } public String getTags() { return tags; } public void setTags(String tags) { this.tags = tags; } public TestSummary getTestSummary() { try { return new TestSummary( Integer.parseInt(right), Integer.parseInt(wrong), Integer.parseInt(ignores), Integer.parseInt(exceptions) ); } catch (NumberFormatException e) { return new TestSummary(); } } public void addInstruction(InstructionResult instructionResult) { instructions.add(instructionResult); } } public static class InstructionResult { public String instruction; public String slimResult; private List<Expectation> expectations = new ArrayList<>(); public void addExpectation(Expectation expectation) { expectations.add(expectation); } public String getInstruction() { return instruction; } public String getSlimResult() { return slimResult; } public List<Expectation> getExpectations() { return expectations; } } public static class Expectation { public String instructionId; public String col; public String row; public String type; public String actual; public String expected; public String evaluationMessage; public String status; public String getInstructionId() { return instructionId; } public String getCol() { return col; } public String getRow() { return row; } public String getType() { return type; } public String getActual() { return actual; } public String getExpected() { return expected; } public String getEvaluationMessage() { return evaluationMessage; } public String getStatus() { return status; } } public static class Table extends ArrayList<Row> { private static final long serialVersionUID = 1L; private String name; public Table(String tableName) { this.name = tableName; } public String getName() { return name; } } public static class Row extends ArrayList<String> { private static final long serialVersionUID = 1L; } }