diff --git a/core/src/test/java/art/arcane/iris/core/IrisRuntimeSchedulerModeRoutingTest.java b/core/src/test/java/art/arcane/iris/core/IrisRuntimeSchedulerModeRoutingTest.java index 87426c72f..ca7b49e94 100644 --- a/core/src/test/java/art/arcane/iris/core/IrisRuntimeSchedulerModeRoutingTest.java +++ b/core/src/test/java/art/arcane/iris/core/IrisRuntimeSchedulerModeRoutingTest.java @@ -1,6 +1,7 @@ package art.arcane.iris.core; import art.arcane.iris.testsupport.BukkitTestServer; +import org.junit.Rule; import org.junit.Test; @@ -9,6 +10,9 @@ import static org.junit.Assume.assumeTrue; import static org.mockito.Mockito.mockingDetails; public class IrisRuntimeSchedulerModeRoutingTest { + @Rule + public final BukkitTestServer.ServerBranding branding = BukkitTestServer.branding(); + @Test public void autoResolvesToPaperLikeOnPurpurBranding() { installServer("Purpur", "git-Purpur-2562 (MC: 26.2)"); @@ -55,6 +59,6 @@ public class IrisRuntimeSchedulerModeRoutingTest { private void installServer(String name, String version) { assumeTrue(mockingDetails(BukkitTestServer.install()).isMock()); - BukkitTestServer.brand(name, version); + branding.set(name, version); } } diff --git a/core/src/test/java/art/arcane/iris/core/gui/NoiseExplorerGUITest.java b/core/src/test/java/art/arcane/iris/core/gui/NoiseExplorerGUITest.java index 649d218d9..75957cff3 100644 --- a/core/src/test/java/art/arcane/iris/core/gui/NoiseExplorerGUITest.java +++ b/core/src/test/java/art/arcane/iris/core/gui/NoiseExplorerGUITest.java @@ -3,7 +3,9 @@ package art.arcane.iris.core.gui; import art.arcane.iris.engine.framework.MeteredCache; import art.arcane.iris.engine.framework.PreservationRegistry; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.function.NoiseProvider; +import org.junit.ClassRule; import org.junit.Test; import javax.swing.SwingUtilities; @@ -20,6 +22,9 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public final class NoiseExplorerGUITest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void openingInitialSourceBuildsSamplerExactlyOnce() throws Exception { AtomicInteger factoryCalls = new AtomicInteger(); diff --git a/core/src/test/java/art/arcane/iris/core/gui/PregeneratorJobShutdownDispatchTest.java b/core/src/test/java/art/arcane/iris/core/gui/PregeneratorJobShutdownDispatchTest.java index 9db13b6f1..b3daed02c 100644 --- a/core/src/test/java/art/arcane/iris/core/gui/PregeneratorJobShutdownDispatchTest.java +++ b/core/src/test/java/art/arcane/iris/core/gui/PregeneratorJobShutdownDispatchTest.java @@ -8,6 +8,7 @@ import art.arcane.iris.platform.bukkit.BukkitPlatform; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.scheduling.J; import art.arcane.volmlib.util.format.MemoryMonitor; import art.arcane.volmlib.util.scheduling.FoliaScheduler; @@ -17,6 +18,7 @@ import org.bukkit.plugin.IllegalPluginAccessException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.scheduler.BukkitScheduler; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -45,6 +47,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class PregeneratorJobShutdownDispatchTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void pluginDisableCanJoinAWorkerAlreadyDispatchingSaving() throws Exception { try (Fixture fixture = new Fixture()) { diff --git a/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java b/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java index b76a79ab4..d5a8fa8d6 100644 --- a/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java +++ b/core/src/test/java/art/arcane/iris/core/lifecycle/MissingWorldStorageLogTest.java @@ -3,8 +3,10 @@ package art.arcane.iris.core.lifecycle; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.LogLevel; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.nio.file.Path; @@ -22,6 +24,9 @@ import static org.mockito.Mockito.mock; * console and the runtime log but never the instance's logs/latest.log - the only log most operators read. */ public class MissingWorldStorageLogTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private final List emitted = new ArrayList<>(); private final List levels = new ArrayList<>(); private IrisPlatform previousPlatform; diff --git a/core/src/test/java/art/arcane/iris/core/link/MultiverseGuardListenerTest.java b/core/src/test/java/art/arcane/iris/core/link/MultiverseGuardListenerTest.java index f6a235721..aea563b70 100644 --- a/core/src/test/java/art/arcane/iris/core/link/MultiverseGuardListenerTest.java +++ b/core/src/test/java/art/arcane/iris/core/link/MultiverseGuardListenerTest.java @@ -3,12 +3,14 @@ package art.arcane.iris.core.link; import art.arcane.iris.core.lifecycle.ManagedWorldLoader; import art.arcane.iris.engine.platform.BukkitChunkGenerator; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.plugin.PluginManager; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -29,6 +31,9 @@ import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; public class MultiverseGuardListenerTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/loader/IrisDataAuthoringCacheTest.java b/core/src/test/java/art/arcane/iris/core/loader/IrisDataAuthoringCacheTest.java index e9b5b4311..6e6733c1f 100644 --- a/core/src/test/java/art/arcane/iris/core/loader/IrisDataAuthoringCacheTest.java +++ b/core/src/test/java/art/arcane/iris/core/loader/IrisDataAuthoringCacheTest.java @@ -4,8 +4,10 @@ import art.arcane.iris.core.IrisSettings; import art.arcane.iris.engine.framework.PreservationRegistry; import art.arcane.iris.engine.object.IrisGenerator; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -22,6 +24,9 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; public class IrisDataAuthoringCacheTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public final TemporaryFolder temporary = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/loader/IrisDataDatapackCompilerCacheTest.java b/core/src/test/java/art/arcane/iris/core/loader/IrisDataDatapackCompilerCacheTest.java index 0717c5521..9cf53a739 100644 --- a/core/src/test/java/art/arcane/iris/core/loader/IrisDataDatapackCompilerCacheTest.java +++ b/core/src/test/java/art/arcane/iris/core/loader/IrisDataDatapackCompilerCacheTest.java @@ -3,8 +3,10 @@ package art.arcane.iris.core.loader; import art.arcane.iris.engine.framework.MeteredCache; import art.arcane.iris.engine.framework.PreservationRegistry; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -17,6 +19,9 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; public class IrisDataDatapackCompilerCacheTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/loader/IrisDataEngineRegistryTest.java b/core/src/test/java/art/arcane/iris/core/loader/IrisDataEngineRegistryTest.java index 6e78dfcc4..420f38a22 100644 --- a/core/src/test/java/art/arcane/iris/core/loader/IrisDataEngineRegistryTest.java +++ b/core/src/test/java/art/arcane/iris/core/loader/IrisDataEngineRegistryTest.java @@ -4,9 +4,11 @@ import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.framework.MeteredCache; import art.arcane.iris.engine.framework.PreservationRegistry; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.context.IrisContext; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -21,6 +23,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class IrisDataEngineRegistryTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/loader/IrisDataRetainedPackTest.java b/core/src/test/java/art/arcane/iris/core/loader/IrisDataRetainedPackTest.java index 11cca8434..8a86f3157 100644 --- a/core/src/test/java/art/arcane/iris/core/loader/IrisDataRetainedPackTest.java +++ b/core/src/test/java/art/arcane/iris/core/loader/IrisDataRetainedPackTest.java @@ -5,8 +5,10 @@ import art.arcane.iris.engine.history.GenerationRegistryContract; import art.arcane.iris.engine.object.IrisDimension; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -20,6 +22,9 @@ import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.spy; public class IrisDataRetainedPackTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderPrefetchTest.java b/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderPrefetchTest.java index 563f759fa..de54f4c0e 100644 --- a/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderPrefetchTest.java +++ b/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderPrefetchTest.java @@ -7,10 +7,12 @@ import art.arcane.iris.engine.object.IrisDimension; import art.arcane.iris.engine.object.IrisObject; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.collection.KSet; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -34,6 +36,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ResourceLoaderPrefetchTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderStaticObjectValidationTest.java b/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderStaticObjectValidationTest.java index 403c19da3..9265f0cc5 100644 --- a/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderStaticObjectValidationTest.java +++ b/core/src/test/java/art/arcane/iris/core/loader/ResourceLoaderStaticObjectValidationTest.java @@ -5,9 +5,11 @@ import art.arcane.iris.engine.object.IrisDimension; import art.arcane.iris.engine.object.IrisPosition; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; import com.google.gson.Gson; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -26,6 +28,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class ResourceLoaderStaticObjectValidationTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/pack/PackDownloaderTest.java b/core/src/test/java/art/arcane/iris/core/pack/PackDownloaderTest.java index 5e37ae1b7..96e04cdce 100644 --- a/core/src/test/java/art/arcane/iris/core/pack/PackDownloaderTest.java +++ b/core/src/test/java/art/arcane/iris/core/pack/PackDownloaderTest.java @@ -27,9 +27,11 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.IrisServices; import art.arcane.iris.spi.PlatformStructureHooks; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.Assume; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -67,6 +69,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class PackDownloaderTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temp = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/pack/PackImageMapValidatorTest.java b/core/src/test/java/art/arcane/iris/core/pack/PackImageMapValidatorTest.java index 18e2995cc..7359261e3 100644 --- a/core/src/test/java/art/arcane/iris/core/pack/PackImageMapValidatorTest.java +++ b/core/src/test/java/art/arcane/iris/core/pack/PackImageMapValidatorTest.java @@ -3,8 +3,10 @@ package art.arcane.iris.core.pack; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -25,6 +27,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class PackImageMapValidatorTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/pack/PackValidationCacheTest.java b/core/src/test/java/art/arcane/iris/core/pack/PackValidationCacheTest.java index 2c79cbe0c..c9ebb8c97 100644 --- a/core/src/test/java/art/arcane/iris/core/pack/PackValidationCacheTest.java +++ b/core/src/test/java/art/arcane/iris/core/pack/PackValidationCacheTest.java @@ -7,6 +7,8 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformRegistries; import art.arcane.iris.spi.PlatformStructureHooks; +import art.arcane.iris.testsupport.PlatformLeakGuard; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.Assume; @@ -30,6 +32,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class PackValidationCacheTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/pack/PackValidatorStructureGraphTest.java b/core/src/test/java/art/arcane/iris/core/pack/PackValidatorStructureGraphTest.java index d9fc885c1..6a58898af 100644 --- a/core/src/test/java/art/arcane/iris/core/pack/PackValidatorStructureGraphTest.java +++ b/core/src/test/java/art/arcane/iris/core/pack/PackValidatorStructureGraphTest.java @@ -4,6 +4,8 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformStructureHooks; import art.arcane.iris.spi.PlatformStructureHooks.JigsawSourceMetadata; +import art.arcane.iris.testsupport.PlatformLeakGuard; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -27,6 +29,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class PackValidatorStructureGraphTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/pregenerator/cache/PregenCacheExecutorRegistrationTest.java b/core/src/test/java/art/arcane/iris/core/pregenerator/cache/PregenCacheExecutorRegistrationTest.java index 7d5320a30..157d28002 100644 --- a/core/src/test/java/art/arcane/iris/core/pregenerator/cache/PregenCacheExecutorRegistrationTest.java +++ b/core/src/test/java/art/arcane/iris/core/pregenerator/cache/PregenCacheExecutorRegistrationTest.java @@ -3,7 +3,9 @@ package art.arcane.iris.core.pregenerator.cache; import art.arcane.iris.engine.framework.MeteredCache; import art.arcane.iris.engine.framework.PreservationRegistry; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; +import org.junit.ClassRule; import org.junit.Test; import java.io.File; @@ -16,6 +18,9 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class PregenCacheExecutorRegistrationTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final class RecordingPreservation implements PreservationRegistry { private final List executors = new CopyOnWriteArrayList<>(); diff --git a/core/src/test/java/art/arcane/iris/core/project/ExternalBlockSchemaTest.java b/core/src/test/java/art/arcane/iris/core/project/ExternalBlockSchemaTest.java index 48d2009d4..a1fc05c67 100644 --- a/core/src/test/java/art/arcane/iris/core/project/ExternalBlockSchemaTest.java +++ b/core/src/test/java/art/arcane/iris/core/project/ExternalBlockSchemaTest.java @@ -7,9 +7,11 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockProperty; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.json.JSONObject; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.List; @@ -20,6 +22,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ExternalBlockSchemaTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final String QUALIFIED_BLOCK = "craftengine:example/ores/copper"; private IrisPlatform previous; diff --git a/core/src/test/java/art/arcane/iris/core/project/IrisCodeWorkspaceTest.java b/core/src/test/java/art/arcane/iris/core/project/IrisCodeWorkspaceTest.java index c1b5948b1..93279f408 100644 --- a/core/src/test/java/art/arcane/iris/core/project/IrisCodeWorkspaceTest.java +++ b/core/src/test/java/art/arcane/iris/core/project/IrisCodeWorkspaceTest.java @@ -8,10 +8,12 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.IrisServices; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.json.JSONArray; import art.arcane.volmlib.util.json.JSONObject; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -34,6 +36,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class IrisCodeWorkspaceTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/project/IrisRiverSchemaTest.java b/core/src/test/java/art/arcane/iris/core/project/IrisRiverSchemaTest.java index f436677e8..4def75054 100644 --- a/core/src/test/java/art/arcane/iris/core/project/IrisRiverSchemaTest.java +++ b/core/src/test/java/art/arcane/iris/core/project/IrisRiverSchemaTest.java @@ -8,6 +8,7 @@ import art.arcane.iris.engine.object.IrisBlockData; import art.arcane.iris.engine.object.IrisExpression; import art.arcane.iris.engine.object.IrisHydrology; import art.arcane.iris.engine.object.IrisRiverPolicy; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.json.JSONArray; @@ -17,6 +18,7 @@ import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformRegistries; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -30,6 +32,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class IrisRiverSchemaTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private IrisPlatform previousPlatform; @Before diff --git a/core/src/test/java/art/arcane/iris/core/project/IrisStaticObjectSchemaTest.java b/core/src/test/java/art/arcane/iris/core/project/IrisStaticObjectSchemaTest.java index 0de1e7b91..97269a088 100644 --- a/core/src/test/java/art/arcane/iris/core/project/IrisStaticObjectSchemaTest.java +++ b/core/src/test/java/art/arcane/iris/core/project/IrisStaticObjectSchemaTest.java @@ -12,11 +12,13 @@ import art.arcane.iris.engine.object.annotations.ArrayType; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.json.JSONObject; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.lang.reflect.Field; @@ -30,6 +32,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class IrisStaticObjectSchemaTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private IrisPlatform previousPlatform; @Before diff --git a/core/src/test/java/art/arcane/iris/core/project/SchemaBuilderParityTest.java b/core/src/test/java/art/arcane/iris/core/project/SchemaBuilderParityTest.java index 696374b43..cca89d561 100644 --- a/core/src/test/java/art/arcane/iris/core/project/SchemaBuilderParityTest.java +++ b/core/src/test/java/art/arcane/iris/core/project/SchemaBuilderParityTest.java @@ -55,12 +55,14 @@ import art.arcane.iris.spi.PlatformRegistries; import art.arcane.iris.spi.PlatformScheduler; import art.arcane.iris.spi.PlatformStructureHooks; import art.arcane.iris.spi.PlatformWorld; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.json.JSONArray; import art.arcane.volmlib.util.json.JSONObject; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.io.File; @@ -76,6 +78,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class SchemaBuilderParityTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final List POTION_KEYS = List.of("minecraft:speed", "minecraft:slow_falling", "sniffer_mod:mega_boost"); private static final List ENCHANT_KEYS = List.of("minecraft:sharpness", "cool_mod:vorpal"); private static final List ITEM_KEYS = List.of("minecraft:stone", "minecraft:diamond_sword", "cool_mod:ruby"); diff --git a/core/src/test/java/art/arcane/iris/core/service/BoardSVCSavedBiomeTest.java b/core/src/test/java/art/arcane/iris/core/service/BoardSVCSavedBiomeTest.java index b5e295861..14fb11c81 100644 --- a/core/src/test/java/art/arcane/iris/core/service/BoardSVCSavedBiomeTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/BoardSVCSavedBiomeTest.java @@ -17,6 +17,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.scheduling.J; import art.arcane.volmlib.util.board.Board; import art.arcane.volmlib.util.board.BoardSettings; @@ -24,6 +25,7 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.junit.ClassRule; import org.junit.Test; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -53,6 +55,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class BoardSVCSavedBiomeTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static IrisPlatform previousPlatform; @BeforeClass diff --git a/core/src/test/java/art/arcane/iris/core/service/JigsawStudioMenuControllerTest.java b/core/src/test/java/art/arcane/iris/core/service/JigsawStudioMenuControllerTest.java index 860be98ab..7725abc38 100644 --- a/core/src/test/java/art/arcane/iris/core/service/JigsawStudioMenuControllerTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/JigsawStudioMenuControllerTest.java @@ -7,6 +7,7 @@ import art.arcane.iris.core.runtime.jigsaw.JigsawStudioPieceRules; import art.arcane.iris.core.runtime.jigsaw.JigsawStudioToolAction; import art.arcane.iris.core.runtime.jigsaw.JigsawStudioToolPayload; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.scheduling.J; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -15,6 +16,7 @@ import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.plugin.java.JavaPlugin; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -41,6 +43,9 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; public class JigsawStudioMenuControllerTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final UUID WORLD_ID = UUID.fromString("22222222-2222-2222-2222-222222222222"); private static final UUID REQUEST_ID = UUID.fromString("77777777-7777-7777-7777-777777777777"); private static final JigsawStudioPieceRules RULES = new JigsawStudioPieceRules(1, 12, 2, 8, false); diff --git a/core/src/test/java/art/arcane/iris/core/service/JigsawStudioServiceCaptureTest.java b/core/src/test/java/art/arcane/iris/core/service/JigsawStudioServiceCaptureTest.java index 794854461..9567bd53e 100644 --- a/core/src/test/java/art/arcane/iris/core/service/JigsawStudioServiceCaptureTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/JigsawStudioServiceCaptureTest.java @@ -36,6 +36,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.data.B; import art.arcane.iris.util.common.math.IrisBlockVector; import art.arcane.iris.util.common.plugin.VolmitPlugin; @@ -72,6 +73,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.WorldUnloadEvent; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -115,6 +117,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class JigsawStudioServiceCaptureTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void shutdownQuiesceIsIdempotentAndResetsOnEnable() throws Exception { diff --git a/core/src/test/java/art/arcane/iris/core/service/MultiverseSVCTest.java b/core/src/test/java/art/arcane/iris/core/service/MultiverseSVCTest.java index d580dedaf..5f3ae0b6a 100644 --- a/core/src/test/java/art/arcane/iris/core/service/MultiverseSVCTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/MultiverseSVCTest.java @@ -4,6 +4,7 @@ import art.arcane.iris.core.link.MultiverseCoreLink; import art.arcane.iris.core.link.MultiverseGuardListener; import art.arcane.iris.platform.bukkit.BukkitPlatform; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.plugin.VolmitPlugin; import org.bukkit.Bukkit; import org.bukkit.event.Listener; @@ -11,6 +12,7 @@ import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.plugin.Plugin; import org.junit.After; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -24,6 +26,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MultiverseSVCTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @After public void unbindLink() { IrisServices.remove(MultiverseCoreLink.class); diff --git a/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java b/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java index 33ac1df61..a8f7d638b 100644 --- a/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java +++ b/core/src/test/java/art/arcane/iris/core/service/StudioSVCWorldPackPublishTest.java @@ -8,9 +8,11 @@ import art.arcane.iris.core.pack.PackValidationRegistry; import art.arcane.iris.core.pack.PackValidationResult; import art.arcane.iris.engine.framework.PreservationRegistry; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.Assume; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -32,6 +34,9 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; public class StudioSVCWorldPackPublishTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/structure/StructureIndexServiceTest.java b/core/src/test/java/art/arcane/iris/core/structure/StructureIndexServiceTest.java index b796e3311..f0c331103 100644 --- a/core/src/test/java/art/arcane/iris/core/structure/StructureIndexServiceTest.java +++ b/core/src/test/java/art/arcane/iris/core/structure/StructureIndexServiceTest.java @@ -7,8 +7,10 @@ import art.arcane.iris.engine.history.GenerationPackFingerprint; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformStructureHooks; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -30,6 +32,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class StructureIndexServiceTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/structure/authoring/IrisDataStructureRecoveryTest.java b/core/src/test/java/art/arcane/iris/core/structure/authoring/IrisDataStructureRecoveryTest.java index 548ff12d2..d99b6e6b3 100644 --- a/core/src/test/java/art/arcane/iris/core/structure/authoring/IrisDataStructureRecoveryTest.java +++ b/core/src/test/java/art/arcane/iris/core/structure/authoring/IrisDataStructureRecoveryTest.java @@ -4,8 +4,10 @@ import art.arcane.iris.core.loader.IrisData; import art.arcane.iris.engine.framework.MeteredCache; import art.arcane.iris.engine.framework.PreservationRegistry; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -22,6 +24,9 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertFalse; public class IrisDataStructureRecoveryTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/core/structure/export/VanillaJigsawDatapackExporterTest.java b/core/src/test/java/art/arcane/iris/core/structure/export/VanillaJigsawDatapackExporterTest.java index 064027996..57e8b5d79 100644 --- a/core/src/test/java/art/arcane/iris/core/structure/export/VanillaJigsawDatapackExporterTest.java +++ b/core/src/test/java/art/arcane/iris/core/structure/export/VanillaJigsawDatapackExporterTest.java @@ -20,6 +20,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.nbt.io.NBTUtil; import art.arcane.volmlib.util.nbt.tag.CompoundTag; @@ -28,6 +29,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -53,6 +55,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class VanillaJigsawDatapackExporterTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static PlatformBlockState stone; @Rule diff --git a/core/src/test/java/art/arcane/iris/core/tools/IrisToolbeltPackReferenceTest.java b/core/src/test/java/art/arcane/iris/core/tools/IrisToolbeltPackReferenceTest.java index a9f908f1b..669e58122 100644 --- a/core/src/test/java/art/arcane/iris/core/tools/IrisToolbeltPackReferenceTest.java +++ b/core/src/test/java/art/arcane/iris/core/tools/IrisToolbeltPackReferenceTest.java @@ -2,8 +2,10 @@ package art.arcane.iris.core.tools; import art.arcane.iris.core.service.StudioSVC; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.bukkit.World; import org.junit.After; +import org.junit.ClassRule; import org.junit.Test; import java.lang.reflect.Proxy; @@ -14,6 +16,9 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class IrisToolbeltPackReferenceTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @After public void cleanServices() { IrisServices.remove(StudioSVC.class); diff --git a/core/src/test/java/art/arcane/iris/core/tools/TreePlausibilizerTest.java b/core/src/test/java/art/arcane/iris/core/tools/TreePlausibilizerTest.java index cd9351a8b..699c880b4 100644 --- a/core/src/test/java/art/arcane/iris/core/tools/TreePlausibilizerTest.java +++ b/core/src/test/java/art/arcane/iris/core/tools/TreePlausibilizerTest.java @@ -1,13 +1,10 @@ package art.arcane.iris.core.tools; import art.arcane.iris.engine.object.IrisObject; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.common.math.IrisBlockVector; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayDeque; @@ -22,11 +19,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class TreePlausibilizerTest { + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); + private static final String OAK_LOG = "minecraft:oak_log[axis=y]"; private static final String BIRCH_LOG = "minecraft:birch_log[axis=y]"; private static final String OAK_LEAVES = "minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false]"; @@ -42,22 +39,6 @@ public class TreePlausibilizerTest { private record Pos(int x, int y, int z) { } - @BeforeClass - public static void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState defaultBlock = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - IrisPlatform platform = mock(IrisPlatform.class); - when(registries.block(anyString())).thenReturn(defaultBlock); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @AfterClass - public static void unbindPlatform() { - IrisPlatforms.unbind(); - } - private static final class TestState implements PlatformBlockState { private final String key; diff --git a/core/src/test/java/art/arcane/iris/engine/EngineShutdownDrainTest.java b/core/src/test/java/art/arcane/iris/engine/EngineShutdownDrainTest.java index 42faebe7d..d65ad2e62 100644 --- a/core/src/test/java/art/arcane/iris/engine/EngineShutdownDrainTest.java +++ b/core/src/test/java/art/arcane/iris/engine/EngineShutdownDrainTest.java @@ -27,6 +27,7 @@ import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; import art.arcane.iris.testsupport.DurabilityMode; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -71,6 +72,9 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; public class EngineShutdownDrainTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @ClassRule public static final DurabilityMode DURABILITY = DurabilityMode.relaxed(); diff --git a/core/src/test/java/art/arcane/iris/engine/ResolvedTerrainProviderTest.java b/core/src/test/java/art/arcane/iris/engine/ResolvedTerrainProviderTest.java index 29967c1bd..2254fe035 100644 --- a/core/src/test/java/art/arcane/iris/engine/ResolvedTerrainProviderTest.java +++ b/core/src/test/java/art/arcane/iris/engine/ResolvedTerrainProviderTest.java @@ -17,11 +17,13 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformRegistries; import art.arcane.iris.spi.PlatformBlockState; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.context.ChunkContext; import art.arcane.iris.util.project.context.IrisContext; import art.arcane.iris.util.project.hunk.Hunk; import art.arcane.iris.util.project.stream.ProceduralStream; import art.arcane.volmlib.util.collection.KList; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -59,6 +61,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public final class ResolvedTerrainProviderTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void cachedTransitionTerrainRetainsDeferredBlocksWhenCopied() { Fixture fixture = new Fixture(); diff --git a/core/src/test/java/art/arcane/iris/engine/actuator/IrisBiomeActuatorCoordinateTest.java b/core/src/test/java/art/arcane/iris/engine/actuator/IrisBiomeActuatorCoordinateTest.java index a4f2cd99a..6d97053ec 100644 --- a/core/src/test/java/art/arcane/iris/engine/actuator/IrisBiomeActuatorCoordinateTest.java +++ b/core/src/test/java/art/arcane/iris/engine/actuator/IrisBiomeActuatorCoordinateTest.java @@ -13,6 +13,7 @@ import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformBiome; import art.arcane.iris.spi.PlatformBiomeWriter; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.context.ChunkContext; import art.arcane.iris.util.project.context.ChunkedDataCache; import art.arcane.iris.util.project.hunk.Hunk; @@ -21,6 +22,7 @@ import art.arcane.volmlib.util.math.RNG; import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.matter.MatterBiomeInject; import org.junit.After; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -43,6 +45,9 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; public class IrisBiomeActuatorCoordinateTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @After public void unbindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/actuator/IrisDimensionStackActuatorMetadataTest.java b/core/src/test/java/art/arcane/iris/engine/actuator/IrisDimensionStackActuatorMetadataTest.java index 82eb3b857..e770fabf0 100644 --- a/core/src/test/java/art/arcane/iris/engine/actuator/IrisDimensionStackActuatorMetadataTest.java +++ b/core/src/test/java/art/arcane/iris/engine/actuator/IrisDimensionStackActuatorMetadataTest.java @@ -7,6 +7,7 @@ import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; import art.arcane.iris.engine.hydrology.cave.HydrologyCaveAction; import art.arcane.iris.engine.mantle.TerrainMatterView; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.matter.IrisMatterSupport; import art.arcane.iris.util.project.matter.slices.PreObjectMatterTest; import art.arcane.volmlib.util.matter.IrisMatter; @@ -23,6 +24,7 @@ import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.matter.MatterSlice; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import static org.mockito.ArgumentMatchers.anyString; @@ -32,6 +34,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisDimensionStackActuatorMetadataTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void bindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/actuator/IrisTerrainNormalActuatorHydrologyTest.java b/core/src/test/java/art/arcane/iris/engine/actuator/IrisTerrainNormalActuatorHydrologyTest.java index c02fcad53..38ad21908 100644 --- a/core/src/test/java/art/arcane/iris/engine/actuator/IrisTerrainNormalActuatorHydrologyTest.java +++ b/core/src/test/java/art/arcane/iris/engine/actuator/IrisTerrainNormalActuatorHydrologyTest.java @@ -9,14 +9,11 @@ import art.arcane.iris.engine.object.IrisDecorationStep; import art.arcane.iris.engine.object.IrisMaterialPalette; import art.arcane.iris.engine.object.IrisRiverMaterialConfig; import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.math.RNG; +import org.junit.Rule; import org.junit.Test; -import org.junit.Before; -import org.junit.After; import java.util.ArrayList; import java.util.List; @@ -28,7 +25,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.mock; @@ -37,27 +33,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisTerrainNormalActuatorHydrologyTest { - private IrisPlatform previousPlatform; + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); - @Before - public void bindPlatform() { - previousPlatform = IrisPlatforms.isBound() ? IrisPlatforms.get() : null; - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @After - public void restorePlatform() { - IrisPlatforms.unbind(); - if (previousPlatform != null) { - IrisPlatforms.bind(previousPlatform); - } - } @Test public void hydrologyOwnedFluidBypassesBiomeSeaLayers() { diff --git a/core/src/test/java/art/arcane/iris/engine/actuator/IrisTransitionGeometryActuatorTest.java b/core/src/test/java/art/arcane/iris/engine/actuator/IrisTransitionGeometryActuatorTest.java index 96d362aa4..9d588d511 100644 --- a/core/src/test/java/art/arcane/iris/engine/actuator/IrisTransitionGeometryActuatorTest.java +++ b/core/src/test/java/art/arcane/iris/engine/actuator/IrisTransitionGeometryActuatorTest.java @@ -12,10 +12,12 @@ import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBiome; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.context.ChunkContext; import art.arcane.iris.util.project.hunk.Hunk; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -31,6 +33,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisTransitionGeometryActuatorTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private IrisPlatform previous; private PlatformRegistries registries; private PlatformBlockState stone; diff --git a/core/src/test/java/art/arcane/iris/engine/decorator/IrisDecoratorCaveContextTest.java b/core/src/test/java/art/arcane/iris/engine/decorator/IrisDecoratorCaveContextTest.java index 42b5bcd7b..9e7f36694 100644 --- a/core/src/test/java/art/arcane/iris/engine/decorator/IrisDecoratorCaveContextTest.java +++ b/core/src/test/java/art/arcane/iris/engine/decorator/IrisDecoratorCaveContextTest.java @@ -14,7 +14,9 @@ import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.hunk.Hunk; +import org.junit.ClassRule; import org.junit.Test; import org.junit.BeforeClass; import org.junit.AfterClass; @@ -31,6 +33,9 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; public class IrisDecoratorCaveContextTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @BeforeClass public static void bindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/decorator/IrisShoreLineDecoratorTest.java b/core/src/test/java/art/arcane/iris/engine/decorator/IrisShoreLineDecoratorTest.java index 72b6a1049..aafeb6f69 100644 --- a/core/src/test/java/art/arcane/iris/engine/decorator/IrisShoreLineDecoratorTest.java +++ b/core/src/test/java/art/arcane/iris/engine/decorator/IrisShoreLineDecoratorTest.java @@ -14,10 +14,12 @@ import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.hunk.Hunk; import art.arcane.iris.util.project.stream.ProceduralStream; import org.bukkit.block.BlockSupport; import org.bukkit.block.data.BlockData; +import org.junit.ClassRule; import org.junit.Test; import org.junit.BeforeClass; import org.junit.AfterClass; @@ -35,6 +37,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisShoreLineDecoratorTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final int FLUID_HEIGHT = 4; @BeforeClass diff --git a/core/src/test/java/art/arcane/iris/engine/framework/EngineComponentTest.java b/core/src/test/java/art/arcane/iris/engine/framework/EngineComponentTest.java index 09e7121cb..bc334d75a 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/EngineComponentTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/EngineComponentTest.java @@ -19,8 +19,10 @@ package art.arcane.iris.engine.framework; import art.arcane.iris.spi.IrisServices; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.math.RollingSequence; import org.junit.After; +import org.junit.ClassRule; import org.junit.Test; import java.util.concurrent.atomic.AtomicReference; @@ -28,6 +30,9 @@ import java.util.concurrent.atomic.AtomicReference; import static org.junit.Assert.assertSame; public class EngineComponentTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @After public void removeCleanup() { IrisServices.remove(EngineComponentCleanup.class); diff --git a/core/src/test/java/art/arcane/iris/engine/framework/EngineHostHeightTest.java b/core/src/test/java/art/arcane/iris/engine/framework/EngineHostHeightTest.java index d7373a45f..9eef22d9f 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/EngineHostHeightTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/EngineHostHeightTest.java @@ -12,8 +12,10 @@ import art.arcane.iris.spi.PlatformBiome; import art.arcane.iris.spi.PlatformBiomeWriter; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.List; @@ -30,6 +32,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class EngineHostHeightTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void bindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/framework/EngineModeBurstAroundTest.java b/core/src/test/java/art/arcane/iris/engine/framework/EngineModeBurstAroundTest.java index eeac725da..c1c04ea85 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/EngineModeBurstAroundTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/EngineModeBurstAroundTest.java @@ -1,14 +1,12 @@ package art.arcane.iris.engine.framework; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.common.parallel.MultiBurst; import art.arcane.iris.util.project.context.ChunkContext; import art.arcane.iris.core.IrisSettings; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.util.List; @@ -19,29 +17,24 @@ import java.util.concurrent.CopyOnWriteArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.CALLS_REAL_METHODS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class EngineModeBurstAroundTest { + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); + private static IrisSettings previousSettings; @BeforeClass public static void bindPlatform() { previousSettings = IrisSettings.settings; IrisSettings.settings = new IrisSettings(); - IrisPlatforms.unbind(); - PlatformRegistries registries = mock(PlatformRegistries.class); - IrisPlatform platform = mock(IrisPlatform.class); - when(registries.block(anyString())).thenReturn(mock(PlatformBlockState.class)); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); } @AfterClass public static void unbindPlatform() { - IrisPlatforms.unbind(); IrisSettings.settings = previousSettings; } diff --git a/core/src/test/java/art/arcane/iris/engine/framework/HintedLocatorTest.java b/core/src/test/java/art/arcane/iris/engine/framework/HintedLocatorTest.java index f71f35d15..0f10994c5 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/HintedLocatorTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/HintedLocatorTest.java @@ -17,6 +17,7 @@ import art.arcane.iris.engine.hydrology.runtime.IrisHydrologyRuntime; import art.arcane.iris.engine.history.GenerationSemanticIndex; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.stream.ProceduralStream; import art.arcane.iris.util.project.stream.interpolation.Interpolated; import art.arcane.volmlib.util.collection.KList; @@ -24,6 +25,7 @@ import art.arcane.volmlib.util.math.Position2; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.io.File; @@ -50,6 +52,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class HintedLocatorTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static boolean boundPlatform; @BeforeClass diff --git a/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerCompatTest.java b/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerCompatTest.java index f9f339348..63efc154a 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerCompatTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerCompatTest.java @@ -34,13 +34,9 @@ import art.arcane.iris.engine.object.IrisObject; import art.arcane.iris.engine.object.IrisPosition; import art.arcane.iris.engine.object.IrisStructure; import art.arcane.iris.engine.object.JigsawJoint; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.math.RNG; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.util.List; @@ -48,26 +44,12 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class StructureAssemblerCompatTest { - @BeforeClass - public static void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @AfterClass - public static void unbindPlatform() { - IrisPlatforms.unbind(); - } + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); @Test public void anExcludedPieceIsNeverDrawnFromItsPool() { diff --git a/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerTest.java b/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerTest.java index 163e94fe2..ca3121b5f 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/StructureAssemblerTest.java @@ -34,13 +34,9 @@ import art.arcane.iris.engine.object.IrisObject; import art.arcane.iris.engine.object.IrisPosition; import art.arcane.iris.engine.object.IrisStructure; import art.arcane.iris.engine.object.JigsawJoint; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.math.RNG; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.util.List; @@ -50,26 +46,12 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class StructureAssemblerTest { - @BeforeClass - public static void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @AfterClass - public static void unbindPlatform() { - IrisPlatforms.unbind(); - } + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); @Test public void attachedNonRotatablePieceKeepsItsAuthoredFacing() { diff --git a/core/src/test/java/art/arcane/iris/engine/framework/StructureCaveAnchorResolverTest.java b/core/src/test/java/art/arcane/iris/engine/framework/StructureCaveAnchorResolverTest.java index 337532b56..267c9720f 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/StructureCaveAnchorResolverTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/StructureCaveAnchorResolverTest.java @@ -5,14 +5,10 @@ import art.arcane.iris.engine.object.IrisStructureAnchorMode; import art.arcane.iris.engine.object.IrisStructurePlacement; import art.arcane.iris.engine.hydrology.cave.HydrologyCaveAction; import art.arcane.iris.engine.hydrology.cave.HydrologyCaveCell; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.math.RNG; import art.arcane.volmlib.util.matter.MatterCavern; -import org.junit.After; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import java.util.Arrays; @@ -27,7 +23,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; @@ -36,21 +31,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class StructureCaveAnchorResolverTest { - @Before - public void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @After - public void unbindPlatform() { - IrisPlatforms.unbind(); - } + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); @Test public void floorRequiresSolidBoundaryAndUpwardClearance() { diff --git a/core/src/test/java/art/arcane/iris/engine/framework/StructureReachabilityContractTest.java b/core/src/test/java/art/arcane/iris/engine/framework/StructureReachabilityContractTest.java index 3386391a0..40b3855bb 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/StructureReachabilityContractTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/StructureReachabilityContractTest.java @@ -24,6 +24,8 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformStructureHooks; import art.arcane.iris.spi.PlatformWorld; +import art.arcane.iris.testsupport.PlatformLeakGuard; +import org.junit.ClassRule; import org.junit.Test; import java.util.List; @@ -35,6 +37,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class StructureReachabilityContractTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void reachableKeysRejectsNullEngine() { assertThrows(NullPointerException.class, () -> StructureReachability.reachableKeys(null)); diff --git a/core/src/test/java/art/arcane/iris/engine/framework/structure/StructureGraphCompilerTest.java b/core/src/test/java/art/arcane/iris/engine/framework/structure/StructureGraphCompilerTest.java index 6339d0323..e72c789f0 100644 --- a/core/src/test/java/art/arcane/iris/engine/framework/structure/StructureGraphCompilerTest.java +++ b/core/src/test/java/art/arcane/iris/engine/framework/structure/StructureGraphCompilerTest.java @@ -14,13 +14,9 @@ import art.arcane.iris.engine.object.IrisObject; import art.arcane.iris.engine.object.IrisPosition; import art.arcane.iris.engine.object.IrisStructure; import art.arcane.iris.engine.object.JigsawJoint; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.collection.KList; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -31,26 +27,10 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class StructureGraphCompilerTest { - @BeforeClass - public static void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @AfterClass - public static void unbindPlatform() { - IrisPlatforms.unbind(); - } + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); @Test public void compilesACompleteTerminalGraphAndSamplesDeterministically() { diff --git a/core/src/test/java/art/arcane/iris/engine/history/ArchivedRegistryCompilerTest.java b/core/src/test/java/art/arcane/iris/engine/history/ArchivedRegistryCompilerTest.java index 9eef16f2c..1a87ca0c1 100644 --- a/core/src/test/java/art/arcane/iris/engine/history/ArchivedRegistryCompilerTest.java +++ b/core/src/test/java/art/arcane/iris/engine/history/ArchivedRegistryCompilerTest.java @@ -9,7 +9,9 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformGenerationRegistry; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KList; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -27,6 +29,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ArchivedRegistryCompilerTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public final TemporaryFolder temporary = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/engine/hydrology/HydrologyPlannerCrossTileCaveAdmissionIntegrationTest.java b/core/src/test/java/art/arcane/iris/engine/hydrology/HydrologyPlannerCrossTileCaveAdmissionIntegrationTest.java index 063087527..d601663fd 100644 --- a/core/src/test/java/art/arcane/iris/engine/hydrology/HydrologyPlannerCrossTileCaveAdmissionIntegrationTest.java +++ b/core/src/test/java/art/arcane/iris/engine/hydrology/HydrologyPlannerCrossTileCaveAdmissionIntegrationTest.java @@ -9,6 +9,8 @@ import art.arcane.iris.core.IrisSettings; import art.arcane.iris.engine.hydrology.cave.HydrologyCavePlan; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -23,6 +25,9 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; public class HydrologyPlannerCrossTileCaveAdmissionIntegrationTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final long SEED = 77L; private static final List ADJACENT_PAIRS = List.of( new TilePair(new HydrologyTileKey(0, -2), new HydrologyTileKey(0, -1)), diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCleanupTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCleanupTest.java index a62f60a32..7dc0a2125 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCleanupTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCleanupTest.java @@ -3,10 +3,8 @@ package art.arcane.iris.engine.mantle; import art.arcane.iris.core.link.Identifier; import art.arcane.iris.engine.framework.TreeBlockMaterial; import art.arcane.iris.engine.hydrology.cave.HydrologyCaveCell; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.project.matter.PreObjectMatterCell; import art.arcane.iris.util.project.matter.TileWrapper; import art.arcane.volmlib.util.mantle.flag.MantleFlag; @@ -15,7 +13,7 @@ import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.matter.MatterCavern; import org.junit.After; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.mockito.InOrder; @@ -27,7 +25,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Answers.CALLS_REAL_METHODS; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -38,20 +35,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class EngineMantleCleanupTest { - @Before - public void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); @After public void unbindPlatform() { - IrisPlatforms.unbind(); MantleSliceRetention.clearForTesting(); } diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCoverageTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCoverageTest.java index 0224f03dd..c26058c40 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCoverageTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleCoverageTest.java @@ -5,12 +5,14 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.mantle.flag.MantleFlag; import art.arcane.volmlib.util.mantle.runtime.Mantle; import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.Matter; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -34,6 +36,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class EngineMantleCoverageTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void bindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleMarkerTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleMarkerTest.java index cedcec4d9..7f9ce00ea 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleMarkerTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/EngineMantleMarkerTest.java @@ -3,24 +3,19 @@ package art.arcane.iris.engine.mantle; import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.framework.EnginePlatformHooks; import art.arcane.iris.engine.object.IrisPosition; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.function.Consumer4; import art.arcane.volmlib.util.mantle.runtime.Mantle; import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.matter.MatterMarker; -import org.junit.After; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Answers.CALLS_REAL_METHODS; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; @@ -28,21 +23,8 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; public class EngineMantleMarkerTest { - @Before - public void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @After - public void unbindPlatform() { - IrisPlatforms.unbind(); - } + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); @Test @SuppressWarnings("unchecked") diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterOverlayTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterOverlayTest.java index 246aea5b6..c88eb0bb1 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterOverlayTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterOverlayTest.java @@ -7,17 +7,15 @@ import art.arcane.iris.engine.history.TransitionGenerationPlan; import art.arcane.iris.engine.hydrology.cave.HydrologyCaveAction; import art.arcane.iris.engine.hydrology.cave.HydrologyCaveCell; import art.arcane.iris.engine.object.IrisDimension; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.mantle.runtime.Mantle; import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.matter.MatterCavern; import art.arcane.volmlib.util.matter.MatterSlice; -import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import static org.junit.Assert.assertFalse; @@ -26,13 +24,15 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MantleWriterOverlayTest { + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); + private static final int X = 1; private static final int Y = 2; private static final int Z = 3; @@ -51,14 +51,6 @@ public class MantleWriterOverlayTest { @Before @SuppressWarnings("unchecked") public void setUp() { - IrisPlatforms.unbind(); - PlatformBlockState defaultBlock = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - IrisPlatform platform = mock(IrisPlatform.class); - when(registries.block(anyString())).thenReturn(defaultBlock); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - engineMantle = mock(EngineMantle.class); Engine engine = mock(Engine.class); dimension = mock(IrisDimension.class); @@ -92,11 +84,6 @@ public class MantleWriterOverlayTest { writer = new MantleWriter(engineMantle, mantle, 0, 0, 0, false); } - @After - public void tearDown() { - IrisPlatforms.unbind(); - } - @Test public void existingCavernStillClearsBlockAndDeferredPlacement() { MatterCavern existing = new MatterCavern(true, "", (byte) 3); diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterPreObjectJournalTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterPreObjectJournalTest.java index 19203cf4b..3c5c2322f 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterPreObjectJournalTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/MantleWriterPreObjectJournalTest.java @@ -7,6 +7,7 @@ import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; import art.arcane.iris.testsupport.BukkitTestServer; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.matter.IrisMatterSupport; import art.arcane.iris.util.project.matter.PreObjectMatterCell; import art.arcane.volmlib.util.mantle.runtime.Mantle; @@ -18,6 +19,7 @@ import art.arcane.volmlib.util.matter.MatterSlice; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.util.concurrent.CountDownLatch; @@ -37,6 +39,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class MantleWriterPreObjectJournalTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final int X = 2; private static final int Y = 5; private static final int Z = 4; diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/MatterGeneratorCarvePassRadiusTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/MatterGeneratorCarvePassRadiusTest.java index 341c50625..af3e61287 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/MatterGeneratorCarvePassRadiusTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/MatterGeneratorCarvePassRadiusTest.java @@ -3,18 +3,14 @@ package art.arcane.iris.engine.mantle; import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.framework.EnginePlatformHooks; import art.arcane.iris.engine.object.IrisDimension; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.project.context.ChunkContext; import art.arcane.volmlib.util.mantle.flag.MantleFlag; import art.arcane.volmlib.util.mantle.flag.ReservedFlag; import art.arcane.volmlib.util.mantle.runtime.Mantle; import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.Matter; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.util.LinkedHashSet; @@ -25,33 +21,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class MatterGeneratorCarvePassRadiusTest { - private static IrisPlatform previousPlatform; + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); - @BeforeClass - public static void bindPlatform() { - previousPlatform = IrisPlatforms.isBound() ? IrisPlatforms.get() : null; - IrisPlatforms.unbind(); - PlatformBlockState air = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - IrisPlatform platform = mock(IrisPlatform.class); - when(registries.block(anyString())).thenReturn(air); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @AfterClass - public static void restorePlatform() { - IrisPlatforms.unbind(); - if (previousPlatform != null) { - IrisPlatforms.bind(previousPlatform); - } - } @Test @SuppressWarnings("unchecked") diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/ResolvedTerrainPlacementTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/ResolvedTerrainPlacementTest.java index b9b3f47fd..c5ecf874e 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/ResolvedTerrainPlacementTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/ResolvedTerrainPlacementTest.java @@ -8,6 +8,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.matter.IrisMatterSupport; import art.arcane.iris.util.project.matter.PreObjectMatterCell; import art.arcane.iris.util.project.matter.slices.PreObjectMatterTest; @@ -17,6 +18,7 @@ import art.arcane.volmlib.util.matter.IrisMatter; import art.arcane.volmlib.util.matter.Matter; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.List; @@ -39,6 +41,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class ResolvedTerrainPlacementTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private EngineMantle engineMantle; private Mantle mantle; private PlatformBlockState stone; diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleCarvingComponentBoundaryRadiusTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleCarvingComponentBoundaryRadiusTest.java index b71601d73..a62d9338f 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleCarvingComponentBoundaryRadiusTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleCarvingComponentBoundaryRadiusTest.java @@ -7,17 +7,13 @@ import art.arcane.iris.engine.mantle.MantlePass; import art.arcane.iris.engine.mantle.EngineMantle; import art.arcane.iris.engine.mantle.MatterGenerator; import art.arcane.iris.engine.object.IrisDimension; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.project.context.ChunkContext; import art.arcane.iris.util.project.stream.ProceduralStream; import art.arcane.volmlib.util.mantle.runtime.Mantle; import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.Matter; -import org.junit.After; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import java.util.ArrayList; @@ -27,7 +23,6 @@ import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -36,21 +31,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MantleCarvingComponentBoundaryRadiusTest { - @Before - public void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @After - public void unbindPlatform() { - IrisPlatforms.unbind(); - } + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); @Test public void boundaryWallResolutionSchedulesAdjacentCarvingChunks() { diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleFloatingObjectComponentBoundaryRadiusTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleFloatingObjectComponentBoundaryRadiusTest.java index ec6b92503..3e4ac3522 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleFloatingObjectComponentBoundaryRadiusTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleFloatingObjectComponentBoundaryRadiusTest.java @@ -28,13 +28,8 @@ import art.arcane.iris.engine.object.IrisFloatingChildBiomes; import art.arcane.iris.engine.object.IrisObject; import art.arcane.iris.engine.object.IrisObjectPlacement; import art.arcane.iris.engine.object.IrisObjectTranslate; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.volmlib.util.collection.KList; -import org.junit.After; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -44,30 +39,16 @@ import java.io.File; import java.io.FileOutputStream; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class MantleFloatingObjectComponentBoundaryRadiusTest { + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); - @Before - public void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @After - public void unbindPlatform() { - IrisPlatforms.unbind(); - } - @Test @SuppressWarnings("unchecked") public void transformedFloatingPlacementExpandsOwnerRadius() throws Exception { diff --git a/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleObjectComponentBoundaryRadiusTest.java b/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleObjectComponentBoundaryRadiusTest.java index 4cf8e9a2e..be7f71765 100644 --- a/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleObjectComponentBoundaryRadiusTest.java +++ b/core/src/test/java/art/arcane/iris/engine/mantle/components/MantleObjectComponentBoundaryRadiusTest.java @@ -28,6 +28,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.math.IrisBlockVector; import art.arcane.iris.util.project.context.ChunkContext; import art.arcane.volmlib.util.collection.KList; @@ -36,6 +37,7 @@ import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.Matter; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -59,6 +61,9 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; public class MantleObjectComponentBoundaryRadiusTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/engine/modifier/IrisCarveModifierInferenceIsolationTest.java b/core/src/test/java/art/arcane/iris/engine/modifier/IrisCarveModifierInferenceIsolationTest.java index 1096c4fbb..e145f8da2 100644 --- a/core/src/test/java/art/arcane/iris/engine/modifier/IrisCarveModifierInferenceIsolationTest.java +++ b/core/src/test/java/art/arcane/iris/engine/modifier/IrisCarveModifierInferenceIsolationTest.java @@ -9,17 +9,13 @@ import art.arcane.iris.engine.object.IrisDimension; import art.arcane.iris.engine.object.IrisDimensionCarvingResolver; import art.arcane.iris.engine.object.IrisRegion; import art.arcane.iris.engine.object.IrisWorld; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; -import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.project.hunk.Hunk; import art.arcane.iris.util.project.stream.ProceduralStream; import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.MatterCavern; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; import java.lang.reflect.Field; @@ -30,27 +26,13 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.mockito.ArgumentMatchers.anyDouble; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.CALLS_REAL_METHODS; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; public class IrisCarveModifierInferenceIsolationTest { - @BeforeClass - public static void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - doReturn(block).when(registries).block(anyString()); - IrisPlatform platform = mock(IrisPlatform.class); - doReturn(registries).when(platform).registries(); - IrisPlatforms.bind(platform); - } - - @AfterClass - public static void unbindPlatform() { - IrisPlatforms.unbind(); - } + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); @Test @SuppressWarnings("unchecked") diff --git a/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierContextTest.java b/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierContextTest.java index ce01209d2..72fcd515d 100644 --- a/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierContextTest.java +++ b/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierContextTest.java @@ -6,10 +6,8 @@ import art.arcane.iris.engine.object.IrisDepositGenerator; import art.arcane.iris.engine.object.IrisDepositHeightDistribution; import art.arcane.iris.engine.object.IrisDepositPlacementScope; import art.arcane.iris.engine.object.IrisObject; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.common.parallel.BurstExecutor; import art.arcane.iris.util.common.parallel.MultiBurst; import art.arcane.iris.util.project.context.ChunkContext; @@ -20,9 +18,8 @@ import art.arcane.volmlib.util.mantle.runtime.Mantle; import art.arcane.volmlib.util.mantle.runtime.MantleChunk; import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.math.RNG; +import org.junit.ClassRule; import org.junit.Test; -import org.junit.AfterClass; -import org.junit.BeforeClass; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -37,7 +34,6 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -49,21 +45,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisDepositModifierContextTest { - @BeforeClass - public static void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - } - - @AfterClass - public static void unbindPlatform() { - IrisPlatforms.unbind(); - } + @ClassRule + public static final PlatformBinding PLATFORM = PlatformBinding.mockPlatform(); @Test public void workerDepositsRetainRuntimeAndChunkContextUntilCompletion() throws Exception { diff --git a/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierOrderingTest.java b/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierOrderingTest.java index c8df9dbf2..0c43ff57a 100644 --- a/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierOrderingTest.java +++ b/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierOrderingTest.java @@ -9,6 +9,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.data.B; import art.arcane.iris.util.common.math.IrisBlockVector; import art.arcane.iris.util.common.parallel.BurstExecutor; @@ -22,6 +23,7 @@ import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.math.RNG; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -48,6 +50,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisDepositModifierOrderingTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void bindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierParityTest.java b/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierParityTest.java index a8ee8762a..6a6a5c31f 100644 --- a/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierParityTest.java +++ b/core/src/test/java/art/arcane/iris/engine/modifier/IrisDepositModifierParityTest.java @@ -13,6 +13,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.data.B; import art.arcane.iris.util.common.parallel.MultiBurst; import art.arcane.iris.util.project.context.ChunkContext; @@ -24,6 +25,7 @@ import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.matter.MatterCavern; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -44,6 +46,9 @@ import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; public class IrisDepositModifierParityTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private final Map states = new HashMap<>(); @Before diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeCompatChildrenTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeCompatChildrenTest.java index f1666a1ae..351267eb9 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeCompatChildrenTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeCompatChildrenTest.java @@ -8,10 +8,10 @@ import art.arcane.iris.core.loader.ResourceLoader; import art.arcane.volmlib.util.collection.KList; import org.junit.Test; -import static art.arcane.iris.engine.object.CompatFixtures.MISSING_BLOCK; -import static art.arcane.iris.engine.object.CompatFixtures.biome; -import static art.arcane.iris.engine.object.CompatFixtures.excludeBlock; -import static art.arcane.iris.engine.object.CompatFixtures.find; +import static art.arcane.iris.engine.object.PackCompatFixtures.MISSING_BLOCK; +import static art.arcane.iris.engine.object.PackCompatFixtures.biome; +import static art.arcane.iris.engine.object.PackCompatFixtures.excludeBlock; +import static art.arcane.iris.engine.object.PackCompatFixtures.find; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -23,7 +23,7 @@ import static org.mockito.Mockito.when; public class IrisBiomeCompatChildrenTest { @SuppressWarnings("unchecked") private static IrisData dataWith(PackCompatReport report, IrisBiome... biomes) { - IrisData data = CompatFixtures.data(report); + IrisData data = PackCompatFixtures.data(report); ResourceLoader biomeLoader = mock(ResourceLoader.class); when(data.getBiomeLoader()).thenReturn(biomeLoader); for (IrisBiome biome : biomes) { diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeDerivativeCompatTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeDerivativeCompatTest.java index 19055378c..33d2fcb00 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeDerivativeCompatTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisBiomeDerivativeCompatTest.java @@ -12,7 +12,7 @@ import static org.junit.Assert.assertEquals; public class IrisBiomeDerivativeCompatTest { @Test public void droppedVanillaDerivativeFallsBackToDerivative() { - IrisBiome biome = CompatFixtures.biome("cave/sulfur-grotto"); + IrisBiome biome = PackCompatFixtures.biome("cave/sulfur-grotto"); biome.setDerivative("minecraft:dripstone_caves"); biome.setVanillaDerivative("minecraft:sulfur_caves"); @@ -25,7 +25,7 @@ public class IrisBiomeDerivativeCompatTest { @Test public void blankVanillaDerivativeFallsBackToDerivative() { - IrisBiome biome = CompatFixtures.biome("cave/sulfur-grotto"); + IrisBiome biome = PackCompatFixtures.biome("cave/sulfur-grotto"); biome.setDerivative("minecraft:dripstone_caves"); biome.setVanillaDerivative(""); diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionCompatRegionTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionCompatRegionTest.java index e9dc36dfe..f9db3b7e1 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionCompatRegionTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionCompatRegionTest.java @@ -12,10 +12,10 @@ import org.junit.Test; import java.util.Map; -import static art.arcane.iris.engine.object.CompatFixtures.MISSING_BLOCK; -import static art.arcane.iris.engine.object.CompatFixtures.excludeBlock; -import static art.arcane.iris.engine.object.CompatFixtures.find; -import static art.arcane.iris.engine.object.CompatFixtures.region; +import static art.arcane.iris.engine.object.PackCompatFixtures.MISSING_BLOCK; +import static art.arcane.iris.engine.object.PackCompatFixtures.excludeBlock; +import static art.arcane.iris.engine.object.PackCompatFixtures.find; +import static art.arcane.iris.engine.object.PackCompatFixtures.region; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -26,7 +26,7 @@ import static org.mockito.Mockito.when; public class IrisDimensionCompatRegionTest { @SuppressWarnings("unchecked") private static IrisData dataWith(PackCompatReport report, IrisRegion... regions) { - IrisData data = CompatFixtures.data(report); + IrisData data = PackCompatFixtures.data(report); ResourceLoader regionLoader = mock(ResourceLoader.class); when(data.getRegionLoader()).thenReturn(regionLoader); for (IrisRegion region : regions) { diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionReachableBiomesTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionReachableBiomesTest.java index 836955f41..243afedf0 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionReachableBiomesTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisDimensionReachableBiomesTest.java @@ -176,7 +176,7 @@ public class IrisDimensionReachableBiomesTest { .setLandBiomes(new KList<>("plains")) .setCaveBiomes(new KList<>("carving/sulfur")); IrisBiome plains = biome("plains"); - IrisBiome sulfur = CompatFixtures.excludeBlock(biome("carving/sulfur")) + IrisBiome sulfur = PackCompatFixtures.excludeBlock(biome("carving/sulfur")) .setChildren(new KList<>("carving/sulfur-hollows")); IrisData data = mock(IrisData.class); diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisLootTableCompatTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisLootTableCompatTest.java index 6212b714f..bc7edcf32 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisLootTableCompatTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisLootTableCompatTest.java @@ -14,8 +14,8 @@ import org.junit.Test; import java.util.List; import java.util.Map; -import static art.arcane.iris.engine.object.CompatFixtures.find; -import static art.arcane.iris.engine.object.CompatFixtures.lootTable; +import static art.arcane.iris.engine.object.PackCompatFixtures.find; +import static art.arcane.iris.engine.object.PackCompatFixtures.lootTable; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -26,7 +26,7 @@ import static org.mockito.Mockito.when; public class IrisLootTableCompatTest { @SuppressWarnings("unchecked") private static IrisData dataWith(PackCompatReport report, IrisLootTable... tables) { - IrisData data = CompatFixtures.data(report); + IrisData data = PackCompatFixtures.data(report); ResourceLoader lootLoader = mock(ResourceLoader.class); when(data.getLootLoader()).thenReturn(lootLoader); for (IrisLootTable table : tables) { @@ -43,7 +43,7 @@ public class IrisLootTableCompatTest { public void evaluateCompatExcludesTableWhoseEntriesWereAllDropped() { PackCompatReport report = new PackCompatReport(); IrisLootTable table = lootTable("chest/sulfur-cache"); - table.setLoader(CompatFixtures.data(report)); + table.setLoader(PackCompatFixtures.data(report)); // The gate walker drops every entry with a missing item and hands the cascade its reasons. CompatStatus walked = new CompatStatus(false, List.of(new CompatFinding(CompatRegistry.ITEM, "minecraft:sulfur_dust", CompatAction.DROPPED, "loot", "chest/sulfur-cache", "loot[0]"))); @@ -62,7 +62,7 @@ public class IrisLootTableCompatTest { public void evaluateCompatKeepsTableWithSurvivingEntries() { PackCompatReport report = new PackCompatReport(); IrisLootTable table = lootTable("chest/mixed"); - table.setLoader(CompatFixtures.data(report)); + table.setLoader(PackCompatFixtures.data(report)); table.setLoot(new KList<>(new IrisLoot())); CompatStatus walked = new CompatStatus(false, List.of(new CompatFinding(CompatRegistry.ITEM, "minecraft:sulfur_dust", CompatAction.DROPPED, "loot", "chest/mixed", "loot[1]"))); @@ -74,7 +74,7 @@ public class IrisLootTableCompatTest { public void evaluateCompatKeepsTableThatNeverDeclaredLoot() { PackCompatReport report = new PackCompatReport(); IrisLootTable table = lootTable("chest/empty"); - table.setLoader(CompatFixtures.data(report)); + table.setLoader(PackCompatFixtures.data(report)); assertFalse(table.evaluateCompat(gate(report)).excluded()); assertTrue(report.isEmpty()); @@ -84,7 +84,7 @@ public class IrisLootTableCompatTest { public void lootReferenceSkipsExcludedAndUnloadableTables() { PackCompatReport report = new PackCompatReport(); IrisLootTable kept = lootTable("chest/common"); - IrisLootTable excluded = CompatFixtures.exclude(lootTable("chest/sulfur-cache"), + IrisLootTable excluded = PackCompatFixtures.exclude(lootTable("chest/sulfur-cache"), CompatRegistry.ITEM, "minecraft:sulfur_dust"); IrisData data = dataWith(report, kept, excluded); IrisLootReference reference = new IrisLootReference() diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectPlacementRunnerRegressionTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectPlacementRunnerRegressionTest.java index bc0a095ba..1dc1ba59c 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectPlacementRunnerRegressionTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectPlacementRunnerRegressionTest.java @@ -7,6 +7,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.math.RNG; @@ -15,6 +16,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.data.Directional; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -40,6 +42,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisObjectPlacementRunnerRegressionTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final int ANCHOR_Y = 80; private IrisData data; diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectShapingTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectShapingTest.java index 75fe7c94c..456e3fe2a 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectShapingTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectShapingTest.java @@ -4,9 +4,11 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.math.IrisBlockVector; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -23,6 +25,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class IrisObjectShapingTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void bindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectSurfaceSupportPlacementTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectSurfaceSupportPlacementTest.java index fa2dca7b5..1b9c5e166 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectSurfaceSupportPlacementTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectSurfaceSupportPlacementTest.java @@ -3,14 +3,12 @@ package art.arcane.iris.engine.object; import art.arcane.iris.core.loader.IrisData; import art.arcane.iris.engine.IrisComplex; import art.arcane.iris.engine.framework.Engine; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.project.stream.ProceduralStream; import art.arcane.volmlib.util.math.RNG; -import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import java.util.HashMap; @@ -23,13 +21,15 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyDouble; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class IrisObjectSurfaceSupportPlacementTest { + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); + private static final int SURFACE_Y = 80; private IrisData data; @@ -38,14 +38,6 @@ public class IrisObjectSurfaceSupportPlacementTest { @Before public void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - @SuppressWarnings("unchecked") ProceduralStream heightStream = mock(ProceduralStream.class); when(heightStream.get(anyDouble(), anyDouble())).thenReturn((double) SURFACE_Y); @@ -59,11 +51,6 @@ public class IrisObjectSurfaceSupportPlacementTest { when(data.getEngine()).thenReturn(engine); } - @After - public void unbindPlatform() { - IrisPlatforms.unbind(); - } - @Test public void carvedAnchorColumnSkipsEverySurfaceAnchoredMode() { for (ObjectPlaceMode mode : new ObjectPlaceMode[]{ diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectTransformsTileTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectTransformsTileTest.java index 01d21393e..00e543bf8 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectTransformsTileTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectTransformsTileTest.java @@ -4,11 +4,13 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.math.IrisBlockVector; import art.arcane.iris.util.common.math.Vector3i; import art.arcane.volmlib.util.collection.KMap; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.Collections; @@ -30,6 +32,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class IrisObjectTransformsTileTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void bindPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisRegionCompatPoolTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisRegionCompatPoolTest.java index e659ed70e..ab8499081 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisRegionCompatPoolTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisRegionCompatPoolTest.java @@ -13,10 +13,10 @@ import org.junit.Test; import java.util.Map; -import static art.arcane.iris.engine.object.CompatFixtures.MISSING_BLOCK; -import static art.arcane.iris.engine.object.CompatFixtures.biome; -import static art.arcane.iris.engine.object.CompatFixtures.excludeBlock; -import static art.arcane.iris.engine.object.CompatFixtures.find; +import static art.arcane.iris.engine.object.PackCompatFixtures.MISSING_BLOCK; +import static art.arcane.iris.engine.object.PackCompatFixtures.biome; +import static art.arcane.iris.engine.object.PackCompatFixtures.excludeBlock; +import static art.arcane.iris.engine.object.PackCompatFixtures.find; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -27,7 +27,7 @@ import static org.mockito.Mockito.when; public class IrisRegionCompatPoolTest { @SuppressWarnings("unchecked") private static IrisData dataWith(PackCompatReport report, IrisBiome... biomes) { - IrisData data = CompatFixtures.data(report); + IrisData data = PackCompatFixtures.data(report); ResourceLoader biomeLoader = mock(ResourceLoader.class); when(data.getBiomeLoader()).thenReturn(biomeLoader); for (IrisBiome biome : biomes) { @@ -46,7 +46,7 @@ public class IrisRegionCompatPoolTest { IrisBiome plains = biome("land/plains"); IrisBiome sulfur = excludeBlock(biome("cave/sulfur-grotto")); IrisData data = dataWith(report, plains, sulfur); - IrisRegion region = CompatFixtures.region("overworld"); + IrisRegion region = PackCompatFixtures.region("overworld"); region.setLoader(data); region.setLandBiomes(new KList<>("land/plains", "cave/sulfur-grotto")); @@ -66,7 +66,7 @@ public class IrisRegionCompatPoolTest { PackCompatReport report = new PackCompatReport(); IrisBiome shore = biome("shore/sand"); IrisData data = dataWith(report, shore); - IrisRegion region = CompatFixtures.region("overworld"); + IrisRegion region = PackCompatFixtures.region("overworld"); region.setLoader(data); region.setSeaBiomes(new KList<>("sea/gone")); region.setShoreBiomes(new KList<>("shore/sand")); @@ -86,7 +86,7 @@ public class IrisRegionCompatPoolTest { sulfur.setChildren(new KList<>("cave/sulfur-deep")); IrisBiome sulfurDeep = biome("cave/sulfur-deep"); IrisData data = dataWith(report, plains, sulfur, sulfurDeep); - IrisRegion region = CompatFixtures.region("overworld"); + IrisRegion region = PackCompatFixtures.region("overworld"); region.setLoader(data); region.setLandBiomes(new KList<>("land/plains")); region.setCaveBiomes(new KList<>("cave/sulfur-grotto")); @@ -102,7 +102,7 @@ public class IrisRegionCompatPoolTest { PackCompatReport report = new PackCompatReport(); IrisBiome sulfur = excludeBlock(biome("cave/sulfur-flats")); IrisData data = dataWith(report, sulfur); - IrisRegion region = CompatFixtures.region("sulfur-lands"); + IrisRegion region = PackCompatFixtures.region("sulfur-lands"); region.setLoader(data); region.setLandBiomes(new KList<>("cave/sulfur-flats")); @@ -122,7 +122,7 @@ public class IrisRegionCompatPoolTest { IrisBiome plains = biome("land/plains"); IrisBiome sulfur = excludeBlock(biome("cave/sulfur-flats")); IrisData data = dataWith(report, plains, sulfur); - IrisRegion region = CompatFixtures.region("overworld"); + IrisRegion region = PackCompatFixtures.region("overworld"); region.setLoader(data); region.setLandBiomes(new KList<>("land/plains", "cave/sulfur-flats")); @@ -133,7 +133,7 @@ public class IrisRegionCompatPoolTest { public void evaluateCompatDoesNotExcludeRegionThatNeverDeclaredLandBiomes() { PackCompatReport report = new PackCompatReport(); IrisData data = dataWith(report); - IrisRegion region = CompatFixtures.region("empty"); + IrisRegion region = PackCompatFixtures.region("empty"); region.setLoader(data); assertFalse(region.evaluateCompat(gate(report)).excluded()); diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisSpawnerCompatTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisSpawnerCompatTest.java index 5d73e237f..d5dc42e95 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisSpawnerCompatTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisSpawnerCompatTest.java @@ -14,10 +14,10 @@ import org.junit.Test; import java.util.Map; -import static art.arcane.iris.engine.object.CompatFixtures.MISSING_ENTITY; -import static art.arcane.iris.engine.object.CompatFixtures.entity; -import static art.arcane.iris.engine.object.CompatFixtures.excludeEntity; -import static art.arcane.iris.engine.object.CompatFixtures.find; +import static art.arcane.iris.engine.object.PackCompatFixtures.MISSING_ENTITY; +import static art.arcane.iris.engine.object.PackCompatFixtures.entity; +import static art.arcane.iris.engine.object.PackCompatFixtures.excludeEntity; +import static art.arcane.iris.engine.object.PackCompatFixtures.find; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -30,7 +30,7 @@ import static org.mockito.Mockito.when; public class IrisSpawnerCompatTest { @SuppressWarnings("unchecked") private static IrisData dataWith(PackCompatReport report, IrisEntity... entities) { - IrisData data = CompatFixtures.data(report); + IrisData data = PackCompatFixtures.data(report); ResourceLoader entityLoader = mock(ResourceLoader.class); when(data.getEntityLoader()).thenReturn(entityLoader); for (IrisEntity entity : entities) { diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisStaticObjectLayerTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisStaticObjectLayerTest.java index a9920e649..89e2e6497 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisStaticObjectLayerTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisStaticObjectLayerTest.java @@ -8,6 +8,7 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.math.IrisBlockVector; import art.arcane.iris.util.project.hunk.Hunk; import art.arcane.iris.util.project.matter.TileWrapper; @@ -19,6 +20,7 @@ import art.arcane.volmlib.util.matter.Matter; import art.arcane.volmlib.util.matter.MatterSlice; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.HashMap; @@ -40,6 +42,9 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; public class IrisStaticObjectLayerTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private final Map states = new HashMap<>(); private IrisData data; private ResourceLoader loader; diff --git a/core/src/test/java/art/arcane/iris/engine/object/NativeStructureObjectVetoTest.java b/core/src/test/java/art/arcane/iris/engine/object/NativeStructureObjectVetoTest.java index 368f731f4..9516d6306 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/NativeStructureObjectVetoTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/NativeStructureObjectVetoTest.java @@ -4,16 +4,14 @@ import art.arcane.iris.core.loader.IrisData; import art.arcane.iris.engine.IrisComplex; import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.framework.NativeStructureVolume; -import art.arcane.iris.spi.IrisPlatform; -import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; -import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformBinding; import art.arcane.iris.util.common.math.Vector3i; import art.arcane.iris.util.project.stream.ProceduralStream; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.math.RNG; -import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import java.util.ArrayList; @@ -23,11 +21,13 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class NativeStructureObjectVetoTest { + @Rule + public final PlatformBinding platform = PlatformBinding.mockPlatform(); + private static final int SURFACE_Y = 80; private IrisData data; @@ -36,14 +36,6 @@ public class NativeStructureObjectVetoTest { @Before public void bindPlatform() { - IrisPlatforms.unbind(); - PlatformBlockState block = mock(PlatformBlockState.class); - PlatformRegistries registries = mock(PlatformRegistries.class); - when(registries.block(anyString())).thenReturn(block); - IrisPlatform platform = mock(IrisPlatform.class); - when(platform.registries()).thenReturn(registries); - IrisPlatforms.bind(platform); - log = state("minecraft:oak_log", true); @SuppressWarnings("unchecked") ProceduralStream heightStream = mock(ProceduralStream.class); @@ -58,11 +50,6 @@ public class NativeStructureObjectVetoTest { when(data.getEngine()).thenReturn(engine); } - @After - public void unbindPlatform() { - IrisPlatforms.unbind(); - } - @Test public void objectPlacesWhenNoNativeStructureIsNear() { RecordingPlacer placer = new RecordingPlacer(engine); diff --git a/core/src/test/java/art/arcane/iris/engine/object/PackCompatFixtures.java b/core/src/test/java/art/arcane/iris/engine/object/PackCompatFixtures.java index d652bffe1..197a57553 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/PackCompatFixtures.java +++ b/core/src/test/java/art/arcane/iris/engine/object/PackCompatFixtures.java @@ -17,11 +17,11 @@ import static org.mockito.Mockito.when; * Shared fixtures for the version-content pool cascade tests. The gate walker (lane L1) is not exercised here: the * tests stamp {@code compat} on a registrant directly, which is exactly what the walker stores. */ -final class CompatFixtures { +final class PackCompatFixtures { static final String MISSING_BLOCK = "minecraft:sulfur"; static final String MISSING_ENTITY = "minecraft:camel"; - private CompatFixtures() { + private PackCompatFixtures() { } static IrisData data(PackCompatReport report) { diff --git a/core/src/test/java/art/arcane/iris/engine/platform/EngineBukkitOpsDeferredMaterializationTest.java b/core/src/test/java/art/arcane/iris/engine/platform/EngineBukkitOpsDeferredMaterializationTest.java index 4c31403d5..09f6739f6 100644 --- a/core/src/test/java/art/arcane/iris/engine/platform/EngineBukkitOpsDeferredMaterializationTest.java +++ b/core/src/test/java/art/arcane/iris/engine/platform/EngineBukkitOpsDeferredMaterializationTest.java @@ -13,6 +13,7 @@ import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.IrisServices; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.common.scheduling.J; import art.arcane.iris.util.project.matter.TileWrapper; import art.arcane.iris.util.project.matter.slices.PreObjectMatterTest; @@ -30,6 +31,7 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.InOrder; import org.mockito.MockedStatic; @@ -59,6 +61,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class EngineBukkitOpsDeferredMaterializationTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test @SuppressWarnings("unchecked") public void savedMantlePlacementUsesCurrentProviderWithoutReadingCurrentMantle() { diff --git a/core/src/test/java/art/arcane/iris/spi/IrisLoggingTest.java b/core/src/test/java/art/arcane/iris/spi/IrisLoggingTest.java index 2e0bc1e0f..fb68e4b02 100644 --- a/core/src/test/java/art/arcane/iris/spi/IrisLoggingTest.java +++ b/core/src/test/java/art/arcane/iris/spi/IrisLoggingTest.java @@ -1,7 +1,9 @@ package art.arcane.iris.spi; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import java.util.ArrayList; @@ -24,6 +26,9 @@ import static org.mockito.Mockito.verify; * exactly one warning and would otherwise repeat per block, per sample or per chunk. */ public class IrisLoggingTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private final List levels = new ArrayList<>(); private final List messages = new ArrayList<>(); private IrisPlatform capturingPlatform; diff --git a/core/src/test/java/art/arcane/iris/spi/IrisPlatformsBindLifecycleTest.java b/core/src/test/java/art/arcane/iris/spi/IrisPlatformsBindLifecycleTest.java index 3daf3fdc5..e6ce100f0 100644 --- a/core/src/test/java/art/arcane/iris/spi/IrisPlatformsBindLifecycleTest.java +++ b/core/src/test/java/art/arcane/iris/spi/IrisPlatformsBindLifecycleTest.java @@ -1,7 +1,9 @@ package art.arcane.iris.spi; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.assertFalse; @@ -10,6 +12,9 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; public class IrisPlatformsBindLifecycleTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void resetBinding() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/spi/IrisServicesTest.java b/core/src/test/java/art/arcane/iris/spi/IrisServicesTest.java index 735e24eba..96d9fabab 100644 --- a/core/src/test/java/art/arcane/iris/spi/IrisServicesTest.java +++ b/core/src/test/java/art/arcane/iris/spi/IrisServicesTest.java @@ -18,12 +18,17 @@ package art.arcane.iris.spi; +import art.arcane.iris.testsupport.PlatformLeakGuard; +import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; public class IrisServicesTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void removeThenReregisterRebindsService() { Sample first = new Sample(); diff --git a/core/src/test/java/art/arcane/iris/testsupport/BukkitTestServer.java b/core/src/test/java/art/arcane/iris/testsupport/BukkitTestServer.java index 1bc432f93..471b3f27f 100644 --- a/core/src/test/java/art/arcane/iris/testsupport/BukkitTestServer.java +++ b/core/src/test/java/art/arcane/iris/testsupport/BukkitTestServer.java @@ -5,6 +5,9 @@ import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.block.data.BlockData; import org.bukkit.plugin.PluginManager; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; import org.mockito.invocation.InvocationOnMock; import java.util.Locale; @@ -18,6 +21,8 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; public final class BukkitTestServer { + private static final String DEFAULT_NAME = "IrisTestServer"; + private static final String DEFAULT_VERSION = "1.0"; private static final Object LOCK = new Object(); private static volatile Server installed; @@ -46,9 +51,7 @@ public final class BukkitTestServer { Server server = mock(Server.class); doReturn(Logger.getLogger("IrisTest")).when(server).getLogger(); doReturn(mock(PluginManager.class)).when(server).getPluginManager(); - doReturn("IrisTestServer").when(server).getName(); - doReturn("1.0").when(server).getVersion(); - doReturn("1.0").when(server).getBukkitVersion(); + applyBranding(server, DEFAULT_NAME, DEFAULT_VERSION); doAnswer((InvocationOnMock invocation) -> blockData(invocation.getArgument(0, Material.class).name().toLowerCase(Locale.ROOT))) .when(server).createBlockData(any(Material.class)); doAnswer((InvocationOnMock invocation) -> blockData(invocation.getArgument(0, String.class))) @@ -67,13 +70,51 @@ public final class BukkitTestServer { } } - public static void brand(String name, String version) { - Server server = install(); + public static ServerBranding branding() { + return new ServerBranding(); + } + + private static void applyBranding(Server server, String name, String version) { doReturn(name).when(server).getName(); doReturn(version).when(server).getVersion(); doReturn(version).when(server).getBukkitVersion(); } + public static final class ServerBranding implements TestRule { + private boolean applied; + + private ServerBranding() { + } + + public void set(String name, String version) { + applyBranding(install(), name, version); + applied = true; + } + + @Override + public Statement apply(Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + try { + base.evaluate(); + } finally { + restore(); + } + } + }; + } + + private void restore() { + if (!applied) { + return; + } + + applied = false; + applyBranding(install(), DEFAULT_NAME, DEFAULT_VERSION); + } + } + public static BlockData blockData(String key) { String canonical = key.indexOf(':') >= 0 ? key : "minecraft:" + key; BlockData data = mock(BlockData.class); diff --git a/core/src/test/java/art/arcane/iris/testsupport/IrisRuntimeState.java b/core/src/test/java/art/arcane/iris/testsupport/IrisRuntimeState.java new file mode 100644 index 000000000..ad5a7948d --- /dev/null +++ b/core/src/test/java/art/arcane/iris/testsupport/IrisRuntimeState.java @@ -0,0 +1,52 @@ +package art.arcane.iris.testsupport; + +import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.spi.IrisServices; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; + +public final class IrisRuntimeState { + private static final Map, Object> SERVICES = services(); + + private IrisRuntimeState() { + } + + public static boolean platformBound() { + return IrisPlatforms.isBound(); + } + + public static List registeredServices() { + TreeSet names = new TreeSet<>(); + + for (Class type : SERVICES.keySet()) { + names.add(type.getName()); + } + + return Collections.unmodifiableList(new ArrayList<>(names)); + } + + public static void reset() { + IrisPlatforms.unbind(); + IrisServices.clear(); + } + + private static Map, Object> services() { + try { + Field field = IrisServices.class.getDeclaredField("SERVICES"); + field.setAccessible(true); + return castServices(field.get(null)); + } catch (ReflectiveOperationException e) { + throw new IllegalStateException("IrisServices no longer exposes its backing map to the test guard", e); + } + } + + @SuppressWarnings("unchecked") + private static Map, Object> castServices(Object value) { + return (Map, Object>) value; + } +} diff --git a/core/src/test/java/art/arcane/iris/testsupport/PlatformBinding.java b/core/src/test/java/art/arcane/iris/testsupport/PlatformBinding.java new file mode 100644 index 000000000..711ca4408 --- /dev/null +++ b/core/src/test/java/art/arcane/iris/testsupport/PlatformBinding.java @@ -0,0 +1,99 @@ +package art.arcane.iris.testsupport; + +import art.arcane.iris.spi.IrisPlatform; +import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.spi.PlatformBlockState; +import art.arcane.iris.spi.PlatformRegistries; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import java.util.function.Supplier; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public final class PlatformBinding implements TestRule { + private final Supplier factory; + private IrisPlatform platform; + private PlatformRegistries registries; + private PlatformBlockState block; + + private PlatformBinding(Supplier factory) { + this.factory = factory; + } + + public static PlatformBinding mockPlatform() { + return new PlatformBinding(null); + } + + public static PlatformBinding of(Supplier factory) { + if (factory == null) { + throw new IllegalArgumentException("A platform factory is required"); + } + + return new PlatformBinding(factory); + } + + public IrisPlatform platform() { + if (platform == null) { + throw new IllegalStateException("The platform binding rule is not active"); + } + + return platform; + } + + public PlatformRegistries registries() { + if (registries == null) { + registries = platform().registries(); + } + + return registries; + } + + public PlatformBlockState block() { + if (block == null) { + block = registries().block("minecraft:stone"); + } + + return block; + } + + @Override + public Statement apply(Statement base, Description description) { + String scope = description.getDisplayName(); + + return new Statement() { + @Override + public void evaluate() throws Throwable { + PlatformLeakGuard.requireClean(scope, "start"); + bind(); + + try { + base.evaluate(); + } finally { + IrisPlatforms.unbind(); + platform = null; + registries = null; + block = null; + PlatformLeakGuard.requireClean(scope, "end"); + } + } + }; + } + + private void bind() { + if (factory == null) { + block = mock(PlatformBlockState.class); + registries = mock(PlatformRegistries.class); + when(registries.block(anyString())).thenReturn(block); + platform = mock(IrisPlatform.class); + when(platform.registries()).thenReturn(registries); + } else { + platform = factory.get(); + } + + IrisPlatforms.bind(platform); + } +} diff --git a/core/src/test/java/art/arcane/iris/testsupport/PlatformLeakGuard.java b/core/src/test/java/art/arcane/iris/testsupport/PlatformLeakGuard.java new file mode 100644 index 000000000..c27a5f76c --- /dev/null +++ b/core/src/test/java/art/arcane/iris/testsupport/PlatformLeakGuard.java @@ -0,0 +1,64 @@ +package art.arcane.iris.testsupport; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import java.util.List; + +public final class PlatformLeakGuard implements TestRule { + private PlatformLeakGuard() { + } + + public static PlatformLeakGuard clean() { + return new PlatformLeakGuard(); + } + + public static void requireClean(String scope, String phase) { + boolean bound = IrisRuntimeState.platformBound(); + List services = IrisRuntimeState.registeredServices(); + + if (!bound && services.isEmpty()) { + return; + } + + IrisRuntimeState.reset(); + throw new AssertionError(describe(scope, phase, bound, services)); + } + + @Override + public Statement apply(Statement base, Description description) { + String scope = description.getDisplayName(); + + return new Statement() { + @Override + public void evaluate() throws Throwable { + requireClean(scope, "start"); + + try { + base.evaluate(); + } finally { + requireClean(scope, "end"); + } + } + }; + } + + private static String describe(String scope, String phase, boolean bound, List services) { + StringBuilder message = new StringBuilder("Iris runtime state is dirty at ") + .append(phase) + .append(" of ") + .append(scope) + .append(':'); + + if (bound) { + message.append(" platform still bound;"); + } + + if (!services.isEmpty()) { + message.append(" services still registered ").append(services).append(';'); + } + + return message.toString(); + } +} diff --git a/core/src/test/java/art/arcane/iris/util/common/data/PlatformStateRebindTest.java b/core/src/test/java/art/arcane/iris/util/common/data/PlatformStateRebindTest.java index 42d7a216a..79acb8d45 100644 --- a/core/src/test/java/art/arcane/iris/util/common/data/PlatformStateRebindTest.java +++ b/core/src/test/java/art/arcane/iris/util/common/data/PlatformStateRebindTest.java @@ -5,9 +5,11 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformRegistries; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.hunk.view.ChunkDataHunkHolder; import org.bukkit.generator.ChunkGenerator; import org.junit.After; +import org.junit.ClassRule; import org.junit.Test; import java.lang.reflect.Field; @@ -24,6 +26,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class PlatformStateRebindTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + private static final List CONVERTED = List.of( "art.arcane.iris.engine.actuator.IrisDimensionStackActuator", "art.arcane.iris.engine.actuator.IrisTerrainNormalActuator", diff --git a/core/src/test/java/art/arcane/iris/util/common/director/DirectorAuthoringDataTest.java b/core/src/test/java/art/arcane/iris/util/common/director/DirectorAuthoringDataTest.java index bf00429cd..460293953 100644 --- a/core/src/test/java/art/arcane/iris/util/common/director/DirectorAuthoringDataTest.java +++ b/core/src/test/java/art/arcane/iris/util/common/director/DirectorAuthoringDataTest.java @@ -6,6 +6,8 @@ import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.object.IrisDimension; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -28,6 +30,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class DirectorAuthoringDataTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public final TemporaryFolder temporary = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java b/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java index c74a36807..17d2b837b 100644 --- a/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java +++ b/core/src/test/java/art/arcane/iris/util/common/director/specialhandlers/StructureHandlerTest.java @@ -17,8 +17,10 @@ import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformStructureHooks; import art.arcane.iris.spi.PlatformWorld; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.director.exceptions.DirectorParsingException; +import org.junit.ClassRule; import org.junit.Test; import java.util.LinkedHashSet; @@ -36,6 +38,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class StructureHandlerTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void registeredEligibilityMatchesFindExecutionTruthTable() { IrisNativeStructureDecision replacement = decision(NativeStructureGenerationStatus.REPLACED_BY_IRIS); diff --git a/core/src/test/java/art/arcane/iris/util/common/misc/WebCacheTest.java b/core/src/test/java/art/arcane/iris/util/common/misc/WebCacheTest.java index ab243ae9f..94b4b2bcb 100644 --- a/core/src/test/java/art/arcane/iris/util/common/misc/WebCacheTest.java +++ b/core/src/test/java/art/arcane/iris/util/common/misc/WebCacheTest.java @@ -2,11 +2,13 @@ package art.arcane.iris.util.common.misc; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.volmlib.util.io.IO; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -34,6 +36,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class WebCacheTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Rule public TemporaryFolder temp = new TemporaryFolder(); diff --git a/core/src/test/java/art/arcane/iris/util/common/scheduling/JHybridPlatformTest.java b/core/src/test/java/art/arcane/iris/util/common/scheduling/JHybridPlatformTest.java index 6d97dfe0d..795f67b0a 100644 --- a/core/src/test/java/art/arcane/iris/util/common/scheduling/JHybridPlatformTest.java +++ b/core/src/test/java/art/arcane/iris/util/common/scheduling/JHybridPlatformTest.java @@ -3,8 +3,10 @@ package art.arcane.iris.util.common.scheduling; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformScheduler; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.junit.After; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.assertNotEquals; @@ -17,6 +19,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class JHybridPlatformTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Before public void clearPlatform() { IrisPlatforms.unbind(); diff --git a/core/src/test/java/art/arcane/iris/util/project/context/ChunkContextPrefillPlanTest.java b/core/src/test/java/art/arcane/iris/util/project/context/ChunkContextPrefillPlanTest.java index a2eb3aea0..2cb834bc8 100644 --- a/core/src/test/java/art/arcane/iris/util/project/context/ChunkContextPrefillPlanTest.java +++ b/core/src/test/java/art/arcane/iris/util/project/context/ChunkContextPrefillPlanTest.java @@ -5,8 +5,10 @@ import art.arcane.iris.engine.hydrology.runtime.IrisHydrologyRuntime; import art.arcane.iris.engine.object.IrisBiome; import art.arcane.iris.engine.object.IrisRegion; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; import art.arcane.iris.util.project.stream.ProceduralStream; import org.bukkit.block.data.BlockData; +import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; @@ -29,6 +31,9 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; public class ChunkContextPrefillPlanTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void noCavePrefillSkipsCaveCacheFill() { AtomicInteger caveCalls = new AtomicInteger(); diff --git a/core/src/test/java/art/arcane/iris/util/project/matter/slices/IrisMatterPlatformSelectionTest.java b/core/src/test/java/art/arcane/iris/util/project/matter/slices/IrisMatterPlatformSelectionTest.java index 0b1323d0c..5e4964ebb 100644 --- a/core/src/test/java/art/arcane/iris/util/project/matter/slices/IrisMatterPlatformSelectionTest.java +++ b/core/src/test/java/art/arcane/iris/util/project/matter/slices/IrisMatterPlatformSelectionTest.java @@ -2,7 +2,9 @@ package art.arcane.iris.util.project.matter.slices; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.IrisPlatforms; +import art.arcane.iris.testsupport.PlatformLeakGuard; import org.bukkit.World; +import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.assertNotNull; @@ -11,6 +13,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class IrisMatterPlatformSelectionTest { + @ClassRule + public static final PlatformLeakGuard PLATFORM_GUARD = PlatformLeakGuard.clean(); + @Test public void hybridClasspathDoesNotEnableBukkitMatterIoForModdedPlatform() { IrisPlatform platform = mock(IrisPlatform.class);