diff --git a/settings.gradle.kts b/settings.gradle.kts index f1acca5..094a123 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,7 @@ dependencyResolutionManagement { versionCatalogs { create("libs") { - version("minestom", "2026.05.11-1.21.11") + version("minestom", "2026.05.17-1.21.11") version("junit", "6.0.3") library("minestom","net.minestom", "minestom").versionRef("minestom") diff --git a/src/main/java/net/minestom/testing/Collector.java b/src/main/java/net/minestom/testing/Collector.java index 694c204..d1b720b 100644 --- a/src/main/java/net/minestom/testing/Collector.java +++ b/src/main/java/net/minestom/testing/Collector.java @@ -30,7 +30,7 @@ public interface Collector { * * @return a list of elements collected by this collector */ - @NotNull List<@NotNull T> collect(); + List collect(); /** * Assert a single element from the collection, check its type, and apply a consumer to it. @@ -69,6 +69,18 @@ default void assertCount(int count) { assertEquals(count, elements.size(), "Expected " + count + " element(s), got " + elements.size() + ": " + elements); } + /** + * Assert the count of elements matching a predicate in the collector. + * + * @param count expected number of elements matching the predicate + * @param predicate to match elements + */ + default void assertCount(int count, Predicate predicate) { + List elements = collect(); + long matchingCount = elements.stream().filter(predicate).count(); + assertEquals(count, matchingCount, "Expected " + count + " element(s) matching the predicate, got " + matchingCount + ": " + elements); + } + /** * Assert that the collector only contains a single element. */ diff --git a/src/main/java/net/minestom/testing/EnvImpl.java b/src/main/java/net/minestom/testing/EnvImpl.java index 2553f42..599f9ff 100644 --- a/src/main/java/net/minestom/testing/EnvImpl.java +++ b/src/main/java/net/minestom/testing/EnvImpl.java @@ -5,7 +5,7 @@ import net.minestom.server.event.EventFilter; import net.minestom.server.event.EventListener; import net.minestom.server.network.player.GameProfile; -import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Assertions; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -20,6 +20,8 @@ public final class EnvImpl implements Env { public EnvImpl(ServerProcess process) { this.process = process; + // If exceptions reach the exception handler, by default fail the test. + process().exception().setExceptionHandler(EnvImpl::handleException); // Start the dispatcher threads if not already started. process().dispatcher().start(); @@ -29,18 +31,22 @@ public EnvImpl(ServerProcess process) { process.connection().setPlayerProvider(TestPlayerImpl::new); } + static void handleException(Throwable exception) { + Assertions.fail("Server threw exception", exception); + } + @Override public ServerProcess process() { return process; } @Override - public TestConnection createConnection(GameProfile profile) { - return new TestConnectionImpl(this, profile); + public TestConnection createConnection(GameProfile gameProfile) { + return new TestConnectionImpl(this, gameProfile); } @Override - public Collector trackEvent(Class eventType, EventFilter filter, @NotNull H actor) { + public Collector trackEvent(Class eventType, EventFilter filter, H actor) { var tracker = new EventCollector(actor); this.process.eventHandler().map(actor, filter).addListener(eventType, tracker.events::add); return tracker; diff --git a/src/main/java/net/minestom/testing/TestConnectionImpl.java b/src/main/java/net/minestom/testing/TestConnectionImpl.java index 0ab602c..8101290 100644 --- a/src/main/java/net/minestom/testing/TestConnectionImpl.java +++ b/src/main/java/net/minestom/testing/TestConnectionImpl.java @@ -1,6 +1,7 @@ package net.minestom.testing; import net.kyori.adventure.translation.GlobalTranslator; +import net.minestom.server.ServerFlag; import net.minestom.server.ServerProcess; import net.minestom.server.adventure.MinestomAdventure; import net.minestom.server.coordinate.Pos; @@ -89,7 +90,7 @@ private ServerPacket extractPacket(final SendablePacket packet) { final Player player = getPlayer(); if (player == null) return serverPacket; - if (MinestomAdventure.AUTOMATIC_COMPONENT_TRANSLATION && serverPacket instanceof ServerPacket.ComponentHolding) { + if (ServerFlag.AUTOMATIC_COMPONENT_TRANSLATION && serverPacket instanceof ServerPacket.ComponentHolding) { serverPacket = ((ServerPacket.ComponentHolding) serverPacket).copyWithOperator(component -> GlobalTranslator.render(component, Objects.requireNonNullElseGet(player.getLocale(), MinestomAdventure::getDefaultLocale))); } @@ -127,4 +128,4 @@ public List collect() { return List.copyOf(packets); } } -} +} \ No newline at end of file