package roboguice.event;
import java.lang.reflect.Method;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import roboguice.event.eventListener.ObserverMethodListener;
/**
* Test class verifying eventManager functionality
*
* @author John Ericksen
*/
public class EventManagerTest {
private EventManager eventManager;
private ContextObserverTesterImpl tester;
private List<Method> eventOneMethods;
private List<Method> eventTwoMethods;
private EventOne event;
@Before
public void setup() throws NoSuchMethodException {
eventManager = new EventManager();
tester = new ContextObserverTesterImpl();
eventOneMethods = ContextObserverTesterImpl.getMethods(EventOne.class);
eventTwoMethods = ContextObserverTesterImpl.getMethods(EventTwo.class);
event = new EventOne();
}
@Test
public void testRegistrationLifeCycle(){
for(Method method : eventOneMethods){
eventManager.registerObserver(EventOne.class, new ObserverMethodListener<EventOne>(tester, method));
}
for(Method method : eventTwoMethods){
eventManager.registerObserver(EventTwo.class, new ObserverMethodListener<EventTwo>(tester, method));
}
eventManager.fire(event);
tester.verifyCallCount(eventOneMethods, EventOne.class, 1);
tester.verifyCallCount(eventTwoMethods, EventTwo.class, 0);
//reset
tester.reset();
eventManager.unregisterObserver(tester, EventOne.class);
eventManager.unregisterObserver( tester, EventTwo.class);
eventManager.fire(event);
tester.verifyCallCount(eventOneMethods, EventOne.class, 0);
tester.verifyCallCount(eventTwoMethods, EventTwo.class, 0);
}
@Test
public void testShouldNotFailIfObserverIsRemovedInsideFire() throws Exception {
eventManager.registerObserver(EventOne.class, new EventListener<EventOne>() {
@Override
public void onEvent(EventOne event) {
// unregister self from manager
eventManager.unregisterObserver(EventOne.class, this);
}
});
eventManager.registerObserver(EventOne.class, Mockito.mock(EventListener.class));
eventManager.fire(event);
}
}