1
2package junit.textui;
3
4import java.io.PrintStream;
5// The following line was removed for compatibility with Android libraries.
6//import java.text.NumberFormat;
7import java.util.Enumeration;
8
9import junit.framework.AssertionFailedError;
10import junit.framework.Test;
11import junit.framework.TestFailure;
12import junit.framework.TestListener;
13import junit.framework.TestResult;
14import junit.runner.BaseTestRunner;
15
16public class ResultPrinter implements TestListener {
17    PrintStream fWriter;
18    int fColumn= 0;
19
20    public ResultPrinter(PrintStream writer) {
21        fWriter= writer;
22    }
23
24    /* API for use by textui.TestRunner
25     */
26
27    synchronized void print(TestResult result, long runTime) {
28        printHeader(runTime);
29        printErrors(result);
30        printFailures(result);
31        printFooter(result);
32    }
33
34    void printWaitPrompt() {
35        getWriter().println();
36        getWriter().println("<RETURN> to continue");
37    }
38
39    /* Internal methods
40     */
41
42    protected void printHeader(long runTime) {
43        getWriter().println();
44        getWriter().println("Time: "+elapsedTimeAsString(runTime));
45    }
46
47    protected void printErrors(TestResult result) {
48        printDefects(result.errors(), result.errorCount(), "error");
49    }
50
51    protected void printFailures(TestResult result) {
52        printDefects(result.failures(), result.failureCount(), "failure");
53    }
54
55    protected void printDefects(Enumeration booBoos, int count, String type) {
56        if (count == 0) return;
57        if (count == 1)
58            getWriter().println("There was " + count + " " + type + ":");
59        else
60            getWriter().println("There were " + count + " " + type + "s:");
61        for (int i= 1; booBoos.hasMoreElements(); i++) {
62            printDefect((TestFailure) booBoos.nextElement(), i);
63        }
64    }
65
66    public void printDefect(TestFailure booBoo, int count) { // only public for testing purposes
67        printDefectHeader(booBoo, count);
68        printDefectTrace(booBoo);
69    }
70
71    protected void printDefectHeader(TestFailure booBoo, int count) {
72        // I feel like making this a println, then adding a line giving the throwable a chance to print something
73        // before we get to the stack trace.
74        getWriter().print(count + ") " + booBoo.failedTest());
75    }
76
77    protected void printDefectTrace(TestFailure booBoo) {
78        getWriter().print(BaseTestRunner.getFilteredTrace(booBoo.trace()));
79    }
80
81    protected void printFooter(TestResult result) {
82        if (result.wasSuccessful()) {
83            getWriter().println();
84            getWriter().print("OK");
85            getWriter().println (" (" + result.runCount() + " test" + (result.runCount() == 1 ? "": "s") + ")");
86
87        } else {
88            getWriter().println();
89            getWriter().println("FAILURES!!!");
90            getWriter().println("Tests run: "+result.runCount()+
91                         ",  Failures: "+result.failureCount()+
92                         ",  Errors: "+result.errorCount());
93        }
94        getWriter().println();
95    }
96
97
98    /**
99     * Returns the formatted string of the elapsed time.
100     * Duplicated from BaseTestRunner. Fix it.
101     */
102    protected String elapsedTimeAsString(long runTime) {
103            // The following line was altered for compatibility with
104            // Android libraries.
105        return Double.toString((double)runTime/1000);
106    }
107
108    public PrintStream getWriter() {
109        return fWriter;
110    }
111    /**
112     * @see junit.framework.TestListener#addError(Test, Throwable)
113     */
114    public void addError(Test test, Throwable t) {
115        getWriter().print("E");
116    }
117
118    /**
119     * @see junit.framework.TestListener#addFailure(Test, AssertionFailedError)
120     */
121    public void addFailure(Test test, AssertionFailedError t) {
122        getWriter().print("F");
123    }
124
125    /**
126     * @see junit.framework.TestListener#endTest(Test)
127     */
128    public void endTest(Test test) {
129    }
130
131    /**
132     * @see junit.framework.TestListener#startTest(Test)
133     */
134    public void startTest(Test test) {
135        getWriter().print(".");
136        if (fColumn++ >= 40) {
137            getWriter().println();
138            fColumn= 0;
139        }
140    }
141
142}
143