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