package cz.davza.studentadventure.objects; import cz.davza.studentadventure.Items.Book; import cz.davza.studentadventure.Items.EnergyDrink; import cz.davza.studentadventure.Items.StickyNote; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; /** * Tests ItemCollectionBase behaviour through PlayerInventory. * Inventory capacity = 20 bulk units. * Book bulk = 3, EnergyDrink bulk = 2, StickyNote bulk = 1. */ class ItemCollectionBaseTest { private PlayerInventory inventory; @BeforeEach void setUp() { inventory = new PlayerInventory(20); } // ── Add ────────────────────────────────────────────────────────────────── @Test void addItemIncreasesUsedCapacity() { inventory.Add(new Book(), 1); assertEquals(20 - 3, inventory.GetRemainingCapacity()); } @Test void addMultipleItemsStackUnderSameKey() { inventory.Add(new Book(), 2); ItemStack stack = inventory.GetByItemCode("book"); assertNotNull(stack); assertEquals(2, stack.getAmount()); } @Test void addReturnsZeroWhenAllFit() { int leftOver = inventory.Add(new Book(), 2); // costs 6 bulk, capacity 20 assertEquals(0, leftOver); } @Test void addReturnsLeftoverWhenCapacityExceeded() { // capacity 20, book bulk 3 → can fit 6 books (18 bulk), 7th won't fit int leftOver = inventory.Add(new Book(), 7); assertEquals(1, leftOver); } @Test void addToExistingStackMergesCorrectly() { inventory.Add(new Book(), 2); inventory.Add(new Book(), 1); ItemStack stack = inventory.GetByItemCode("book"); assertEquals(3, stack.getAmount()); } @Test void addZeroBulkItemAlwaysFits() { // StickyNote has bulk 1 actually — test with a full inventory of high-bulk items // fill to 18 bulk (6 books), then add sticky note (bulk 1) — still 2 bulk remaining inventory.Add(new Book(), 6); int leftOver = inventory.Add(new StickyNote("test"), 1); assertEquals(0, leftOver); } // ── Remove ─────────────────────────────────────────────────────────────── @Test void removeDecreasesStackAmount() { inventory.Add(new Book(), 3); inventory.Remove("book", 1); assertEquals(2, inventory.GetByItemCode("book").getAmount()); } @Test void removeDecrementsUsedCapacity() { inventory.Add(new Book(), 2); // 6 bulk used inventory.Remove("book", 1); // 3 bulk freed assertEquals(20 - 3, inventory.GetRemainingCapacity()); } @Test void removeEntireStackClearsEntry() { inventory.Add(new Book(), 2); inventory.Remove("book", 2); assertNull(inventory.GetByItemCode("book")); } @Test void removeMoreThanStackSizeClearsEntry() { inventory.Add(new Book(), 1); inventory.Remove("book", 99); assertNull(inventory.GetByItemCode("book")); } @Test void removeNonExistentCodeDoesNotThrow() { assertDoesNotThrow(() -> inventory.Remove("nonexistent", 1)); } @Test void removeRestoresCapacityCorrectly() { inventory.Add(new EnergyDrink(), 3); // 6 bulk used inventory.Remove("energy_drink", 3); // all removed assertEquals(20, inventory.GetRemainingCapacity()); } // ── GetByItemCode ──────────────────────────────────────────────────────── @Test void getByItemCodeReturnsNullWhenNotPresent() { assertNull(inventory.GetByItemCode("book")); } @Test void getByItemCodeReturnsCorrectStack() { inventory.Add(new Book(), 2); ItemStack stack = inventory.GetByItemCode("book"); assertNotNull(stack); assertEquals("book", stack.getItem().getCode()); } // ── Capacity ───────────────────────────────────────────────────────────── @Test void remainingCapacityStartsAtFullCapacity() { assertEquals(20, inventory.GetRemainingCapacity()); } @Test void capacityReturnsConfiguredMax() { assertEquals(20, inventory.GetCapacity()); } // ── Empty ──────────────────────────────────────────────────────────────── @Test void emptyClearsAllItems() { inventory.Add(new Book(), 2); inventory.Add(new EnergyDrink(), 1); inventory.Empty(); assertNull(inventory.GetByItemCode("book")); assertNull(inventory.GetByItemCode("energy_drink")); } @Test void emptyResetsUsedCapacity() { inventory.Add(new Book(), 3); inventory.Empty(); assertEquals(20, inventory.GetRemainingCapacity()); } // ── GetItems ───────────────────────────────────────────────────────────── @Test void getItemsReturnsOnlyOccupiedEntries() { inventory.Add(new Book(), 1); inventory.Add(new EnergyDrink(), 1); assertEquals(2, inventory.GetItems().size()); } @Test void getItemsIsEmptyWhenInventoryEmpty() { assertTrue(inventory.GetItems().isEmpty()); } }