From 7eb223fa7a206d3cd926db92aaa0ea01ea291fe1 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sat, 12 Sep 2026 18:25:13 +0200 Subject: [PATCH] test: extend coverage of testPortal --- tests/testPortal.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/tests/testPortal.cpp b/tests/testPortal.cpp index 2fd4d8a..0d72f86 100644 --- a/tests/testPortal.cpp +++ b/tests/testPortal.cpp @@ -318,3 +318,90 @@ VF_TEST(builtFrameCarvesItsOwnApproachOutOfTheTerrain) { for (int gz = 0; gz < 10; ++gz) world.setBlock(gx, gy, gz, Block::Netherrack); + PortalFrame frame; + frame.origin = {4, 42, 5}; + frame.width = 2; + frame.height = 3; + frame.alongX = true; + frame.dimension = DimensionId::Nether; + + CHECK(PortalScan::siteUsable(world, frame)); + PortalScan::buildFrame(world, frame); + + CHECK(PortalScan::intact(world, frame)); + CHECK(PortalScan::interiorClear(world, frame)); + CHECK_EQ(world.blockAt(4, 42, 4), Block::Air); + CHECK_EQ(world.blockAt(5, 42, 6), Block::Air); + CHECK_EQ(world.blockAt(4, 41, 4), Block::Obsidian); + CHECK_EQ(world.blockAt(4, 41, 6), Block::Obsidian); + CHECK_EQ(world.blockAt(0, 42, 0), Block::Netherrack); + CHECK_EQ(PortalScan::light(world, frame), 6); +} + +VF_TEST(bedrockMakesASiteUnusable) { + World world; + PortalFrame frame; + frame.origin = {0, 2, 0}; + frame.width = 2; + frame.height = 3; + frame.alongX = true; + + CHECK(PortalScan::siteUsable(world, frame)); + world.setBlock(0, 1, 0, Block::Bedrock); + CHECK(!PortalScan::siteUsable(world, frame)); +} + +VF_TEST(endPortalIgnitesOnlyOnceEveryEyeIsSeated) { + DimensionSet dimensions(121u); + PortalNetwork network(dimensions); + Vec3i center{40, 60, 40}; + + CHECK_EQ(network.buildEndFrame(DimensionId::End, center), PortalNetwork::endFrameSlots); + const World& world = dimensions.end().world(); + CHECK_EQ(world.blockAt(38, 60, 40), Block::EndPortalFrame); + CHECK_EQ(world.blockAt(40, 60, 42), Block::EndPortalFrame); + CHECK_EQ(world.blockAt(38, 60, 38), Block::Air); // corners stay empty + CHECK_EQ(world.blockAt(42, 60, 42), Block::Air); + CHECK_EQ(world.blockAt(40, 60, 40), Block::Air); + + const int offsetX[PortalNetwork::endFrameSlots] = {-2, -2, -2, 2, 2, 2, -1, 0, 1, -1, 0, 1}; + const int offsetZ[PortalNetwork::endFrameSlots] = {-1, 0, 1, -1, 0, 1, -2, -2, -2, 2, 2, 2}; + + for (int slot = 0; slot < PortalNetwork::endFrameSlots - 1; ++slot) { + Vec3i socket{center.x + offsetX[slot], center.y, center.z + offsetZ[slot]}; + CHECK(network.insertEndEye(DimensionId::End, socket)); + CHECK(network.hasEndEye(DimensionId::End, socket)); + CHECK_EQ(network.endEyeCount(DimensionId::End, center), slot + 1); + CHECK(!network.endFrameComplete(DimensionId::End, center)); + CHECK_EQ(world.blockAt(center.x, center.y, center.z), Block::Air); + } + + Vec3i last{center.x + offsetX[11], center.y, center.z + offsetZ[11]}; + CHECK(network.insertEndEye(DimensionId::End, last)); + CHECK(network.endFrameComplete(DimensionId::End, center)); + + int portalCells = 0; + for (int dx = -1; dx <= 1; ++dx) + for (int dz = -1; dz <= 1; ++dz) + if (world.blockAt(center.x + dx, center.y, center.z + dz) == Block::EndPortal) + ++portalCells; + CHECK_EQ(portalCells, 9); +} + +VF_TEST(endPortalEyesOnlyGoIntoRealFrameBlocks) { + DimensionSet dimensions(122u); + PortalNetwork network(dimensions); + Vec3i center{0, 50, 0}; + network.buildEndFrame(DimensionId::End, center); + + Vec3i socket{-2, 50, 0}; + CHECK(network.insertEndEye(DimensionId::End, socket)); + CHECK(!network.insertEndEye(DimensionId::End, socket)); + CHECK(!network.insertEndEye(DimensionId::End, {-2, 50, -2})); + CHECK(!network.insertEndEye(DimensionId::End, {9, 9, 9})); + CHECK_EQ(network.endEyeCount(DimensionId::End, center), 1); + + // The same socket in another dimension is a different socket entirely. + CHECK(!network.hasEndEye(DimensionId::Overworld, socket)); + CHECK(!network.activateEndPortal(DimensionId::End, center)); +}