158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.textui;
358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.PrintStream;
549c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot// android-changed
649c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot// The following line was removed for compatibility with Android libraries.
749c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot// import java.text.NumberFormat;
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.util.Enumeration;
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.AssertionFailedError;
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test;
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestFailure;
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestListener;
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestResult;
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.BaseTestRunner;
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class ResultPrinter implements TestListener {
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	PrintStream fWriter;
1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	int fColumn= 0;
2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public ResultPrinter(PrintStream writer) {
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fWriter= writer;
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/* API for use by textui.TestRunner
2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	synchronized void print(TestResult result, long runTime) {
2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		printHeader(runTime);
3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	    printErrors(result);
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	    printFailures(result);
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	    printFooter(result);
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	void printWaitPrompt() {
3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().println();
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().println("<RETURN> to continue");
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/* Internal methods
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void printHeader(long runTime) {
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().println();
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().println("Time: "+elapsedTimeAsString(runTime));
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void printErrors(TestResult result) {
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		printDefects(result.errors(), result.errorCount(), "error");
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void printFailures(TestResult result) {
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		printDefects(result.failures(), result.failureCount(), "failure");
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	protected void printDefects(Enumeration<TestFailure> booBoos, int count, String type) {
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (count == 0) return;
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (count == 1)
5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println("There was " + count + " " + type + ":");
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		else
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println("There were " + count + " " + type + "s:");
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (int i= 1; booBoos.hasMoreElements(); i++) {
63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			printDefect(booBoos.nextElement(), i);
6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void printDefect(TestFailure booBoo, int count) { // only public for testing purposes
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		printDefectHeader(booBoo, count);
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		printDefectTrace(booBoo);
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void printDefectHeader(TestFailure booBoo, int count) {
7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		// I feel like making this a println, then adding a line giving the throwable a chance to print something
7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		// before we get to the stack trace.
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().print(count + ") " + booBoo.failedTest());
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void printDefectTrace(TestFailure booBoo) {
7958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().print(BaseTestRunner.getFilteredTrace(booBoo.trace()));
8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void printFooter(TestResult result) {
8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (result.wasSuccessful()) {
8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println();
8558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().print("OK");
8658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println (" (" + result.runCount() + " test" + (result.runCount() == 1 ? "": "s") + ")");
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} else {
8958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println();
9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println("FAILURES!!!");
9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println("Tests run: "+result.runCount()+
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				         ",  Failures: "+result.failureCount()+
9358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				         ",  Errors: "+result.errorCount());
9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	    getWriter().println();
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns the formatted string of the elapsed time.
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Duplicated from BaseTestRunner. Fix it.
10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected String elapsedTimeAsString(long runTime) {
10449c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		// android-changed
10549c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		// The following line was altered for compatibility with
10649c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		// Android libraries.
10749c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		return Double.toString((double)runTime/1000);
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public PrintStream getWriter() {
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fWriter;
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * @see junit.framework.TestListener#addError(Test, Throwable)
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void addError(Test test, Throwable t) {
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().print("E");
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * @see junit.framework.TestListener#addFailure(Test, AssertionFailedError)
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void addFailure(Test test, AssertionFailedError t) {
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().print("F");
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * @see junit.framework.TestListener#endTest(Test)
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void endTest(Test test) {
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * @see junit.framework.TestListener#startTest(Test)
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void startTest(Test test) {
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getWriter().print(".");
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fColumn++ >= 40) {
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getWriter().println();
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fColumn= 0;
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}
145