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 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 TakeExamCommandTest { private GameData context; private Player player; @BeforeEach void setUp() { context = TestHelpers.buildGameData(); player = context.getPlayer(); } @Test void examPassesWhenIntelligenceHighEnough() { // Need effectiveScore >= 50. intelligence - stress/10 >= 50 // Set intelligence to 50, stress to 0 → score = 50 player.getIntelligence().increase(100); // clamps to 100 CommandResult result = execute("takeexam", context); assertEquals(CommandState.GAME_WIN, result.getResultState()); } @Test void examFailsWhenIntelligenceTooLow() { // Default intelligence = 5, stress = 0 → score = 5, need 50 → fail CommandResult result = execute("takeexam", context); assertEquals(CommandState.GAME_OVER, result.getResultState()); } @Test void examStressPenaltyReducesScore() { // intelligence 60, stress 100 → penalty 10 → score 50 → just passes player.getIntelligence().increase(100); // 100 player.getStress().increase(100); // 100 → penalty 10 // effectiveScore = 100 - 10 = 90 → passes CommandResult result = execute("takeexam", context); assertEquals(CommandState.GAME_WIN, result.getResultState()); } @Test void examFailsWhenStressPenaltyPullsScoreBelow50() { // intelligence = 55, stress = 100 → penalty 10 → score 45 → fail player.getIntelligence().increase(50); // starts at 5, becomes 55 player.getStress().increase(100); CommandResult result = execute("takeexam", context); assertEquals(CommandState.GAME_OVER, result.getResultState()); } @Test void examPassMessageContainsDistinctionWhenScoreAbove80() { player.getIntelligence().increase(100); // 100 // stress = 0 → score = 100 → distinction CommandResult result = execute("takeexam", context); assertTrue(result.getResultMessage().contains("DISTINCTION")); } @Test void examPassMessageContainsMeritWhenScoreBetween65And80() { // Need score 65-79: intelligence 70, stress 0 → score 70 player.getIntelligence().increase(65); // 5 + 65 = 70 CommandResult result = execute("takeexam", context); assertTrue(result.getResultMessage().contains("MERIT")); } @Test void examPassMessageContainsPassWhenScoreBetween50And64() { // Need score 50-64: intelligence 55, stress 0 → score 55 player.getIntelligence().increase(50); // 5 + 50 = 55 CommandResult result = execute("takeexam", context); assertTrue(result.getResultMessage().contains("RESULT: PASS\n")); } @Test void examScoreExactlyAtThresholdPasses() { // intelligence = 50, stress 0 → score exactly 50 → pass player.getIntelligence().increase(45); // 5 + 45 = 50 CommandResult result = execute("takeexam", context); assertEquals(CommandState.GAME_WIN, result.getResultState()); } @Test void examScoreOneBelowThresholdFails() { // intelligence = 49, stress 0 → score 49 → fail player.getIntelligence().increase(44); // 5 + 44 = 49 CommandResult result = execute("takeexam", context); assertEquals(CommandState.GAME_OVER, result.getResultState()); } }