Add linking game tests
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-09-21 08:32:18 -04:00
1 parent 5a9a13f35c
commit b6f321e6cb
5 files changed
+86 -2

No files matched your search

@@ -0,0 +1,78 @@
package net.dnorberg.rivencraft.gametest;
import net.dnorberg.rivencraft.Rivencraft;
import net.dnorberg.rivencraft.book.LinkTarget;
import net.dnorberg.rivencraft.book.LinkingService;
import net.dnorberg.rivencraft.registry.ModDataComponents;
import net.dnorberg.rivencraft.registry.ModItems;
import net.minecraft.core.BlockPos;
import net.minecraft.core.GlobalPos;
import net.minecraft.gametest.framework.GameTest;
import net.minecraft.gametest.framework.GameTestHelper;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Blocks;
import net.neoforged.neoforge.gametest.GameTestHolder;
import net.neoforged.neoforge.gametest.PrefixGameTestTemplate;
/** Server-side regression coverage for persistent linking-book data and travel safety. */
@GameTestHolder(Rivencraft.MOD_ID)
@PrefixGameTestTemplate(false)
public final class LinkingGameTests {
private static final BlockPos ORIGIN = new BlockPos(0, 1, 0);
private LinkingGameTests() {
}
@GameTest(template = "empty")
public static void linkTargetSurvivesItemSerialization(GameTestHelper helper) {
LinkTarget expected = new LinkTarget(
GlobalPos.of(helper.getLevel().dimension(), helper.absolutePos(ORIGIN)),
127.5F,
-31.25F
);
ItemStack book = new ItemStack(ModItems.LINKING_BOOK.get());
book.set(ModDataComponents.LINK_TARGET.get(), expected);
CompoundTag serialized = (CompoundTag) book.saveOptional(helper.getLevel().registryAccess());
ItemStack restored = ItemStack.parseOptional(helper.getLevel().registryAccess(), serialized);
helper.assertValueEqual(restored.get(ModDataComponents.LINK_TARGET.get()), expected,
"A Linking Book must retain its dimension, position, and orientation after serialization");
helper.succeed();
}
@GameTest(template = "empty")
public static void travelUsesRecordedSafePosition(GameTestHelper helper) {
helper.setBlock(ORIGIN.below(), Blocks.STONE);
BlockPos destination = helper.absolutePos(ORIGIN);
ServerPlayer player = helper.makeMockServerPlayerInLevel();
LinkTarget target = new LinkTarget(GlobalPos.of(helper.getLevel().dimension(), destination), 90.0F, 15.0F);
LinkingService.LinkResult result = LinkingService.travel(player, target);
helper.assertValueEqual(result, LinkingService.LinkResult.SUCCESS,
"A Linking Book must travel to a clear location with a sturdy floor");
helper.assertTrue(player.level() == helper.getLevel(), "Travel must remain in the recorded dimension");
helper.assertTrue(Math.abs(player.getYRot() - 90.0F) < 0.01F && Math.abs(player.getXRot() - 15.0F) < 0.01F,
"Travel must restore the recorded orientation");
helper.succeed();
}
@GameTest(template = "empty")
public static void travelRejectsBlockedDestination(GameTestHelper helper) {
BlockPos absoluteOrigin = helper.absolutePos(ORIGIN);
for (BlockPos position : BlockPos.betweenClosed(
absoluteOrigin.offset(-4, -2, -4), absoluteOrigin.offset(4, 2, 4))) {
helper.getLevel().setBlockAndUpdate(position, Blocks.STONE.defaultBlockState());
}
ServerPlayer player = helper.makeMockServerPlayerInLevel();
LinkTarget target = new LinkTarget(GlobalPos.of(helper.getLevel().dimension(), absoluteOrigin), 0.0F, 0.0F);
helper.assertValueEqual(LinkingService.travel(player, target), LinkingService.LinkResult.NO_SAFE_DESTINATION,
"Linking must fail rather than placing a player inside a blocked destination");
helper.succeed();
}
}