diff --git a/core/src/main/java/mc/core/eventbus/EventBus.java b/core/src/main/java/mc/core/eventbus/EventBus.java index c28a328..460f725 100644 --- a/core/src/main/java/mc/core/eventbus/EventBus.java +++ b/core/src/main/java/mc/core/eventbus/EventBus.java @@ -17,16 +17,20 @@ public class EventBus { private Queue eventQueue; private Map, List>> subscribes = new HashMap<>(); - @SuppressWarnings("unchecked") - public void registerSubscribes(Object subscriberObject) { - Stream.of(subscriberObject.getClass().getDeclaredMethods()) + private Stream getMethods(Object subscriberObject) { + return Stream.of(subscriberObject.getClass().getDeclaredMethods()) .filter(method -> method.isAnnotationPresent(Subscriber.class)) .filter(method -> method.getReturnType().equals(Void.TYPE)) .filter(method -> method.getParameterCount() == 1) - .filter(method -> Event.class.isAssignableFrom(method.getParameterTypes()[0])) + .filter(method -> Event.class.isAssignableFrom(method.getParameterTypes()[0])); + } + + @SuppressWarnings("unchecked") + public void registerSubscribes(Object subscriberObject) { + getMethods(subscriberObject) .forEach(method -> { - Class type = (Class) method.getParameterTypes()[0]; - List> pairs; + final Class type = (Class) method.getParameterTypes()[0]; + final List> pairs; if (subscribes.containsKey(type)) { pairs = subscribes.get(type); } else { @@ -36,4 +40,20 @@ public class EventBus { pairs.add(new Pair<>(subscriberObject, method)); }); } + + @SuppressWarnings("unchecked") + public void unregisterSubscribes(Object subscriberObject) { + getMethods(subscriberObject) + .forEach(method -> { + final Class type = (Class) method.getParameterTypes()[0]; + if (subscribes.containsKey(type)) { + final List> pairs = subscribes.get(type); + pairs.removeIf(pair -> pair.getKey() == subscriberObject); + + if (pairs.isEmpty()) { + subscribes.remove(type); + } + } + }); + } } diff --git a/core/src/test/java/mc/core/TestEventBus.java b/core/src/test/java/mc/core/TestEventBus.java index 88a882a..d8ab843 100644 --- a/core/src/test/java/mc/core/TestEventBus.java +++ b/core/src/test/java/mc/core/TestEventBus.java @@ -4,7 +4,7 @@ import javafx.util.Pair; import mc.core.eventbus.Event; import mc.core.eventbus.EventBus; import mc.core.eventbus.Subscriber; -import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.internal.util.reflection.Whitebox; @@ -17,14 +17,22 @@ import static org.junit.jupiter.api.Assertions.*; class TestEventBus { @SuppressWarnings("unchecked") + private Map, List>> getEventBusFieldSubscribes() { + return (Map, List>>) Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); + } + + @BeforeEach + void before() { + getEventBusFieldSubscribes().clear(); + } + + @Test void testRegisterSubscribes() { DumbEventHandler handler = new DumbEventHandler(); EventBus.getInsnance().registerSubscribes(handler); - Map>> subscribes = - (Map>>) - Whitebox.getInternalState(EventBus.getInsnance(), "subscribes"); + Map, List>> subscribes = getEventBusFieldSubscribes(); assertEquals(1, subscribes.size()); List> pairs = subscribes.values().iterator().next(); @@ -35,6 +43,17 @@ class TestEventBus { assertEquals("corectSubscribe", pair.getValue().getName()); } + @Test + void testUnregisterSubscribes() { + DumbEventHandler handler = new DumbEventHandler(); + EventBus.getInsnance().registerSubscribes(handler); + + EventBus.getInsnance().unregisterSubscribes(handler); + + Map, List>> subscribes = getEventBusFieldSubscribes(); + assertEquals(0, subscribes.size()); + } + private class DumbEvent implements Event { }