package cz.davza.studentadventure.commands; import cz.davza.studentadventure.TestHelpers; import cz.davza.studentadventure.enums.CommandState; import cz.davza.studentadventure.objects.CommandResult; import cz.davza.studentadventure.objects.GameData; import cz.davza.studentadventure.objects.Player; import cz.davza.studentadventure.rooms.BedroomRoom; import cz.davza.studentadventure.rooms.ClassroomRoom; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; import static cz.davza.studentadventure.TestHelpers.execute; import static org.junit.jupiter.api.Assertions.*; class SleepCommandTest { private GameData context; private Player player; @BeforeEach void setUp() { context = TestHelpers.buildGameData(); player = context.getPlayer(); // Starting room is Bedroom — sleep is valid here immediately } @Test void sleepInBedroomReturnsSuccess() { CommandResult result = execute("sleep", context); assertEquals(CommandState.SUCCESS, result.getResultState()); } @Test void sleepInBedroomRestoresEnergy() { player.getEnergy().decrease(50); execute("sleep", context); assertEquals(100, player.getEnergy().getValue()); } @Test void sleepInBedroomReducesStress() { player.getStress().increase(60); execute("sleep", context); assertEquals(0, player.getStress().getValue()); } @Test void sleepInBedroomResetsHoursAwake() { player.addHoursAwake(20); execute("sleep", context); assertEquals(cz.davza.studentadventure.enums.DeprivationState.NORMAL, player.getDeprivationState()); } @Test void sleepInBedroomAdvancesToNextMorning() { execute("sleep", context); assertEquals(2, context.getTime().getDay()); assertEquals(8, context.getTime().getHour()); } @Test void sleepOutsideBedroomAndClassroomFails() { // Walk to hallway first context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("hallway")); context.getMap().commitRoomChange(); CommandResult result = execute("sleep", context); assertEquals(CommandState.FAILED, result.getResultState()); } @Test void sleepInClassroomAdvancesTimeBy2Hours() { // Move player to classroom — need book to enter context.getPlayer().getInventory().Add(new cz.davza.studentadventure.Items.Book(), 1); context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("hallway")); context.getMap().commitRoomChange(); context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("classroom")); context.getMap().commitRoomChange(); int hourBefore = context.getTime().getHour(); // Run many times to guarantee we hit the success path at least once // (30% catch chance means ~99.9% chance of success in 20 attempts) boolean succeeded = false; for (int i = 0; i < 20; i++) { context = TestHelpers.buildGameData(); player = context.getPlayer(); player.getInventory().Add(new cz.davza.studentadventure.Items.Book(), 1); context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("hallway")); context.getMap().commitRoomChange(); context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("classroom")); context.getMap().commitRoomChange(); int before = context.getTime().getHour(); CommandResult result = execute("sleep", context); if (result.getResultState() == CommandState.SUCCESS) { assertEquals(before + 2, context.getTime().getHour()); succeeded = true; break; } } assertTrue(succeeded, "Expected at least one successful classroom sleep in 20 attempts"); } @Test void sleepInClassroomCanReturnGameOver() { // Run many times to guarantee we hit the caught path boolean caughtOnce = false; for (int i = 0; i < 50; i++) { GameData ctx = TestHelpers.buildGameData(); ctx.getPlayer().getInventory().Add(new cz.davza.studentadventure.Items.Book(), 1); ctx.getMap().setNextRoom(ctx.getMap().getCurrentRoom().getExit("hallway")); ctx.getMap().commitRoomChange(); ctx.getMap().setNextRoom(ctx.getMap().getCurrentRoom().getExit("classroom")); ctx.getMap().commitRoomChange(); CommandResult result = execute("sleep", ctx); if (result.getResultState() == CommandState.GAME_OVER) { caughtOnce = true; break; } } assertTrue(caughtOnce, "Expected to be caught sleeping at least once in 50 attempts"); } }