package com.tddinaction.concurrency.waitforthreads;
import java.util.List;
import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
import org.junit.runner.notification.StoppedByUserException;
public class DelayedFailureRunNotifier extends RunNotifier {
private final RunNotifier notifier;
private final List<Failure> failures;
public DelayedFailureRunNotifier(RunNotifier notifier,
List<Failure> failures) {
this.notifier = notifier;
this.failures = failures;
}
@Override
public void addFirstListener(RunListener listener) {
notifier.addFirstListener(listener);
}
@Override
public void addListener(RunListener listener) {
notifier.addListener(listener);
}
@Override
public void removeListener(RunListener listener) {
notifier.removeListener(listener);
}
@Override
public void pleaseStop() {
notifier.pleaseStop();
}
@Override
public void fireTestStarted(Description desc)
throws StoppedByUserException {
failures.clear();
notifier.fireTestStarted(desc);
}
@Override
public void fireTestFinished(Description desc) {
if (!failures.isEmpty()) {
notifier.fireTestFailure(mergeFailures(failures));
}
notifier.fireTestFinished(desc);
}
private Failure mergeFailures(List<Failure> failures) {
Throwable[] exceptions = new Throwable[failures.size()];
for (int i = 0; i < failures.size(); i++) {
exceptions[i] = failures.get(i).getException();
}
return new MergedFailure(failures.get(0).getDescription(),
exceptions);
}
@Override
public void fireTestFailure(Failure failure) {
failures.add(failure);
}
@Override
public void fireTestIgnored(Description desc) {
notifier.fireTestIgnored(desc);
}
@Override
public void fireTestRunFinished(Result result) {
notifier.fireTestRunFinished(result);
}
@Override
public void fireTestRunStarted(Description desc) {
notifier.fireTestRunStarted(desc);
}
}