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 StealCommandTest { private GameData context; private Player player; @BeforeEach void setUp() { context = TestHelpers.buildGameData(); player = context.getPlayer(); } @Test void stealCanSucceedAndAddMoney() { boolean succeededOnce = false; int startMoney = player.getWallet().getMoney(); for (int i = 0; i < 50; i++) { context = TestHelpers.buildGameData(); player = context.getPlayer(); CommandResult result = execute("steal", context); if (result.getResultState() == CommandState.SUCCESS) { assertTrue(player.getWallet().getMoney() > startMoney); succeededOnce = true; break; } } assertTrue(succeededOnce, "Expected steal to succeed at least once in 50 attempts"); } @Test void stealCanReturnGameOver() { boolean caughtOnce = false; for (int i = 0; i < 50; i++) { context = TestHelpers.buildGameData(); CommandResult result = execute("steal", context); if (result.getResultState() == CommandState.GAME_OVER) { caughtOnce = true; break; } } assertTrue(caughtOnce, "Expected to be caught stealing at least once in 50 attempts"); } @Test void stealInDesperateStateHasLowerCatchChance() { // Desperate: stress > 70, energy < 30 // Run many attempts and count game overs vs successes in desperate vs normal // Desperate should have fewer game overs (15% vs 40%) int desperateGameOvers = 0; int normalGameOvers = 0; int trials = 200; for (int i = 0; i < trials; i++) { GameData ctx = TestHelpers.buildGameData(); ctx.getPlayer().getStress().increase(80); ctx.getPlayer().getEnergy().decrease(80); if (execute("steal", ctx).getResultState() == CommandState.GAME_OVER) desperateGameOvers++; } for (int i = 0; i < trials; i++) { GameData ctx = TestHelpers.buildGameData(); if (execute("steal", ctx).getResultState() == CommandState.GAME_OVER) normalGameOvers++; } // With 200 trials, desperate (~15%) should have noticeably fewer than normal (~40%) assertTrue(desperateGameOvers < normalGameOvers, "Desperate steal should be caught less often. Desperate: " + desperateGameOvers + " Normal: " + normalGameOvers); } @Test void stealMoneyAmountIsWithinExpectedRange() { for (int i = 0; i < 50; i++) { context = TestHelpers.buildGameData(); player = context.getPlayer(); int before = player.getWallet().getMoney(); CommandResult result = execute("steal", context); if (result.getResultState() == CommandState.SUCCESS) { int gained = player.getWallet().getMoney() - before; assertTrue(gained >= 10 && gained <= 40, "Expected stolen amount 10-40, got " + gained); return; } } } }