Home | History | Annotate | Download | only in textui
      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 }
    140