diff --git a/gradle.properties b/gradle.properties index 790f341b..d3f9e9ea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,8 +14,8 @@ org.gradle.configuration-cache=true neogradle.subsystems.conventions.runs.enabled=false neogradle.subsystems.conventions.runs.create-default-run-per-type=false -neogradle.subsystems.parchment.minecraftVersion=1.20.6 -neogradle.subsystems.parchment.mappingsVersion=2024.05.01 +neoForge.parchment.minecraftVersion=1.20.6 +neoForge.parchment.mappingsVersion=2024.05.01 mod_id=compactmachines diff --git a/neoforge-main/build.gradle.kts b/neoforge-main/build.gradle.kts index 46fccd36..4b9bcc13 100644 --- a/neoforge-main/build.gradle.kts +++ b/neoforge-main/build.gradle.kts @@ -63,6 +63,11 @@ neoForge { this.dependency(coreApi) } + unitTest { + enable() + testedMod = mods.named(modId) + } + runs { // applies to all the run configs below configureEach { @@ -71,6 +76,8 @@ neoForge { // Recommended logging level for the console systemProperty("forge.logging.console.level", "debug") + sourceSet = project.sourceSets.main + if (!System.getenv().containsKey("CI")) { // JetBrains Runtime Hotswap // jvmArgument("-XX:+AllowEnhancedClassRedefinition") @@ -91,18 +98,28 @@ neoForge { programArguments.addAll("--height", "1080") } -// create("server") { -// systemProperty("forge.enabledGameTestNamespaces", modId) -// environmentVariables("CM_TEST_RESOURCES", project.file("src/test/resources").path) -// programArguments("nogui") -// modSource(project.sourceSets.test.get()) -// } -// -// create("gameTestServer") { -// systemProperty("forge.enabledGameTestNamespaces", modId) -// environmentVariable("CM_TEST_RESOURCES", file("src/test/resources").path) -// modSource(project.sourceSets.test.get()) -// } + create("server") { + server() + gameDirectory.set(file("runs/server")) + + systemProperty("forge.enabledGameTestNamespaces", modId) + programArgument("nogui") + + environment.put("CM_TEST_RESOURCES", file("src/test/resources").path) + + sourceSet = project.sourceSets.test + sourceSets.add(project.sourceSets.test.get()) + } + + create("gameTestServer") { + type = "gameTestServer" + + systemProperty("forge.enabledGameTestNamespaces", modId) + environment.put("CM_TEST_RESOURCES", file("src/test/resources").path) + + sourceSet = project.sourceSets.test + sourceSets.add(project.sourceSets.test.get()) + } } } @@ -153,11 +170,19 @@ dependencies { jarJar(libraries.feather) { isTransitive = false } } + testImplementation(neoforged.testframework) + testImplementation("org.junit.jupiter:junit-jupiter:5.7.1") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + // Mods // compileOnly(mods.bundles.jei) // compileOnly(mods.jade) } +tasks.withType { + useJUnitPlatform() +} + tasks.withType { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } diff --git a/neoforge-main/gradle.properties b/neoforge-main/gradle.properties deleted file mode 100644 index 89d64c59..00000000 --- a/neoforge-main/gradle.properties +++ /dev/null @@ -1,5 +0,0 @@ -# Dependencies and Libs -jei_mc_version=1.19.2 -jei_version=11.2.0.247 -#top_version=1.16-3.1.4-22 -curios_version=1.19.2-5.1.1.0 \ No newline at end of file diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/util/CompactGameTestHelper.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/CompactGameTestHelper.java similarity index 97% rename from tests-1.20/test/java/dev/compactmods/machines/test/util/CompactGameTestHelper.java rename to neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/CompactGameTestHelper.java index e2855528..b51ef084 100644 --- a/tests-1.20/test/java/dev/compactmods/machines/test/util/CompactGameTestHelper.java +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/CompactGameTestHelper.java @@ -1,4 +1,4 @@ -package dev.compactmods.machines.test.util; +package dev.compactmods.machines.test.gametest; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/CompactMachinesTest.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/CompactMachinesTest.java similarity index 70% rename from tests-1.20/test/java/dev/compactmods/machines/test/CompactMachinesTest.java rename to neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/CompactMachinesTest.java index 136fb6fa..6dff5fbb 100644 --- a/tests-1.20/test/java/dev/compactmods/machines/test/CompactMachinesTest.java +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/CompactMachinesTest.java @@ -1,18 +1,17 @@ -package dev.compactmods.machines.test; +package dev.compactmods.machines.test.gametest; -import dev.compactmods.machines.api.CompactMachinesApi; -import dev.compactmods.machines.api.room.CompactMachines.roomApi(); +import dev.compactmods.machines.api.CompactMachines; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.testframework.conf.Feature; import net.neoforged.testframework.conf.FrameworkConfiguration; -@Mod(CompactMachinesApi.MOD_ID) +@Mod(CompactMachines.MOD_ID) public class CompactMachinesTest { public CompactMachinesTest(ModContainer container, IEventBus modBus) { - final var config = FrameworkConfiguration.builder(CompactMachinesApi.modRL("tests")) + final var config = FrameworkConfiguration.builder(CompactMachines.modRL("tests")) .enable(Feature.GAMETEST) .build(); diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/ServerEventHandler.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/ServerEventHandler.java similarity index 92% rename from tests-1.20/test/java/dev/compactmods/machines/test/ServerEventHandler.java rename to neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/ServerEventHandler.java index 17d4c332..1ffee5f2 100644 --- a/tests-1.20/test/java/dev/compactmods/machines/test/ServerEventHandler.java +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/ServerEventHandler.java @@ -1,7 +1,7 @@ -package dev.compactmods.machines.test; +package dev.compactmods.machines.test.gametest; import com.google.common.collect.ImmutableSet; -import dev.compactmods.machines.api.CompactMachinesApi; +import dev.compactmods.machines.api.CompactMachines; import net.minecraft.server.MinecraftServer; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.repository.FolderRepositorySource; @@ -18,7 +18,7 @@ import java.nio.file.Path; import java.util.concurrent.ExecutionException; -@EventBusSubscriber(modid = CompactMachinesApi.MOD_ID) +@EventBusSubscriber(modid = CompactMachines.MOD_ID) public class ServerEventHandler { final static Logger LOG = LogManager.getLogger(); @@ -55,7 +55,7 @@ public static void onServerStarted(final ServerStartedEvent evt) { server.reloadResources(packs.getSelectedIds()).get(); server.getResourceManager() - .listResources("structures", rl -> rl.getNamespace().equals(CompactMachinesApi.MOD_ID)) + .listResources("structures", rl -> rl.getNamespace().equals(CompactMachines.MOD_ID)) .forEach((rl, res) -> LOG.debug(rl.toDebugFileName())); } catch (InterruptedException | ExecutionException e) { diff --git a/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/TestRoomApi.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/TestRoomApi.java new file mode 100644 index 00000000..7172db2e --- /dev/null +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/TestRoomApi.java @@ -0,0 +1,49 @@ +package dev.compactmods.machines.test.gametest; + +import com.google.common.base.Predicates; +import dev.compactmods.machines.api.room.IRoomApi; +import dev.compactmods.machines.api.room.registration.IRoomRegistrar; +import dev.compactmods.machines.api.room.spatial.IRoomChunkManager; +import dev.compactmods.machines.api.room.spatial.IRoomChunks; +import dev.compactmods.machines.api.room.spawn.IRoomSpawnManager; +import dev.compactmods.machines.room.RoomRegistrar; +import dev.compactmods.machines.room.spatial.GraphChunkManager; +import dev.compactmods.machines.room.spawn.RoomSpawnManagers; + +import java.util.function.Predicate; + +public class TestRoomApi { + + public static IRoomApi forTest() { + final var registrar = new RoomRegistrar(); + final var spawnManagers = new RoomSpawnManagers(registrar); + final var chunkManager = new GraphChunkManager(); + + return new IRoomApi() { + @Override + public Predicate roomCodeValidator() { + return Predicates.alwaysTrue(); + } + + @Override + public IRoomRegistrar registrar() { + return registrar; + } + + @Override + public IRoomSpawnManager spawnManager(String roomCode) { + return spawnManagers.get(roomCode); + } + + @Override + public IRoomChunkManager chunkManager() { + return chunkManager; + } + + @Override + public IRoomChunks chunks(String roomCode) { + return chunkManager.get(roomCode); + } + }; + } +} diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/data/PlayerHistoryTrackerTests.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/data/PlayerHistoryTrackerTests.java similarity index 87% rename from tests-1.20/test/java/dev/compactmods/machines/test/data/PlayerHistoryTrackerTests.java rename to neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/data/PlayerHistoryTrackerTests.java index bdf4efa1..dd98a01d 100644 --- a/tests-1.20/test/java/dev/compactmods/machines/test/data/PlayerHistoryTrackerTests.java +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/data/PlayerHistoryTrackerTests.java @@ -1,12 +1,11 @@ -package dev.compactmods.machines.test.data; +package dev.compactmods.machines.test.gametest.data; -import dev.compactmods.machines.api.CompactMachinesApi; -import dev.compactmods.machines.api.room.CompactMachines.roomApi(); +import dev.compactmods.machines.api.CompactMachines; import dev.compactmods.machines.api.room.history.RoomEntryPoint; import dev.compactmods.machines.player.PlayerEntryPointHistoryManager; import dev.compactmods.machines.api.room.history.RoomEntryResult; import dev.compactmods.machines.room.RoomCodeGenerator; -import dev.compactmods.machines.test.TestCompactMachines.roomApi(); +import dev.compactmods.machines.test.gametest.TestRoomApi; import net.minecraft.gametest.framework.GameTest; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.nbt.NbtOps; @@ -19,14 +18,14 @@ import java.util.stream.Collectors; @PrefixGameTestTemplate(false) -@GameTestHolder(CompactMachinesApi.MOD_ID) +@GameTestHolder(CompactMachines.MOD_ID) public class PlayerHistoryTrackerTests { private static final String BATCH = "PLAYER_HISTORY_TRACKING"; @GameTest(template = "empty_1x1", batch = BATCH) public static void failsPlayerGoingTooFar(final GameTestHelper test) { - CompactMachines.roomApi().INSTANCE = TestCompactMachines.roomApi().forTest(test); + CompactMachines.Internal.ROOM_API = TestRoomApi.forTest(); final var history = new PlayerEntryPointHistoryManager(1); @@ -42,7 +41,7 @@ public static void failsPlayerGoingTooFar(final GameTestHelper test) { @GameTest(template = "empty_1x1", batch = BATCH, timeoutTicks = 1400) public static void canGetPlayerHistory(final GameTestHelper test) throws InterruptedException { - CompactMachines.roomApi().INSTANCE = TestCompactMachines.roomApi().forTest(test); + CompactMachines.Internal.ROOM_API = TestRoomApi.forTest(); final var history = new PlayerEntryPointHistoryManager(5); @@ -71,7 +70,7 @@ public static void canGetPlayerHistory(final GameTestHelper test) throws Interru @GameTest(template = "empty_1x1", batch = BATCH, timeoutTicks = 1400) public static void canRemovePlayerHistory(final GameTestHelper test) throws InterruptedException { - CompactMachines.roomApi().INSTANCE = TestCompactMachines.roomApi().forTest(test); + CompactMachines.Internal.ROOM_API = TestRoomApi.forTest(); final var history = new PlayerEntryPointHistoryManager(5); final var player = test.makeMockPlayer(GameType.SURVIVAL); @@ -98,7 +97,7 @@ public static void canRemovePlayerHistory(final GameTestHelper test) throws Inte @GameTest(template = "empty_1x1", batch = BATCH, timeoutTicks = 1400) public static void testDataLogic(final GameTestHelper test) throws InterruptedException { - CompactMachines.roomApi().INSTANCE = TestCompactMachines.roomApi().forTest(test); + CompactMachines.Internal.ROOM_API = TestRoomApi.forTest(); final var history = new PlayerEntryPointHistoryManager(5); diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/worldgen/RoomGenerationTests.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/worldgen/RoomGenerationTests.java similarity index 77% rename from tests-1.20/test/java/dev/compactmods/machines/test/worldgen/RoomGenerationTests.java rename to neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/worldgen/RoomGenerationTests.java index e7c63340..9918d836 100644 --- a/tests-1.20/test/java/dev/compactmods/machines/test/worldgen/RoomGenerationTests.java +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/worldgen/RoomGenerationTests.java @@ -1,10 +1,10 @@ -package dev.compactmods.machines.test.worldgen; +package dev.compactmods.machines.test.gametest.worldgen; import dev.compactmods.machines.api.room.CompactRoomGenerator; import dev.compactmods.machines.api.room.RoomTemplate; -import dev.compactmods.machines.api.CompactMachinesApi; +import dev.compactmods.machines.api.CompactMachines; import dev.compactmods.machines.api.util.BlockSpaceUtil; -import dev.compactmods.machines.test.util.CompactGameTestHelper; +import dev.compactmods.machines.test.gametest.CompactGameTestHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.gametest.framework.GameTest; @@ -15,10 +15,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.gametest.GameTestHolder; -import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; import net.neoforged.testframework.annotation.ForEachTest; -import net.neoforged.testframework.gametest.EmptyTemplate; import org.apache.logging.log4j.LogManager; import java.util.ArrayList; @@ -34,12 +31,12 @@ public class RoomGenerationTests { public static Collection roomTests() { List funcs = new ArrayList<>(); - makeAndAddRoomTemplateTest(funcs, CompactMachinesApi.modRL("3_cubed"), new RoomTemplate(3, CommonColors.WHITE)); - makeAndAddRoomTemplateTest(funcs, CompactMachinesApi.modRL("5_cubed"), new RoomTemplate(5, CommonColors.WHITE)); - makeAndAddRoomTemplateTest(funcs, CompactMachinesApi.modRL("7_cubed"), new RoomTemplate(7, CommonColors.WHITE)); - makeAndAddRoomTemplateTest(funcs, CompactMachinesApi.modRL("9_cubed"), new RoomTemplate(9, CommonColors.WHITE)); - makeAndAddRoomTemplateTest(funcs, CompactMachinesApi.modRL("11_cubed"), new RoomTemplate(11, CommonColors.WHITE)); - makeAndAddRoomTemplateTest(funcs, CompactMachinesApi.modRL("13_cubed"), new RoomTemplate(13, CommonColors.WHITE)); + makeAndAddRoomTemplateTest(funcs, CompactMachines.modRL("3_cubed"), new RoomTemplate(3, CommonColors.WHITE)); + makeAndAddRoomTemplateTest(funcs, CompactMachines.modRL("5_cubed"), new RoomTemplate(5, CommonColors.WHITE)); + makeAndAddRoomTemplateTest(funcs, CompactMachines.modRL("7_cubed"), new RoomTemplate(7, CommonColors.WHITE)); + makeAndAddRoomTemplateTest(funcs, CompactMachines.modRL("9_cubed"), new RoomTemplate(9, CommonColors.WHITE)); + makeAndAddRoomTemplateTest(funcs, CompactMachines.modRL("11_cubed"), new RoomTemplate(11, CommonColors.WHITE)); + makeAndAddRoomTemplateTest(funcs, CompactMachines.modRL("13_cubed"), new RoomTemplate(13, CommonColors.WHITE)); return funcs; } @@ -48,7 +45,7 @@ private static void makeAndAddRoomTemplateTest(List funcs, Resourc funcs.add(new TestFunction( "room_generation", "builtin_roomgen_" + id.getPath(), - CompactMachinesApi.MOD_ID + ":empty_15x15", + CompactMachines.MOD_ID + ":empty_15x15", Rotation.NONE, 200, 0, diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/worldgen/StructureGenTests.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/worldgen/StructureGenTests.java similarity index 84% rename from tests-1.20/test/java/dev/compactmods/machines/test/worldgen/StructureGenTests.java rename to neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/worldgen/StructureGenTests.java index 85eded84..ea3cc43a 100644 --- a/tests-1.20/test/java/dev/compactmods/machines/test/worldgen/StructureGenTests.java +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/gametest/worldgen/StructureGenTests.java @@ -1,15 +1,13 @@ -package dev.compactmods.machines.test.worldgen; +package dev.compactmods.machines.test.gametest.worldgen; -import dev.compactmods.machines.api.CompactMachinesApi; +import dev.compactmods.machines.api.CompactMachines; import dev.compactmods.machines.api.room.CompactRoomGenerator; import dev.compactmods.machines.api.room.RoomStructureInfo; -import dev.compactmods.machines.test.util.CompactGameTestHelper; +import dev.compactmods.machines.test.gametest.CompactGameTestHelper; import net.minecraft.core.BlockPos; import net.minecraft.gametest.framework.GameTest; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.AABB; -import net.neoforged.neoforge.gametest.GameTestHolder; -import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; import net.neoforged.testframework.annotation.ForEachTest; @ForEachTest(groups = StructureGenTests.BATCH) @@ -28,7 +26,7 @@ public static void structurePlacedCenter(final CompactGameTestHelper testHelper) CompactRoomGenerator.generateRoom(testHelper.getLevel(), roomDims, Blocks.WHITE_STAINED_GLASS.defaultBlockState()); CompactRoomGenerator.populateStructure(testHelper.getLevel(), - CompactMachinesApi.modRL("gold_1x1"), + CompactMachines.modRL("gold_1x1"), roomDims.deflate(1), RoomStructureInfo.RoomStructurePlacement.CENTERED); testHelper.succeed(); @@ -45,7 +43,7 @@ public static void structurePlacedCeiling(final CompactGameTestHelper testHelper CompactRoomGenerator.generateRoom(testHelper.getLevel(), roomDims, Blocks.WHITE_STAINED_GLASS.defaultBlockState()); CompactRoomGenerator.populateStructure(testHelper.getLevel(), - CompactMachinesApi.modRL("gold_1x1"), + CompactMachines.modRL("gold_1x1"), roomDims.deflate(1), RoomStructureInfo.RoomStructurePlacement.CENTERED_CEILING); testHelper.succeed(); @@ -62,7 +60,7 @@ public static void structurePlacedFloor(final CompactGameTestHelper testHelper) CompactRoomGenerator.generateRoom(testHelper.getLevel(), roomDims, Blocks.WHITE_STAINED_GLASS.defaultBlockState()); CompactRoomGenerator.populateStructure(testHelper.getLevel(), - CompactMachinesApi.modRL("gold_1x1"), + CompactMachines.modRL("gold_1x1"), roomDims.deflate(1), RoomStructureInfo.RoomStructurePlacement.CENTERED_FLOOR); testHelper.succeed(); diff --git a/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/AABBHelperTests.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/AABBHelperTests.java new file mode 100644 index 00000000..35f69ef3 --- /dev/null +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/AABBHelperTests.java @@ -0,0 +1,113 @@ +package dev.compactmods.machines.test.junit; + + +import com.google.common.math.DoubleMath; +import dev.compactmods.machines.api.util.AABBAligner; +import dev.compactmods.machines.api.util.AABBHelper; +import dev.compactmods.machines.util.RandomSourceUtil; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.neoforged.testframework.junit.EphemeralTestServerProvider; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestFactory; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.util.Collection; +import java.util.stream.Stream; + +@ExtendWith(EphemeralTestServerProvider.class) +public class AABBHelperTests { + private static final String BATCH = "aabb-helper"; + + @Test + public void canFloorToY0() { + // Source minY = 5 + AABB before = AABB.ofSize(new Vec3(0, 7.5, 0), 5, 5, 5); + + // Align to Y-0 + final var after = AABBAligner.floor(before, 0); + + Assertions.assertEquals(5, before.minY, "Before was modified in-place rather than immutably moved."); + Assertions.assertEquals(0, after.minY, "After y level should be zero. (was: %s)".formatted(after.minY)); + Assertions.assertEquals(5, after.getYsize(), "AABB size was modified; should have remained the same."); + } + + @Test + public void canFloorToAnotherAABB() { + // Source minY = 5 + AABB before = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 7.5), 5, 5, 5); + + // Target minY = 1 (bounds are Y 1-11) + AABB bounds = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 6), 10, 10, 10); + + // Align to Y-0 + final var after = AABBAligner.floor(before, bounds); + + Assertions.assertEquals(5, before.minY, "Before was modified in-place rather than immutably moved."); + Assertions.assertEquals(1, after.minY, "After y level should be 1. (was: %s)".formatted(after.minY)); + + Assertions.assertEquals(5, after.getYsize(), "AABB size was modified; should have remained the same."); + } + + @Test + public void normalizeToZero() { + AABB before = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 7.5), 5, 5, 5); + + // Align to Y-0 + final var after = AABBHelper.normalize(before); + + Assertions.assertEquals(5, before.minY, "Before was modified in-place rather than immutably moved."); + + Assertions.assertEquals(0, after.minX, "After x level was not zero (was: %s)".formatted(after.minX)); + Assertions.assertEquals(0, after.minY, "After y level was not zero (was: %s)".formatted(after.minY)); + Assertions.assertEquals(0, after.minZ, "After z level was not zero (was: %s)".formatted(after.minZ)); + + Assertions.assertEquals(5, after.getYsize(), "AABB size was modified; should have remained the same."); + } + + @TestFactory + public static Collection normalizeBoundaryTests() { + final var random = RandomSource.create(); + return Stream.concat( + RandomSourceUtil.randomVec3Stream(random).limit(10), + + // Ensure at least one negative and one positive bound are part of the test + Stream.of( + Vec3.ZERO.subtract(-3, -2, 5), + Vec3.ZERO.add(2, 5, 1) + ) + ).map(randomOffset -> DynamicTest.dynamicTest( + "normalize_boundaries_%s".formatted(randomOffset.hashCode()), + () -> normalizeIntoBoundaries(randomOffset) + )) + .toList(); + } + + private static void assertVec3Equals(Vec3 actual, Vec3 expected) { + Assertions.assertTrue(DoubleMath.fuzzyEquals(actual.x, expected.x, 0.001), + "X did not match expected value (was: %s; expected: %s)".formatted(actual.x, expected.x)); + + Assertions.assertTrue(DoubleMath.fuzzyEquals(actual.y, expected.y, 0.001), + "Y did not match expected value (was: %s; expected: %s)".formatted(actual.y, expected.y)); + + Assertions.assertTrue(DoubleMath.fuzzyEquals(actual.z, expected.z, 0.001), + "Z did not match expected value (was: %s; expected: %s)".formatted(actual.z, expected.z)); + } + + public static void normalizeIntoBoundaries(Vec3 randomOffset) { + AABB before = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 7.5), 5, 5, 5); + AABB bounds = AABB.ofSize(randomOffset, 5, 5, 5); + + final var after = AABBHelper.normalizeWithin(before, bounds); + + Assertions.assertEquals(5, before.minY, "Before was modified in-place rather than immutably moved."); + + assertVec3Equals(AABBHelper.minCorner(after), AABBHelper.minCorner(bounds)); + + Assertions.assertEquals(5, after.getYsize(), "AABB size was modified; should have remained the same."); + } +} diff --git a/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/CodecTests.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/CodecTests.java new file mode 100644 index 00000000..792ac220 --- /dev/null +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/CodecTests.java @@ -0,0 +1,48 @@ +package dev.compactmods.machines.test.junit; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.JsonOps; +import net.minecraft.core.UUIDUtil; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.world.phys.Vec3; +import net.neoforged.testframework.junit.EphemeralTestServerProvider; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@ExtendWith(EphemeralTestServerProvider.class) +public class CodecTests { + + @Test + public void test() { + final var MAP = Map.of(UUID.randomUUID(), List.of("hello", "world")); + + final var result = Codec.unboundedMap(UUIDUtil.STRING_CODEC, Codec.STRING.listOf()) + .encodeStart(JsonOps.INSTANCE, MAP) + .resultOrPartial(Assertions::fail); + + Assertions.assertNotNull(result); + } + + @Test + public void canSerializeVector3d() { + Vec3 expected = new Vec3(1.25d, 2.50d, 3.75d); + + DataResult nbtResult = Vec3.CODEC.encodeStart(NbtOps.INSTANCE, expected); + nbtResult.resultOrPartial(Assertions::fail) + .ifPresent(nbt -> { + ListTag list = (ListTag) nbt; + + Assertions.assertNotEquals(expected.x, list.getDouble(0), "Position x did not match."); + Assertions.assertNotEquals(expected.y, list.getDouble(1), "Position y did not match."); + Assertions.assertNotEquals(expected.z, list.getDouble(2), "Position z did not match."); + }); + } +} \ No newline at end of file diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/MathUtilTests.java b/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/MathUtilTests.java similarity index 59% rename from tests-1.20/test/java/dev/compactmods/machines/test/MathUtilTests.java rename to neoforge-main/src/test/java/dev/compactmods/machines/test/junit/MathUtilTests.java index 07e28433..c4b3c6a3 100644 --- a/tests-1.20/test/java/dev/compactmods/machines/test/MathUtilTests.java +++ b/neoforge-main/src/test/java/dev/compactmods/machines/test/junit/MathUtilTests.java @@ -1,26 +1,22 @@ -package dev.compactmods.machines.test; +package dev.compactmods.machines.test.junit; -import dev.compactmods.machines.api.CompactMachinesApi; import dev.compactmods.machines.util.MathUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; -import net.minecraft.gametest.framework.GameTest; -import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.gametest.GameTestHolder; -import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; +import net.neoforged.testframework.junit.EphemeralTestServerProvider; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import java.util.HashMap; -@PrefixGameTestTemplate(false) -@GameTestHolder(CompactMachinesApi.MOD_ID) +@ExtendWith(EphemeralTestServerProvider.class) public class MathUtilTests { - private static final String BATCH = "MathUtil"; - - @GameTest(template = "empty_1x1", batch = BATCH) - public static void positionGeneratorWorksCorrectly(final GameTestHelper test) { + @Test + public void positionGeneratorWorksCorrectly() { // Our generation works in a counter-clockwise spiral, starting at 0,0 /* * 6 5 4 @@ -45,11 +41,7 @@ public static void positionGeneratorWorksCorrectly(final GameTestHelper test) { ChunkPos calculatedChunk = new ChunkPos(BlockPos.containing(finalPos)); - String error = String.format("Generation did not match for %s.", id); - if(!expectedChunk.equals(calculatedChunk)) - test.fail(error); + Assertions.assertEquals(expectedChunk, calculatedChunk, String.format("Generation did not match for %s.", id)); }); - - test.succeed(); } } diff --git a/tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_15x15.nbt b/neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_15x15.nbt similarity index 100% rename from tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_15x15.nbt rename to neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_15x15.nbt diff --git a/tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_15x31.nbt b/neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_15x31.nbt similarity index 100% rename from tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_15x31.nbt rename to neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_15x31.nbt diff --git a/tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_1x1.nbt b/neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_1x1.nbt similarity index 100% rename from tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_1x1.nbt rename to neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_1x1.nbt diff --git a/tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_5x5.nbt b/neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_5x5.nbt similarity index 100% rename from tests-1.20/test/resources/test_pack/data/compactmachines/structures/empty_5x5.nbt rename to neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/empty_5x5.nbt diff --git a/tests-1.20/test/resources/test_pack/data/compactmachines/structures/gold_1x1.nbt b/neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/gold_1x1.nbt similarity index 100% rename from tests-1.20/test/resources/test_pack/data/compactmachines/structures/gold_1x1.nbt rename to neoforge-main/src/test/resources/test_pack/data/compactmachines/structures/gold_1x1.nbt diff --git a/tests-1.20/test/resources/test_pack/pack.mcmeta b/neoforge-main/src/test/resources/test_pack/pack.mcmeta similarity index 100% rename from tests-1.20/test/resources/test_pack/pack.mcmeta rename to neoforge-main/src/test/resources/test_pack/pack.mcmeta diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/AABBHelperTests.java b/tests-1.20/test/java/dev/compactmods/machines/test/AABBHelperTests.java deleted file mode 100644 index 15c0762c..00000000 --- a/tests-1.20/test/java/dev/compactmods/machines/test/AABBHelperTests.java +++ /dev/null @@ -1,126 +0,0 @@ -package dev.compactmods.machines.test; - - -import com.google.common.math.DoubleMath; -import dev.compactmods.machines.api.CompactMachinesApi; -import dev.compactmods.machines.api.util.AABBAligner; -import dev.compactmods.machines.api.util.AABBHelper; -import dev.compactmods.machines.util.RandomSourceUtil; -import net.minecraft.core.Direction; -import net.minecraft.gametest.framework.GameTest; -import net.minecraft.gametest.framework.GameTestGenerator; -import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraft.gametest.framework.TestFunction; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.gametest.GameTestHolder; -import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; - -import java.util.Collection; -import java.util.stream.Stream; - -@PrefixGameTestTemplate(false) -@GameTestHolder(CompactMachinesApi.MOD_ID) -public class AABBHelperTests { - private static final String BATCH = "aabb-helper"; - - @GameTest(template = "empty_1x1", batch = BATCH) - public static void canFloorToY0(final GameTestHelper test) { - // Source minY = 5 - AABB before = AABB.ofSize(new Vec3(0, 7.5, 0), 5, 5, 5); - - // Align to Y-0 - final var after = AABBAligner.floor(before, 0); - - test.assertTrue(before.minY == 5, "Before was modified in-place rather than immutably moved."); - test.assertTrue(after.minY == 0, "After y level should be zero. (was: %s)".formatted(after.minY)); - test.assertTrue(after.getYsize() == 5, "AABB size was modified; should have remained the same."); - test.succeed(); - } - - @GameTest(template = "empty_1x1", batch = BATCH) - public static void canFloorToAnotherAABB(final GameTestHelper test) { - // Source minY = 5 - AABB before = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 7.5), 5, 5, 5); - - // Target minY = 1 (bounds are Y 1-11) - AABB bounds = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 6), 10, 10, 10); - - // Align to Y-0 - final var after = AABBAligner.floor(before, bounds); - - test.assertTrue(before.minY == 5, "Before was modified in-place rather than immutably moved."); - test.assertTrue(after.minY == 1, "After y level should be 1. (was: %s)".formatted(after.minY)); - - test.assertTrue(after.getYsize() == 5, "AABB size was modified; should have remained the same."); - test.succeed(); - } - - @GameTest(template = "empty_1x1", batch = BATCH) - public static void normalizeToZero(final GameTestHelper test) { - AABB before = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 7.5), 5, 5, 5); - - // Align to Y-0 - final var after = AABBHelper.normalize(before); - - test.assertTrue(before.minY == 5, "Before was modified in-place rather than immutably moved."); - - test.assertTrue(after.minX == 0, "After x level was not zero (was: %s)".formatted(after.minX)); - test.assertTrue(after.minY == 0, "After y level was not zero (was: %s)".formatted(after.minY)); - test.assertTrue(after.minZ == 0, "After z level was not zero (was: %s)".formatted(after.minZ)); - - test.assertTrue(after.getYsize() == 5, "AABB size was modified; should have remained the same."); - test.succeed(); - } - - @GameTestGenerator - public static Collection normalizeBoundaryTests() { - final var random = RandomSource.create(); - return Stream.concat( - RandomSourceUtil.randomVec3Stream(random).limit(10), - - // Ensure at least one negative and one positive bound are part of the test - Stream.of( - Vec3.ZERO.subtract(-3, -2, 5), - Vec3.ZERO.add(2, 5, 1) - ) - ).map(randomOffset -> new TestFunction( - BATCH, - "normalize_boundaries_%s".formatted(randomOffset.hashCode()), - CompactMachinesApi.MOD_ID + ":empty_1x1", - Rotation.NONE, - 5, - 0, - true, - testHelper -> normalizeIntoBoundaries(testHelper, randomOffset) - )) - .toList(); - } - - private static void assertVec3Equals(final GameTestHelper testHelper, Vec3 actual, Vec3 expected) { - if(!DoubleMath.fuzzyEquals(actual.x, expected.x, 0.001)) - testHelper.fail("X did not match expected value (was: %s; expected: %s)".formatted(actual.x, expected.x)); - - if(!DoubleMath.fuzzyEquals(actual.y, expected.y, 0.001)) - testHelper.fail("Y did not match expected value (was: %s; expected: %s)".formatted(actual.y, expected.y)); - - if(!DoubleMath.fuzzyEquals(actual.z, expected.z, 0.001)) - testHelper.fail("Z did not match expected value (was: %s; expected: %s)".formatted(actual.z, expected.z)); - } - - public static void normalizeIntoBoundaries(final GameTestHelper test, Vec3 randomOffset) { - AABB before = AABB.ofSize(Vec3.ZERO.relative(Direction.UP, 7.5), 5, 5, 5); - AABB bounds = AABB.ofSize(randomOffset, 5, 5, 5); - - final var after = AABBHelper.normalizeWithin(before, bounds); - - test.assertTrue(before.minY == 5, "Before was modified in-place rather than immutably moved."); - - assertVec3Equals(test, AABBHelper.minCorner(after), AABBHelper.minCorner(bounds)); - - test.assertTrue(after.getYsize() == 5, "AABB size was modified; should have remained the same."); - test.succeed(); - } -} diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/TestRoomApi.java b/tests-1.20/test/java/dev/compactmods/machines/test/TestRoomApi.java deleted file mode 100644 index 92fe667c..00000000 --- a/tests-1.20/test/java/dev/compactmods/machines/test/TestRoomApi.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.compactmods.machines.test; - -import com.google.common.base.Predicates; -import dev.compactmods.machines.api.dimension.MissingDimensionException; -import dev.compactmods.machines.api.room.ICompactMachines.roomApi(); -import dev.compactmods.machines.room.CompactMachines.roomApi()Instance; -import dev.compactmods.machines.room.RoomRegistrar; -import dev.compactmods.machines.room.spatial.GraphChunkManager; -import dev.compactmods.machines.room.spawn.RoomSpawnManagers; -import dev.compactmods.machines.room.spawn.SpawnManager; -import net.minecraft.gametest.framework.GameTestHelper; - -public class TestCompactMachines.roomApi() { - - public static ICompactMachines.roomApi() forTest(GameTestHelper test) { - final var registrar = new RoomRegistrar(); - final var spawnManagers = new RoomSpawnManagers(registrar); - final var chunkManager = new GraphChunkManager(); - - return new CompactMachines.roomApi()Instance(Predicates.alwaysTrue(), registrar, spawnManagers, chunkManager); - } -} diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/data/CodecTests.java b/tests-1.20/test/java/dev/compactmods/machines/test/data/CodecTests.java deleted file mode 100644 index 9c6997fe..00000000 --- a/tests-1.20/test/java/dev/compactmods/machines/test/data/CodecTests.java +++ /dev/null @@ -1,59 +0,0 @@ -package dev.compactmods.machines.test.data; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.JsonOps; -import dev.compactmods.machines.api.CompactMachinesApi; -import net.minecraft.core.UUIDUtil; -import net.minecraft.gametest.framework.GameTest; -import net.minecraft.gametest.framework.GameTestHelper; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; -import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.gametest.GameTestHolder; -import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -@PrefixGameTestTemplate(false) -@GameTestHolder(CompactMachinesApi.MOD_ID) -public class CodecTests { - - private static final String BATCH = "CODECS"; - - @GameTest(template = "empty_1x1", batch = BATCH) - public static void test(final GameTestHelper test) { - final var MAP = Map.of(UUID.randomUUID(), List.of("hello", "world")); - - final var result = Codec.unboundedMap(UUIDUtil.STRING_CODEC, Codec.STRING.listOf()) - .encodeStart(JsonOps.INSTANCE, MAP) - .resultOrPartial(test::fail); - - test.succeed(); - } - - @GameTest(template = "empty_1x1", batch = BATCH) - public static void canSerializeVector3d(final GameTestHelper test) { - Vec3 expected = new Vec3(1.25d, 2.50d, 3.75d); - - DataResult nbtResult = Vec3.CODEC.encodeStart(NbtOps.INSTANCE, expected); - nbtResult.resultOrPartial(test::fail) - .ifPresent(nbt -> { - ListTag list = (ListTag) nbt; - - if (expected.x != list.getDouble(0)) - test.fail("Position x did not match; expected " + expected + " but got " + list); - - if (expected.y != list.getDouble(1)) - test.fail("Position y did not match; expected " + expected + " but got " + list); - - if (expected.z != list.getDouble(2)) - test.fail("Position z did not match; expected " + expected + " but got " + list); - }); - - test.succeed(); - } -} \ No newline at end of file diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/data/DataManagerBuilderTests.java b/tests-1.20/test/java/dev/compactmods/machines/test/data/DataManagerBuilderTests.java deleted file mode 100644 index af4d80b8..00000000 --- a/tests-1.20/test/java/dev/compactmods/machines/test/data/DataManagerBuilderTests.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.compactmods.machines.test.data; - -import dev.compactmods.machines.api.CompactMachinesApi; -import dev.compactmods.machines.data.DataManagerBuilder; -import dev.compactmods.machines.data.manager.IKeyedDataFileManager; -import dev.compactmods.machines.data.room.RoomDataAttachments; -import dev.compactmods.machines.test.util.CompactGameTestHelper; -import net.minecraft.gametest.framework.GameTest; -import net.neoforged.testframework.annotation.ForEachTest; -import net.neoforged.testframework.gametest.EmptyTemplate; - -@ForEachTest(groups = "data_manager_builder") -public class DataManagerBuilderTests { - - @GameTest - @EmptyTemplate - public static void testCanCreate(CompactGameTestHelper helper) { - - // TODO - TEST - - var dataManager = DataManagerBuilder - .keyed(helper.getLevel().getServer(), CompactMachinesApi.modRL("test")) - .build(); - - var data = dataManager.data("room-code-here"); - - dataManager.save(); - - helper.succeed(); - } -} diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/util/FileHelper.java b/tests-1.20/test/java/dev/compactmods/machines/test/util/FileHelper.java deleted file mode 100644 index 0588f5a8..00000000 --- a/tests-1.20/test/java/dev/compactmods/machines/test/util/FileHelper.java +++ /dev/null @@ -1,71 +0,0 @@ -package dev.compactmods.machines.test.util; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtAccounter; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.Tag; -import org.jetbrains.annotations.Nullable; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URL; -import java.nio.file.Path; - -public final class FileHelper { - public static final FileHelper INSTANCE = new FileHelper(); - - private FileHelper() { - } - - @Nullable - public static Path resourcesDir() { - final var rd = System.getenv("CM5_TEST_RESOURCES"); - return rd == null ? null : Path.of(rd); - } - - public InputStream getFileStream(String filename) { - return getClass().getClassLoader().getResourceAsStream(filename); - } - - public InputStreamReader openFile(String filename) { - URL res = getClass().getClassLoader().getResource(filename); - try { - InputStream inputStream = res.openStream(); - return new InputStreamReader(inputStream); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } - - public static JsonElement getJsonFromFile(String filename) { - Gson g = new Gson(); - InputStreamReader isr = INSTANCE.openFile(filename); - return g.fromJson(isr, JsonElement.class); - } - - public static CompoundTag getNbtFromFile(String filename) throws IOException { - InputStream isr = INSTANCE.getFileStream(filename); - return NbtIo.readCompressed(isr, NbtAccounter.unlimitedHeap()); - } - - public static CompoundTag getNbtFromSavedDataFile(String filename) throws IOException { - InputStream isr = INSTANCE.getFileStream(filename); - final var nbtRoot = NbtIo.readCompressed(isr, NbtAccounter.unlimitedHeap()); - return nbtRoot.getCompound("data"); - } - - public static T getNbtFromSavedDataFile(String filename, Class tagClass) throws IOException { - InputStream isr = INSTANCE.getFileStream(filename); - final var nbtRoot = NbtIo.readCompressed(isr, NbtAccounter.unlimitedHeap()); - final var tag = nbtRoot.get("data"); - if(tagClass.isInstance(tag)) - return tagClass.cast(tag); - - return null; - } -} diff --git a/tests-1.20/test/java/dev/compactmods/machines/test/util/NbtTestUtils.java b/tests-1.20/test/java/dev/compactmods/machines/test/util/NbtTestUtils.java deleted file mode 100644 index bd7f9474..00000000 --- a/tests-1.20/test/java/dev/compactmods/machines/test/util/NbtTestUtils.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.compactmods.machines.test.util; - -import net.minecraft.gametest.framework.GameTestAssertException; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -public class NbtTestUtils { - public static boolean checkListSize(CompoundTag tag, String list, int expectedSize) { - return checkListSize(tag, list, Tag.TAG_COMPOUND, expectedSize); - } - - public static boolean checkListSize(CompoundTag tag, String list, int listType, int expectedSize) { - if(!tag.contains(list, Tag.TAG_LIST)) - return false; - - int actualSize = tag.getList(list, listType).size(); - if(actualSize != expectedSize) - throw new GameTestAssertException("Expected NBT list %s to have %s elements; got %s".formatted(list, expectedSize, actualSize)); - - return true; - } -}