Skip to content

Commit

Permalink
Complete rewrite of JUnit result reporter.
Browse files Browse the repository at this point in the history
  • Loading branch information
espenhw committed Mar 19, 2009
1 parent 402452d commit b1bb960
Showing 1 changed file with 148 additions and 43 deletions.
191 changes: 148 additions & 43 deletions src/main/java/org/grumblesmurf/malabar/MalabarRunListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,166 @@
import org.junit.runner.notification.Failure;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.List;
import java.util.LinkedList;

public class MalabarRunListener
extends RunListener
{
private PrintWriter out;

private String currentClass = "";
private boolean reported;

private static final Pattern displayNamePattern = Pattern.compile("(.*)\\((.*)\\)");

public MalabarRunListener(PrintWriter out) {
this.out = out;
}

private Pattern displayNamePattern = Pattern.compile("(.*)\\((.*)\\)");
@Override
public void testStarted(Description description) throws Exception {
reported = false;
}

@Override
public void testFinished(Description description) throws Exception {
printAndUpdateCurrentClass(description);
report(".");
}

@Override
public void testIgnored(Description description) throws Exception {
printAndUpdateCurrentClass(description);
report("I");
}

@Override
public void testFailure(Failure failure) throws Exception {
printAndUpdateCurrentClass(failure);
if (isError(failure))
report("E");
else
report("F");
}

@Override
public void testRunFinished(Result result) throws Exception {
List<Failure> failures = new LinkedList<Failure>();
List<Failure> errors = new LinkedList<Failure>();

for (Failure failure : result.getFailures()) {
if (isError(failure))
errors.add(failure);
else
failures.add(failure);
}

out.println(String.format("\nResults:\n\nTests run %s Failures: %s Errors: %s Ignored: %s",
result.getRunCount(),
failures.size(),
errors.size(),
result.getIgnoreCount()));

if (result.wasSuccessful()) {
out.println("OK");
} else {
out.println("FAILURES!!!");

reportFailures(failures);

reportErrors(errors);
}

double seconds = result.getRunTime() / 1000.0;
out.println(String.format("\nTook %s seconds", seconds));
}

private void report(String indicator) {
out.print(indicator);
reported = true;
}

private void reportFailures(List<Failure> failures) {
reportFailures("Failed tests:", failures);
}

private void reportErrors(List<Failure> errors) {
reportFailures("Tests in error:", errors);
}

private void reportFailures(String header, List<Failure> failures) {
if (failures.isEmpty())
return;

out.println(header);
out.println();

for (Failure f : failures) {
if (isError(f))
reportError(f);
else
reportFailure(f);
}
}

private void reportError(Failure error) {
printQualifiedMethodName(error.getDescription());

printSanitizedStackTrace(error.getException());

out.println();
}

private void printSanitizedStackTrace(Throwable t) {
out.println(t.getClass().getName() + ": " + t.getMessage());
for (StackTraceElement ste : t.getStackTrace()) {
if (ste.getClassName().startsWith("sun.reflect"))
continue;

out.println("\tat " + ste);

if (ste.getClassName().startsWith("org.junit"))
break;
}

if (t.getCause() != null) {
out.print("Caused by: ");
printSanitizedStackTrace(t.getCause());
}
}

private void reportFailure(Failure failure) {
printQualifiedMethodName(failure.getDescription());
out.print(failure.getMessage());

String qualifiedClassName = getClassName(failure.getDescription().getDisplayName());
for (StackTraceElement ste : failure.getException().getStackTrace()) {
if (ste.getClassName().equals(qualifiedClassName)) {
if (!failure.getMessage().endsWith("\n"))
out.println();

out.println(" Failure point: " +
ste.getFileName() + ":" + ste.getLineNumber() + "\n");

break;
}
}

out.println();
}

private void printQualifiedMethodName(Description description) {
String className = simpleName(getClassName(description.getDisplayName()));
out.print(className);
out.print(".");
String methodName = getMethodName(description.getDisplayName());
out.println(methodName);
}

private boolean isError(Failure failure) {
return !(failure.getException() instanceof AssertionError);
}

private String getClassName(String description) {
Matcher matcher= displayNamePattern.matcher(description);
return matcher.matches() ? matcher.group(2) : "";
Expand Down Expand Up @@ -73,45 +219,4 @@ private void printMethod(Description description) {
private void printMethod(Failure failure) {
printMethod(failure.getDescription());
}

@Override
public void testRunFinished(Result result) throws Exception {
out.println(String.format("\nResults:\n\nTests run %s Failures: %s Ignored: %s",
result.getRunCount(),
result.getFailureCount(),
result.getIgnoreCount()));
double seconds = result.getRunTime() / 1000.0;
out.println(String.format("\nTook %s seconds", seconds));
}

@Override
public void testAssumptionFailure(Failure failure) {
printAndUpdateCurrentClass(failure);
printMethod(failure);
out.println("AssumptionFailure:");
out.println(failure.getMessage());
}

@Override
public void testFailure(Failure failure) throws Exception {
printAndUpdateCurrentClass(failure);
printMethod(failure);
out.println("FAIL");
out.println(failure.getMessage());
String qualifiedClassName = getClassName(failure.getDescription().getDisplayName());
for (StackTraceElement ste : failure.getException().getStackTrace()) {
if (ste.getClassName().equals(qualifiedClassName)) {
out.println(" Failure point: " +
ste.getFileName() + ":" + ste.getLineNumber() + "\n");
break;
}
}
}

@Override
public void testIgnored(Description description) throws Exception {
printAndUpdateCurrentClass(description);
printMethod(description);
out.println("ignored");
}
}

0 comments on commit b1bb960

Please sign in to comment.