From 50fa8958cc0f40c6ae6f82b290e7090cf1a91acb Mon Sep 17 00:00:00 2001 From: Face o' Cat Date: Sun, 1 Nov 2026 11:10:17 +0200 Subject: [PATCH] test: move the builder checks to JUnit The 16 builderTest programs (17 classes with GuiProtocolTest) move to src/test and run under ./gradlew test, so one run reports every failing check instead of stopping at the first failed task. - Each main becomes a @Test method; BlockEntitiesTest.standaloneMachine and GuiProtocolTest (called from ScreenLoaderTest) become tests of their own. The check bodies are unchanged apart from dropping the "passed" prints. - The builderTest source set and its 16 verify* JavaExec tasks are gone; the test task sets mmdlib.resources and mmdlib.generated for VanillaExamplesTest and RuntimeBehaviorTest. - Docs that named the old tasks now name the test classes, and the CI comment and build.gradle no longer mention them. The checks passed in one JVM with classes and methods in four random orders (they used to run in separate JVMs). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_018zpP6ZrFjaGe477FvWAZKo --- .github/workflows/ci.yml | 4 +- build.gradle | 4 +- docs/block-builder.md | 2 +- docs/definition-loading.md | 2 +- docs/entity-builder.md | 2 +- docs/fluid-builder.md | 2 +- docs/item-builder.md | 2 +- docs/material-extensions.md | 2 +- docs/material-factory.md | 2 +- docs/method-events.md | 2 +- docs/runtime-behaviors.md | 2 +- docs/vanilla-extensions.md | 2 +- gradle/verification.gradle | 42 ++----------------- .../lib/common/builders/BlockBuilderTest.java | 8 ++-- .../common/builders/BlockEntitiesTest.java | 12 +++--- .../lib/common/builders/DataModulesTest.java | 8 ++-- .../common/builders/DefinitionLoaderTest.java | 9 ++-- .../common/builders/EntityBuilderTest.java | 8 ++-- .../lib/common/builders/FluidBuilderTest.java | 8 ++-- .../lib/common/builders/ItemBuilderTest.java | 6 ++- .../lib/common/builders/ItemTemplateTest.java | 7 ++-- .../lib/common/builders/LoadedPartsTest.java | 8 ++-- .../builders/MaterialExtensionsTest.java | 8 ++-- .../common/builders/MaterialFactoryTest.java | 8 ++-- .../common/builders/MaterialPartsTest.java | 8 ++-- .../lib/common/builders/MethodEventsTest.java | 8 ++-- .../common/builders/RuntimeBehaviorTest.java | 8 ++-- .../common/builders/VanillaExamplesTest.java | 8 ++-- .../moddev/mc/lib/gui/ScreenLoaderTest.java | 9 ++-- .../mc/lib/gui/runtime/GuiProtocolTest.java | 9 ++-- 30 files changed, 88 insertions(+), 122 deletions(-) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/BlockBuilderTest.java (96%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/BlockEntitiesTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/DataModulesTest.java (96%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/DefinitionLoaderTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/EntityBuilderTest.java (96%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/FluidBuilderTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/ItemBuilderTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/ItemTemplateTest.java (94%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/LoadedPartsTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/MaterialExtensionsTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/MaterialFactoryTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/MaterialPartsTest.java (97%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/MethodEventsTest.java (98%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/RuntimeBehaviorTest.java (98%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/common/builders/VanillaExamplesTest.java (98%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/gui/ScreenLoaderTest.java (98%) rename src/{builderTest => test}/java/zone/moddev/mc/lib/gui/runtime/GuiProtocolTest.java (92%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e96273b..c1a213b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,7 @@ name: CI -# Every pull request runs the unit tests, the builder checks and the server game tests -# (`./gradlew check`), then the client GUI smoke test with and without JEI. +# Every pull request runs the unit tests and the server game tests (`./gradlew check`), then the +# client GUI smoke test with and without JEI. on: pull_request: push: diff --git a/build.gradle b/build.gradle index 21c5508..9cb79d5 100644 --- a/build.gradle +++ b/build.gradle @@ -66,14 +66,14 @@ tasks.configureEach { task -> if (task.name == 'runData') task.finalizedBy(refreshDataResources) if (task.name == 'jar' || task.name == 'jarJar' || task.name == 'javadoc' || task.name.startsWith('verify') || task.name.startsWith('test') - || task.name in ['compileTestJava', 'compileBuilderTestJava', 'compileRuntimeTestJava', + || task.name in ['compileTestJava', 'compileRuntimeTestJava', 'writeMinecraftClasspathJunit', 'writeMinecraftClasspathClient', 'writeMinecraftClasspathServer', 'runClient', 'runServer', 'runGameTestServer']) { task.mustRunAfter(refreshDataResources) } } -// Verification tasks (verify*, test source sets); run with `./gradlew check`. +// Verification tasks (verify*, tests); run with `./gradlew check`. apply from: 'gradle/verification.gradle' // Runtime GUI smoke tests compile optional JEI hooks without requiring JEI at runtime. diff --git a/docs/block-builder.md b/docs/block-builder.md index b96f0f6..cfe11b3 100644 --- a/docs/block-builder.md +++ b/docs/block-builder.md @@ -65,6 +65,6 @@ conflicting embedded names fail. Properties are nested under `properties`. The paired item uses ItemTemplate.CODEC; custom shapes/state-dependent properties and specialized block classes remain content-factory concerns. -`verifyBlockBuilder` runs with Gradle check/build, testing chain isolation, +`BlockBuilderTest` (JUnit, part of `./gradlew check`) tests chain isolation, material/item binding, validation, and JSON/NBT round trips. The overall material loading and object-registration pipeline remains unfinished. diff --git a/docs/definition-loading.md b/docs/definition-loading.md index 92809c5..449e56e 100644 --- a/docs/definition-loading.md +++ b/docs/definition-loading.md @@ -154,7 +154,7 @@ runtime registrar. Machine and custom world-entity wiring still uses its dedicat factory APIs. See [the playable vanilla example](vanilla-extensions.md). This stage does not discover enabled world datapacks or add registry IDs on ordinary datapack reload. -`verifyDefinitionLoader` checks cross-mod module and handler references, delayed +`DefinitionLoaderTest` (JUnit) checks cross-mod module and handler references, delayed material decoding, namespace/nested IDs, optional-mod filtering, duplicate IDs, malformed files, immutable results, reversed source order, and mounted ZIP paths. Lifecycle placement is checked against the pinned loader sources; an actual diff --git a/docs/entity-builder.md b/docs/entity-builder.md index aa5693d..64199cd 100644 --- a/docs/entity-builder.md +++ b/docs/entity-builder.md @@ -93,7 +93,7 @@ placement rules, goals, and other relevant NeoForge registrations. Arrows/bolts can implement this interface, including their own ammunition pickup and spawn synchronization; no projectile-specific implementation is installed yet. -verifyEntityBuilder runs with check/build. It covers immutable material branches, +`EntityBuilderTest` (JUnit, part of `./gradlew check`) covers immutable material branches, defensive factory data, codec round trips, factory lookup/class mismatch/errors, and factory-specific settings validation. Actual spawning, persistence, rendering, and type registration need verification in a running NeoForge instance. diff --git a/docs/fluid-builder.md b/docs/fluid-builder.md index d338b93..569d1ca 100644 --- a/docs/fluid-builder.md +++ b/docs/fluid-builder.md @@ -70,5 +70,5 @@ using deferred suppliers for their circular references. This builder does not register fluids, provide runtime flow behavior, install renderers, generate tags, or implement interaction callbacks. The startup loader now loads material plans, and RuntimeContentRegistrar applies their fluid families; see [the vanilla example](vanilla-extensions.md). -verifyFluidBuilder runs under check/build and covers material isolation, family +`FluidBuilderTest` (JUnit, part of `./gradlew check`) covers material isolation, family IDs, validation, optional companion definitions, and JSON/NBT round trips. diff --git a/docs/item-builder.md b/docs/item-builder.md index 4252c70..e5494e9 100644 --- a/docs/item-builder.md +++ b/docs/item-builder.md @@ -43,5 +43,5 @@ No legacy numeric harvest level has been added. Future tool/block factories must use the target Minecraft version's tag-based mining rules. The checkout now targets Java 21 and NeoForge 21.1.247 for Minecraft 1.21.1. -`./gradlew check` runs verifyItemBuilder and verifyItemTemplate. StackContext NBT +`./gradlew check` runs the JUnit tests `ItemBuilderTest` and `ItemTemplateTest`. StackContext NBT is stored in the CUSTOM_DATA component; it is not interpreted as legacy item NBT. diff --git a/docs/material-extensions.md b/docs/material-extensions.md index 339c9f8..00a9412 100644 --- a/docs/material-extensions.md +++ b/docs/material-extensions.md @@ -182,7 +182,7 @@ still separate work. Planning and codec use do not instantiate game objects. Existing direct MaterialContentPlanner calls plan standard parts; use MaterialFactory to include registered extension types. -verifyMaterialExtensions tests dynamic type selections, excludes, optional mods, +`MaterialExtensionsTest` (JUnit) tests dynamic type selections, excludes, optional mods, codec round trips, typed callback validation/dispatch, listener cleanup, deferred creation boundaries, registry validation, and ID collisions. Actual game-object registration, behaviors, and renderer effects require an in-game test. diff --git a/docs/material-factory.md b/docs/material-factory.md index 311f8a5..042b1b6 100644 --- a/docs/material-factory.md +++ b/docs/material-factory.md @@ -104,7 +104,7 @@ to execute the previous incomplete JSLT transform. These operations create definitions, not registered Minecraft items/blocks, fluids, or entity types. Concrete behavior factories, parent inheritance, automatic mod-resource discovery, and the final registry/application stage remain -separate work. verifyMaterialFactory runs with check/build and covers exclusions, +separate work. `MaterialFactoryTest` (JUnit, part of `./gradlew check`) covers exclusions, section validation, JSON/NBT round trips, material stats, optional-mod gates, factory overrides, and identity binding. diff --git a/docs/method-events.md b/docs/method-events.md index 55461f5..d42ce36 100644 --- a/docs/method-events.md +++ b/docs/method-events.md @@ -268,7 +268,7 @@ A simple `registerEvent(name, Context.class)` accepts one `Context` argument by default. Event contracts are extensible even though the initial player, weapon, and tool contracts are bundled. -`verifyMethodEvents` checks real method resolution and invocation, caller-supplied +`MethodEventsTest` (JUnit) checks real method resolution and invocation, caller-supplied class loaders, ID/material dispatch, multiple handlers for one type, error and exception paths, failed-file atomicity, and JSON/NBT round trips. Built-in method signatures are resolved without constructing a Minecraft world. In-game armor, diff --git a/docs/runtime-behaviors.md b/docs/runtime-behaviors.md index aa8c58b..25da7cb 100644 --- a/docs/runtime-behaviors.md +++ b/docs/runtime-behaviors.md @@ -233,7 +233,7 @@ block, and material definitions are dispatched by the runtime event bridge. `StandardItems` by itself deliberately rejects ammunition instead of substituting an item that cannot shoot. -verifyRuntimeBehavior checks dispatch classes without instantiating game objects, +`RuntimeBehaviorTest` (JUnit) checks dispatch classes without instantiating game objects, material stat formulas, explicit tier tags, lazy repair resolution, and bundled tag resources. The whole NeoForge project compiles and existing definition/codec/API checks run alongside it. Scythe harvesting/protection, crackhammer processing and diff --git a/docs/vanilla-extensions.md b/docs/vanilla-extensions.md index 38f8c67..729915a 100644 --- a/docs/vanilla-extensions.md +++ b/docs/vanilla-extensions.md @@ -136,7 +136,7 @@ asset JAR. The legacy `--minecraft-assets` argument is accepted but unused. check all static parent/model/texture references, concrete model texture variables, PNG headers, and animation metadata. `verifyStaticAssets` runs it during `check`. -`verifyVanillaExamples` loads the actual shipped files through `DefinitionLoader`, +`VanillaExamplesTest` (JUnit) loads the actual shipped files through `DefinitionLoader`, checks every planned item/block has its packaged resources, verifies no unwanted vanilla tool/armor duplicates, and round-trips the runtime references through JSON/NBT and MaterialBuilder. diff --git a/gradle/verification.gradle b/gradle/verification.gradle index 6aa9cab..05c018e 100644 --- a/gradle/verification.gradle +++ b/gradle/verification.gradle @@ -1,11 +1,7 @@ -// Verification: the builderTest/runtimeTest source sets and every verify* task. +// Verification: the JUnit tests, the runtimeTest source set and every verify* task. // All of it runs on `./gradlew check`; `build` only compiles and packages (see the end of this file). sourceSets { - builderTest { - compileClasspath += sourceSets.main.output + sourceSets.test.compileClasspath - runtimeClasspath += sourceSets.main.output + sourceSets.test.runtimeClasspath - } runtimeTest { compileClasspath += sourceSets.main.output + sourceSets.test.compileClasspath runtimeClasspath += sourceSets.main.output + sourceSets.test.runtimeClasspath @@ -37,39 +33,9 @@ dependencies { tasks.named('test', Test) { useJUnitPlatform() testLogging { events 'failed'; exceptionFormat 'full' } -} - -// Standalone checks in src/builderTest, run as plain Java programs: task name -> main class -// (in zone.moddev.mc.lib.common.builders), plus any system properties the check reads. -def resources = file('src/main/resources').absolutePath -def builderChecks = [ - verifyItemBuilder : ['ItemBuilderTest'], - verifyItemTemplate : ['ItemTemplateTest'], - verifyBlockBuilder : ['BlockBuilderTest'], - verifyEntityBuilder : ['EntityBuilderTest'], - verifyFluidBuilder : ['FluidBuilderTest'], - verifyMaterialParts : ['MaterialPartsTest'], - verifyMaterialFactory : ['MaterialFactoryTest'], - verifyMaterialExtensions: ['MaterialExtensionsTest'], - verifyRuntimeBehavior : ['RuntimeBehaviorTest', ['mmdlib.resources': resources]], - verifyDataModules : ['DataModulesTest'], - verifyLoadedParts : ['LoadedPartsTest'], - verifyBlockEntities : ['BlockEntitiesTest'], - verifyMethodEvents : ['MethodEventsTest'], - verifyDefinitionLoader : ['DefinitionLoaderTest'], - verifyScreens : ['zone.moddev.mc.lib.gui.ScreenLoaderTest'], - verifyVanillaExamples : ['VanillaExamplesTest', ['mmdlib.resources': resources, - 'mmdlib.generated': file('src/generated/resources').absolutePath]], -] -builderChecks.each { name, spec -> - def check = tasks.register(name, JavaExec) { - group = 'verification' - dependsOn tasks.named('builderTestClasses') - classpath = sourceSets.builderTest.runtimeClasspath - mainClass = spec[0].contains('.') ? spec[0] : "zone.moddev.mc.lib.common.builders.${spec[0]}" - if (spec.size() > 1) systemProperties(spec[1]) - } - tasks.named('check') { dependsOn check } + // VanillaExamplesTest and RuntimeBehaviorTest read the shipped definitions from disk. + systemProperty 'mmdlib.resources', file('src/main/resources').absolutePath + systemProperty 'mmdlib.generated', file('src/generated/resources').absolutePath } def verifyReleaseClasses = tasks.register('verifyReleaseClasses') { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/BlockBuilderTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/BlockBuilderTest.java similarity index 96% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/BlockBuilderTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/BlockBuilderTest.java index 300f53d..fa07962 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/BlockBuilderTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/BlockBuilderTest.java @@ -11,11 +11,14 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.common.codecs.BlockTemplate; import zone.moddev.mc.lib.common.parsers.BlockParser; public final class BlockBuilderTest { - public static void main(String[] args) { + @Test + void buildsMaterialBlocksAndValidates() { var root = BlockBuilder.create(); require(root == BlockBuilder.INSTANCE); var template = @@ -106,9 +109,6 @@ public static void main(String[] args) { .parse(JsonOps.INSTANCE, JsonParser.parseString(invalid)) .error() .isPresent()); - System.out.println( - "Immutable material block builder, item binding, JSON/NBT codec, and validation checks" - + " passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/BlockEntitiesTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/BlockEntitiesTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/BlockEntitiesTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/BlockEntitiesTest.java index d8a07d8..a3bf7eb 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/BlockEntitiesTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/BlockEntitiesTest.java @@ -17,6 +17,8 @@ import net.neoforged.neoforge.registries.DeferredRegister; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.MaterialExtensions; import zone.moddev.mc.lib.common.codecs.MMDMaterialCodec; import zone.moddev.mc.lib.common.factories.*; @@ -36,7 +38,8 @@ static final class Other extends BlockEntity { } } - public static void main(String[] args) { + @Test + void plansMachineBlockEntitiesAndWorldEntities() { var api = new MaterialExtensions(false); var module = DataModules.Block.CODEC @@ -228,18 +231,15 @@ public Machine create( var binding = new zone.moddev.mc.lib.api.BlockEntityBinding<>(prepared, () -> null); require(binding.as(Machine.class) == binding && binding.blockEntityClass() == Machine.class); expectFailure(() -> binding.as(Other.class)); - standaloneMachine(); require(creations.get() == 0); - System.out.println( - "Machine block entities, block-owned world entities, selection/gating, codecs, deferred" - + " typed factory validation, and standalone machine planning passed"); } /** * Plans a standalone machine. Queuing it on a runtime registrar needs a bootstrapped game, so * that is covered by the runtime smoke test. */ - private static void standaloneMachine() { + @Test + void standaloneMachinePlans() { var machine = DataModules.Block.CODEC .parse( diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/DataModulesTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/DataModulesTest.java similarity index 96% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/DataModulesTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/DataModulesTest.java index 5a323f1..88e1191 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/DataModulesTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/DataModulesTest.java @@ -12,13 +12,16 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.MaterialExtensions; import zone.moddev.mc.lib.common.factories.MaterialFactory; import zone.moddev.mc.lib.common.modules.*; import zone.moddev.mc.lib.common.modules.ModuleCatalog; public final class DataModulesTest { - public static void main(String[] args) throws Exception { + @Test + void loadsBundledAndExternalModules() throws Exception { var bundled = ModuleCatalog.bundled(); require( bundled.items().size() == 32 @@ -134,9 +137,6 @@ public static void main(String[] args) throws Exception { Files.delete(path); } } - System.out.println( - "Bundled and external data modules, overrides, selections, ZIP paths, and JSON/NBT codecs" - + " passed"); } private static ResourceLocation id(String value) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/DefinitionLoaderTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/DefinitionLoaderTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/DefinitionLoaderTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/DefinitionLoaderTest.java index e5d7b60..2d31d22 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/DefinitionLoaderTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/DefinitionLoaderTest.java @@ -7,6 +7,8 @@ import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.MaterialExtensions; import zone.moddev.mc.lib.common.loading.DefinitionLoader; import zone.moddev.mc.lib.common.loading.DefinitionLoader.SourceRoot; @@ -18,7 +20,8 @@ public static void handler(String context) { calls.incrementAndGet(); } - public static void main(String[] args) throws Exception { + @Test + void loadsDefinitionsAcrossMods() throws Exception { Path temporary = Files.createTempDirectory("mmdlib-loading"); var loader = DefinitionLoaderTest.class.getClassLoader(); try { @@ -255,10 +258,6 @@ public static void main(String[] args) throws Exception { DefinitionLoader.load(List.of(), new MaterialExtensions(), mod -> false) .materials() .isEmpty()); - System.out.println( - "Folder dispatch, cross-mod staging, extension handles, IDs, duplicates, optional mods," - + " standalone blocks with block entities, standalone items, and mounted ZIP loading" - + " passed"); } finally { try (var paths = Files.walk(temporary)) { for (var path : paths.sorted(java.util.Comparator.reverseOrder()).toList()) diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/EntityBuilderTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/EntityBuilderTest.java similarity index 96% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/EntityBuilderTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/EntityBuilderTest.java index 2f023ce..cb54957 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/EntityBuilderTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/EntityBuilderTest.java @@ -15,6 +15,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.Level; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.common.codecs.EntityTemplate; import zone.moddev.mc.lib.common.factories.EntityFactories; import zone.moddev.mc.lib.common.factories.EntityFactory; @@ -23,7 +25,8 @@ import zone.moddev.mc.lib.common.types.MMDEntity; public final class EntityBuilderTest { - public static void main(String[] args) { + @Test + void buildsEntityTemplates() { var root = EntityBuilder.create(); require(root == EntityBuilder.INSTANCE); var settings = JsonParser.parseString("{\"power\":2}").getAsJsonObject(); @@ -134,9 +137,6 @@ public Entity create( .forMaterial("test:copper") .build(); expectFailure(() -> factories.prepare(badSettings, Entity.class)); - System.out.println( - "Entity templates, typed factory resolution, settings validation, and JSON/NBT checks" - + " passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/FluidBuilderTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/FluidBuilderTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/FluidBuilderTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/FluidBuilderTest.java index 57a01b9..3d124a3 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/FluidBuilderTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/FluidBuilderTest.java @@ -10,11 +10,14 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.common.codecs.FluidTemplate; import zone.moddev.mc.lib.common.parsers.FluidParser; public final class FluidBuilderTest { - public static void main(String[] args) { + @Test + void buildsFluidFamilies() { var root = FluidBuilder.create(); require(root == FluidBuilder.INSTANCE); var template = @@ -125,9 +128,6 @@ public static void main(String[] args) { .parse(JsonOps.INSTANCE, JsonParser.parseString(invalid)) .error() .isPresent()); - System.out.println( - "Fluid builder, family IDs, optional block/bucket binding, validation, and JSON/NBT checks" - + " passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/ItemBuilderTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/ItemBuilderTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/ItemBuilderTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/ItemBuilderTest.java index 4510c02..470385b 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/ItemBuilderTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/ItemBuilderTest.java @@ -7,10 +7,13 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.util.StackContext; public final class ItemBuilderTest { - public static void main(String[] args) { + @Test + void buildsMaterialItems() { require(ItemBuilder.create() == ItemBuilder.INSTANCE); var root = ItemBuilder.INSTANCE; var template = root.setName("mmdlib:ingot"); @@ -85,7 +88,6 @@ public static void main(String[] args) { expectFailure(() -> copper.setMaxStackSize(0)); expectFailure(() -> copper.setMaxDamage(-1)); expectFailure(() -> copper.setUseTime(-1)); - System.out.println("Immutable material item template checks passed"); } private static void require(boolean value) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/ItemTemplateTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/ItemTemplateTest.java similarity index 94% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/ItemTemplateTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/ItemTemplateTest.java index c9a7135..838e2f1 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/ItemTemplateTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/ItemTemplateTest.java @@ -6,11 +6,14 @@ import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.common.codecs.ItemTemplate; import zone.moddev.mc.lib.common.parsers.ItemParser; public final class ItemTemplateTest { - public static void main(String[] args) { + @Test + void templateRoundTripsAndValidates() { var json = JsonParser.parseString( """ @@ -66,8 +69,6 @@ public static void main(String[] args) { .get(0) .count() == 2); - System.out.println( - "DFU item template round-trip, parser, attributes, and validation checks passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/LoadedPartsTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/LoadedPartsTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/LoadedPartsTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/LoadedPartsTest.java index 721a75b..bea4c12 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/LoadedPartsTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/LoadedPartsTest.java @@ -10,6 +10,8 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.MaterialExtensions; import zone.moddev.mc.lib.common.codecs.MMDMaterialCodec; import zone.moddev.mc.lib.common.factories.MaterialFactory; @@ -18,7 +20,8 @@ import zone.moddev.mc.lib.common.types.*; public final class LoadedPartsTest { - public static void main(String[] args) { + @Test + void loadedPartsKeepTheirIdentities() { var api = new MaterialExtensions(false); var codec = MMDMaterialCodec.forExtensions(api); // resolves the catalog at each operation var factory = new MaterialFactory(api, mod -> false); @@ -182,9 +185,6 @@ public static void main(String[] args) { expectFailure(() -> api.registerItemModule(id("addon:dart"), gated)); expectFailure(() -> api.registerBlockModule(id("addon:needle"), panel)); require(api.snapshot().parts().entries().size() == 4); - System.out.println( - "Loaded part identities, aliases, independent catalogs, projectile companions, behaviors," - + " and scoped codecs passed"); } private static ResourceLocation id(String value) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialExtensionsTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/MaterialExtensionsTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialExtensionsTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/MaterialExtensionsTest.java index 90d6ceb..ba87426 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialExtensionsTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/MaterialExtensionsTest.java @@ -17,6 +17,8 @@ import net.neoforged.bus.api.Event; import net.neoforged.neoforge.registries.DeferredRegister; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.*; import zone.moddev.mc.lib.common.codecs.MMDMaterialCodec; import zone.moddev.mc.lib.common.factories.MaterialFactory; @@ -31,7 +33,8 @@ private static final class OtherItem extends Item { } } - public static void main(String[] args) throws Exception { + @Test + void customTypesPlanAndDispatch() throws Exception { var api = new MaterialExtensions(); var codec = MMDMaterialCodec.forExtensions(api); // created before the types are registered AtomicInteger templateCalls = new AtomicInteger(); @@ -219,9 +222,6 @@ public Block create(MMDMaterial material, MMDBlock definition) { .selection() .customItems() .isEmpty()); - System.out.println( - "Custom type selection/planning, typed callbacks, NeoForge event bridge, optional mods, and" - + " error checks passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialFactoryTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/MaterialFactoryTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialFactoryTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/MaterialFactoryTest.java index 95a33fe..f8cbe07 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialFactoryTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/MaterialFactoryTest.java @@ -12,13 +12,16 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.common.codecs.MMDMaterialCodec; import zone.moddev.mc.lib.common.factories.MaterialFactory; import zone.moddev.mc.lib.common.modules.ModuleCatalog; import zone.moddev.mc.lib.common.types.*; public final class MaterialFactoryTest { - public static void main(String[] args) throws Exception { + @Test + void buildsMaterialsFromSections() throws Exception { var root = MaterialBuilder.create(); require(root == MaterialBuilder.INSTANCE); var template = @@ -251,9 +254,6 @@ public static void main(String[] args) throws Exception { } finally { Files.delete(file); } - System.out.println( - "Material builder/factory, section selections, stats, optional mods, and JSON/NBT checks" - + " passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialPartsTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/MaterialPartsTest.java similarity index 97% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialPartsTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/MaterialPartsTest.java index 2f78886..250b4fa 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MaterialPartsTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/MaterialPartsTest.java @@ -9,13 +9,16 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.common.modules.ModuleCatalog; import zone.moddev.mc.lib.common.types.MMDMaterial; import zone.moddev.mc.lib.common.types.MaterialPart; import zone.moddev.mc.lib.common.types.MaterialParts; public final class MaterialPartsTest { - public static void main(String[] args) { + @Test + void plansCanonicalParts() { require(ModuleCatalog.bundled().parts().entries().size() == 55); for (var part : ModuleCatalog.bundled().parts().entries().values()) { var encoded = @@ -227,9 +230,6 @@ public static void main(String[] args) { .parse(JsonOps.INSTANCE, JsonParser.parseString(invalid)) .error() .isPresent()); - System.out.println( - "55 canonical material parts, optional Mekanism gating, projectile companions, and default" - + " fluid planning passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MethodEventsTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/MethodEventsTest.java similarity index 98% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/MethodEventsTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/MethodEventsTest.java index 235d4ce..25f236e 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/MethodEventsTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/MethodEventsTest.java @@ -16,6 +16,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.*; import zone.moddev.mc.lib.api.MaterialEventContexts.ToolTarget; import zone.moddev.mc.lib.common.codecs.EventExtension; @@ -97,7 +99,8 @@ static final class HiddenClass { public static void text(String value) {} } - public static void main(String[] args) throws Throwable { + @Test + void resolvesAndInvokesMethodEvents() throws Throwable { var api = new MaterialExtensions(false); var events = api.events(); var message = events.registerEvent("test:message", String.class); @@ -347,9 +350,6 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE } finally { Files.delete(file); } - System.out.println( - "Load-time MethodHandles, typed signatures, ID/material dispatch, atomic failures, class" - + " loaders, and JSON/NBT checks passed"); } private static EventExtension.Handler binding(String type, String reference, String id) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/RuntimeBehaviorTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/RuntimeBehaviorTest.java similarity index 98% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/RuntimeBehaviorTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/RuntimeBehaviorTest.java index bf2e7eb..1b2d2eb 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/RuntimeBehaviorTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/RuntimeBehaviorTest.java @@ -14,6 +14,8 @@ import net.minecraft.world.item.ArmorItem; import net.minecraft.world.level.block.*; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.MaterialExtensions; import zone.moddev.mc.lib.common.modules.ModuleCatalog; import zone.moddev.mc.lib.common.runtime.*; @@ -35,7 +37,8 @@ private static void blockValidate(MaterialPart part) { API.blockImplementation(part.factory()).validate(part); } - public static void main(String[] args) throws Exception { + @Test + void dispatchesRuntimeBehaviors() throws Exception { var material = MaterialBuilder.create() .setName("test:metal") @@ -271,9 +274,6 @@ public static void main(String[] args) throws Exception { else require(value.getAsString().startsWith("minecraft:")); } } - System.out.println( - "BMe-derived runtime class dispatch, material stat formulas, explicit tier tags, and tag" - + " resources passed"); } private static void require(boolean condition) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/common/builders/VanillaExamplesTest.java b/src/test/java/zone/moddev/mc/lib/common/builders/VanillaExamplesTest.java similarity index 98% rename from src/builderTest/java/zone/moddev/mc/lib/common/builders/VanillaExamplesTest.java rename to src/test/java/zone/moddev/mc/lib/common/builders/VanillaExamplesTest.java index c0f71ce..56538ae 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/common/builders/VanillaExamplesTest.java +++ b/src/test/java/zone/moddev/mc/lib/common/builders/VanillaExamplesTest.java @@ -10,6 +10,8 @@ import net.minecraft.nbt.NbtOps; import net.minecraft.resources.ResourceLocation; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.api.MaterialExtensions; import zone.moddev.mc.lib.common.codecs.MMDMaterialCodec; import zone.moddev.mc.lib.common.loading.DefinitionLoader; @@ -19,7 +21,8 @@ * resources. */ public final class VanillaExamplesTest { - public static void main(String[] args) throws Exception { + @Test + void shippedDefinitionsLoad() throws Exception { var source = Path.of(System.getProperty("mmdlib.resources")); var generated = Path.of(System.getProperty("mmdlib.generated")); var api = new MaterialExtensions(); @@ -297,9 +300,6 @@ public static void main(String[] args) throws Exception { } } } - System.out.println( - "Shipped vanilla definitions: 15 materials, 233 items, 79 blocks including fluids, 14" - + " projectile types; codec and resource coverage passed"); } private static ResourceLocation id(String value) { diff --git a/src/builderTest/java/zone/moddev/mc/lib/gui/ScreenLoaderTest.java b/src/test/java/zone/moddev/mc/lib/gui/ScreenLoaderTest.java similarity index 98% rename from src/builderTest/java/zone/moddev/mc/lib/gui/ScreenLoaderTest.java rename to src/test/java/zone/moddev/mc/lib/gui/ScreenLoaderTest.java index ed93794..e607b28 100644 --- a/src/builderTest/java/zone/moddev/mc/lib/gui/ScreenLoaderTest.java +++ b/src/test/java/zone/moddev/mc/lib/gui/ScreenLoaderTest.java @@ -12,6 +12,8 @@ import net.neoforged.neoforge.fluids.FluidStack; +import org.junit.jupiter.api.Test; + import zone.moddev.mc.lib.gui.layout.ScreenLayout; import zone.moddev.mc.lib.gui.layout.TextMeasure; import zone.moddev.mc.lib.gui.load.BoundValue; @@ -140,8 +142,8 @@ public static int temperature(BlockEntity entity) { """; - public static void main(String[] args) throws Throwable { - zone.moddev.mc.lib.gui.runtime.GuiProtocolTest.main(args); + @Test + void loadsAndBindsScreens() throws Throwable { var bound = bind(EXAMPLE); var screen = bound.screen(); require(screen.playerInventory()); @@ -251,9 +253,6 @@ public static void main(String[] args) throws Throwable { fails( "not a block entity", HEAD.replace("$Press", "$Helpers") + "