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