diff --git a/event-bus-core/src/main/java/dev/kske/eventbus/core/DeadEvent.java b/event-bus-core/src/main/java/dev/kske/eventbus/core/DeadEvent.java index 0c93b9a..ad0feb8 100644 --- a/event-bus-core/src/main/java/dev/kske/eventbus/core/DeadEvent.java +++ b/event-bus-core/src/main/java/dev/kske/eventbus/core/DeadEvent.java @@ -18,8 +18,13 @@ public final class DeadEvent { this.event = event; } + @Override + public String toString() { + return String.format("DeadEvent[eventBus=%s, event=%s]", eventBus, event); + } + /** - * @return the event bus that originated this event + * @return the event bus that dispatched this event * @since 1.1.0 */ public EventBus getEventBus() { return eventBus; } diff --git a/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java b/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java index f0c065d..88317c6 100644 --- a/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java +++ b/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java @@ -84,7 +84,13 @@ public final class EventBus { handlers.next().execute(event); } } else if (!(event instanceof DeadEvent)) { + + // Dispatch dead event dispatch(new DeadEvent(this, event)); + } else { + + // Warn about the dead event not being handled + logger.log(Level.WARNING, "{0} not handled", event); } // Reset dispatch state diff --git a/event-bus-core/src/test/java/dev/kske/eventbus/core/DeadTest.java b/event-bus-core/src/test/java/dev/kske/eventbus/core/DeadTest.java index 94e925d..50e1986 100644 --- a/event-bus-core/src/test/java/dev/kske/eventbus/core/DeadTest.java +++ b/event-bus-core/src/test/java/dev/kske/eventbus/core/DeadTest.java @@ -2,7 +2,7 @@ package dev.kske.eventbus.core; import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.Test; /** * Tests the dispatching of a dead event if an event could not be delivered. @@ -12,20 +12,32 @@ import org.junit.jupiter.api.*; */ class DeadTest { - EventBus bus; + EventBus bus = new EventBus(); String event = "This event has no handler"; boolean deadEventHandled; - @BeforeEach - void registerListener() { - bus = new EventBus(); - bus.registerListener(this); - } - + /** + * Tests dead event delivery. + * + * @since 1.1.0 + */ @Test void testDeadEvent() { + bus.registerListener(this); bus.dispatch(event); assertTrue(deadEventHandled); + bus.removeListener(this); + } + + /** + * Tests how the event bus reacts to an unhandled dead event. This should not lead to an + * exception or endless recursion and instead be logged. + * + * @since 1.1.0 + */ + @Test + void testUnhandledDeadEvent() { + bus.dispatch(event); } @Event diff --git a/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java b/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java index 95bae3f..f8a5f90 100644 --- a/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java +++ b/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java @@ -27,8 +27,8 @@ class DispatchTest { } /** - * Tests {@link EventBus#dispatch(Object)} with multiple handler priorities, a subtype handler - * and a static handler. + * Tests {@link EventBus#dispatch(Object)} with multiple handler priorities, a polymorphic + * handler and a static handler. * * @since 0.0.1 */