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