From 736eddd856f1153dfd181e0d6f18fd8c950eb9d1 Mon Sep 17 00:00:00 2001 From: ErikSteiner <2684018+ErikSteiner@users.noreply.github.com> Date: Wed, 26 Aug 2026 09:24:36 +0200 Subject: [PATCH] fix: fail road generation without road data --- common/build.gradle | 7 ++ .../generation/RoadGenerationService.java | 4 +- .../generation/RoadGenerationServiceTest.java | 76 +++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 common/src/test/java/net/shiroha233/roadweaver/generation/RoadGenerationServiceTest.java diff --git a/common/build.gradle b/common/build.gradle index 89f791fc..fe399040 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -12,6 +12,13 @@ dependencies { // H2 仅用于读取旧版世界数据,运行时由平台模块打包。 compileOnly("com.h2database:h2:2.2.224") { transitive = false } + + testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") + testImplementation("org.mockito:mockito-core:5.12.0") +} + +tasks.named('test', Test).configure { + useJUnitPlatform() } sourceSets { diff --git a/common/src/main/java/net/shiroha233/roadweaver/generation/RoadGenerationService.java b/common/src/main/java/net/shiroha233/roadweaver/generation/RoadGenerationService.java index 54e146a9..90578e63 100644 --- a/common/src/main/java/net/shiroha233/roadweaver/generation/RoadGenerationService.java +++ b/common/src/main/java/net/shiroha233/roadweaver/generation/RoadGenerationService.java @@ -133,8 +133,8 @@ public static boolean generateTask(ServerLevel level, StructureConnection conn) if (!modCfg.roadAppearance().roadsEnabled()) return true; RoadGenerationConfig genCfg = RoadGenerationConfig.from(modCfg); - new Road(level, conn, cfg, genCfg).generateRoad(modCfg.pathfindingCost().aStarMaxSteps()); - return true; + return new Road(level, conn, cfg, genCfg) + .generateRoad(modCfg.pathfindingCost().aStarMaxSteps()) != null; } catch (Throwable t) { return false; } diff --git a/common/src/test/java/net/shiroha233/roadweaver/generation/RoadGenerationServiceTest.java b/common/src/test/java/net/shiroha233/roadweaver/generation/RoadGenerationServiceTest.java new file mode 100644 index 00000000..9114f997 --- /dev/null +++ b/common/src/test/java/net/shiroha233/roadweaver/generation/RoadGenerationServiceTest.java @@ -0,0 +1,76 @@ +package net.shiroha233.roadweaver.generation; + +import net.minecraft.SharedConstants; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.Bootstrap; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.shiroha233.roadweaver.config.ConfigService; +import net.shiroha233.roadweaver.config.ModConfig; +import net.shiroha233.roadweaver.config.sub.RoadAppearanceConfig; +import net.shiroha233.roadweaver.config.sub.RoadGenerationConfig; +import net.shiroha233.roadweaver.core.model.StructureConnection; +import net.shiroha233.roadweaver.features.path.config.PathFeatureConfig; +import net.shiroha233.roadweaver.features.path.pathlogic.core.Road; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class RoadGenerationServiceTest { + + @Test + void generateTaskFailsWhenRoadGenerationProducesNoRoadData() { + SharedConstants.tryDetectVersion(); + Bootstrap.bootStrap(); + + ModConfig modConfig = ConfigService.get(); + RoadAppearanceConfig roadAppearance = modConfig.roadAppearance(); + boolean roadsEnabled = roadAppearance.roadsEnabled(); + boolean allowArtificial = roadAppearance.allowArtificial(); + boolean allowNatural = roadAppearance.allowNatural(); + + try { + roadAppearance.setRoadsEnabled(true); + roadAppearance.setAllowArtificial(false); + roadAppearance.setAllowNatural(false); + + ServerLevel level = mock(ServerLevel.class); + RegistryAccess registryAccess = mock(RegistryAccess.class); + @SuppressWarnings("unchecked") + Registry> configuredFeatures = mock(Registry.class); + + when(level.dimension()).thenReturn(Level.OVERWORLD); + when(level.registryAccess()).thenReturn(registryAccess); + when(registryAccess.registryOrThrow(Registries.CONFIGURED_FEATURE)).thenReturn(configuredFeatures); + + StructureConnection connection = new StructureConnection( + BlockPos.ZERO, + new BlockPos(16, 0, 0) + ); + + Road road = new Road( + level, + connection, + new PathFeatureConfig(), + RoadGenerationConfig.from(modConfig) + ); + assertNull( + road.generateRoad(modConfig.pathfindingCost().aStarMaxSteps()), + "Test setup must make Road.generateRoad() return null" + ); + + assertFalse(RoadGenerationService.generateTask(level, connection)); + } finally { + roadAppearance.setRoadsEnabled(roadsEnabled); + roadAppearance.setAllowArtificial(allowArtificial); + roadAppearance.setAllowNatural(allowNatural); + } + } +}