package cz.davza.studentadventure.commands; import cz.davza.studentadventure.Items.Book; import cz.davza.studentadventure.TestHelpers; import cz.davza.studentadventure.enums.CommandState; import cz.davza.studentadventure.objects.CommandResult; import cz.davza.studentadventure.objects.GameData; 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 PickupCommandTest { private GameData context; @BeforeEach void setUp() { context = TestHelpers.buildGameData(); // Bedroom starts with a Bed and Money — add a Book for pickup tests context.getMap().getCurrentRoom().getItems().Add(new Book(), 3); } @Test void pickupItemAddsToInventory() { execute("pickup book", context); assertNotNull(context.getPlayer().getInventory().GetByItemCode("book")); } @Test void pickupItemRemovesFromRoom() { int before = context.getMap().getCurrentRoom().getItems().GetByItemCode("book").getAmount(); execute("pickup book", context); int after = context.getMap().getCurrentRoom().getItems().GetByItemCode("book").getAmount(); assertEquals(before - 1, after); } @Test void pickupSpecificAmountPicksCorrectNumber() { execute("pickup book 2", context); assertEquals(2, context.getPlayer().getInventory().GetByItemCode("book").getAmount()); } @Test void pickupReturnsSuccessState() { CommandResult result = execute("pickup book", context); assertEquals(CommandState.SUCCESS, result.getResultState()); } @Test void pickupNonExistentItemReturnsItemNotFound() { CommandResult result = execute("pickup energy_drink", context); assertEquals(CommandState.ITEM_NOT_FOUND, result.getResultState()); } @Test void pickupNonCollectableReturnsNotCollectable() { // Bed is in bedroom and is not collectable CommandResult result = execute("pickup bed", context); assertEquals(CommandState.ITEM_NOT_COLLECTABLE, result.getResultState()); } @Test void pickupWithNoParamsReturnsInvalidParams() { CommandResult result = execute("pickup", context); assertEquals(CommandState.INVALID_PARAMS, result.getResultState()); } @Test void pickupWhenInventoryFullReturnsInventoryFull() { // Fill inventory: capacity 20, book bulk 3 → 6 books fill 18, 7th won't all fit context.getMap().getCurrentRoom().getItems().Add(new Book(), 10); // Add 6 books to inventory (uses 18 capacity, 2 remaining — not enough for another book at bulk 3) context.getPlayer().getInventory().Add(new Book(), 6); CommandResult result = execute("pickup book 1", context); assertEquals(CommandState.INVENTORY_FULL, result.getResultState()); } @Test void pickupWithNonNumberAmountReturnsInvalidParams() { CommandResult result = execute("pickup book abc", context); assertEquals(CommandState.INVALID_PARAMS, result.getResultState()); } @Test void pickupDefaultsToOneWhenNoAmountGiven() { execute("pickup book", context); assertEquals(1, context.getPlayer().getInventory().GetByItemCode("book").getAmount()); } }