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