| package junit.framework; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Enumeration; |
| import java.util.List; |
| import java.util.Vector; |
| |
| /** |
| * A <code>TestResult</code> collects the results of executing |
| * a test case. It is an instance of the Collecting Parameter pattern. |
| * The test framework distinguishes between <i>failures</i> and <i>errors</i>. |
| * A failure is anticipated and checked for with assertions. Errors are |
| * unanticipated problems like an {@link ArrayIndexOutOfBoundsException}. |
| * |
| * @see Test |
| */ |
| public class TestResult extends Object { |
| // BEGIN android-changed changed types from List<> to Vector<> for API compatibility |
| protected Vector<TestFailure> fFailures; |
| protected Vector<TestFailure> fErrors; |
| protected Vector<TestListener> fListeners; |
| // END android-changed |
| protected int fRunTests; |
| private boolean fStop; |
| |
| public TestResult() { |
| // BEGIN android-changed to Vector |
| fFailures= new Vector<TestFailure>(); |
| fErrors= new Vector<TestFailure>(); |
| fListeners= new Vector<TestListener>(); |
| // END android-changed |
| fRunTests= 0; |
| fStop= false; |
| } |
| /** |
| * Adds an error to the list of errors. The passed in exception |
| * caused the error. |
| */ |
| public synchronized void addError(Test test, Throwable t) { |
| fErrors.add(new TestFailure(test, t)); |
| for (TestListener each : cloneListeners()) |
| each.addError(test, t); |
| } |
| /** |
| * Adds a failure to the list of failures. The passed in exception |
| * caused the failure. |
| */ |
| public synchronized void addFailure(Test test, AssertionFailedError t) { |
| fFailures.add(new TestFailure(test, t)); |
| for (TestListener each : cloneListeners()) |
| each.addFailure(test, t); |
| } |
| /** |
| * Registers a TestListener |
| */ |
| public synchronized void addListener(TestListener listener) { |
| fListeners.add(listener); |
| } |
| /** |
| * Unregisters a TestListener |
| */ |
| public synchronized void removeListener(TestListener listener) { |
| fListeners.remove(listener); |
| } |
| /** |
| * Returns a copy of the listeners. |
| */ |
| private synchronized List<TestListener> cloneListeners() { |
| List<TestListener> result= new ArrayList<TestListener>(); |
| result.addAll(fListeners); |
| return result; |
| } |
| /** |
| * Informs the result that a test was completed. |
| */ |
| public void endTest(Test test) { |
| for (TestListener each : cloneListeners()) |
| each.endTest(test); |
| } |
| /** |
| * Gets the number of detected errors. |
| */ |
| public synchronized int errorCount() { |
| return fErrors.size(); |
| } |
| /** |
| * Returns an Enumeration for the errors |
| */ |
| public synchronized Enumeration<TestFailure> errors() { |
| return Collections.enumeration(fErrors); |
| } |
| |
| |
| /** |
| * Gets the number of detected failures. |
| */ |
| public synchronized int failureCount() { |
| return fFailures.size(); |
| } |
| /** |
| * Returns an Enumeration for the failures |
| */ |
| public synchronized Enumeration<TestFailure> failures() { |
| return Collections.enumeration(fFailures); |
| } |
| |
| /** |
| * Runs a TestCase. |
| */ |
| protected void run(final TestCase test) { |
| startTest(test); |
| Protectable p= new Protectable() { |
| public void protect() throws Throwable { |
| test.runBare(); |
| } |
| }; |
| runProtected(test, p); |
| |
| endTest(test); |
| } |
| /** |
| * Gets the number of run tests. |
| */ |
| public synchronized int runCount() { |
| return fRunTests; |
| } |
| /** |
| * Runs a TestCase. |
| */ |
| public void runProtected(final Test test, Protectable p) { |
| try { |
| p.protect(); |
| } |
| catch (AssertionFailedError e) { |
| addFailure(test, e); |
| } |
| catch (ThreadDeath e) { // don't catch ThreadDeath by accident |
| throw e; |
| } |
| catch (Throwable e) { |
| addError(test, e); |
| } |
| } |
| /** |
| * Checks whether the test run should stop |
| */ |
| public synchronized boolean shouldStop() { |
| return fStop; |
| } |
| /** |
| * Informs the result that a test will be started. |
| */ |
| public void startTest(Test test) { |
| final int count= test.countTestCases(); |
| synchronized(this) { |
| fRunTests+= count; |
| } |
| for (TestListener each : cloneListeners()) |
| each.startTest(test); |
| } |
| /** |
| * Marks that the test run should stop. |
| */ |
| public synchronized void stop() { |
| fStop= true; |
| } |
| /** |
| * Returns whether the entire test was successful or not. |
| */ |
| public synchronized boolean wasSuccessful() { |
| return failureCount() == 0 && errorCount() == 0; |
| } |
| } |