SleepCommandTest.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 cz.davza.studentadventure.rooms.BedroomRoom;
  8. import cz.davza.studentadventure.rooms.ClassroomRoom;
  9. import org.junit.jupiter.api.BeforeEach;
  10. import org.junit.jupiter.api.Test;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import static cz.davza.studentadventure.TestHelpers.execute;
  14. import static org.junit.jupiter.api.Assertions.*;
  15. class SleepCommandTest {
  16. private GameData context;
  17. private Player player;
  18. @BeforeEach
  19. void setUp() {
  20. context = TestHelpers.buildGameData();
  21. player = context.getPlayer();
  22. // Starting room is Bedroom — sleep is valid here immediately
  23. }
  24. @Test
  25. void sleepInBedroomReturnsSuccess() {
  26. CommandResult result = execute("sleep", context);
  27. assertEquals(CommandState.SUCCESS, result.getResultState());
  28. }
  29. @Test
  30. void sleepInBedroomRestoresEnergy() {
  31. player.getEnergy().decrease(50);
  32. execute("sleep", context);
  33. assertEquals(100, player.getEnergy().getValue());
  34. }
  35. @Test
  36. void sleepInBedroomReducesStress() {
  37. player.getStress().increase(60);
  38. execute("sleep", context);
  39. assertEquals(0, player.getStress().getValue());
  40. }
  41. @Test
  42. void sleepInBedroomResetsHoursAwake() {
  43. player.addHoursAwake(20);
  44. execute("sleep", context);
  45. assertEquals(cz.davza.studentadventure.enums.DeprivationState.NORMAL,
  46. player.getDeprivationState());
  47. }
  48. @Test
  49. void sleepInBedroomAdvancesToNextMorning() {
  50. execute("sleep", context);
  51. assertEquals(2, context.getTime().getDay());
  52. assertEquals(8, context.getTime().getHour());
  53. }
  54. @Test
  55. void sleepOutsideBedroomAndClassroomFails() {
  56. // Walk to hallway first
  57. context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("hallway"));
  58. context.getMap().commitRoomChange();
  59. CommandResult result = execute("sleep", context);
  60. assertEquals(CommandState.FAILED, result.getResultState());
  61. }
  62. @Test
  63. void sleepInClassroomAdvancesTimeBy2Hours() {
  64. // Move player to classroom — need book to enter
  65. context.getPlayer().getInventory().Add(new cz.davza.studentadventure.Items.Book(), 1);
  66. context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("hallway"));
  67. context.getMap().commitRoomChange();
  68. context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("classroom"));
  69. context.getMap().commitRoomChange();
  70. int hourBefore = context.getTime().getHour();
  71. // Run many times to guarantee we hit the success path at least once
  72. // (30% catch chance means ~99.9% chance of success in 20 attempts)
  73. boolean succeeded = false;
  74. for (int i = 0; i < 20; i++) {
  75. context = TestHelpers.buildGameData();
  76. player = context.getPlayer();
  77. player.getInventory().Add(new cz.davza.studentadventure.Items.Book(), 1);
  78. context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("hallway"));
  79. context.getMap().commitRoomChange();
  80. context.getMap().setNextRoom(context.getMap().getCurrentRoom().getExit("classroom"));
  81. context.getMap().commitRoomChange();
  82. int before = context.getTime().getHour();
  83. CommandResult result = execute("sleep", context);
  84. if (result.getResultState() == CommandState.SUCCESS) {
  85. assertEquals(before + 2, context.getTime().getHour());
  86. succeeded = true;
  87. break;
  88. }
  89. }
  90. assertTrue(succeeded, "Expected at least one successful classroom sleep in 20 attempts");
  91. }
  92. @Test
  93. void sleepInClassroomCanReturnGameOver() {
  94. // Run many times to guarantee we hit the caught path
  95. boolean caughtOnce = false;
  96. for (int i = 0; i < 50; i++) {
  97. GameData ctx = TestHelpers.buildGameData();
  98. ctx.getPlayer().getInventory().Add(new cz.davza.studentadventure.Items.Book(), 1);
  99. ctx.getMap().setNextRoom(ctx.getMap().getCurrentRoom().getExit("hallway"));
  100. ctx.getMap().commitRoomChange();
  101. ctx.getMap().setNextRoom(ctx.getMap().getCurrentRoom().getExit("classroom"));
  102. ctx.getMap().commitRoomChange();
  103. CommandResult result = execute("sleep", ctx);
  104. if (result.getResultState() == CommandState.GAME_OVER) {
  105. caughtOnce = true;
  106. break;
  107. }
  108. }
  109. assertTrue(caughtOnce, "Expected to be caught sleeping at least once in 50 attempts");
  110. }
  111. }