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