diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java index 3ad657e47..8fc59ea06 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/recipes/TurtleUpgradeRecipe.java @@ -111,7 +111,9 @@ public final class TurtleUpgradeRecipe extends CustomRecipe { itemTurtle.getUpgradeWithData(turtle, TurtleSide.RIGHT), }; - // Get the upgrades for the new items + // Get the upgrades for the new items. + // Note: because the turtle is facing towards us, the directions are flipped. Items placed to the left + // of the turtle, are equipped on its right (and vice versa). var items = new ItemStack[]{ rightItem, leftItem }; for (var i = 0; i < 2; i++) { if (!items[i].isEmpty()) { diff --git a/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/ItemStackMatcher.java b/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/ItemStackMatcher.java index dc6b50285..ace7d0cee 100644 --- a/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/ItemStackMatcher.java +++ b/projects/common/src/testFixtures/java/dan200/computercraft/test/shared/ItemStackMatcher.java @@ -29,7 +29,7 @@ public class ItemStackMatcher extends TypeSafeMatcher { @Override protected void describeMismatchSafely(ItemStack item, Description description) { - description.appendText("was ").appendValue(stack).appendValue(stack.getTag()); + description.appendText("was ").appendValue(item).appendValue(item.getTag()); } public static Matcher isStack(ItemStack stack) { diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt index 44a1a1755..c24126db2 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt @@ -29,6 +29,7 @@ import dan200.computercraft.shared.util.WaterloggableHelpers import dan200.computercraft.test.core.assertArrayEquals import dan200.computercraft.test.core.computer.LuaTaskContext import dan200.computercraft.test.core.computer.getApi +import dan200.computercraft.test.shared.ItemStackMatcher.isStack import net.minecraft.core.BlockPos import net.minecraft.gametest.framework.GameTest import net.minecraft.gametest.framework.GameTestHelper @@ -908,6 +909,83 @@ class Turtle_Test { thenWaitUntil { helper.assertContainerEmpty(BlockPos(2, 3, 2)) } } + /** + * Test that turtles can be crafted with upgrades. + */ + @GameTest(template = Structures.DEFAULT) + fun Can_upgrades_be_crafted(helper: GameTestHelper) = helper.immediate { + fun turtle(left: UpgradeData? = null, right: UpgradeData? = null): ItemStack = + ModRegistry.Items.TURTLE_NORMAL.get() + .create(-1, null, -1, left, right, 0, null) + + val pick = TurtleUpgrades.instance().get(ItemStack(Items.DIAMOND_PICKAXE))!! + val sword = TurtleUpgrades.instance().get(ItemStack(Items.DIAMOND_SWORD))!! + + // Check we can craft with upgrades + assertThat( + "Craft with item on left equips on right", + helper.craftItem( + ItemStack(Items.DIAMOND_PICKAXE), turtle(), ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ), + isStack(turtle(right = pick)), + ) + assertThat( + "Craft with item on right equips on left", + helper.craftItem( + ItemStack.EMPTY, turtle(), ItemStack(Items.DIAMOND_PICKAXE), + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ), + isStack(turtle(left = pick)), + ) + assertThat( + "Craft with two items", + helper.craftItem( + ItemStack(Items.DIAMOND_SWORD), turtle(), ItemStack(Items.DIAMOND_PICKAXE), + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ), + isStack(turtle(left = pick, right = sword)), + ) + assertThat( + "Maintains upgrades", + helper.craftItem( + ItemStack(Items.DIAMOND_SWORD), turtle(left = pick), ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ), + isStack(turtle(left = pick, right = sword)), + ) + + // Cannot craft when already have item + helper.assertNotCraftable( + ItemStack.EMPTY, turtle(left = sword), ItemStack(Items.DIAMOND_PICKAXE), + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ) + + // Cannot craft with an invalid upgrade + helper.assertNotCraftable( + ItemStack.EMPTY, turtle(), ItemStack(Items.DIRT), + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ) + + // Cannot craft with extra items in the inventory + helper.assertNotCraftable( + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack(Items.DIRT), + ItemStack.EMPTY, turtle(), ItemStack(Items.DIAMOND_PICKAXE), + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ) + helper.assertNotCraftable( + ItemStack.EMPTY, turtle(), ItemStack(Items.DIAMOND_PICKAXE), + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack(Items.DIRT), + ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, + ) + } + /** * Render turtles as an item. */