package com.twitter.common.testing.runner;
import java.util.List;
import com.google.common.collect.Lists;
import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
/**
* A run listener that forwards all events to a sequence of registered listeners.
*/
class ForwardingListener extends RunListener implements ListenerRegistry {
/**
* Fires an event to a listener.
*
* @param <E> The type of exception thrown when firing this event.
*/
private interface Event<E extends Exception> {
void fire(RunListener listener) throws E;
}
private final List<RunListener> listeners = Lists.newArrayList();
@Override
public void addListener(RunListener listener) {
listeners.add(listener);
}
private <E extends Exception> void fire(Event<E> dispatcher) throws E {
for (RunListener listener : listeners) {
dispatcher.fire(listener);
}
}
@Override
public void testRunStarted(final Description description) throws Exception {
fire(new Event<Exception>() {
@Override public void fire(RunListener listener) throws Exception {
listener.testRunStarted(description);
}
});
}
@Override
public void testRunFinished(final Result result) throws Exception {
fire(new Event<Exception>() {
@Override public void fire(RunListener listener) throws Exception {
listener.testRunFinished(result);
}
});
}
@Override
public void testStarted(final Description description) throws Exception {
fire(new Event<Exception>() {
@Override public void fire(RunListener listener) throws Exception {
listener.testStarted(description);
}
});
}
@Override
public void testIgnored(final Description description) throws Exception {
fire(new Event<Exception>() {
@Override public void fire(RunListener listener) throws Exception {
listener.testIgnored(description);
}
});
}
@Override
public void testFailure(final Failure failure) throws Exception {
fire(new Event<Exception>() {
@Override public void fire(RunListener listener) throws Exception {
listener.testFailure(failure);
}
});
}
@Override
public void testFinished(final Description description) throws Exception {
fire(new Event<Exception>() {
@Override public void fire(RunListener listener) throws Exception {
listener.testFinished(description);
}
});
}
@Override
public void testAssumptionFailure(final Failure failure) {
fire(new Event<RuntimeException>() {
@Override public void fire(RunListener listener) {
listener.testAssumptionFailure(failure);
}
});
}
}