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