package roboguice.event; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Base ContextSingleton Observer testing class exercising the various * implementation combinations. * * @author John Ericksen */ @SuppressWarnings({ "UnusedParameters", "UnusedDeclaration" }) public class ContextObserverBase { private Map<String, Map<Class<?>, Integer>> callCount = new HashMap<String, Map<Class<?>, Integer>>(); public void verifyCallCount(List<Method> methods, Class<?> event, int expectedCount) { for (Method method : methods) { assertTrue("Method: " + method.getName() + " was not called.", callCount.containsKey(method.getName()) || expectedCount == 0); if (callCount.containsKey(method.getName())) { Map<Class<?>, Integer> callCountClass = callCount.get(method.getName()); if (expectedCount > 0) { assertTrue("Event: " + event.getName() + " was not observed.", callCountClass.containsKey(event) || expectedCount == 0); if (callCountClass.containsKey(event)) { assertEquals("Call count was not expected", callCountClass.get(event).intValue(), expectedCount); } } } } } public void reset() { for (Map.Entry<String, Map<Class<?>, Integer>> callCountEntry : callCount.entrySet()) { for (Map.Entry<Class<?>, Integer> callCountClassEntry : callCountEntry.getValue().entrySet()) { callCountClassEntry.setValue(0); } } } public static final String[] methods = { "baseObservesEvent", "baseObservesProtectedEvent", "baseObservesPackagePrivateEvent", "baseObservesPrivateEvent", }; public static final String OVERLOADED_METHOD = "baseObservesOverloadedEvent"; public void baseObservesEvent(@Observes EventOne event) { triggerCalled(methods[0], EventOne.class); } public void baseObservesEvent(@Observes EventTwo event) { triggerCalled(methods[0], EventTwo.class); } protected void baseObservesProtectedEvent(@Observes EventOne event) { triggerCalled(methods[1], EventOne.class); } protected void baseObservesProtectedEvent(@Observes EventTwo event) { triggerCalled(methods[1], EventTwo.class); } void baseObservesPackagePrivateEvent(@Observes EventOne event) { triggerCalled(methods[2], EventOne.class); } void baseObservesPackagePrivateEvent(@Observes EventTwo event) { triggerCalled(methods[2], EventTwo.class); } @SuppressWarnings("unused") //used by reflection like others private void baseObservesPrivateEvent(@Observes EventOne event) { triggerCalled(methods[3], EventOne.class); } @SuppressWarnings("unused") //used by reflection like others private void baseObservesPrivateEvent(@Observes EventTwo event) { triggerCalled(methods[3], EventTwo.class); } public void observesOverloadedEvent(@Observes EventOne event) { triggerCalled(OVERLOADED_METHOD, EventOne.class); } public void observesOverloadedEvent(@Observes EventTwo event) { triggerCalled(OVERLOADED_METHOD, EventTwo.class); } protected void observesOverloadedProtectedEvent(@Observes EventOne event) { triggerCalled(OVERLOADED_METHOD, EventOne.class); } protected void observesOverloadedProtectedEvent(@Observes EventTwo event) { triggerCalled(OVERLOADED_METHOD, EventTwo.class); } void observesOverloadedPackagePrivateEvent(@Observes EventOne event) { triggerCalled(OVERLOADED_METHOD, EventOne.class); } void observesOverloadedPackagePrivateEvent(@Observes EventTwo event) { triggerCalled(OVERLOADED_METHOD, EventTwo.class); } @SuppressWarnings("rawtypes") public void triggerCalled(String method, Class eventClass) { if (!callCount.containsKey(method)) { callCount.put(method, new HashMap<Class<?>, Integer>()); } Map<Class<?>, Integer> callCountClass = callCount.get(method); if (!callCountClass.containsKey(eventClass)) { callCountClass.put(eventClass, 0); } callCountClass.put(eventClass, callCountClass.get(eventClass) + 1); } public static List<Method> getMethods(Class<?> eventClass) throws NoSuchMethodException { List<Method> methodList = new ArrayList<Method>(); for (String method : ContextObserverBase.methods) { methodList.add(ContextObserverBase.class.getDeclaredMethod(method, eventClass)); } return methodList; } }