diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index 552b3f7663b..11ded940331 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -69,6 +69,7 @@ import lombok.Setter; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; +import org.jetbrains.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Collections; @@ -249,7 +250,8 @@ private void refundAll(ClickData clickData) { } } - private void onPatternChange(int index) { + @VisibleForTesting + public void onPatternChange(int index) { if (isRemote()) return; // remove old if applicable diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java index cd8c41f40c4..3ea3611e07b 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -2,11 +2,16 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.cover.detector.AdvancedFluidDetectorCover; import com.gregtechceu.gtceu.common.cover.detector.AdvancedItemDetectorCover; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.gametest.util.TestUtils; +import com.gregtechceu.gtceu.utils.RedstoneUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -14,6 +19,7 @@ import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; @@ -52,13 +58,20 @@ public static void testAdvancedActivityDetectorCoverWithActivity(GameTestHelper @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedActivityDetectorCoverWithoutActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); + SimpleTieredMachine machine = ((SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); - helper.runAtTickTime(20 - machine.getOffsetTimer() % 20, () -> helper.pullLever(2, 2, 2)); - helper.runAtTickTime(45 - machine.getOffsetTimer() % 20, () -> { - TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)); - helper.succeed(); + int offset = (int) (machine.getOffsetTimer() % 20L); + helper.runAtTickTime(20 - offset, () -> { + // Stop the fluid input + helper.pullLever(2, 2, 2); + // Also clear out the tank + NotifiableFluidTank tank = (NotifiableFluidTank) machine + .getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP).get(0); + tank.setFluidInTank(0, FluidStack.EMPTY); }); + // 20 ticks for the cover to update, 11 ticks for the recipe to finish, 1 tick for the cover to update + helper.runAtTickTime(52 - offset, + () -> helper.succeedWhen(() -> TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)))); } @GameTest(template = "electrolyzer", batch = "coverTests") @@ -70,10 +83,25 @@ public static void testAdvancedFluidDetectorCover(GameTestHelper helper) { cover.setMaxValue(100000); cover.setMinValue(1); cover.setLatched(false); - // At t=80, 21k will be inside, giving a redstone value of 2 or 3 - helper.runAtTickTime(81, () -> { - TestUtils.assertRedstone(helper, new BlockPos(0, 2, 1), 2, 3); - TestUtils.assertLampOn(helper, new BlockPos(0, 2, 1)); + MutableInt expected = new MutableInt(); + int offset = (int) (machine.getOffsetTimer() % 20L); + helper.runAtTickTime(80 - offset, () -> { + // Actually pull in the value at the time, since offset might change the amount + var handler = machine.getFluidHandlerCap(null, false); + long storedFluid = 0; + for (int tank = 0; tank < handler.getTanks(); tank++) { + storedFluid += handler.getFluidInTank(tank).getAmount(); + } + expected.setValue(RedstoneUtil.computeRedstoneBetweenValues(storedFluid, + cover.getMaxValue(), cover.getMinValue(), cover.isInverted())); + }); + + helper.runAtTickTime(81 - offset, () -> { + int value = expected.intValue(); + TestUtils.assertRedstoneEither(helper, new BlockPos(0, 2, 1), + value, + Math.max(0, value - 1), + Math.min(15, value + 1)); helper.succeed(); }); } diff --git a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java index 58157ff6a08..0c5e440bec9 100644 --- a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java +++ b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java @@ -83,6 +83,8 @@ private static BusHolder getBussesAndForm(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferNormalInputBusTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.inputBus1.getInventory().setStackInSlot(0, new ItemStack(Blocks.COBBLESTONE)); helper.succeedWhen(() -> { helper.assertTrue( @@ -97,6 +99,8 @@ public static void patternBufferNormalInputBusTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferBasicRequestTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug IGrid grid = busHolder.patternBuffer.getGrid(); @@ -139,6 +143,8 @@ public static void patternBufferBasicRequestTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferDistinctDoesNothingTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.patternBuffer.setDistinct(true); IGrid grid = busHolder.patternBuffer.getGrid(); @@ -182,6 +188,8 @@ public static void patternBufferDistinctDoesNothingTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferDyeingDoesNothingTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.patternBuffer.setPaintingColor(0xff); IGrid grid = busHolder.patternBuffer.getGrid(); diff --git a/src/test/resources/data/gtceu/structures/patternbuffertest.nbt b/src/test/resources/data/gtceu/structures/patternbuffertest.nbt index 2727a885a69..89f73cf8894 100644 Binary files a/src/test/resources/data/gtceu/structures/patternbuffertest.nbt and b/src/test/resources/data/gtceu/structures/patternbuffertest.nbt differ