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