From f8142fe7b0b590ab4c230c462e20d3210efa0a84 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sun, 13 Sep 2026 14:11:13 +0200 Subject: [PATCH] test: extend coverage of testSlotAction --- tests/testSlotAction.cpp | 157 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/tests/testSlotAction.cpp b/tests/testSlotAction.cpp index 5c189b1..f17e8fa 100644 --- a/tests/testSlotAction.cpp +++ b/tests/testSlotAction.cpp @@ -311,3 +311,160 @@ VF_TEST(aNumberKeyRespectsTheTargetSlotsFilter) { int hotbar = session.menu.layout().hotbarFirst; int fuel = session.menu.slotsWithRole(MenuSlot::Role::FuelInput)[0]; + session.menu.slot(hotbar).cell.stack = makeStack(ItemId::Stone, 4); + CHECK(!session.hotbar(fuel, 0).applied); + CHECK_EQ(session.menu.stackAt(hotbar).count, 4); + + session.menu.slot(hotbar + 1).cell.stack = makeStack(ItemId::Planks, 4); + CHECK(session.hotbar(fuel, 1).applied); + CHECK_EQ(session.menu.stackAt(fuel).count, 4); +} + +VF_TEST(aNumberKeyOnTheResultSlotCraftsIntoAnEmptyHotbarSlot) { + Session session(MenuKind::CraftingTable); + CraftingView grid = session.menu.crafting(); + grid.input(0, 0) = makeStack(ItemId::Wood, 3); + grid.refresh(); + + int hotbar = session.menu.layout().hotbarFirst; + SlotActionResult crafted = session.hotbar(session.menu.layout().resultSlot, 0); + CHECK(crafted.applied); + CHECK(crafted.craftedResult); + CHECK_EQ(session.menu.stackAt(hotbar).count, 4); + CHECK(session.menu.stackAt(hotbar).item == ItemId::Planks); + CHECK_EQ(grid.input(0, 0).count, 2); + + // The second attempt finds the hotbar slot occupied and refuses. + CHECK(!session.hotbar(session.menu.layout().resultSlot, 0).applied); + CHECK_EQ(grid.input(0, 0).count, 2); +} + +VF_TEST(theMiddleClickOnlyClonesInCreativeMode) { + Session survival(MenuKind::Chest); + survival.menu.slot(0).cell.stack = makeStack(ItemId::Stone, 3); + SlotActionResult nothing = survival.click(ClickKind::Middle, 0); + CHECK(!nothing.applied); + CHECK_EQ(nothing.created, 0); + CHECK(survival.cursor.empty()); + + Session creative(MenuKind::Chest); + creative.menu.setCreativeMode(true); + creative.menu.slot(0).cell.stack = makeStack(ItemId::Stone, 3); + SlotActionResult cloned = creative.click(ClickKind::Middle, 0); + CHECK(cloned.applied); + CHECK_EQ(cloned.created, 64); + CHECK_EQ(creative.cursor.held.count, 64); + CHECK_EQ(creative.menu.stackAt(0).count, 3); + + // A full cursor blocks the clone. + CHECK(!creative.click(ClickKind::Middle, 0).applied); +} + +VF_TEST(aDoubleClickGathersEveryMatchingStackOntoTheCursor) { + Session session(MenuKind::Chest); + session.menu.slot(0).cell.stack = makeStack(ItemId::Sand, 10); + session.menu.slot(1).cell.stack = makeStack(ItemId::Sand, 64); + session.menu.slot(2).cell.stack = makeStack(ItemId::Sand, 5); + session.menu.slot(3).cell.stack = makeStack(ItemId::Stone, 20); + + session.click(ClickKind::Left, 0); + CHECK_EQ(session.cursor.held.count, 10); + + SlotActionResult gathered = session.click(ClickKind::Double, 0); + CHECK(gathered.applied); + CHECK_EQ(session.cursor.held.count, 64); + // The partial stack goes first, the full one only tops up the rest. + CHECK(session.menu.stackAt(2).empty()); + CHECK_EQ(session.menu.stackAt(1).count, 15); + CHECK_EQ(session.menu.stackAt(3).count, 20); + + CHECK(!session.click(ClickKind::Double, 0).applied); +} + +VF_TEST(aDoubleClickWithAnEmptyCursorDoesNothing) { + Session session(MenuKind::Chest); + session.menu.slot(0).cell.stack = makeStack(ItemId::Sand, 10); + CHECK(!session.click(ClickKind::Double, 0).applied); + CHECK_EQ(session.menu.stackAt(0).count, 10); +} + +VF_TEST(aDoubleClickNeverPullsOutOfAResultSlot) { + Session session(MenuKind::CraftingTable); + CraftingView grid = session.menu.crafting(); + grid.input(0, 0) = makeStack(ItemId::Wood, 1); + grid.refresh(); + + int hotbar = session.menu.layout().hotbarFirst; + session.menu.slot(hotbar).cell.stack = makeStack(ItemId::Planks, 2); + session.click(ClickKind::Left, hotbar); + CHECK_EQ(session.cursor.held.count, 2); + + session.click(ClickKind::Double, hotbar); + CHECK_EQ(session.cursor.held.count, 2); + CHECK_EQ(session.menu.stackAt(session.menu.layout().resultSlot).count, 4); +} + +VF_TEST(aLeftDragSplitsEvenlyAndKeepsTheRemainderOnTheCursor) { + Session session(MenuKind::Chest); + session.menu.slot(0).cell.stack = makeStack(ItemId::Stone, 10); + session.click(ClickKind::Left, 0); + + CHECK(session.click(ClickKind::DragLeftStart, 1).applied); + CHECK(session.click(ClickKind::DragLeftAdd, 2).applied); + CHECK(session.click(ClickKind::DragLeftAdd, 3).applied); + CHECK(!session.click(ClickKind::DragLeftAdd, 3).applied); + + SlotActionResult released = session.click(ClickKind::DragLeftEnd, -1); + CHECK(released.applied); + CHECK_EQ(released.moved, 9); + CHECK_EQ(session.menu.stackAt(1).count, 3); + CHECK_EQ(session.menu.stackAt(2).count, 3); + CHECK_EQ(session.menu.stackAt(3).count, 3); + CHECK_EQ(session.cursor.held.count, 1); + CHECK(!session.drag.active); +} + +VF_TEST(aRightDragLeavesExactlyOneItemPerPaintedSlot) { + Session session(MenuKind::Chest); + session.menu.slot(0).cell.stack = makeStack(ItemId::Apple, 8); + session.click(ClickKind::Left, 0); + + session.click(ClickKind::DragRightStart, 1); + session.click(ClickKind::DragRightAdd, 2); + session.click(ClickKind::DragRightAdd, 3); + SlotActionResult released = session.click(ClickKind::DragRightEnd, -1); + + CHECK(released.applied); + CHECK_EQ(released.moved, 3); + CHECK_EQ(session.menu.stackAt(1).count, 1); + CHECK_EQ(session.menu.stackAt(2).count, 1); + CHECK_EQ(session.menu.stackAt(3).count, 1); + CHECK_EQ(session.cursor.held.count, 5); +} + +VF_TEST(aDragSkipsSlotsThatWouldRefuseTheStackAnyway) { + Session session(MenuKind::Furnace); + int hotbar = session.menu.layout().hotbarFirst; + int fuel = session.menu.slotsWithRole(MenuSlot::Role::FuelInput)[0]; + int input = session.menu.slotsWithRole(MenuSlot::Role::SmeltInput)[0]; + + session.menu.slot(hotbar).cell.stack = makeStack(ItemId::Stone, 6); + session.click(ClickKind::Left, hotbar); + + session.click(ClickKind::DragLeftStart, hotbar + 1); + CHECK(!session.click(ClickKind::DragLeftAdd, fuel).applied); + CHECK(!session.click(ClickKind::DragLeftAdd, input).applied); + CHECK(session.click(ClickKind::DragLeftAdd, hotbar + 2).applied); + session.click(ClickKind::DragLeftEnd, -1); + + CHECK_EQ(session.menu.stackAt(hotbar + 1).count, 3); + CHECK_EQ(session.menu.stackAt(hotbar + 2).count, 3); + CHECK(session.menu.stackAt(fuel).empty()); + CHECK(session.cursor.empty()); +} + +VF_TEST(anAbandonedDragGivesEverythingBackToTheCursor) { + Session session(MenuKind::Chest); + session.menu.slot(0).cell.stack = makeStack(ItemId::Stone, 12); + session.click(ClickKind::Left, 0); +