/*
// Modified from junit's ResultPrinter class. Original code is covered by
// the junit license and modifications are covered as follows:
//
// This software is subject to the terms of the Eclipse Public License v1.0
// Agreement, available at the following URL:
// http://www.eclipse.org/legal/epl-v10.html.
// You must accept the terms of that agreement to use this software.
//
// Copyright (C) 2004-2005 SAS Institute, Inc.
// Copyright (C) 2005-2009 Pentaho and others
// All Rights Reserved.
//
// sasebb, 14 December, 2004
*/
package mondrian.test;
import junit.framework.*;
import junit.runner.BaseTestRunner;
import java.io.PrintStream;
import java.text.NumberFormat;
import java.util.Enumeration;
public class MondrianResultPrinter implements TestListener {
PrintStream fWriter;
int fStarted = 0;
public MondrianResultPrinter(PrintStream writer) {
fWriter = writer;
}
/* API for use by textui.TestRunner
*/
synchronized void print(TestResult result, long runTime) {
printHeader();
printErrors(result);
printFailures(result);
printFooter(runTime, result);
}
void printWaitPrompt() {
getWriter().println();
getWriter().println("<RETURN> to continue");
}
/* Internal methods
*/
protected void printHeader() {
getWriter().println();
}
protected void printErrors(TestResult result) {
printDefects(result.errors(), result.errorCount(), "error");
}
protected void printFailures(TestResult result) {
printDefects(result.failures(), result.failureCount(), "failure");
}
protected void printDefects(Enumeration booBoos, int count, String type) {
if (count == 0) {
return;
}
if (count == 1) {
getWriter().println("There was " + count + " " + type + ":");
} else {
getWriter().println("There were " + count + " " + type + "s:");
}
for (int i = 1; booBoos.hasMoreElements(); i++) {
printDefect((TestFailure) booBoos.nextElement(), i);
}
}
// only public for testing purposes
public void printDefect(TestFailure booBoo, int count) {
printDefectHeader(booBoo, count);
printDefectTrace(booBoo);
}
protected void printDefectHeader(TestFailure booBoo, int count) {
// I feel like making this a println, then adding a line
// giving the throwable a chance to print something before we
// get to the stack trace.
getWriter().print(count + ") " + booBoo.failedTest());
}
protected void printDefectTrace(TestFailure booBoo) {
getWriter().print(BaseTestRunner.getFilteredTrace(booBoo.trace()));
}
protected void printFooter(long runTime, TestResult result) {
if (result.wasSuccessful()) {
getWriter().println();
getWriter().print("OK");
getWriter().println(
" (" + result.runCount() + " test"
+ (result.runCount() == 1 ? "" : "s") + ")");
} else {
getWriter().println();
getWriter().println("FAILURES!!!");
getWriter().println(
"Tests run: " + result.runCount()
+ ", Failures: " + result.failureCount()
+ ", Errors: " + result.errorCount());
}
getWriter().println();
getWriter().println("Time: " + elapsedTimeAsString(runTime));
}
/**
* Returns the formatted string of the elapsed time.
* Duplicated from BaseTestRunner. Fix it.
*/
protected String elapsedTimeAsString(long runTime) {
return NumberFormat.getInstance().format((double)runTime / 1000);
}
public PrintStream getWriter() {
return fWriter;
}
/**
* @see junit.framework.TestListener#addError(Test, Throwable)
*/
public void addError(Test test, Throwable t) {
getWriter().print("E");
}
/**
* @see junit.framework.TestListener#addFailure(Test, AssertionFailedError)
*/
public void addFailure(Test test, AssertionFailedError t) {
getWriter().print("F");
}
/**
* @see junit.framework.TestListener#endTest(Test)
*/
public void endTest(Test test) {
}
/**
* @see junit.framework.TestListener#startTest(Test)
*/
public void startTest(Test test) {
if (fStarted % 40 == 0) {
getWriter().print("\n[" + fStarted + "] ");
}
getWriter().print(".");
fStarted++;
}
}
// End MondrianResultPrinter.java