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;
7909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabotimport java.util.Vector;
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/**
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A <code>TestResult</code> collects the results of executing
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * a test case. It is an instance of the Collecting Parameter pattern.
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * The test framework distinguishes between <i>failures</i> and <i>errors</i>.
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A failure is anticipated and checked for with assertions. Errors are
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * unanticipated problems like an {@link ArrayIndexOutOfBoundsException}.
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot *
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * @see Test
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class TestResult extends Object {
19909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot	// BEGIN android-changed changed types from List<> to Vector<> for API compatibility
20909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot	protected Vector<TestFailure> fFailures;
21909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot	protected Vector<TestFailure> fErrors;
22909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot	protected Vector<TestListener> fListeners;
23909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot	// END android-changed
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected int fRunTests;
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private boolean fStop;
2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult() {
28909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot		// BEGIN android-changed to Vector
29909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot		fFailures= new Vector<TestFailure>();
30909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot		fErrors= new Vector<TestFailure>();
31909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot		fListeners= new Vector<TestListener>();
32909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot		// END android-changed
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRunTests= 0;
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStop= false;
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Adds an error to the list of errors. The passed in exception
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * caused the error.
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addError(Test test, Throwable t) {
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fErrors.add(new TestFailure(test, t));
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.addError(test, t);
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Adds a failure to the list of failures. The passed in exception
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * caused the failure.
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addFailure(Test test, AssertionFailedError t) {
50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fFailures.add(new TestFailure(test, t));
51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.addFailure(test, t);
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Registers a TestListener
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addListener(TestListener listener) {
58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fListeners.add(listener);
5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Unregisters a TestListener
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void removeListener(TestListener listener) {
64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fListeners.remove(listener);
6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns a copy of the listeners.
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
69b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private synchronized List<TestListener> cloneListeners() {
70b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		List<TestListener> result= new ArrayList<TestListener>();
71b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		result.addAll(fListeners);
72b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return result;
7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Informs the result that a test was completed.
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void endTest(Test test) {
78b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
79b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.endTest(test);
8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the number of detected errors.
8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized int errorCount() {
8558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fErrors.size();
8658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
8858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns an Enumeration for the errors
8958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
90b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public synchronized Enumeration<TestFailure> errors() {
91b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Collections.enumeration(fErrors);
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
93b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
94b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the number of detected failures.
9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized int failureCount() {
9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fFailures.size();
10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns an Enumeration for the failures
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
104b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public synchronized Enumeration<TestFailure> failures() {
105b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Collections.enumeration(fFailures);
10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
107b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Runs a TestCase.
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void run(final TestCase test) {
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		startTest(test);
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Protectable p= new Protectable() {
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			public void protect() throws Throwable {
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				test.runBare();
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		};
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		runProtected(test, p);
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		endTest(test);
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the number of run tests.
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized int runCount() {
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fRunTests;
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Runs a TestCase.
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void runProtected(final Test test, Protectable p) {
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			p.protect();
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (AssertionFailedError e) {
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			addFailure(test, e);
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (ThreadDeath e) { // don't catch ThreadDeath by accident
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			throw e;
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (Throwable e) {
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			addError(test, e);
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Checks whether the test run should stop
14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized boolean shouldStop() {
14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fStop;
15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Informs the result that a test will be started.
15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void startTest(Test test) {
15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		final int count= test.countTestCases();
15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		synchronized(this) {
15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fRunTests+= count;
15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
159b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (TestListener each : cloneListeners())
160b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			each.startTest(test);
16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Marks that the test run should stop.
16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void stop() {
16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStop= true;
16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns whether the entire test was successful or not.
17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized boolean wasSuccessful() {
17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return failureCount() == 0 && errorCount() == 0;
17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
174909fd849f6baa59819ca38adf39b36d2c100c421Brett Chabot}
175