package cz.davza.studentadventure.commands; import cz.davza.studentadventure.TestHelpers; import cz.davza.studentadventure.enums.CommandState; import cz.davza.studentadventure.enums.DeprivationState; import cz.davza.studentadventure.objects.CommandResult; import cz.davza.studentadventure.objects.GameData; import cz.davza.studentadventure.objects.Player; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static cz.davza.studentadventure.TestHelpers.execute; import static org.junit.jupiter.api.Assertions.*; class StudyCommandTest { private GameData context; private Player player; @BeforeEach void setUp() { context = TestHelpers.buildGameData(); player = context.getPlayer(); } @Test void studyOneHourIncreasesIntelligenceBy5() { execute("study 1", context); assertEquals(10, player.getIntelligence().getValue()); } @Test void studyOneHourCostsEnergy() { int before = player.getEnergy().getValue(); execute("study 1", context); assertTrue(player.getEnergy().getValue() < before); } @Test void studyOneHourIncreasesStress() { execute("study 1", context); assertTrue(player.getStress().getValue() > 0); } @Test void studyOneHourAdvancesTimeByOneHour() { int before = context.getTime().getHour(); execute("study 1", context); assertEquals(before + 1, context.getTime().getHour()); } @Test void studyMultipleHoursStacksGains() { execute("study 3", context); assertEquals(5 + 15, player.getIntelligence().getValue()); } @Test void studyMultipleHoursAdvancesTimeByThatMany() { int before = context.getTime().getHour(); execute("study 3", context); assertEquals(before + 3, context.getTime().getHour()); } @Test void studyWithNoParamsReturnsInvalidParams() { CommandResult result = execute("study", context); assertEquals(CommandState.INVALID_PARAMS, result.getResultState()); } @Test void studyWithZeroHoursReturnsInvalidParams() { CommandResult result = execute("study 0", context); assertEquals(CommandState.INVALID_PARAMS, result.getResultState()); } @Test void studyWithNegativeHoursReturnsInvalidParams() { CommandResult result = execute("study -1", context); assertEquals(CommandState.INVALID_PARAMS, result.getResultState()); } @Test void studyWithNonNumberReturnsInvalidParams() { CommandResult result = execute("study abc", context); assertEquals(CommandState.INVALID_PARAMS, result.getResultState()); } @Test void studyWhenEnergyZeroReturnsFailed() { player.getEnergy().decrease(100); CommandResult result = execute("study 1", context); assertEquals(CommandState.FAILED, result.getResultState()); } @Test void studyStopsEarlyWhenEnergyRunsOut() { player.getEnergy().decrease(85); // 15 energy left, first hour costs ~10, second ~13 → stops at 1 CommandResult result = execute("study 2", context); assertEquals(CommandState.SUCCESS, result.getResultState()); assertTrue(result.getResultMessage().contains("run out of energy")); } @Test void studyAddsToHoursAwakeCounter() { execute("study 3", context); // 3 hours awake is still NORMAL (threshold is 14) assertEquals(DeprivationState.NORMAL, player.getDeprivationState()); } @Test void studyReturnsSuccessState() { CommandResult result = execute("study 1", context); assertEquals(CommandState.SUCCESS, result.getResultState()); } @Test void studyCostsMoreEnergyWithDeprivation() { // Push player to deprived state player.addHoursAwake(25); int energyBefore = player.getEnergy().getValue(); execute("study 1", context); int energyCostDeprived = energyBefore - player.getEnergy().getValue(); // Reset and do the same at normal state context = TestHelpers.buildGameData(); player = context.getPlayer(); int energyBefore2 = player.getEnergy().getValue(); execute("study 1", context); int energyCostNormal = energyBefore2 - player.getEnergy().getValue(); assertTrue(energyCostDeprived > energyCostNormal); } }