/* * Copyright (c) 2016 Vivid Solutions. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package org.locationtech.jtstest.testrunner; import java.io.StringWriter; import java.util.Date; import java.util.Iterator; import java.util.List; import org.locationtech.jts.util.Assert; import org.locationtech.jtstest.util.StringUtil; /** * @version 1.7 */ public class SimpleReportWriter implements ReportWriter { private static final String LABEL_TEST_CASE = "Case"; private boolean verbose; private StringWriter reportBuf; public SimpleReportWriter(boolean verbose) { this.verbose = verbose; } public String writeReport(TestEngine engine) { reportBuf = new StringWriter(); reportOnParsingProblems(engine.getParsingProblems()); reportOnTestRuns(engine.getTestRuns()); reportBuf.write("\n\n"); reportSummary(engine); reportBuf.write("\n"); reportOnTime(engine.getStart(), engine.getEnd()); return reportBuf.toString(); } public String write(Test test) { reportBuf = new StringWriter(); reportOnTest(test); return reportBuf.toString(); } public void reportOnTime(Date start, Date end) { long elapsedTime = end.getTime() - start.getTime(); long days = elapsedTime / (24 * 60 * 60 * 1000); long hours = (elapsedTime - (days * 24 * 60 * 60 * 1000)) / (60 * 60 * 1000); long minutes = (elapsedTime - (hours * 60 * 60 * 1000)) / (60 * 1000); double seconds = (elapsedTime - (minutes * 60 * 1000)) / (1000d); String message = "Elapsed time: "; message += days > 0 ? days + " days, " : ""; message += hours > 0 ? hours + " hours, " : ""; message += minutes > 0 ? minutes + " minutes, " : ""; message += seconds > 0 ? seconds + " seconds" : ""; reportBuf.write(message); } public void reportOnTest(Test test) { String id = test.getGeometryIndex() + " " + test.getOperation(); for (int i = 0; i < test.getArgumentCount(); i++) { id += " " + test.getArgument(i); } if (test.getExpectedResult() instanceof BooleanResult) { id += ", " + test.getExpectedResult().toShortString(); } if (test.getDescription().length() > 0) { id += ", " + test.getDescription(); } String report = ""; if (test.getException() != null) { reportBuf.write("Test Threw Exception (" + id + ")" + " " + (verbose ? StringUtil.getStackTrace(test.getException()) : test.getException().toString()) + "\n" ); } else if (test.isPassed() && verbose) { reportBuf.write("Test Passed (" + id + ")" + "\n"); } else if (! test.isPassed()) { reportBuf.write("Test Failed (" + id + ")" + "\n"); if (verbose) { reportBuf.write(" Expected: " + test.getExpectedResult().toFormattedString() + "\n"); try { reportBuf.write(" Actual: " + test.getActualResult().toFormattedString() + "\n"); } catch (Exception e) { Assert.shouldNeverReachHere(e.toString()); } } } } private void reportOnParsingProblems(List parsingProblems) { if (parsingProblems.isEmpty()) { return; } reportBuf.write("\n"); for (Iterator i = parsingProblems.iterator(); i.hasNext(); ) { String parsingProblem = (String) i.next(); reportBuf.write(parsingProblem); reportBuf.write("\n"); } } private void reportOnTestRuns(List testRuns) { for (Iterator i = testRuns.iterator(); i.hasNext(); ) { TestRun testRun = (TestRun) i.next(); reportOnTestRun(testRun); } } private void reportOnTestRun(TestRun testRun) { reportOnTestCases(testRun.getTestCases()); } private void reportOnTestCases(List testCases) { for (Iterator i = testCases.iterator(); i.hasNext(); ) { TestCase testCase = (TestCase) i.next(); if (testCase.isRun()) reportOnTestCase(testCase); } } private boolean areAllTestsPassed(TestCase testCase) { for (Iterator i = testCase.getTests().iterator(); i.hasNext(); ) { Test test = (Test) i.next(); if (! test.isPassed()) { return false; } } return true; } private void reportOnTestCase(TestCase testCase) { if (areAllTestsPassed(testCase) && ! verbose) { return; } reportBuf.write("\n"); reportBuf.write(LABEL_TEST_CASE + " " + testCase.getTestRun().getTestFile().getName() + " - #" + testCase.getCaseIndex() + " (" + testCase.getLineNumber() + ")" + (testCase.getDescription().length() > 0 ? ": " + testCase.getDescription() : "") + "\n"); reportOnTests(testCase.getTests()); } private void reportOnTests(List tests) { for (Iterator i = tests.iterator(); i.hasNext(); ) { Test test = (Test) i.next(); reportOnTest(test); } } public void reportSummary(TestEngine engine) { if (engine.getParseExceptionCount() > 0) { reportBuf.write(engine.getParseExceptionCount() + " parsing exceptions\n"); } reportBuf.write(engine.getTestCaseCount() + " cases with " + engine.getTestCount() + " tests" + " -- "); reportBuf.write(engine.getPassedCount() + " passed, " + engine.getFailedCount() + " failed, " + engine.getExceptionCount() + " exceptions"); if (engine.getParseExceptionCount() + engine.getFailedCount() + engine.getExceptionCount() > 0) { reportBuf.write("\n\n******* ERRORS ENCOUNTERED IN RUN ********\n"); } } }