mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 05:33:00 +00:00 
			
		
		
		
	Fix printout crafting
Introduced by the previous commit — I'd made one of the checks too lax. Add some tests for this, so it doesn't happen again, though this code does get a complete rewrite in 1.21 anyway >_>.
This commit is contained in:
		| @@ -58,7 +58,7 @@ public final class PrintoutRecipe extends CustomRecipe { | |||||||
|             for (var x = 0; x < inventory.getWidth(); x++) { |             for (var x = 0; x < inventory.getWidth(); x++) { | ||||||
|                 var stack = inventory.getItem(x + y * inventory.getWidth()); |                 var stack = inventory.getItem(x + y * inventory.getWidth()); | ||||||
|                 if (!stack.isEmpty()) { |                 if (!stack.isEmpty()) { | ||||||
|                     if (!stack.is(ModRegistry.Items.PRINTED_BOOK.get())) { |                     if (stack.is(ModRegistry.Items.PRINTED_PAGE.get()) || stack.is(ModRegistry.Items.PRINTED_PAGES.get())) { | ||||||
|                         if (printouts == null) printouts = new ItemStack[9]; |                         if (printouts == null) printouts = new ItemStack[9]; | ||||||
|                         printouts[numPrintouts] = stack; |                         printouts[numPrintouts] = stack; | ||||||
|                         numPages += PrintoutItem.getPageCount(stack); |                         numPages += PrintoutItem.getPageCount(stack); | ||||||
|   | |||||||
| @@ -27,6 +27,11 @@ public class ItemStackMatcher extends TypeSafeMatcher<ItemStack> { | |||||||
|         description.appendValue(stack).appendValue(stack.getTag()); |         description.appendValue(stack).appendValue(stack.getTag()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void describeMismatchSafely(ItemStack item, Description description) { | ||||||
|  |         description.appendText("was ").appendValue(stack).appendValue(stack.getTag()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public static Matcher<ItemStack> isStack(ItemStack stack) { |     public static Matcher<ItemStack> isStack(ItemStack stack) { | ||||||
|         return new ItemStackMatcher(stack); |         return new ItemStackMatcher(stack); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -5,9 +5,17 @@ | |||||||
| package dan200.computercraft.gametest | package dan200.computercraft.gametest | ||||||
| 
 | 
 | ||||||
| import dan200.computercraft.gametest.api.* | import dan200.computercraft.gametest.api.* | ||||||
|  | import dan200.computercraft.shared.ModRegistry | ||||||
|  | import dan200.computercraft.shared.media.items.PrintoutItem | ||||||
|  | import dan200.computercraft.test.shared.ItemStackMatcher.isStack | ||||||
|  | import net.minecraft.gametest.framework.GameTest | ||||||
| import net.minecraft.gametest.framework.GameTestGenerator | import net.minecraft.gametest.framework.GameTestGenerator | ||||||
| import net.minecraft.gametest.framework.GameTestHelper | import net.minecraft.gametest.framework.GameTestHelper | ||||||
| import net.minecraft.gametest.framework.TestFunction | import net.minecraft.gametest.framework.TestFunction | ||||||
|  | import net.minecraft.world.item.ItemStack | ||||||
|  | import net.minecraft.world.item.Items | ||||||
|  | import org.hamcrest.MatcherAssert.assertThat | ||||||
|  | import org.junit.jupiter.api.Assertions.assertEquals | ||||||
| 
 | 
 | ||||||
| class Printout_Test { | class Printout_Test { | ||||||
|     /** |     /** | ||||||
| @@ -56,4 +64,52 @@ class Printout_Test { | |||||||
| 
 | 
 | ||||||
|         thenExecute { helper.level.dayTime = Times.NOON } |         thenExecute { helper.level.dayTime = Times.NOON } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     @GameTest(template = "default") | ||||||
|  |     fun Craft_pages(helper: GameTestHelper) = helper.immediate { | ||||||
|  |         // Assert that crafting with only one page fails | ||||||
|  |         helper.assertNotCraftable(ItemStack(ModRegistry.Items.PRINTED_PAGE.get()), ItemStack(Items.STRING)) | ||||||
|  | 
 | ||||||
|  |         // Assert that crafting with no pages fails | ||||||
|  |         helper.assertNotCraftable(ItemStack(Items.PAPER), ItemStack(Items.PAPER), ItemStack(Items.STRING)) | ||||||
|  | 
 | ||||||
|  |         // Assert that crafting with a book fails | ||||||
|  |         helper.assertNotCraftable(ItemStack(ModRegistry.Items.PRINTED_PAGE.get()), ItemStack(ModRegistry.Items.PRINTED_BOOK.get()), ItemStack(Items.STRING)) | ||||||
|  | 
 | ||||||
|  |         assertThat( | ||||||
|  |             helper.craftItem( | ||||||
|  |                 PrintoutItem.createSingleFromTitleAndText("First", createPagesOf(' '), createPagesOf('b')), | ||||||
|  |                 PrintoutItem.createMultipleFromTitleAndText("Second", createPagesOf(' '), createPagesOf('b')), | ||||||
|  |                 ItemStack(Items.STRING), | ||||||
|  |             ), | ||||||
|  |             isStack(PrintoutItem.createMultipleFromTitleAndText("First", createPagesOf(' ', 2), createPagesOf('b', 2))), | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @GameTest(template = "default") | ||||||
|  |     fun Craft_book(helper: GameTestHelper) = helper.immediate { | ||||||
|  |         // Assert that crafting with no pages fails | ||||||
|  |         helper.assertNotCraftable(ItemStack(Items.PAPER), ItemStack(Items.PAPER), ItemStack(Items.STRING), ItemStack(Items.LEATHER)) | ||||||
|  | 
 | ||||||
|  |         // Assert that crafting with only one page works | ||||||
|  |         assertEquals( | ||||||
|  |             ModRegistry.Items.PRINTED_BOOK.get(), | ||||||
|  |             helper.craftItem(ItemStack(ModRegistry.Items.PRINTED_PAGE.get()), ItemStack(Items.STRING), ItemStack(Items.LEATHER)).item, | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         assertThat( | ||||||
|  |             helper.craftItem( | ||||||
|  |                 PrintoutItem.createSingleFromTitleAndText("First", createPagesOf(' '), createPagesOf('b')), | ||||||
|  |                 PrintoutItem.createMultipleFromTitleAndText("Second", createPagesOf(' '), createPagesOf('b')), | ||||||
|  |                 ItemStack(Items.STRING), | ||||||
|  |                 ItemStack(Items.LEATHER), | ||||||
|  |             ), | ||||||
|  |             isStack(PrintoutItem.createBookFromTitleAndText("First", createPagesOf(' ', 2), createPagesOf('b', 2))), | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun createPagesOf(c: Char, pages: Int = 1): Array<String> { | ||||||
|  |         val line = c.toString().repeat(PrintoutItem.LINE_MAX_LENGTH) | ||||||
|  |         return Array(PrintoutItem.LINES_PER_PAGE * pages) { line } | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,20 +6,18 @@ package dan200.computercraft.gametest | |||||||
| 
 | 
 | ||||||
| import com.mojang.authlib.GameProfile | import com.mojang.authlib.GameProfile | ||||||
| import dan200.computercraft.gametest.api.Structures | import dan200.computercraft.gametest.api.Structures | ||||||
|  | import dan200.computercraft.gametest.api.craftItem | ||||||
| import dan200.computercraft.gametest.api.sequence | import dan200.computercraft.gametest.api.sequence | ||||||
| import dan200.computercraft.shared.ModRegistry | import dan200.computercraft.shared.ModRegistry | ||||||
| import net.minecraft.gametest.framework.GameTest | import net.minecraft.gametest.framework.GameTest | ||||||
| import net.minecraft.gametest.framework.GameTestAssertException |  | ||||||
| import net.minecraft.gametest.framework.GameTestHelper | import net.minecraft.gametest.framework.GameTestHelper | ||||||
| import net.minecraft.nbt.CompoundTag | import net.minecraft.nbt.CompoundTag | ||||||
| import net.minecraft.nbt.NbtUtils | import net.minecraft.nbt.NbtUtils | ||||||
| import net.minecraft.world.entity.player.Player | import net.minecraft.world.entity.player.Player | ||||||
| import net.minecraft.world.inventory.AbstractContainerMenu | import net.minecraft.world.inventory.AbstractContainerMenu | ||||||
| import net.minecraft.world.inventory.MenuType | import net.minecraft.world.inventory.MenuType | ||||||
| import net.minecraft.world.inventory.TransientCraftingContainer |  | ||||||
| import net.minecraft.world.item.ItemStack | import net.minecraft.world.item.ItemStack | ||||||
| import net.minecraft.world.item.Items | import net.minecraft.world.item.Items | ||||||
| import net.minecraft.world.item.crafting.RecipeType |  | ||||||
| import org.junit.jupiter.api.Assertions.assertEquals | import org.junit.jupiter.api.Assertions.assertEquals | ||||||
| import java.util.* | import java.util.* | ||||||
| 
 | 
 | ||||||
| @@ -32,15 +30,10 @@ class Recipe_Test { | |||||||
|     @GameTest(template = Structures.DEFAULT) |     @GameTest(template = Structures.DEFAULT) | ||||||
|     fun Craft_result_has_nbt(context: GameTestHelper) = context.sequence { |     fun Craft_result_has_nbt(context: GameTestHelper) = context.sequence { | ||||||
|         thenExecute { |         thenExecute { | ||||||
|             val container = TransientCraftingContainer(DummyMenu, 3, 3) |             val result = context.craftItem( | ||||||
|             container.setItem(0, ItemStack(Items.SKELETON_SKULL)) |                 ItemStack(Items.SKELETON_SKULL), | ||||||
|             container.setItem(1, ItemStack(ModRegistry.Items.COMPUTER_ADVANCED.get())) |                 ItemStack(ModRegistry.Items.COMPUTER_ADVANCED.get()), | ||||||
| 
 |             ) | ||||||
|             val recipe = context.level.server.recipeManager |  | ||||||
|                 .getRecipeFor(RecipeType.CRAFTING, container, context.level) |  | ||||||
|                 .orElseThrow { GameTestAssertException("No recipe matches") } |  | ||||||
| 
 |  | ||||||
|             val result = recipe.assemble(container, context.level.registryAccess()) |  | ||||||
| 
 | 
 | ||||||
|             val profile = GameProfile(UUID.fromString("f3c8d69b-0776-4512-8434-d1b2165909eb"), "dan200") |             val profile = GameProfile(UUID.fromString("f3c8d69b-0776-4512-8434-d1b2165909eb"), "dan200") | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ | |||||||
| package dan200.computercraft.gametest.api | package dan200.computercraft.gametest.api | ||||||
| 
 | 
 | ||||||
| import dan200.computercraft.api.peripheral.IPeripheral | import dan200.computercraft.api.peripheral.IPeripheral | ||||||
|  | import dan200.computercraft.gametest.Recipe_Test.DummyMenu | ||||||
| import dan200.computercraft.gametest.core.ManagedComputers | import dan200.computercraft.gametest.core.ManagedComputers | ||||||
| import dan200.computercraft.mixin.gametest.GameTestHelperAccessor | import dan200.computercraft.mixin.gametest.GameTestHelperAccessor | ||||||
| import dan200.computercraft.mixin.gametest.GameTestInfoAccessor | import dan200.computercraft.mixin.gametest.GameTestInfoAccessor | ||||||
| @@ -22,9 +23,11 @@ import net.minecraft.world.Container | |||||||
| import net.minecraft.world.InteractionHand | import net.minecraft.world.InteractionHand | ||||||
| import net.minecraft.world.entity.Entity | import net.minecraft.world.entity.Entity | ||||||
| import net.minecraft.world.entity.EntityType | import net.minecraft.world.entity.EntityType | ||||||
|  | import net.minecraft.world.inventory.TransientCraftingContainer | ||||||
| import net.minecraft.world.item.Item | import net.minecraft.world.item.Item | ||||||
| import net.minecraft.world.item.ItemStack | import net.minecraft.world.item.ItemStack | ||||||
| import net.minecraft.world.item.context.UseOnContext | import net.minecraft.world.item.context.UseOnContext | ||||||
|  | import net.minecraft.world.item.crafting.RecipeType | ||||||
| import net.minecraft.world.level.block.Blocks | import net.minecraft.world.level.block.Blocks | ||||||
| import net.minecraft.world.level.block.entity.BarrelBlockEntity | import net.minecraft.world.level.block.entity.BarrelBlockEntity | ||||||
| import net.minecraft.world.level.block.entity.BlockEntity | import net.minecraft.world.level.block.entity.BlockEntity | ||||||
| @@ -343,6 +346,32 @@ fun GameTestHelper.placeItemAt(stack: ItemStack, pos: BlockPos, direction: Direc | |||||||
|     stack.useOn(UseOnContext(player, InteractionHand.MAIN_HAND, hit)) |     stack.useOn(UseOnContext(player, InteractionHand.MAIN_HAND, hit)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * Assert a recipe is not craftable. | ||||||
|  |  */ | ||||||
|  | fun GameTestHelper.assertNotCraftable(vararg items: ItemStack) { | ||||||
|  |     val container = TransientCraftingContainer(DummyMenu, 3, 3) | ||||||
|  |     for ((i, item) in items.withIndex()) container.setItem(i, item) | ||||||
|  | 
 | ||||||
|  |     val recipe = level.server.recipeManager.getRecipeFor(RecipeType.CRAFTING, container, level) | ||||||
|  | 
 | ||||||
|  |     if (recipe.isPresent) fail("Expected no recipe to match $items") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Attempt to craft an item. | ||||||
|  |  */ | ||||||
|  | fun GameTestHelper.craftItem(vararg items: ItemStack): ItemStack { | ||||||
|  |     val container = TransientCraftingContainer(DummyMenu, 3, 3) | ||||||
|  |     for ((i, item) in items.withIndex()) container.setItem(i, item) | ||||||
|  | 
 | ||||||
|  |     val recipe = level.server.recipeManager | ||||||
|  |         .getRecipeFor(RecipeType.CRAFTING, container, level) | ||||||
|  |         .orElseThrow { GameTestAssertException("No recipe matches $items") } | ||||||
|  | 
 | ||||||
|  |     return recipe.assemble(container, level.registryAccess()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Run a function multiple times until it succeeds. |  * Run a function multiple times until it succeeds. | ||||||
|  */ |  */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jonathan Coates
					Jonathan Coates