| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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;
- }
- }
- }
- }
|