/*
* Author : Stephen Chong
* Created: Nov 24, 2003
*/
package polyglot.pth;
import java.util.*;
import java.util.regex.Pattern;
/**
*
*/
public class TestSuite extends AbstractTest {
protected List tests;
protected boolean haltOnFirstFailure = false;
protected int totalTests = 0;
protected int successfulTests = 0;
public TestSuite(String name) {
this(name, new ArrayList(), false);
}
public TestSuite(String name, List tests) {
this(name, tests, false);
}
public TestSuite(String name, List tests, boolean haltOnFirstFailure) {
super(name);
this.tests = tests;
this.haltOnFirstFailure = haltOnFirstFailure;
}
public boolean getHaltOnFirstFailure() {
return haltOnFirstFailure;
}
public void setOutputController(OutputController output) {
super.setOutputController(output);
for (Iterator iter = tests.iterator(); iter.hasNext(); ) {
Test t = (Test)iter.next();
t.setOutputController(output);
}
}
protected boolean runTest() {
boolean okay = true;
if (this.getTestSuiteResult() == null) {
this.setTestResult(this.createTestResult(null));
}
Map oldTestResults = new HashMap(this.getTestSuiteResult().testResults);
Map newResults = new HashMap();
for (Iterator i = tests.iterator(); i.hasNext(); ) {
Test t = (Test)i.next();
TestResult tr = (TestResult)oldTestResults.get(t.getName());
if (executeTest(t.getName(), tr)) {
totalTests++;
if (tr != null) {
t.setTestResult(tr);
}
boolean result = t.run();
okay = okay && result;
tr = t.getTestResult();
if (!result && haltOnFirstFailure) {
break;
}
else if (result) {
successfulTests++;
}
}
this.getTestSuiteResult().testResults.put(t.getName(), tr);
newResults.put(t.getName(), tr);
this.postIndividualTest();
}
this.getTestSuiteResult().testResults.clear();
this.getTestSuiteResult().testResults.putAll(newResults);
return okay;
}
protected void postIndividualTest() {
}
public int getTotalTestCount() {
return totalTests;
}
public int getSuccesfulTestCount() {
return successfulTests;
}
public int getFailedTestCount() {
return totalTests - successfulTests;
}
protected static boolean executeTest(String testName, TestResult tr) {
if (Main.options.testFilter != null &&
!Pattern.matches(Main.options.testFilter, testName)) {
return false;
}
if (Main.options.testPreviouslyFailedOnly &&
tr != null && tr.dateLastSuccess != null &&
tr.dateLastSuccess.equals(tr.dateTestRun)) {
return false;
}
return true;
}
protected TestSuiteResult getTestSuiteResult() {
return (TestSuiteResult)this.getTestResult();
}
public List getTests() {
return Collections.unmodifiableList(this.tests);
}
protected TestResult createTestResult(Date lastSuccess) {
Map testResults;
if (this.getTestSuiteResult() != null) {
testResults = getTestSuiteResult().testResults;
}
else {
testResults = new LinkedHashMap();
}
Date lastRun = new Date();
if (this.success()) {
lastSuccess = lastRun;
}
return new TestSuiteResult(this, lastRun, testResults, lastSuccess);
}
}