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}