From 41664fc605f68f3eb2ae2a5737f6031a10f86800 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:19:27 +0200 Subject: [PATCH 01/18] chore: - Extracted magic value 234234565 to CONTINENT_SEED_SALT Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../java/art/arcane/iris/generation/runtime/IrisComplex.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java index ffd5b3872..6685c4790 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java @@ -123,6 +123,7 @@ public class IrisComplex implements DataProvider { private static final double SLOPE_RUN = 3D; /** A sheer coast would let shoreMinimumWidth buy unbounded height, so the shore band stops climbing here. */ private static final double MAX_SHORE_BAND_GRADIENT = 3D; + private static final int CONTINENT_SEED_SALT = 234234565; private static final Comparator INTERPOLATOR_ORDER = Comparator .comparing((IrisInterpolator interpolator) -> interpolator.getFunction().name()) .thenComparingDouble(IrisInterpolator::getHorizontalScale); @@ -372,7 +373,7 @@ public class IrisComplex implements DataProvider { .convertAware2D(ProceduralStream::get), "shoreBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SHORE, shoreBiomeStream); bridgeStream = focusedBiomes != null ? focusedBiomes.convert(IrisBiome::getInferredType) : - GenerationStreams.cache2D(engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(234234565), getData()) + GenerationStreams.cache2D(engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(CONTINENT_SEED_SALT), getData()) .bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND), "bridgeStream", engine, cacheSize); ProceduralStream proceduralBaseBiomeStream = focusedBiomes != null ? focusedBiomes : From d80fcedd91afc10eea53861dfdaf6d55cf610ec9 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:19:59 +0200 Subject: [PATCH 02/18] chore: - Extracted continent seed derivation to createContinentSeedSource Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../art/arcane/iris/generation/runtime/IrisComplex.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java index 6685c4790..59ecd1279 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java @@ -373,7 +373,7 @@ public class IrisComplex implements DataProvider { .convertAware2D(ProceduralStream::get), "shoreBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SHORE, shoreBiomeStream); bridgeStream = focusedBiomes != null ? focusedBiomes.convert(IrisBiome::getInferredType) : - GenerationStreams.cache2D(engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(CONTINENT_SEED_SALT), getData()) + GenerationStreams.cache2D(engine.getDimension().getContinentalStyle().create(createContinentSeedSource(), getData()) .bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND), "bridgeStream", engine, cacheSize); ProceduralStream proceduralBaseBiomeStream = focusedBiomes != null ? focusedBiomes : @@ -497,6 +497,10 @@ public class IrisComplex implements DataProvider { //@done } + private RNG createContinentSeedSource() { + return rng.nextParallelRNG(CONTINENT_SEED_SALT); + } + /** * The Studio-wide cache exists for the runtime a player edits against. Detached runtimes serve * historical activations (transition bands, saved-biome queries) and keep the configured size, or From a0aa62b8c6f6befd8a67358fe0f83ba49895c56c Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:20:32 +0200 Subject: [PATCH 03/18] chore: - Extracted continent zoom scaling to scaleByContinentZoom Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../art/arcane/iris/generation/runtime/IrisComplex.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java index 59ecd1279..4be2bd851 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java @@ -373,8 +373,7 @@ public class IrisComplex implements DataProvider { .convertAware2D(ProceduralStream::get), "shoreBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SHORE, shoreBiomeStream); bridgeStream = focusedBiomes != null ? focusedBiomes.convert(IrisBiome::getInferredType) : - GenerationStreams.cache2D(engine.getDimension().getContinentalStyle().create(createContinentSeedSource(), getData()) - .bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream() + GenerationStreams.cache2D(scaleByContinentZoom(engine.getDimension().getContinentalStyle().create(createContinentSeedSource(), getData()), engine.getDimension()).stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND), "bridgeStream", engine, cacheSize); ProceduralStream proceduralBaseBiomeStream = focusedBiomes != null ? focusedBiomes : GenerationStreams.cache2D(bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z)) @@ -501,6 +500,10 @@ public class IrisComplex implements DataProvider { return rng.nextParallelRNG(CONTINENT_SEED_SALT); } + private static CNG scaleByContinentZoom(CNG generator, IrisDimension dimension) { + return generator.bake().scale(1D / dimension.getContinentZoom()).bake(); + } + /** * The Studio-wide cache exists for the runtime a player edits against. Detached runtimes serve * historical activations (transition bands, saved-biome queries) and keep the configured size, or From b7e6259a050a63350e83c397bed67b8aada29da5 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:21:05 +0200 Subject: [PATCH 04/18] chore: - Extracted shared continent generator lookup to takeSharedContinentGenerator Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../art/arcane/iris/generation/runtime/IrisComplex.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java index 4be2bd851..fd1f38406 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java @@ -373,7 +373,7 @@ public class IrisComplex implements DataProvider { .convertAware2D(ProceduralStream::get), "shoreBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SHORE, shoreBiomeStream); bridgeStream = focusedBiomes != null ? focusedBiomes.convert(IrisBiome::getInferredType) : - GenerationStreams.cache2D(scaleByContinentZoom(engine.getDimension().getContinentalStyle().create(createContinentSeedSource(), getData()), engine.getDimension()).stream() + GenerationStreams.cache2D(scaleByContinentZoom(takeSharedContinentGenerator(engine.getDimension()), engine.getDimension()).stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND), "bridgeStream", engine, cacheSize); ProceduralStream proceduralBaseBiomeStream = focusedBiomes != null ? focusedBiomes : GenerationStreams.cache2D(bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z)) @@ -496,6 +496,10 @@ public class IrisComplex implements DataProvider { //@done } + private CNG takeSharedContinentGenerator(IrisDimension dimension) { + return dimension.getContinentalStyle().create(createContinentSeedSource(), getData()); + } + private RNG createContinentSeedSource() { return rng.nextParallelRNG(CONTINENT_SEED_SALT); } From 0b6ac19fa7847a111d89b604a201b01debc04a0d Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:21:38 +0200 Subject: [PATCH 05/18] chore: - Extracted continent generator construction to createContinentGenerator Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../art/arcane/iris/generation/runtime/IrisComplex.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java index fd1f38406..b13417024 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java @@ -373,7 +373,7 @@ public class IrisComplex implements DataProvider { .convertAware2D(ProceduralStream::get), "shoreBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SHORE, shoreBiomeStream); bridgeStream = focusedBiomes != null ? focusedBiomes.convert(IrisBiome::getInferredType) : - GenerationStreams.cache2D(scaleByContinentZoom(takeSharedContinentGenerator(engine.getDimension()), engine.getDimension()).stream() + GenerationStreams.cache2D(createContinentGenerator(engine.getDimension()).stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND), "bridgeStream", engine, cacheSize); ProceduralStream proceduralBaseBiomeStream = focusedBiomes != null ? focusedBiomes : GenerationStreams.cache2D(bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z)) @@ -496,6 +496,10 @@ public class IrisComplex implements DataProvider { //@done } + private CNG createContinentGenerator(IrisDimension dimension) { + return scaleByContinentZoom(takeSharedContinentGenerator(dimension), dimension); + } + private CNG takeSharedContinentGenerator(IrisDimension dimension) { return dimension.getContinentalStyle().create(createContinentSeedSource(), getData()); } From 5bffa6eb0473e419fafdd343cb158e72a1f9a928 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:22:10 +0200 Subject: [PATCH 06/18] chore: - Moved continent generator construction to ContinentGenerator Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../iris/generation/runtime/IrisComplex.java | 16 ++--------- .../terrain/ContinentGenerator.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java index b13417024..f737ec417 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java @@ -52,6 +52,7 @@ import art.arcane.iris.generation.decoration.IrisDecorationPart; import art.arcane.iris.generation.decoration.IrisDecorator; import art.arcane.iris.generation.noise.IrisGenerator; import art.arcane.iris.generation.noise.IrisGeneratorStyle; +import art.arcane.iris.generation.terrain.ContinentGenerator; import art.arcane.iris.generation.terrain.IrisDimension; import art.arcane.iris.generation.context.IrisContext; import art.arcane.iris.generation.noise.IrisInterpolator; @@ -123,7 +124,6 @@ public class IrisComplex implements DataProvider { private static final double SLOPE_RUN = 3D; /** A sheer coast would let shoreMinimumWidth buy unbounded height, so the shore band stops climbing here. */ private static final double MAX_SHORE_BAND_GRADIENT = 3D; - private static final int CONTINENT_SEED_SALT = 234234565; private static final Comparator INTERPOLATOR_ORDER = Comparator .comparing((IrisInterpolator interpolator) -> interpolator.getFunction().name()) .thenComparingDouble(IrisInterpolator::getHorizontalScale); @@ -497,19 +497,7 @@ public class IrisComplex implements DataProvider { } private CNG createContinentGenerator(IrisDimension dimension) { - return scaleByContinentZoom(takeSharedContinentGenerator(dimension), dimension); - } - - private CNG takeSharedContinentGenerator(IrisDimension dimension) { - return dimension.getContinentalStyle().create(createContinentSeedSource(), getData()); - } - - private RNG createContinentSeedSource() { - return rng.nextParallelRNG(CONTINENT_SEED_SALT); - } - - private static CNG scaleByContinentZoom(CNG generator, IrisDimension dimension) { - return generator.bake().scale(1D / dimension.getContinentZoom()).bake(); + return ContinentGenerator.create(dimension, rng, getData()); } /** diff --git a/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java new file mode 100644 index 000000000..aa6980f87 --- /dev/null +++ b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java @@ -0,0 +1,28 @@ +package art.arcane.iris.generation.terrain; + +import art.arcane.iris.pack.loading.IrisData; +import art.arcane.volmlib.util.math.RNG; +import art.arcane.volmlib.util.noise.CNG; + +public final class ContinentGenerator { + private static final int CONTINENT_SEED_SALT = 234234565; + + private ContinentGenerator() { + } + + public static CNG create(IrisDimension dimension, RNG parentSeedSource, IrisData packData) { + return scaleByContinentZoom(takeSharedGenerator(dimension, parentSeedSource, packData), dimension); + } + + private static CNG takeSharedGenerator(IrisDimension dimension, RNG parentSeedSource, IrisData packData) { + return dimension.getContinentalStyle().create(deriveContinentSeed(parentSeedSource), packData); + } + + private static RNG deriveContinentSeed(RNG parentSeedSource) { + return parentSeedSource.nextParallelRNG(CONTINENT_SEED_SALT); + } + + private static CNG scaleByContinentZoom(CNG generator, IrisDimension dimension) { + return generator.bake().scale(1D / dimension.getContinentZoom()).bake(); + } +} From f07dfb7a85ab33bcf7ae63a811fdebbf96913bea Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:22:42 +0200 Subject: [PATCH 07/18] chore: - Inlined IrisComplex.createContinentGenerator Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../art/arcane/iris/generation/runtime/IrisComplex.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java index f737ec417..a37a72a0d 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/IrisComplex.java @@ -373,7 +373,7 @@ public class IrisComplex implements DataProvider { .convertAware2D(ProceduralStream::get), "shoreBiomeStream", engine, cacheSize); inferredStreams.put(InferredType.SHORE, shoreBiomeStream); bridgeStream = focusedBiomes != null ? focusedBiomes.convert(IrisBiome::getInferredType) : - GenerationStreams.cache2D(createContinentGenerator(engine.getDimension()).stream() + GenerationStreams.cache2D(ContinentGenerator.create(engine.getDimension(), rng, getData()).stream() .convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND), "bridgeStream", engine, cacheSize); ProceduralStream proceduralBaseBiomeStream = focusedBiomes != null ? focusedBiomes : GenerationStreams.cache2D(bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z)) @@ -496,10 +496,6 @@ public class IrisComplex implements DataProvider { //@done } - private CNG createContinentGenerator(IrisDimension dimension) { - return ContinentGenerator.create(dimension, rng, getData()); - } - /** * The Studio-wide cache exists for the runtime a player edits against. Detached runtimes serve * historical activations (transition bands, saved-biome queries) and keep the configured size, or From 789644b93f5dfd0c499b58df826abe17407934b2 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 04:23:14 +0200 Subject: [PATCH 08/18] chore: - Replaced DimensionTerrainContext continent chain with ContinentGenerator Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../iris/generation/runtime/DimensionTerrainContext.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/art/arcane/iris/generation/runtime/DimensionTerrainContext.java b/core/src/main/java/art/arcane/iris/generation/runtime/DimensionTerrainContext.java index a5449c555..c5db627a5 100644 --- a/core/src/main/java/art/arcane/iris/generation/runtime/DimensionTerrainContext.java +++ b/core/src/main/java/art/arcane/iris/generation/runtime/DimensionTerrainContext.java @@ -5,6 +5,7 @@ import art.arcane.iris.generation.stream.GenerationStreams; import art.arcane.iris.configuration.IrisSettings; import art.arcane.iris.pack.loading.IrisData; import art.arcane.iris.generation.image.IrisImageMapRuntime; +import art.arcane.iris.generation.terrain.ContinentGenerator; import art.arcane.iris.generation.terrain.InferredType; import art.arcane.iris.generation.biome.IrisBiome; import art.arcane.iris.generation.terrain.IrisDimension; @@ -258,9 +259,7 @@ public final class DimensionTerrainContext implements DataProvider { inferredStreams.put(InferredType.SHORE, shoreBiomeStream); ProceduralStream bridgeStream = focusBiome == null - ? dimension.getContinentalStyle() - .create(rng.nextParallelRNG(234234565), dimensionData) - .bake().scale(1D / dimension.getContinentZoom()).bake().stream() + ? ContinentGenerator.create(dimension, rng, dimensionData).stream() .convert(value -> value >= dimension.getLandChance() ? InferredType.SEA : InferredType.LAND) From 72eff9b7754027bd2f9447917abc659a51e618bf Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:12:37 +0200 Subject: [PATCH 09/18] feat: - Added ExpectedToFailUntilFixed marker and rule Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../ExpectedToFailUntilFixedRuleTest.java | 81 +++++++++++++++++++ .../testsupport/ExpectedToFailUntilFixed.java | 12 +++ .../ExpectedToFailUntilFixedRule.java | 42 ++++++++++ 3 files changed, 135 insertions(+) create mode 100644 core/src/test/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRuleTest.java create mode 100644 core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixed.java create mode 100644 core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRule.java diff --git a/core/src/test/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRuleTest.java b/core/src/test/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRuleTest.java new file mode 100644 index 000000000..2f8bd6d53 --- /dev/null +++ b/core/src/test/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRuleTest.java @@ -0,0 +1,81 @@ +package art.arcane.iris.testsupport; + +import org.junit.AssumptionViolatedException; +import org.junit.Test; +import org.junit.function.ThrowingRunnable; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import java.lang.annotation.Annotation; + +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +public class ExpectedToFailUntilFixedRuleTest { + private static final String KNOWN_BUG = "known bug"; + private static final String BUG_STILL_PRESENT = "bug still present"; + private static final String REMOVAL_REMINDER = "remove @ExpectedToFailUntilFixed: " + KNOWN_BUG; + private static final Statement PASSING = new Statement() { + @Override + public void evaluate() { + } + }; + + private final ExpectedToFailUntilFixedRule rule = new ExpectedToFailUntilFixedRule(); + private final AssertionError bugStillPresent = new AssertionError(BUG_STILL_PRESENT); + private final IllegalStateException crash = new IllegalStateException(BUG_STILL_PRESENT); + + @Test + public void doesAMarkedTestThatStillFailsGetReportedAsSkippedWithItsFailure() { + assertSame(bugStillPresent, assertThrows(AssumptionViolatedException.class, runMarked(failingWith(bugStillPresent))).getCause()); + } + + @Test + public void doesAMarkedTestThatPassesFailWithARemovalReminder() { + assertTrue(messageOfAssertionFailure(runMarked(PASSING)).contains(REMOVAL_REMINDER)); + } + + @Test + public void doesACrashInAMarkedTestStillFail() { + assertSame(crash, assertThrows(IllegalStateException.class, runMarked(failingWith(crash)))); + } + + @Test + public void doesAnUnmarkedFailingTestStillFail() { + assertSame(bugStillPresent, assertThrows(AssertionError.class, runUnmarked(failingWith(bugStillPresent)))); + } + + @ExpectedToFailUntilFixed(KNOWN_BUG) + private void markedTestTemplate() { + } + + private ThrowingRunnable runMarked(Statement test) { + return () -> rule.apply(test, describe(markerOfTemplate())).evaluate(); + } + + private ThrowingRunnable runUnmarked(Statement test) { + return () -> rule.apply(test, describe()).evaluate(); + } + + private ExpectedToFailUntilFixed markerOfTemplate() throws NoSuchMethodException { + return getClass().getDeclaredMethod("markedTestTemplate").getAnnotation(ExpectedToFailUntilFixed.class); + } + + private static String messageOfAssertionFailure(ThrowingRunnable test) { + return assertThrows(AssertionError.class, test).getMessage(); + } + + private static Description describe(Annotation... annotations) { + return Description.createTestDescription(ExpectedToFailUntilFixedRuleTest.class, "example", annotations); + } + + private static Statement failingWith(Throwable failure) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + throw failure; + } + }; + } +} diff --git a/core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixed.java b/core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixed.java new file mode 100644 index 000000000..78dd73a37 --- /dev/null +++ b/core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixed.java @@ -0,0 +1,12 @@ +package art.arcane.iris.testsupport; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ExpectedToFailUntilFixed { + String value(); +} diff --git a/core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRule.java b/core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRule.java new file mode 100644 index 000000000..182f1b979 --- /dev/null +++ b/core/src/testFixtures/java/art/arcane/iris/testsupport/ExpectedToFailUntilFixedRule.java @@ -0,0 +1,42 @@ +package art.arcane.iris.testsupport; + +import org.junit.AssumptionViolatedException; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +public final class ExpectedToFailUntilFixedRule implements TestRule { + @Override + public Statement apply(Statement test, Description description) { + ExpectedToFailUntilFixed marker = markerOf(description); + return marker == null ? test : new ExpectedFailure(test, marker.value()); + } + + private static ExpectedToFailUntilFixed markerOf(Description description) { + return description.getAnnotation(ExpectedToFailUntilFixed.class); + } + + private static final class ExpectedFailure extends Statement { + private final Statement test; + private final String reason; + + private ExpectedFailure(Statement test, String reason) { + this.test = test; + this.reason = reason; + } + + @Override + public void evaluate() throws Throwable { + try { + test.evaluate(); + } catch (AssertionError stillFailing) { + throw reportAsSkipped(stillFailing); + } + throw new AssertionError("Passes now, remove @ExpectedToFailUntilFixed: " + reason); + } + + private AssumptionViolatedException reportAsSkipped(AssertionError stillFailing) { + return new AssumptionViolatedException("Still failing until fixed: " + reason, stillFailing); + } + } +} From 622b40f786f18868cfd4149b4d59f16f3bd4450b Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:12:40 +0200 Subject: [PATCH 10/18] test: - Added ContinentGeneratorTest checking the continent map at world start Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../terrain/ContinentGeneratorTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java diff --git a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java new file mode 100644 index 000000000..1c952e4b3 --- /dev/null +++ b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java @@ -0,0 +1,65 @@ +package art.arcane.iris.generation.terrain; + +import art.arcane.iris.generation.noise.IrisGeneratorStyle; +import art.arcane.iris.generation.noise.NoiseStyle; +import art.arcane.iris.generation.runtime.Engine; +import art.arcane.iris.pack.loading.IrisData; +import art.arcane.volmlib.util.math.RNG; +import art.arcane.volmlib.util.noise.CNG; +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.assertArrayEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ContinentGeneratorTest { + private static final long WORLD_SEED = 7L; + private static final double POWER_OF_TWO_CONTINENT_ZOOM = 4D; + private static final double[][] SAMPLE_BLOCKS = {{1000D, -2000D}, {12.5D, -7.25D}, {-517D, 333D}}; + private static final double[] CONTINENT_MAP_OF_EXISTING_WORLDS = + {0.21889892332042843D, 0.6984934456740721D, 0.2708759584352327D}; + + private final IrisData packData = createPackDataThatBelongsToOneRunningEngine(); + private final IrisDimension baseZoomDimension = createDimensionWithContinentZoom(POWER_OF_TWO_CONTINENT_ZOOM); + + @Test + public void doesTheContinentMapAtWorldStartMatchExistingWorlds() { + assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAtWorldStart(baseZoomDimension), 0D); + } + + private double[] sampleContinentMapAtWorldStart(IrisDimension dimension) { + return sampleContinentMap(dimension, SAMPLE_BLOCKS); + } + + private double[] sampleContinentMap(IrisDimension dimension, double[][] blocks) { + return sampleAtBlocks(ContinentGenerator.create(dimension, new RNG(WORLD_SEED), packData), blocks); + } + + private static double[] sampleAtBlocks(CNG continentGenerator, double[][] blocks) { + return Arrays.stream(blocks).mapToDouble(block -> sampleAt(continentGenerator, block)).toArray(); + } + + private static double sampleAt(CNG continentGenerator, double[] block) { + return continentGenerator.noise(block[0], block[1]); + } + + private static IrisDimension createDimensionWithContinentZoom(double zoom) { + return new IrisDimension().setContinentalStyle(createSimplexStyle()).setContinentZoom(zoom); + } + + private static IrisGeneratorStyle createSimplexStyle() { + return new IrisGeneratorStyle(NoiseStyle.SIMPLEX); + } + + private static IrisData createPackDataThatBelongsToOneRunningEngine() { + IrisData newPackData = mock(IrisData.class); + bindToNewRunningEngine(newPackData); + return newPackData; + } + + private static void bindToNewRunningEngine(IrisData packData) { + when(packData.getEngine()).thenReturn(mock(Engine.class)); + } +} From 788ac0671327958e61c5d072f4c925dc71ab4ec1 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:12:43 +0200 Subject: [PATCH 11/18] test: - Added continent zoom stretch test Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../terrain/ContinentGeneratorTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java index 1c952e4b3..21f3edac6 100644 --- a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java +++ b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java @@ -17,22 +17,35 @@ import static org.mockito.Mockito.when; public class ContinentGeneratorTest { private static final long WORLD_SEED = 7L; private static final double POWER_OF_TWO_CONTINENT_ZOOM = 4D; + private static final double SQUARED_CONTINENT_ZOOM = POWER_OF_TWO_CONTINENT_ZOOM * POWER_OF_TWO_CONTINENT_ZOOM; private static final double[][] SAMPLE_BLOCKS = {{1000D, -2000D}, {12.5D, -7.25D}, {-517D, 333D}}; + private static final double[][] BLOCKS_SHRUNK_BY_CONTINENT_ZOOM = shrinkByContinentZoom(SAMPLE_BLOCKS); private static final double[] CONTINENT_MAP_OF_EXISTING_WORLDS = {0.21889892332042843D, 0.6984934456740721D, 0.2708759584352327D}; private final IrisData packData = createPackDataThatBelongsToOneRunningEngine(); private final IrisDimension baseZoomDimension = createDimensionWithContinentZoom(POWER_OF_TWO_CONTINENT_ZOOM); + private final IrisDimension squaredZoomDimension = createDimensionWithContinentZoom(SQUARED_CONTINENT_ZOOM); @Test public void doesTheContinentMapAtWorldStartMatchExistingWorlds() { assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAtWorldStart(baseZoomDimension), 0D); } + @Test + public void doesSquaredContinentZoomStretchTheContinentMapByTheBaseZoom() { + assertArrayEquals(sampleBaseContinentMapStretchedByBaseZoom(), + sampleContinentMapAtWorldStart(squaredZoomDimension), 0D); + } + private double[] sampleContinentMapAtWorldStart(IrisDimension dimension) { return sampleContinentMap(dimension, SAMPLE_BLOCKS); } + private double[] sampleBaseContinentMapStretchedByBaseZoom() { + return sampleContinentMap(baseZoomDimension, BLOCKS_SHRUNK_BY_CONTINENT_ZOOM); + } + private double[] sampleContinentMap(IrisDimension dimension, double[][] blocks) { return sampleAtBlocks(ContinentGenerator.create(dimension, new RNG(WORLD_SEED), packData), blocks); } @@ -45,6 +58,14 @@ public class ContinentGeneratorTest { return continentGenerator.noise(block[0], block[1]); } + private static double[][] shrinkByContinentZoom(double[][] blocks) { + return Arrays.stream(blocks).map(block -> shrinkByContinentZoom(block)).toArray(double[][]::new); + } + + private static double[] shrinkByContinentZoom(double[] block) { + return new double[]{block[0] / POWER_OF_TWO_CONTINENT_ZOOM, block[1] / POWER_OF_TWO_CONTINENT_ZOOM}; + } + private static IrisDimension createDimensionWithContinentZoom(double zoom) { return new IrisDimension().setContinentalStyle(createSimplexStyle()).setContinentZoom(zoom); } From 7e73e8f599e542499f583feed445c76cf4d7a417 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:12:47 +0200 Subject: [PATCH 12/18] test: - Added rebuild test, expected to fail until the fix Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../terrain/ContinentGeneratorTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java index 21f3edac6..d1588f6d0 100644 --- a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java +++ b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java @@ -4,8 +4,11 @@ import art.arcane.iris.generation.noise.IrisGeneratorStyle; import art.arcane.iris.generation.noise.NoiseStyle; import art.arcane.iris.generation.runtime.Engine; import art.arcane.iris.pack.loading.IrisData; +import art.arcane.iris.testsupport.ExpectedToFailUntilFixed; +import art.arcane.iris.testsupport.ExpectedToFailUntilFixedRule; import art.arcane.volmlib.util.math.RNG; import art.arcane.volmlib.util.noise.CNG; +import org.junit.Rule; import org.junit.Test; import java.util.Arrays; @@ -15,6 +18,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ContinentGeneratorTest { + private static final String SHARED_STYLE_GENERATOR_BUG = + "ContinentGenerator scales the shared style generator instead of a private one. " + + "Ref.: https://github.com/VolmitSoftware/Iris/issues/1251"; private static final long WORLD_SEED = 7L; private static final double POWER_OF_TWO_CONTINENT_ZOOM = 4D; private static final double SQUARED_CONTINENT_ZOOM = POWER_OF_TWO_CONTINENT_ZOOM * POWER_OF_TWO_CONTINENT_ZOOM; @@ -27,6 +33,9 @@ public class ContinentGeneratorTest { private final IrisDimension baseZoomDimension = createDimensionWithContinentZoom(POWER_OF_TWO_CONTINENT_ZOOM); private final IrisDimension squaredZoomDimension = createDimensionWithContinentZoom(SQUARED_CONTINENT_ZOOM); + @Rule + public final ExpectedToFailUntilFixedRule expectedFailures = new ExpectedToFailUntilFixedRule(); + @Test public void doesTheContinentMapAtWorldStartMatchExistingWorlds() { assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAtWorldStart(baseZoomDimension), 0D); @@ -38,6 +47,12 @@ public class ContinentGeneratorTest { sampleContinentMapAtWorldStart(squaredZoomDimension), 0D); } + @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) + @Test + public void doesRebuildingTheSameWorldZoomItsContinentMapOnlyOnce() { + assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAfterRebuild(baseZoomDimension), 0D); + } + private double[] sampleContinentMapAtWorldStart(IrisDimension dimension) { return sampleContinentMap(dimension, SAMPLE_BLOCKS); } @@ -46,6 +61,11 @@ public class ContinentGeneratorTest { return sampleContinentMap(baseZoomDimension, BLOCKS_SHRUNK_BY_CONTINENT_ZOOM); } + private double[] sampleContinentMapAfterRebuild(IrisDimension dimension) { + sampleContinentMapAtWorldStart(dimension); + return sampleContinentMapAtWorldStart(dimension); + } + private double[] sampleContinentMap(IrisDimension dimension, double[][] blocks) { return sampleAtBlocks(ContinentGenerator.create(dimension, new RNG(WORLD_SEED), packData), blocks); } From 38a7e0fdb5857293a23d365f0f89362752349b62 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:12:51 +0200 Subject: [PATCH 13/18] test: - Added second rebuild test, expected to fail until the fix Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../generation/terrain/ContinentGeneratorTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java index d1588f6d0..0007d5a39 100644 --- a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java +++ b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java @@ -53,6 +53,12 @@ public class ContinentGeneratorTest { assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAfterRebuild(baseZoomDimension), 0D); } + @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) + @Test + public void doesRebuildingTheSameWorldTwiceZoomItsContinentMapOnlyOnce() { + assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAfterSecondRebuild(baseZoomDimension), 0D); + } + private double[] sampleContinentMapAtWorldStart(IrisDimension dimension) { return sampleContinentMap(dimension, SAMPLE_BLOCKS); } @@ -66,6 +72,11 @@ public class ContinentGeneratorTest { return sampleContinentMapAtWorldStart(dimension); } + private double[] sampleContinentMapAfterSecondRebuild(IrisDimension dimension) { + sampleContinentMapAtWorldStart(dimension); + return sampleContinentMapAfterRebuild(dimension); + } + private double[] sampleContinentMap(IrisDimension dimension, double[][] blocks) { return sampleAtBlocks(ContinentGenerator.create(dimension, new RNG(WORLD_SEED), packData), blocks); } From 4ac49baaffeedd5e3e165900b7976d07e3f6cbb5 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:12:56 +0200 Subject: [PATCH 14/18] test: - Added overworld continental style rebuild test, expected to fail until the fix Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../terrain/ContinentGeneratorTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java index 0007d5a39..91edfd6fa 100644 --- a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java +++ b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java @@ -24,6 +24,7 @@ public class ContinentGeneratorTest { private static final long WORLD_SEED = 7L; private static final double POWER_OF_TWO_CONTINENT_ZOOM = 4D; private static final double SQUARED_CONTINENT_ZOOM = POWER_OF_TWO_CONTINENT_ZOOM * POWER_OF_TWO_CONTINENT_ZOOM; + private static final double OVERWORLD_STYLE_ZOOM = 6D; private static final double[][] SAMPLE_BLOCKS = {{1000D, -2000D}, {12.5D, -7.25D}, {-517D, 333D}}; private static final double[][] BLOCKS_SHRUNK_BY_CONTINENT_ZOOM = shrinkByContinentZoom(SAMPLE_BLOCKS); private static final double[] CONTINENT_MAP_OF_EXISTING_WORLDS = @@ -32,6 +33,7 @@ public class ContinentGeneratorTest { private final IrisData packData = createPackDataThatBelongsToOneRunningEngine(); private final IrisDimension baseZoomDimension = createDimensionWithContinentZoom(POWER_OF_TWO_CONTINENT_ZOOM); private final IrisDimension squaredZoomDimension = createDimensionWithContinentZoom(SQUARED_CONTINENT_ZOOM); + private final IrisDimension overworldStyleDimension = createDimensionWithOverworldContinentalStyle(); @Rule public final ExpectedToFailUntilFixedRule expectedFailures = new ExpectedToFailUntilFixedRule(); @@ -59,6 +61,12 @@ public class ContinentGeneratorTest { assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAfterSecondRebuild(baseZoomDimension), 0D); } + @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) + @Test + public void doesRebuildingAWorldWithTheOverworldContinentalStyleZoomItsContinentMapOnlyOnce() { + assertArrayEquals(sampleOverworldContinentMapAtWorldStart(), sampleContinentMapAfterRebuild(overworldStyleDimension), 0D); + } + private double[] sampleContinentMapAtWorldStart(IrisDimension dimension) { return sampleContinentMap(dimension, SAMPLE_BLOCKS); } @@ -77,6 +85,10 @@ public class ContinentGeneratorTest { return sampleContinentMapAfterRebuild(dimension); } + private double[] sampleOverworldContinentMapAtWorldStart() { + return sampleContinentMapAtWorldStart(createDimensionWithOverworldContinentalStyle()); + } + private double[] sampleContinentMap(IrisDimension dimension, double[][] blocks) { return sampleAtBlocks(ContinentGenerator.create(dimension, new RNG(WORLD_SEED), packData), blocks); } @@ -105,6 +117,18 @@ public class ContinentGeneratorTest { return new IrisGeneratorStyle(NoiseStyle.SIMPLEX); } + private static IrisDimension createDimensionWithOverworldContinentalStyle() { + return createDimensionWithContinentZoom(POWER_OF_TWO_CONTINENT_ZOOM).setContinentalStyle(createOverworldContinentalStyle()); + } + + private static IrisGeneratorStyle createOverworldContinentalStyle() { + return new IrisGeneratorStyle(NoiseStyle.NOWHERE_CELLULAR).setZoom(OVERWORLD_STYLE_ZOOM).setFracture(createSmokeFracture()); + } + + private static IrisGeneratorStyle createSmokeFracture() { + return new IrisGeneratorStyle(NoiseStyle.FRACTAL_SMOKE).setFracture(new IrisGeneratorStyle(NoiseStyle.STATIC)); + } + private static IrisData createPackDataThatBelongsToOneRunningEngine() { IrisData newPackData = mock(IrisData.class); bindToNewRunningEngine(newPackData); From a9df19cae2cfa90aeae8186c323a168828f38260 Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:13:22 +0200 Subject: [PATCH 15/18] chore: - Opened ContinentGenerator.deriveContinentSeed to the package Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../art/arcane/iris/generation/terrain/ContinentGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java index aa6980f87..36aed3970 100644 --- a/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java +++ b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java @@ -18,7 +18,7 @@ public final class ContinentGenerator { return dimension.getContinentalStyle().create(deriveContinentSeed(parentSeedSource), packData); } - private static RNG deriveContinentSeed(RNG parentSeedSource) { + static RNG deriveContinentSeed(RNG parentSeedSource) { return parentSeedSource.nextParallelRNG(CONTINENT_SEED_SALT); } From 8bccb48c096a1ce451a2710c2571ae49d592544e Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:13:26 +0200 Subject: [PATCH 16/18] test: - Added shared style generator test, expected to fail until the fix Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../terrain/ContinentGeneratorTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java index 91edfd6fa..f7c744998 100644 --- a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java +++ b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java @@ -67,6 +67,12 @@ public class ContinentGeneratorTest { assertArrayEquals(sampleOverworldContinentMapAtWorldStart(), sampleContinentMapAfterRebuild(overworldStyleDimension), 0D); } + @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) + @Test + public void doesBuildingTheContinentMapLeaveTheSharedStyleGeneratorUnscaled() { + assertArrayEquals(sampleUntouchedSharedStyleGenerator(), sampleSharedStyleGeneratorAfterContinentMapBuilt(baseZoomDimension), 0D); + } + private double[] sampleContinentMapAtWorldStart(IrisDimension dimension) { return sampleContinentMap(dimension, SAMPLE_BLOCKS); } @@ -89,6 +95,19 @@ public class ContinentGeneratorTest { return sampleContinentMapAtWorldStart(createDimensionWithOverworldContinentalStyle()); } + private double[] sampleSharedStyleGeneratorAfterContinentMapBuilt(IrisDimension dimension) { + sampleContinentMapAtWorldStart(dimension); + return sampleSharedStyleGenerator(dimension.getContinentalStyle()); + } + + private double[] sampleUntouchedSharedStyleGenerator() { + return sampleSharedStyleGenerator(createSimplexStyle()); + } + + private double[] sampleSharedStyleGenerator(IrisGeneratorStyle style) { + return sampleAtBlocks(style.create(ContinentGenerator.deriveContinentSeed(new RNG(WORLD_SEED)), packData), SAMPLE_BLOCKS); + } + private double[] sampleContinentMap(IrisDimension dimension, double[][] blocks) { return sampleAtBlocks(ContinentGenerator.create(dimension, new RNG(WORLD_SEED), packData), blocks); } From bda770650b3ab2f989ea84b2c38518f456be6cbf Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:14:52 +0200 Subject: [PATCH 17/18] fix: - Replaced IrisGeneratorStyle.create with createNoCache in ContinentGenerator - Removed @ExpectedToFailUntilFixed from the continent tests Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../iris/generation/terrain/ContinentGenerator.java | 2 +- .../generation/terrain/ContinentGeneratorTest.java | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java index 36aed3970..c70df49e3 100644 --- a/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java +++ b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java @@ -15,7 +15,7 @@ public final class ContinentGenerator { } private static CNG takeSharedGenerator(IrisDimension dimension, RNG parentSeedSource, IrisData packData) { - return dimension.getContinentalStyle().create(deriveContinentSeed(parentSeedSource), packData); + return dimension.getContinentalStyle().createNoCache(deriveContinentSeed(parentSeedSource), packData); } static RNG deriveContinentSeed(RNG parentSeedSource) { diff --git a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java index f7c744998..5b98f12c4 100644 --- a/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java +++ b/core/src/test/java/art/arcane/iris/generation/terrain/ContinentGeneratorTest.java @@ -4,11 +4,8 @@ import art.arcane.iris.generation.noise.IrisGeneratorStyle; import art.arcane.iris.generation.noise.NoiseStyle; import art.arcane.iris.generation.runtime.Engine; import art.arcane.iris.pack.loading.IrisData; -import art.arcane.iris.testsupport.ExpectedToFailUntilFixed; -import art.arcane.iris.testsupport.ExpectedToFailUntilFixedRule; import art.arcane.volmlib.util.math.RNG; import art.arcane.volmlib.util.noise.CNG; -import org.junit.Rule; import org.junit.Test; import java.util.Arrays; @@ -18,9 +15,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ContinentGeneratorTest { - private static final String SHARED_STYLE_GENERATOR_BUG = - "ContinentGenerator scales the shared style generator instead of a private one. " - + "Ref.: https://github.com/VolmitSoftware/Iris/issues/1251"; private static final long WORLD_SEED = 7L; private static final double POWER_OF_TWO_CONTINENT_ZOOM = 4D; private static final double SQUARED_CONTINENT_ZOOM = POWER_OF_TWO_CONTINENT_ZOOM * POWER_OF_TWO_CONTINENT_ZOOM; @@ -35,9 +29,6 @@ public class ContinentGeneratorTest { private final IrisDimension squaredZoomDimension = createDimensionWithContinentZoom(SQUARED_CONTINENT_ZOOM); private final IrisDimension overworldStyleDimension = createDimensionWithOverworldContinentalStyle(); - @Rule - public final ExpectedToFailUntilFixedRule expectedFailures = new ExpectedToFailUntilFixedRule(); - @Test public void doesTheContinentMapAtWorldStartMatchExistingWorlds() { assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAtWorldStart(baseZoomDimension), 0D); @@ -49,25 +40,21 @@ public class ContinentGeneratorTest { sampleContinentMapAtWorldStart(squaredZoomDimension), 0D); } - @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) @Test public void doesRebuildingTheSameWorldZoomItsContinentMapOnlyOnce() { assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAfterRebuild(baseZoomDimension), 0D); } - @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) @Test public void doesRebuildingTheSameWorldTwiceZoomItsContinentMapOnlyOnce() { assertArrayEquals(CONTINENT_MAP_OF_EXISTING_WORLDS, sampleContinentMapAfterSecondRebuild(baseZoomDimension), 0D); } - @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) @Test public void doesRebuildingAWorldWithTheOverworldContinentalStyleZoomItsContinentMapOnlyOnce() { assertArrayEquals(sampleOverworldContinentMapAtWorldStart(), sampleContinentMapAfterRebuild(overworldStyleDimension), 0D); } - @ExpectedToFailUntilFixed(SHARED_STYLE_GENERATOR_BUG) @Test public void doesBuildingTheContinentMapLeaveTheSharedStyleGeneratorUnscaled() { assertArrayEquals(sampleUntouchedSharedStyleGenerator(), sampleSharedStyleGeneratorAfterContinentMapBuilt(baseZoomDimension), 0D); From ba4708f2bbfefcfae960f724928b8da299819ddf Mon Sep 17 00:00:00 2001 From: CeeVeeR Date: Fri, 2 Oct 2026 05:23:25 +0200 Subject: [PATCH 18/18] chore: - Renamed takeSharedGenerator to createContinentalStyleGenerator Ref.: https://github.com/VolmitSoftware/Iris/issues/1251 --- .../arcane/iris/generation/terrain/ContinentGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java index c70df49e3..4423d81b9 100644 --- a/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java +++ b/core/src/main/java/art/arcane/iris/generation/terrain/ContinentGenerator.java @@ -11,10 +11,10 @@ public final class ContinentGenerator { } public static CNG create(IrisDimension dimension, RNG parentSeedSource, IrisData packData) { - return scaleByContinentZoom(takeSharedGenerator(dimension, parentSeedSource, packData), dimension); + return scaleByContinentZoom(createContinentalStyleGenerator(dimension, parentSeedSource, packData), dimension); } - private static CNG takeSharedGenerator(IrisDimension dimension, RNG parentSeedSource, IrisData packData) { + private static CNG createContinentalStyleGenerator(IrisDimension dimension, RNG parentSeedSource, IrisData packData) { return dimension.getContinentalStyle().createNoCache(deriveContinentSeed(parentSeedSource), packData); }