1package org.junit.internal;
2
3import java.io.PrintStream;
4import java.text.NumberFormat;
5import java.util.List;
6
7import org.junit.runner.Description;
8import org.junit.runner.Result;
9import org.junit.runner.notification.Failure;
10import org.junit.runner.notification.RunListener;
11
12public class TextListener extends RunListener {
13
14	private final PrintStream fWriter;
15
16	public TextListener(JUnitSystem system) {
17		this(system.out());
18	}
19
20	public TextListener(PrintStream writer) {
21		this.fWriter= writer;
22	}
23
24	@Override
25	public void testRunFinished(Result result) {
26		printHeader(result.getRunTime());
27		printFailures(result);
28		printFooter(result);
29	}
30
31	@Override
32	public void testStarted(Description description) {
33		fWriter.append('.');
34	}
35
36	@Override
37	public void testFailure(Failure failure) {
38		fWriter.append('E');
39	}
40
41	@Override
42	public void testIgnored(Description description) {
43		fWriter.append('I');
44	}
45
46	/*
47	 * Internal methods
48	 */
49
50	private PrintStream getWriter() {
51		return fWriter;
52	}
53
54	protected void printHeader(long runTime) {
55		getWriter().println();
56		getWriter().println("Time: " + elapsedTimeAsString(runTime));
57	}
58
59	protected void printFailures(Result result) {
60		List<Failure> failures= result.getFailures();
61		if (failures.size() == 0)
62			return;
63		if (failures.size() == 1)
64			getWriter().println("There was " + failures.size() + " failure:");
65		else
66			getWriter().println("There were " + failures.size() + " failures:");
67		int i= 1;
68		for (Failure each : failures)
69			printFailure(each, "" + i++);
70	}
71
72	protected void printFailure(Failure each, String prefix) {
73		getWriter().println(prefix + ") " + each.getTestHeader());
74		getWriter().print(each.getTrace());
75	}
76
77	protected void printFooter(Result result) {
78		if (result.wasSuccessful()) {
79			getWriter().println();
80			getWriter().print("OK");
81			getWriter().println(" (" + result.getRunCount() + " test" + (result.getRunCount() == 1 ? "" : "s") + ")");
82
83		} else {
84			getWriter().println();
85			getWriter().println("FAILURES!!!");
86			getWriter().println("Tests run: " + result.getRunCount() + ",  Failures: " + result.getFailureCount());
87		}
88		getWriter().println();
89	}
90
91	/**
92	 * Returns the formatted string of the elapsed time. Duplicated from
93	 * BaseTestRunner. Fix it.
94	 */
95	protected String elapsedTimeAsString(long runTime) {
96		return NumberFormat.getInstance().format((double) runTime / 1000);
97	}
98}
99