diff --git a/src/test/java/net/minestom/server/notifications/NotificationIntegrationTest.java b/src/test/java/net/minestom/server/notifications/NotificationIntegrationTest.java index d7bd61093c2..c1f5ac3136a 100644 --- a/src/test/java/net/minestom/server/notifications/NotificationIntegrationTest.java +++ b/src/test/java/net/minestom/server/notifications/NotificationIntegrationTest.java @@ -8,18 +8,18 @@ import net.minestom.server.network.packet.server.play.AdvancementsPacket; import net.minestom.testing.Collector; import net.minestom.testing.Env; -import net.minestom.testing.EnvTest; +import net.minestom.testing.annotations.EnvironmentTest; import org.junit.jupiter.api.Test; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; -@EnvTest +@EnvironmentTest class NotificationIntegrationTest { @Test - void testBuilder(Env env) { + void testBuilder() { var notification = Notification.builder() .icon(Material.ITEM_FRAME) .title(Component.text("unit test")) diff --git a/testing/src/main/java/net/minestom/testing/Env.java b/testing/src/main/java/net/minestom/testing/Env.java index 23f26476783..d89cd42f381 100644 --- a/testing/src/main/java/net/minestom/testing/Env.java +++ b/testing/src/main/java/net/minestom/testing/Env.java @@ -56,4 +56,14 @@ default boolean tickWhile(BooleanSupplier condition, Duration timeout) { default void destroyInstance(Instance instance) { process().instance().unregisterInstance(instance); } + + /** + * Cleanup the test environment + * @since 1.4.1 + */ + void cleanup(); + + static Env createInstance(ServerProcess process) { + return new EnvImpl(process); + } } diff --git a/testing/src/main/java/net/minestom/testing/EnvImpl.java b/testing/src/main/java/net/minestom/testing/EnvImpl.java index 50c993f8f22..ca45480d762 100644 --- a/testing/src/main/java/net/minestom/testing/EnvImpl.java +++ b/testing/src/main/java/net/minestom/testing/EnvImpl.java @@ -48,7 +48,8 @@ public EnvImpl(ServerProcess process) { return flexible; } - void cleanup() { + @Override + public void cleanup() { this.listeners.forEach(FlexibleListenerImpl::check); } diff --git a/testing/src/main/java/net/minestom/testing/EnvTest.java b/testing/src/main/java/net/minestom/testing/EnvTest.java index cff8f74cfe1..bdc9d4f49a0 100644 --- a/testing/src/main/java/net/minestom/testing/EnvTest.java +++ b/testing/src/main/java/net/minestom/testing/EnvTest.java @@ -10,11 +10,15 @@ import java.lang.annotation.Target; import java.lang.reflect.Method; +/** + * @deprecated As of Microtus 1.4.2, because this version don't support Non Env tests and env tests at the same time use {@link net.minestom.testing.annotations.EnvironmentTest} instead. + */ @ExtendWith(EnvTest.EnvParameterResolver.class) @ExtendWith(EnvTest.EnvBefore.class) @ExtendWith(EnvTest.EnvCleaner.class) @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Deprecated(since = "1.4.2", forRemoval = true) public @interface EnvTest { final class EnvBefore implements BeforeEachCallback { diff --git a/testing/src/main/java/net/minestom/testing/annotations/EnvironmentTest.java b/testing/src/main/java/net/minestom/testing/annotations/EnvironmentTest.java new file mode 100644 index 00000000000..954d2aa2719 --- /dev/null +++ b/testing/src/main/java/net/minestom/testing/annotations/EnvironmentTest.java @@ -0,0 +1,21 @@ +package net.minestom.testing.annotations; + +import net.minestom.testing.environment.TestEnvironmentCleaner; +import net.minestom.testing.environment.TestEnvironmentParameterResolver; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Creates a fake environment for Microtus + * @since 1.4.2 + */ +@ExtendWith(TestEnvironmentCleaner.class) +@ExtendWith(TestEnvironmentParameterResolver.class) +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface EnvironmentTest { +} diff --git a/testing/src/main/java/net/minestom/testing/environment/TestEnvironmentCleaner.java b/testing/src/main/java/net/minestom/testing/environment/TestEnvironmentCleaner.java new file mode 100644 index 00000000000..6b354229791 --- /dev/null +++ b/testing/src/main/java/net/minestom/testing/environment/TestEnvironmentCleaner.java @@ -0,0 +1,25 @@ +package net.minestom.testing.environment; + +import net.minestom.testing.Env; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.InvocationInterceptor; +import org.junit.jupiter.api.extension.ReflectiveInvocationContext; + +import java.lang.reflect.Method; +import java.util.List; + +/** + * Handles {@link Env} to clean the Test Environment after usage + * @since 1.4.2 + */ +public final class TestEnvironmentCleaner implements InvocationInterceptor { + @Override + public void interceptTestMethod(Invocation invocation, ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext) throws Throwable { + invocation.proceed(); + List arguments = invocationContext.getArguments(); + arguments.stream().filter(Env.class::isInstance).findFirst().ifPresent(o -> { + Env env = (Env) o; + env.cleanup(); + }); + } +} diff --git a/testing/src/main/java/net/minestom/testing/environment/TestEnvironmentParameterResolver.java b/testing/src/main/java/net/minestom/testing/environment/TestEnvironmentParameterResolver.java new file mode 100644 index 00000000000..77f023b7268 --- /dev/null +++ b/testing/src/main/java/net/minestom/testing/environment/TestEnvironmentParameterResolver.java @@ -0,0 +1,20 @@ +package net.minestom.testing.environment; + +import net.minestom.server.MinecraftServer; +import net.minestom.testing.Env; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.support.TypeBasedParameterResolver; + +/** + * Handles {@link Env} parameter for JUnit Tests to inject the TestEnvironment + * @since 1.4.1 + */ +public final class TestEnvironmentParameterResolver extends TypeBasedParameterResolver { + @Override + public Env resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return Env.createInstance(MinecraftServer.updateProcess()); + } +}