TestResult.java revision b3823db9f1192d8c81345740b3e65bd6738ba55b
158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.framework;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.ArrayList;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.Collections;
558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.util.Enumeration;
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.List;
758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/**
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A <code>TestResult</code> collects the results of executing
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * a test case. It is an instance of the Collecting Parameter pattern.
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * The test framework distinguishes between <i>failures</i> and <i>errors</i>.
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A failure is anticipated and checked for with assertions. Errors are
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * unanticipated problems like an {@link ArrayIndexOutOfBoundsException}.
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot *
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * @see Test
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class TestResult extends Object {
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	protected List<TestFailure> fFailures;
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	protected List<TestFailure> fErrors;
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	protected List<TestListener> fListeners;
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected int fRunTests;
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private boolean fStop;
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult() {
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fFailures= new ArrayList<TestFailure>();
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fErrors= new ArrayList<TestFailure>();
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fListeners= new ArrayList<TestListener>();
2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRunTests= 0;
2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStop= false;
3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Adds an error to the list of errors. The passed in exception
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * caused the error.
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addError(Test test, Throwable t) {
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fErrors.add(new TestFailure(test, t));
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.addError(test, t);
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Adds a failure to the list of failures. The passed in exception
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * caused the failure.
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addFailure(Test test, AssertionFailedError t) {
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fFailures.add(new TestFailure(test, t));
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.addFailure(test, t);
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Registers a TestListener
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addListener(TestListener listener) {
53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fListeners.add(listener);
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Unregisters a TestListener
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void removeListener(TestListener listener) {
59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fListeners.remove(listener);
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns a copy of the listeners.
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private synchronized List<TestListener> cloneListeners() {
65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		List<TestListener> result= new ArrayList<TestListener>();
66b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		result.addAll(fListeners);
67b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return result;
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Informs the result that a test was completed.
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void endTest(Test test) {
73b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
74b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.endTest(test);
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the number of detected errors.
7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
7958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized int errorCount() {
8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fErrors.size();
8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns an Enumeration for the errors
8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
85b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public synchronized Enumeration<TestFailure> errors() {
86b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Collections.enumeration(fErrors);
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
88b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
89b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the number of detected failures.
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
9358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized int failureCount() {
9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fFailures.size();
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns an Enumeration for the failures
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
99b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public synchronized Enumeration<TestFailure> failures() {
100b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Collections.enumeration(fFailures);
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
102b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Runs a TestCase.
10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void run(final TestCase test) {
10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		startTest(test);
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Protectable p= new Protectable() {
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			public void protect() throws Throwable {
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				test.runBare();
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		};
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		runProtected(test, p);
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		endTest(test);
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the number of run tests.
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized int runCount() {
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fRunTests;
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Runs a TestCase.
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void runProtected(final Test test, Protectable p) {
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			p.protect();
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (AssertionFailedError e) {
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			addFailure(test, e);
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (ThreadDeath e) { // don't catch ThreadDeath by accident
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			throw e;
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (Throwable e) {
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			addError(test, e);
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Checks whether the test run should stop
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized boolean shouldStop() {
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fStop;
14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Informs the result that a test will be started.
14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void startTest(Test test) {
15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		final int count= test.countTestCases();
15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		synchronized(this) {
15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fRunTests+= count;
15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
154b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
155b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.startTest(test);
15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Marks that the test run should stop.
15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void stop() {
16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStop= true;
16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns whether the entire test was successful or not.
16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized boolean wasSuccessful() {
16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return failureCount() == 0 && errorCount() == 0;
16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}