001package org.junit.internal;
002
003import java.io.PrintStream;
004import java.text.NumberFormat;
005import java.util.List;
006
007import org.junit.runner.Description;
008import org.junit.runner.Result;
009import org.junit.runner.notification.Failure;
010import org.junit.runner.notification.RunListener;
011
012public class TextListener extends RunListener {
013
014    private final PrintStream writer;
015
016    public TextListener(JUnitSystem system) {
017        this(system.out());
018    }
019
020    public TextListener(PrintStream writer) {
021        this.writer = writer;
022    }
023
024    @Override
025    public void testRunFinished(Result result) {
026        printHeader(result.getRunTime());
027        printFailures(result);
028        printFooter(result);
029    }
030
031    @Override
032    public void testStarted(Description description) {
033        writer.append('.');
034    }
035
036    @Override
037    public void testFailure(Failure failure) {
038        writer.append('E');
039    }
040
041    @Override
042    public void testIgnored(Description description) {
043        writer.append('I');
044    }
045
046    /*
047      * Internal methods
048      */
049
050    private PrintStream getWriter() {
051        return writer;
052    }
053
054    protected void printHeader(long runTime) {
055        getWriter().println();
056        getWriter().println("Time: " + elapsedTimeAsString(runTime));
057    }
058
059    protected void printFailures(Result result) {
060        List<Failure> failures = result.getFailures();
061        if (failures.size() == 0) {
062            return;
063        }
064        if (failures.size() == 1) {
065            getWriter().println("There was " + failures.size() + " failure:");
066        } else {
067            getWriter().println("There were " + failures.size() + " failures:");
068        }
069        int i = 1;
070        for (Failure each : failures) {
071            printFailure(each, "" + i++);
072        }
073    }
074
075    protected void printFailure(Failure each, String prefix) {
076        getWriter().println(prefix + ") " + each.getTestHeader());
077        getWriter().print(each.getTrace());
078    }
079
080    protected void printFooter(Result result) {
081        if (result.wasSuccessful()) {
082            getWriter().println();
083            getWriter().print("OK");
084            getWriter().println(" (" + result.getRunCount() + " test" + (result.getRunCount() == 1 ? "" : "s") + ")");
085
086        } else {
087            getWriter().println();
088            getWriter().println("FAILURES!!!");
089            getWriter().println("Tests run: " + result.getRunCount() + ",  Failures: " + result.getFailureCount());
090        }
091        getWriter().println();
092    }
093
094    /**
095     * Returns the formatted string of the elapsed time. Duplicated from
096     * BaseTestRunner. Fix it.
097     */
098    protected String elapsedTimeAsString(long runTime) {
099        return NumberFormat.getInstance().format((double) runTime / 1000);
100    }
101}