package cz.davza.studentadventure.objects; import cz.davza.studentadventure.Items.Book; import cz.davza.studentadventure.Items.EnergyDrink; import cz.davza.studentadventure.interfaces.IItem; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class ItemCollectionTest { private PlayerInventory inventory; private IItem book; private IItem drink; @BeforeEach void setUp() { inventory = new PlayerInventory(20); // capacity of 20 bulk book = new Book(); // bulk = 3 drink = new EnergyDrink();// bulk = 2 } // ── Add ────────────────────────────────────────────────────────── @Test void addItemStoresIt() { inventory.Add(book, 1); assertNotNull(inventory.GetByItemCode("book")); } @Test void addItemReturnsZeroLeftoverWhenFits() { int leftOver = inventory.Add(book, 1); assertEquals(0, leftOver); } @Test void addItemDecreasesRemainingCapacity() { inventory.Add(book, 1); // bulk 3 assertEquals(17, inventory.GetRemainingCapacity()); } @Test void addMultipleOfSameItemStacksTogether() { inventory.Add(book, 2); assertEquals(2, inventory.GetByItemCode("book").getAmount()); } @Test void addReturnsLeftoverWhenCapacityExceeded() { // capacity 20, book bulk 3 → fits 6 (uses 18), 7th overflows int leftOver = inventory.Add(book, 7); assertEquals(1, leftOver); } @Test void addDifferentItemsTrackSeparately() { inventory.Add(book, 1); inventory.Add(drink, 1); assertNotNull(inventory.GetByItemCode("book")); assertNotNull(inventory.GetByItemCode("energy_drink")); } @Test void addZeroItemsDoesNothing() { // capacity / bulk = 20/3 = 6, asking for 0 → canInsert = min(0, 6) = 0 inventory.Add(book, 0); assertNull(inventory.GetByItemCode("book")); assertEquals(20, inventory.GetRemainingCapacity()); } // ── Remove ─────────────────────────────────────────────────────── @Test void removeReducesStackAmount() { inventory.Add(book, 3); inventory.Remove("book", 1); assertEquals(2, inventory.GetByItemCode("book").getAmount()); } @Test void removeRestoresCapacity() { inventory.Add(book, 2); // uses 6 inventory.Remove("book", 1); // frees 3 assertEquals(17, inventory.GetRemainingCapacity()); } @Test void removeEntireStackCleansUpEntry() { inventory.Add(book, 1); inventory.Remove("book", 1); assertNull(inventory.GetByItemCode("book")); } @Test void removeMoreThanStackRemovesAll() { inventory.Add(book, 2); inventory.Remove("book", 10); assertNull(inventory.GetByItemCode("book")); } @Test void removeMissingCodeIsNoOp() { assertDoesNotThrow(() -> inventory.Remove("nonexistent", 1)); } @Test void removeFullyRestoresCapacityToInitial() { inventory.Add(book, 2); inventory.Remove("book", 2); assertEquals(20, inventory.GetRemainingCapacity()); } // ── GetByItemCode ───────────────────────────────────────────────── @Test void getByItemCodeReturnsNullForMissingItem() { assertNull(inventory.GetByItemCode("book")); } @Test void getByItemCodeReturnsCorrectStack() { inventory.Add(drink, 3); ItemStack stack = inventory.GetByItemCode("energy_drink"); assertNotNull(stack); assertEquals(3, stack.getAmount()); } // ── Capacity ────────────────────────────────────────────────────── @Test void getRemainingCapacityStartsAtMax() { assertEquals(20, inventory.GetRemainingCapacity()); } @Test void getCapacityReturnsInitialSize() { assertEquals(20, inventory.GetCapacity()); } // ── Empty ───────────────────────────────────────────────────────── @Test void emptyRemovesAllItems() { inventory.Add(book, 2); inventory.Add(drink, 1); inventory.Empty(); assertTrue(inventory.GetItems().isEmpty()); } @Test void emptyResetsUsedCapacity() { inventory.Add(book, 2); inventory.Empty(); assertEquals(20, inventory.GetRemainingCapacity()); } }