Minor refactoring and Event Test fixes

This commit is contained in:
James Seibel
2022-11-25 09:51:59 -06:00
parent d6a83c8b61
commit 0a806c1218
5 changed files with 46 additions and 30 deletions
@@ -43,11 +43,11 @@ public interface IDhApiEventInjector
/**
* Fires all bound events of the given type (does nothing if no events are bound).
*
* @param dependencyInterface event type
* @param abstractEvent event type
* @param eventParameterObject event parameter
* @return if any of the events returned that this event should be canceled.
* @return if any of bound event handlers returned that this event should be canceled.
* @param <T> the parameter type taken by the event handlers.
*/
<T, U extends IDhApiEvent<T>> boolean fireAllEvents(Class<U> dependencyInterface, T eventParameterObject);
<T, U extends IDhApiEvent<T>> boolean fireAllEvents(Class<U> abstractEvent, T eventParameterObject);
}
@@ -40,7 +40,6 @@ public abstract class DhApiLevelUnloadEvent implements IDhApiEvent<DhApiLevelUnl
/** The recently unloaded level. */
public final IDhApiLevelWrapper levelWrapper;
public EventParam(IDhApiLevelWrapper newLevelWrapper) { this.levelWrapper = newLevelWrapper; }
}
@@ -33,7 +33,7 @@ import java.util.HashMap;
* This class takes care of dependency injection for API events.
*
* @author James Seibel
* @version 2022-11-20
* @version 2022-11-24
*/
public class ApiEventInjector extends DependencyInjector<IDhApiEvent> implements IDhApiEventInjector // Note to self: Don't try adding a generic type to IDhApiEvent, the consturctor won't accept it
{
@@ -56,12 +56,12 @@ public class ApiEventInjector extends DependencyInjector<IDhApiEvent> implements
if (ApiEventDefinitionHandler.INSTANCE.getEventDefinition(abstractEvent).isOneTimeEvent)
{
// has this one time event been fired yet?
if (firedOneTimeEventParamsByEventInterface.containsKey(abstractEvent))
if (this.firedOneTimeEventParamsByEventInterface.containsKey(abstractEvent))
{
// the one time event has happened, fire the handler
// this has to be an unsafe cast since the hash map can't hold the generic objects
Object parameter = firedOneTimeEventParamsByEventInterface.get(abstractEvent);
Object parameter = this.firedOneTimeEventParamsByEventInterface.get(abstractEvent);
eventImplementation.fireEvent(parameter);
}
}
@@ -121,9 +121,9 @@ public class ApiEventInjector extends DependencyInjector<IDhApiEvent> implements
// if this is a one time event, record that it was called
if (ApiEventDefinitionHandler.INSTANCE.getEventDefinition(abstractEvent).isOneTimeEvent &&
!firedOneTimeEventParamsByEventInterface.containsKey(abstractEvent))
!this.firedOneTimeEventParamsByEventInterface.containsKey(abstractEvent))
{
firedOneTimeEventParamsByEventInterface.put(abstractEvent, eventParameterObject);
this.firedOneTimeEventParamsByEventInterface.put(abstractEvent, eventParameterObject);
}
@@ -33,7 +33,7 @@ import java.util.HashMap;
* event instance.
*
* @author James Seibel
* @version 2022-11-21
* @version 2022-11-24
*/
public class ApiEventDefinitionHandler
{
@@ -47,6 +47,7 @@ public class ApiEventDefinitionHandler
private ApiEventDefinitionHandler() { this.addInitialBindings(); }
/** This must include all available events */
public void addInitialBindings()
{
this.setEventDefinition(DhApiAfterDhInitEvent.class, DhApiAfterDhInitEvent.EVENT_DEFINITION);
@@ -82,9 +83,6 @@ public class ApiEventDefinitionHandler
{
if (!this.DEFINITIONS_BY_EVENT_INTERFACE.containsKey(eventInterface))
{
// attempt to get the definition for this class
throw new NullPointerException("event definition missing for: [" + eventInterface.getSimpleName() + "]");
}
+36 -17
View File
@@ -19,22 +19,25 @@ import java.util.ArrayList;
/**
* @author James Seibel
* @version 2022-11-21
* @version 2022-11-25
*/
public class EventInjectorTest
{
@Before
public void testSetup()
{
ApiEventDefinitionHandler definitionHandler = ApiEventDefinitionHandler.INSTANCE;
// reset the injectors and event definitions
ApiEventInjector.INSTANCE.clear();
ApiEventDefinitionHandler.INSTANCE.clear();
definitionHandler.clear();
// register test events
ApiEventDefinitionHandler.INSTANCE.setEventDefinition(DhApiTestEvent.class, DhApiTestEvent.EVENT_DEFINITION);
ApiEventDefinitionHandler.INSTANCE.setEventDefinition(DhApiOneTimeTestEvent.class, DhApiOneTimeTestEvent.EVENT_DEFINITION);
ApiEventDefinitionHandler.INSTANCE.addInitialBindings();
definitionHandler.setEventDefinition(DhApiTestEvent.class, DhApiTestEvent.EVENT_DEFINITION);
definitionHandler.setEventDefinition(DhApiOneTimeTestEvent.class, DhApiOneTimeTestEvent.EVENT_DEFINITION);
definitionHandler.addInitialBindings();
}
@@ -110,14 +113,21 @@ public class EventInjectorTest
@Test
public void testEventDefinition()
{
ApiEventDefinitionHandler definitionHandler = ApiEventDefinitionHandler.INSTANCE;
String errorMessagePrefix = "Missing " + DhApiEventDefinition.class.getSimpleName() + " for event class [";
Assert.assertNotNull(errorMessagePrefix + DhApiTestEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.INSTANCE.getEventDefinition(DhApiTestEvent.class));
Assert.assertNotNull(errorMessagePrefix + DhApiOneTimeTestEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.INSTANCE.getEventDefinition(DhApiOneTimeTestEvent.class));
Assert.assertNotNull(errorMessagePrefix + DhApiAfterDhInitEvent.class.getSimpleName() + "]", ApiEventDefinitionHandler.INSTANCE.getEventDefinition(DhApiAfterDhInitEvent.class));
Assert.assertNotNull(errorMessagePrefix + DhApiTestEvent.class.getSimpleName() + "]", definitionHandler.getEventDefinition(DhApiTestEvent.class));
Assert.assertNotNull(errorMessagePrefix + DhApiOneTimeTestEvent.class.getSimpleName() + "]", definitionHandler.getEventDefinition(DhApiOneTimeTestEvent.class));
Assert.assertNotNull(errorMessagePrefix + DhApiAfterDhInitEvent.class.getSimpleName() + "]", definitionHandler.getEventDefinition(DhApiAfterDhInitEvent.class));
}
@Test
public void testOneTimeEventFiring()
public void oneTimeEventTestPreFireBinding() { this.oneTimeEventTest(false); }
@Test
public void oneTimeEventTestPostFireBinding() { this.oneTimeEventTest(true); }
public void oneTimeEventTest(boolean bindEventBeforeOneTimeFiring)
{
// Injector setup
ApiEventInjector TEST_EVENT_HANDLER = ApiEventInjector.INSTANCE;
@@ -127,16 +137,23 @@ public class EventInjectorTest
Assert.assertNull("Nothing should have been bound.", TEST_EVENT_HANDLER.get(DhApiOneTimeTestEvent.class));
// pre-event fire binding
TEST_EVENT_HANDLER.bind(DhApiOneTimeTestEvent.class, new DhOneTimeTestEventHandler());
if (bindEventBeforeOneTimeFiring)
{
TEST_EVENT_HANDLER.bind(DhApiOneTimeTestEvent.class, new DhOneTimeTestEventHandler());
}
TEST_EVENT_HANDLER.runDelayedSetup();
// pre-bound event firing
Assert.assertEquals("fireAllEvents canceled returned canceled incorrectly.", true, TEST_EVENT_HANDLER.fireAllEvents(DhApiOneTimeTestEvent.class, true));
// validate event fired correctly
ArrayList<DhApiOneTimeTestEvent> oneTimeEventList = TEST_EVENT_HANDLER.getAll(DhApiOneTimeTestEvent.class);
Assert.assertEquals("Event not fired for pre-fire object.", true, oneTimeEventList.get(0).getTestValue());
Assert.assertEquals("fireAllEvents canceled returned canceled incorrectly.", bindEventBeforeOneTimeFiring, TEST_EVENT_HANDLER.fireAllEvents(DhApiOneTimeTestEvent.class, true));
// validate pre-bound events fired correctly
ArrayList<DhApiOneTimeTestEvent> oneTimeEventList;
if (bindEventBeforeOneTimeFiring)
{
oneTimeEventList = TEST_EVENT_HANDLER.getAll(DhApiOneTimeTestEvent.class);
Assert.assertEquals("Event not fired for pre-fire object.", true, oneTimeEventList.get(0).getTestValue());
}
// post-event fire binding
@@ -144,8 +161,10 @@ public class EventInjectorTest
TEST_EVENT_HANDLER.bind(DhApiOneTimeTestEvent.class, new DhOneTimeTestEventHandlerAlt());
// validate both events have fired
oneTimeEventList = TEST_EVENT_HANDLER.getAll(DhApiOneTimeTestEvent.class);
Assert.assertEquals("Event not fired for pre-fire object.", true, oneTimeEventList.get(0).getTestValue());
Assert.assertEquals("Event not fired for post-fire object.", true, oneTimeEventList.get(1).getTestValue());
for (int i = 0; i < oneTimeEventList.size(); i++)
{
Assert.assertEquals("Event not fired for object ["+i+"].", true, oneTimeEventList.get(i).getTestValue());
}