OneLiteFeatherNET / Microtus

Up to date Minestom fork caring about community, code quality & stability
https://wiki.microtus.dev
Other
3 stars 0 forks source link

Change or revise the testing framework #62

Open TheMeinerLP opened 1 week ago

TheMeinerLP commented 1 week ago

After waiting for an internal tool and interesting errors from Intellij, the testing framework should be converted to extensions instead of annotations.

Before:

@EnvironmentTest
class NotificationIntegrationTest {

    @Test
    void testBuilder() {
        var notification = Notification.builder()
                .icon(Material.ITEM_FRAME)
                .title(Component.text("unit test"))
                .frameType(FrameType.TASK)
                .build();
        assertEquals(FrameType.TASK, notification.type());
        assertEquals(ItemStack.of(Material.ITEM_FRAME), notification.icon());
        assertEquals(Component.text("unit test"), notification.title());
    }

    @Test
    void testSend(Env env) {
        var instance = env.createFlatInstance();
        var connection = env.createConnection();
        Collector<AdvancementsPacket> advancementsPacketCollector = connection.trackIncoming(AdvancementsPacket.class);
        var player = connection.connect(instance, new Pos(0, 42, 0)).join();
        var notification = Notification.builder()
                .icon(Material.ITEM_FRAME)
                .title(Component.text("unit test"))
                .frameType(FrameType.TASK)
                .build();
        notification.send(player);
        advancementsPacketCollector.assertCount(2);
        AdvancementsPacket advancementsPacket = advancementsPacketCollector.collect().get(1);
        assertNotNull(advancementsPacket);
        Optional<AdvancementsPacket.AdvancementMapping> advancementMapping = advancementsPacket.advancementMappings().stream().findFirst();
        advancementMapping.ifPresent(advancementMapping1 -> {
            AdvancementsPacket.Advancement advancement = advancementMapping1.value();
            assertFalse(advancement.sendTelemetryData());
            var displayData = advancement.displayData();
            assertEquals(ItemStack.of(Material.ITEM_FRAME), displayData.icon());
            assertEquals(Component.text("unit test"), displayData.title());
            assertEquals(FrameType.TASK, displayData.frameType());
        });
    }
}

After:

@ExtendWith(MicrotusExtension.class)
class NotificationIntegrationTest {

    @Test
    void testBuilder() {
        var notification = Notification.builder()
                .icon(Material.ITEM_FRAME)
                .title(Component.text("unit test"))
                .frameType(FrameType.TASK)
                .build();
        assertEquals(FrameType.TASK, notification.type());
        assertEquals(ItemStack.of(Material.ITEM_FRAME), notification.icon());
        assertEquals(Component.text("unit test"), notification.title());
    }

    @Test
    void testSend(Env env) {
        var instance = env.createFlatInstance();
        var connection = env.createConnection();
        Collector<AdvancementsPacket> advancementsPacketCollector = connection.trackIncoming(AdvancementsPacket.class);
        var player = connection.connect(instance, new Pos(0, 42, 0)).join();
        var notification = Notification.builder()
                .icon(Material.ITEM_FRAME)
                .title(Component.text("unit test"))
                .frameType(FrameType.TASK)
                .build();
        notification.send(player);
        advancementsPacketCollector.assertCount(2);
        AdvancementsPacket advancementsPacket = advancementsPacketCollector.collect().get(1);
        assertNotNull(advancementsPacket);
        Optional<AdvancementsPacket.AdvancementMapping> advancementMapping = advancementsPacket.advancementMappings().stream().findFirst();
        advancementMapping.ifPresent(advancementMapping1 -> {
            AdvancementsPacket.Advancement advancement = advancementMapping1.value();
            assertFalse(advancement.sendTelemetryData());
            var displayData = advancement.displayData();
            assertEquals(ItemStack.of(Material.ITEM_FRAME), displayData.icon());
            assertEquals(Component.text("unit test"), displayData.title());
            assertEquals(FrameType.TASK, displayData.frameType());
        });
    }
}

Extension Class:

public class MicrotusExtension extends TypeBasedParameterResolver<Env> implements InvocationInterceptor {

    @Override
    public Env resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
            throws ParameterResolutionException {
        return Env.createInstance(MinecraftServer.updateProcess());
    }

    @Override
    public void interceptTestMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
        invocation.proceed();
        List<Object> arguments = invocationContext.getArguments();
        arguments.stream().filter(Env.class::isInstance).findFirst().ifPresent(o -> {
            Env env = (Env) o;
            env.cleanup();
        });
    }
}
yannicklamprecht commented 1 week ago

Seems like a useful change. Can we expect other Microtus extensions popping up in the future? If that's the case naming of the class should be adjusted. MicrotusEnvExtension or MicrotusEnvironmentExtension?

TheMeinerLP commented 1 week ago

So Mockito puts them together in a Java file. So good question, would have to be specified more precisely.

The reason for the change is this

Screenshot_20240616_014745

yannicklamprecht commented 1 week ago

Yeah a parameterized test wouldn't be the right way to address that. Extensions are totally fine and made for that.