package com.example.tests;
import com.frotty27.hrtk.api.annotation.HytaleSuite;
import com.frotty27.hrtk.api.annotation.HytaleTest;
import com.frotty27.hrtk.api.annotation.Tag;
import com.frotty27.hrtk.api.annotation.DisplayName;
import com.frotty27.hrtk.api.annotation.Order;
import com.frotty27.hrtk.api.assert_.EventAssert;
import com.frotty27.hrtk.api.assert_.HytaleAssert;
import com.frotty27.hrtk.api.assert_.PlayerAssert;
import com.frotty27.hrtk.api.context.HytaleTestContext;
import com.frotty27.hrtk.api.lifecycle.IsolationStrategy;
@HytaleSuite(value = "Game Mode Tests", isolation = IsolationStrategy.NONE)
@Tag("gamemode")
public class GameModeSurfaceTests {
@HytaleTest
@Order(1)
@DisplayName("GameMode enum has Adventure and Creative values")
void gameModeEnumValues() {
// The GameMode enum is the core mode identifier.
// Your mod branches on this to enable/disable features.
HytaleAssert.assertNotNull(GameMode.Adventure);
HytaleAssert.assertNotNull(GameMode.Creative);
HytaleAssert.assertEquals(2, GameMode.values().length);
}
@HytaleTest
@Order(2)
@DisplayName("GameModeType resolves from GameMode enum")
void gameModeTypeResolvable() {
// GameModeType is the asset that defines permissions and interactions
// for each mode. fromGameMode() links the enum to the asset.
var adventureType = GameModeType.fromGameMode(GameMode.Adventure);
HytaleAssert.assertNotNull("Adventure GameModeType should resolve", adventureType);
var creativeType = GameModeType.fromGameMode(GameMode.Creative);
HytaleAssert.assertNotNull("Creative GameModeType should resolve", creativeType);
}
@HytaleTest
@Order(3)
@DisplayName("ChangeGameModeEvent carries the new mode")
void gameModeChangeEventCarriesMode(HytaleTestContext ctx) {
// Capture the event before triggering the mode change.
var capture = ctx.captureEvent(ChangeGameModeEvent.class);
ctx.simulateGameModeChange(GameMode.Creative);
EventAssert.assertEventFired(capture);
HytaleAssert.assertEquals(GameMode.Creative, capture.getFirst().getGameMode());
}
@HytaleTest
@Order(4)
@DisplayName("ChangeGameModeEvent can be cancelled")
void gameModeChangeCanBeCancelled(HytaleTestContext ctx) {
// Cancelling the event prevents the mode switch.
// Protection plugins use this to block unauthorized mode changes.
var capture = ctx.captureEvent(ChangeGameModeEvent.class);
ctx.simulateGameModeChange(GameMode.Creative);
EventAssert.assertEventFired(capture);
var event = capture.getFirst();
event.setCancelled(true);
HytaleAssert.assertTrue("Event should be cancellable", event.isCancelled());
}
}