package cz.davza.studentadventure.commands; import cz.davza.studentadventure.Items.EnergyDrink; 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 BuyCommandTest { private GameData context; private Player player; @BeforeEach void setUp() { context = TestHelpers.buildGameData(); player = context.getPlayer(); } @Test void buyEnergyDrinkDeductsCost() { int before = player.getWallet().getMoney(); execute("buy energy_drink", context); assertEquals(before - EnergyDrink.COST, player.getWallet().getMoney()); } @Test void buyEnergyDrinkAddsToInventory() { execute("buy energy_drink", context); assertNotNull(player.getInventory().GetByItemCode("energy_drink")); } @Test void buyReturnsSuccessState() { CommandResult result = execute("buy energy_drink", context); assertEquals(CommandState.SUCCESS, result.getResultState()); } @Test void buyWithInsufficientFundsReturnsFailed() { player.getWallet().spendMoney(player.getWallet().getMoney()); // drain wallet CommandResult result = execute("buy energy_drink", context); assertEquals(CommandState.FAILED, result.getResultState()); } @Test void buyWithInsufficientFundsDoesNotAddItem() { player.getWallet().spendMoney(player.getWallet().getMoney()); execute("buy energy_drink", context); assertNull(player.getInventory().GetByItemCode("energy_drink")); } @Test void buyUnknownItemReturnsFailed() { CommandResult result = execute("buy sandwich", context); assertEquals(CommandState.FAILED, result.getResultState()); } @Test void buyWithNoParamsReturnsInvalidParams() { CommandResult result = execute("buy", context); assertEquals(CommandState.INVALID_PARAMS, result.getResultState()); } @Test void buyWhenInventoryFullReturnsInventoryFull() { // Fill inventory: capacity 20, drink bulk 2 → 10 drinks = 20 bulk player.getInventory().Add(new EnergyDrink(), 10); CommandResult result = execute("buy energy_drink", context); assertEquals(CommandState.INVENTORY_FULL, result.getResultState()); } @Test void buyDoesNotSpendMoneyWhenInventoryFull() { player.getInventory().Add(new EnergyDrink(), 10); int moneyBefore = player.getWallet().getMoney(); execute("buy energy_drink", context); assertEquals(moneyBefore, player.getWallet().getMoney()); } }