StealCommandTest.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package cz.davza.studentadventure.commands;
  2. import cz.davza.studentadventure.TestHelpers;
  3. import cz.davza.studentadventure.enums.CommandState;
  4. import cz.davza.studentadventure.objects.CommandResult;
  5. import cz.davza.studentadventure.objects.GameData;
  6. import cz.davza.studentadventure.objects.Player;
  7. import org.junit.jupiter.api.BeforeEach;
  8. import org.junit.jupiter.api.Test;
  9. import static cz.davza.studentadventure.TestHelpers.execute;
  10. import static org.junit.jupiter.api.Assertions.*;
  11. class StealCommandTest {
  12. private GameData context;
  13. private Player player;
  14. @BeforeEach
  15. void setUp() {
  16. context = TestHelpers.buildGameData();
  17. player = context.getPlayer();
  18. }
  19. @Test
  20. void stealCanSucceedAndAddMoney() {
  21. boolean succeededOnce = false;
  22. int startMoney = player.getWallet().getMoney();
  23. for (int i = 0; i < 50; i++) {
  24. context = TestHelpers.buildGameData();
  25. player = context.getPlayer();
  26. CommandResult result = execute("steal", context);
  27. if (result.getResultState() == CommandState.SUCCESS) {
  28. assertTrue(player.getWallet().getMoney() > startMoney);
  29. succeededOnce = true;
  30. break;
  31. }
  32. }
  33. assertTrue(succeededOnce, "Expected steal to succeed at least once in 50 attempts");
  34. }
  35. @Test
  36. void stealCanReturnGameOver() {
  37. boolean caughtOnce = false;
  38. for (int i = 0; i < 50; i++) {
  39. context = TestHelpers.buildGameData();
  40. CommandResult result = execute("steal", context);
  41. if (result.getResultState() == CommandState.GAME_OVER) {
  42. caughtOnce = true;
  43. break;
  44. }
  45. }
  46. assertTrue(caughtOnce, "Expected to be caught stealing at least once in 50 attempts");
  47. }
  48. @Test
  49. void stealInDesperateStateHasLowerCatchChance() {
  50. // Desperate: stress > 70, energy < 30
  51. // Run many attempts and count game overs vs successes in desperate vs normal
  52. // Desperate should have fewer game overs (15% vs 40%)
  53. int desperateGameOvers = 0;
  54. int normalGameOvers = 0;
  55. int trials = 200;
  56. for (int i = 0; i < trials; i++) {
  57. GameData ctx = TestHelpers.buildGameData();
  58. ctx.getPlayer().getStress().increase(80);
  59. ctx.getPlayer().getEnergy().decrease(80);
  60. if (execute("steal", ctx).getResultState() == CommandState.GAME_OVER) desperateGameOvers++;
  61. }
  62. for (int i = 0; i < trials; i++) {
  63. GameData ctx = TestHelpers.buildGameData();
  64. if (execute("steal", ctx).getResultState() == CommandState.GAME_OVER) normalGameOvers++;
  65. }
  66. // With 200 trials, desperate (~15%) should have noticeably fewer than normal (~40%)
  67. assertTrue(desperateGameOvers < normalGameOvers,
  68. "Desperate steal should be caught less often. Desperate: " + desperateGameOvers
  69. + " Normal: " + normalGameOvers);
  70. }
  71. @Test
  72. void stealMoneyAmountIsWithinExpectedRange() {
  73. for (int i = 0; i < 50; i++) {
  74. context = TestHelpers.buildGameData();
  75. player = context.getPlayer();
  76. int before = player.getWallet().getMoney();
  77. CommandResult result = execute("steal", context);
  78. if (result.getResultState() == CommandState.SUCCESS) {
  79. int gained = player.getWallet().getMoney() - before;
  80. assertTrue(gained >= 10 && gained <= 40,
  81. "Expected stolen amount 10-40, got " + gained);
  82. return;
  83. }
  84. }
  85. }
  86. }