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