1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage junit.framework; 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Vector; 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Enumeration; 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A <code>TestResult</code> collects the results of executing 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a test case. It is an instance of the Collecting Parameter pattern. 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The test framework distinguishes between <i>failures</i> and <i>errors</i>. 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A failure is anticipated and checked for with assertions. Errors are 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * unanticipated problems like an <code>ArrayIndexOutOfBoundsException</code>. 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Test 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class TestResult extends Object { 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected Vector fFailures; 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected Vector fErrors; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected Vector fListeners; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int fRunTests; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean fStop; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public TestResult() { 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fFailures= new Vector(); 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fErrors= new Vector(); 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fListeners= new Vector(); 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fRunTests= 0; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fStop= false; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds an error to the list of errors. The passed in exception 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * caused the error. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized void addError(Test test, Throwable t) { 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fErrors.addElement(new TestFailure(test, t)); 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) { 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((TestListener)e.nextElement()).addError(test, t); 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Adds a failure to the list of failures. The passed in exception 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * caused the failure. 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized void addFailure(Test test, AssertionFailedError t) { 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fFailures.addElement(new TestFailure(test, t)); 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) { 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((TestListener)e.nextElement()).addFailure(test, t); 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Registers a TestListener 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized void addListener(TestListener listener) { 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fListeners.addElement(listener); 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unregisters a TestListener 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized void removeListener(TestListener listener) { 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fListeners.removeElement(listener); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns a copy of the listeners. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private synchronized Vector cloneListeners() { 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (Vector)fListeners.clone(); 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Informs the result that a test was completed. 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void endTest(Test test) { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) { 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((TestListener)e.nextElement()).endTest(test); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the number of detected errors. 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized int errorCount() { 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fErrors.size(); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an Enumeration for the errors 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized Enumeration errors() { 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fErrors.elements(); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the number of detected failures. 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized int failureCount() { 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fFailures.size(); 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an Enumeration for the failures 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized Enumeration failures() { 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fFailures.elements(); 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Runs a TestCase. 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected void run(final TestCase test) { 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project startTest(test); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Protectable p= new Protectable() { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void protect() throws Throwable { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project test.runBare(); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }; 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project runProtected(test, p); 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project endTest(test); 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the number of run tests. 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized int runCount() { 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fRunTests; 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Runs a TestCase. 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void runProtected(final Test test, Protectable p) { 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project p.protect(); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project catch (AssertionFailedError e) { 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addFailure(test, e); 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project catch (ThreadDeath e) { // don't catch ThreadDeath by accident 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw e; 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project catch (Throwable e) { 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addError(test, e); 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Checks whether the test run should stop 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized boolean shouldStop() { 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return fStop; 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Informs the result that a test will be started. 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void startTest(Test test) { 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project final int count= test.countTestCases(); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project synchronized(this) { 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fRunTests+= count; 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((TestListener)e.nextElement()).startTest(test); 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Marks that the test run should stop. 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized void stop() { 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fStop= true; 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns whether the entire test was successful or not. 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public synchronized boolean wasSuccessful() { 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return failureCount() == 0 && errorCount() == 0; 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 167