From 0a806c1218b4f95f2b1fb5ba62defcb1ff1b42ab Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 25 Nov 2022 09:51:59 -0600 Subject: [PATCH] Minor refactoring and Event Test fixes --- .../events/IDhApiEventInjector.java | 6 +-- .../abstractEvents/DhApiLevelUnloadEvent.java | 1 - .../DependencyInjection/ApiEventInjector.java | 10 ++-- .../events/ApiEventDefinitionHandler.java | 6 +-- .../test/java/tests/EventInjectorTest.java | 53 +++++++++++++------ 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/api/src/main/java/com/seibel/lod/api/interfaces/events/IDhApiEventInjector.java b/api/src/main/java/com/seibel/lod/api/interfaces/events/IDhApiEventInjector.java index 1c693b430..de5a2591a 100644 --- a/api/src/main/java/com/seibel/lod/api/interfaces/events/IDhApiEventInjector.java +++ b/api/src/main/java/com/seibel/lod/api/interfaces/events/IDhApiEventInjector.java @@ -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 the parameter type taken by the event handlers. */ - > boolean fireAllEvents(Class dependencyInterface, T eventParameterObject); + > boolean fireAllEvents(Class abstractEvent, T eventParameterObject); } diff --git a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiLevelUnloadEvent.java b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiLevelUnloadEvent.java index f5e199fa1..bfeff4258 100644 --- a/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiLevelUnloadEvent.java +++ b/api/src/main/java/com/seibel/lod/api/methods/events/abstractEvents/DhApiLevelUnloadEvent.java @@ -40,7 +40,6 @@ public abstract class DhApiLevelUnloadEvent implements 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 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 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); } diff --git a/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java b/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java index d55749977..2aa3dcf62 100644 --- a/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java +++ b/api/src/main/java/com/seibel/lod/core/events/ApiEventDefinitionHandler.java @@ -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() + "]"); } diff --git a/api/src/test/java/tests/EventInjectorTest.java b/api/src/test/java/tests/EventInjectorTest.java index 63813f03a..77bd37769 100644 --- a/api/src/test/java/tests/EventInjectorTest.java +++ b/api/src/test/java/tests/EventInjectorTest.java @@ -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 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 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()); + }