package org.spongepowered.mod.event; import net.minecraft.launchwrapper.Launch; import net.minecraft.launchwrapper.LaunchClassLoader; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.EventBus; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.spongepowered.api.Sponge; import org.spongepowered.api.event.EventManager; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.entity.SpawnEntityEvent; import org.spongepowered.api.plugin.PluginContainer; import org.spongepowered.api.plugin.PluginManager; import org.spongepowered.common.event.ShouldFire; import org.spongepowered.common.event.SpongeEventManager; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.net.URLClassLoader; import java.util.Optional; @RunWith(PowerMockRunner.class) @PrepareForTest(Loader.class) public class SpongeModEventManagerTest { private EventManager eventManager; private Object plugin; private PluginContainer container; @Before public void init() throws Exception { PluginManager manager = Mockito.mock(PluginManager.class); this.eventManager = new SpongeEventManager(manager); this.plugin = new Object(); this.container = Mockito.mock(PluginContainer.class); Mockito.when(manager.fromInstance(plugin)).thenReturn(Optional.of(this.container)); this.resetStatics(); } private void resetStatics() throws IllegalAccessException { for (Field field: ShouldFire.class.getDeclaredFields()) { if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) { field.set(null, false); } } } @Test public void testSpawn() throws ClassNotFoundException { SpawnListener listener = new SpawnListener(); Assert.assertFalse("SPAWN_ENTITY_EVENT is not false!", ShouldFire.SPAWN_ENTITY_EVENT); Assert.assertFalse("SPAWN_ENTITY_EVENT_CHUNKLOAD is not false!", ShouldFire.SPAWN_ENTITY_EVENT_CHUNKLOAD); this.eventManager.registerListeners(this.plugin, listener); Assert.assertTrue("SPAWN_ENTITY_EVENT is not true!", ShouldFire.SPAWN_ENTITY_EVENT); Assert.assertFalse("SPAWN_ENTITY_EVENT_CHUNKLOAD is not false!", ShouldFire.SPAWN_ENTITY_EVENT_CHUNKLOAD); this.eventManager.unregisterListeners(listener); Assert.assertFalse("SPAWN_ENTITY_EVENT is not false!", ShouldFire.SPAWN_ENTITY_EVENT); Assert.assertFalse("SPAWN_ENTITY_EVENT_CHUNKLOAD is not false!", ShouldFire.SPAWN_ENTITY_EVENT_CHUNKLOAD); ForgeSpawnEventListener forgeListener = new ForgeSpawnEventListener(); EventBus eventBus = new EventBus(); eventBus.register(forgeListener); Assert.assertTrue("SPAWN_ENTITY_EVENT is not true!", ShouldFire.SPAWN_ENTITY_EVENT); } private static class SpawnListener { @Listener public void onSpawn(SpawnEntityEvent event) {} } private static class SubListener { @Listener public void onCustom(SpawnEntityEvent.Custom event) {} } private static class ForgeSpawnEventListener { @SubscribeEvent public void onSpawn(EntityJoinWorldEvent event) { } } }