package com.googlecode.gwt.test.internal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Class responsible for triggering {@link AfterTestCallback#afterTest()} callback methods from
* registered callbacks. <strong>For internal use only.</strong>
*
* @author Gael Lazzari
*/
public class AfterTestCallbackManager {
private static final AfterTestCallbackManager INSTANCE = new AfterTestCallbackManager();
public static AfterTestCallbackManager get() {
return INSTANCE;
}
private final Set<AfterTestCallback> callbacks;
private final Set<AfterTestCallback> finalCallbacks;
private final Set<AfterTestCallback> removeableCallbacks;
private AfterTestCallbackManager() {
callbacks = new HashSet<AfterTestCallback>();
finalCallbacks = new HashSet<AfterTestCallback>();
removeableCallbacks = new HashSet<AfterTestCallback>();
}
/**
* Register a callback to be triggered after a test execution.
*
* @param callback The callback to register
* @return <tt>true</tt> if the callback was not already registered
*/
public boolean registerCallback(AfterTestCallback callback) {
return callbacks.add(callback);
}
public boolean registerFinalCallback(AfterTestCallback finalCallback) {
return finalCallbacks.add(finalCallback);
}
/**
* Register a callback to triggered after a test execution. This callback will be removed at the
* end of the test execution.
*
* @param removeableCallback The callback to register
* @return <tt>true</tt> if the callback was not already registered.
*/
public boolean registerRemoveableCallback(AfterTestCallback removeableCallback) {
return removeableCallbacks.add(removeableCallback);
}
/**
* Trigger all the registered callbacks and collect all the exception that may be thrown.
*
* @return A list of exceptions that has been thrown when triggering the different callbacks.
*/
public List<Throwable> triggerCallbacks() {
List<Throwable> throwables = new ArrayList<Throwable>();
for (AfterTestCallback callback : callbacks) {
executeCallback(callback, throwables);
}
for (AfterTestCallback callback : removeableCallbacks) {
executeCallback(callback, throwables);
}
for (AfterTestCallback callback : finalCallbacks) {
executeCallback(callback, throwables);
}
removeableCallbacks.clear();
return throwables;
}
/**
* Unregister a callback so it will not be triggered anymore.
*
* @param callback The callback to unregister.
* @return <tt>true</tt> if this callback was registered.
*/
public boolean unregisterCallback(AfterTestCallback callback) {
return callbacks.remove(callback);
}
private void executeCallback(AfterTestCallback callback, List<Throwable> throwables) {
try {
callback.afterTest();
} catch (Throwable t) {
throwables.add(t);
}
}
}