Test- 26.3

This commit is contained in:
Brian Neumann-Fopiano committed 2026-09-19 23:48:44 -04:00
1 parent edadd14f4b
commit f0e7fea13b
107 files changed
+25110 -86

No files matched your search

@@ -1,5 +1,7 @@
package art.arcane.iris.pack;
import art.arcane.iris.platform.bukkit.nms.datapack.DataVersion;
import art.arcane.iris.world.lifecycle.BukkitStartupPaths;
import art.arcane.iris.world.history.GenerationRegistryContractFactory;
import art.arcane.iris.generation.biome.IrisBiomeCustom;
@@ -49,6 +51,28 @@ public class DefaultPackBootstrapProvisionerTest {
assertTrue(DefaultPackBootstrapProvisioner.defaultPacks().isEmpty());
}
@Test
public void bootstrapUsesTheSelectedRuntimeBiomeSchema() throws Exception {
Path root = Files.createTempDirectory("iris-bootstrap-runtime");
try {
Path dataDirectory = root.resolve("plugins/Iris");
writePack(dataDirectory.resolve("packs/overworld"), "overworld", "runtime");
BukkitStartupPaths startupPaths = BukkitStartupPaths.resolve(root, new String[0]);
for (DataVersion version : new DataVersion[]{DataVersion.V26_1_2, DataVersion.V26_2, DataVersion.V26_3}) {
DefaultPackBootstrapProvisioner.ProvisionResult result = DefaultPackBootstrapProvisioner.provision(
new DefaultPackBootstrapProvisioner.BootstrapRequest(dataDirectory, ignored -> {}, startupPaths, version));
Path biomeRoot = result.datapackRoot().resolve("data/iris/worldgen/biome/biomes");
try (Stream<Path> paths = Files.list(biomeRoot)) {
String json = Files.readString(paths.findFirst().orElseThrow());
assertEquals(version != DataVersion.V26_3, json.contains("\"spawners\""));
assertEquals(version == DataVersion.V26_3, json.contains("minecraft:gameplay/natural_mob_spawns"));
}
}
} finally {
delete(root);
}
}
@Test
public void emptyInstallPublishesValidDatapackWithoutNetworkRequests() throws Exception {
AtomicInteger requests = new AtomicInteger();
@@ -66,7 +90,8 @@ public class DefaultPackBootstrapProvisionerTest {
1,
Duration.ZERO,
8L * 1024L * 1024L,
root
root,
DataVersion.getLatest()
);
DefaultPackBootstrapProvisioner.ProvisionResult result = DefaultPackBootstrapProvisioner.provision(
@@ -648,8 +673,8 @@ public class DefaultPackBootstrapProvisionerTest {
BukkitStartupPaths startupPaths = BukkitStartupPaths.resolve(serverRoot, new String[0]);
DefaultPackBootstrapProvisioner.ProvisionResult installed =
DefaultPackBootstrapProvisioner.provision(dataDirectory, ignored -> {
}, startupPaths);
DefaultPackBootstrapProvisioner.provision(new DefaultPackBootstrapProvisioner.BootstrapRequest(dataDirectory, ignored -> {
}, startupPaths, DataVersion.getLatest()));
Path levelStem = installed.datapackRoot().resolve("data/iris/dimension/moon.json");
assertEquals(DefaultPackBootstrapProvisioner.ProvisionStatus.INSTALLED, installed.status());
@@ -661,8 +686,8 @@ public class DefaultPackBootstrapProvisionerTest {
StandardCharsets.UTF_8
);
DefaultPackBootstrapProvisioner.ProvisionResult updated =
DefaultPackBootstrapProvisioner.provision(dataDirectory, ignored -> {
}, startupPaths);
DefaultPackBootstrapProvisioner.provision(new DefaultPackBootstrapProvisioner.BootstrapRequest(dataDirectory, ignored -> {
}, startupPaths, DataVersion.getLatest()));
assertEquals(DefaultPackBootstrapProvisioner.ProvisionStatus.UPDATED, updated.status());
assertTrue(Files.readString(levelStem).contains("\"type\": \"iris:underworld\""));
@@ -709,7 +734,8 @@ public class DefaultPackBootstrapProvisionerTest {
1,
Duration.ZERO,
8L * 1024L * 1024L,
serverRoot
serverRoot,
DataVersion.getLatest()
);
}
@@ -170,14 +170,16 @@ public class IrisDatapackCompilerTest {
int maxFormat = pack.getInt("max_format");
assertEquals(101, minFormat);
assertEquals(107, maxFormat);
assertEquals(121, maxFormat);
assertEquals(maxFormat, pack.getInt("pack_format"));
// One artifact serves both runtimes: each supported DataVersion's format must be in range.
// One artifact serves supported runtimes: each supported DataVersion's format must be in range.
assertTrue(minFormat <= DataVersion.V26_1_2.getPackFormat()
&& DataVersion.V26_1_2.getPackFormat() <= maxFormat);
assertTrue(minFormat <= DataVersion.V26_2.getPackFormat()
&& DataVersion.V26_2.getPackFormat() <= maxFormat);
assertTrue(minFormat <= DataVersion.V26_3.getPackFormat()
&& DataVersion.V26_3.getPackFormat() <= maxFormat);
}
@Test
@@ -496,14 +498,14 @@ public class IrisDatapackCompilerTest {
Path dataDirectory = server.resolve("plugins/Iris");
BukkitStartupPaths startupPaths = BukkitStartupPaths.resolve(server, new String[0]);
DefaultPackBootstrapProvisioner.ProvisionResult installed =
DefaultPackBootstrapProvisioner.provision(dataDirectory, ignored -> {
}, startupPaths);
DefaultPackBootstrapProvisioner.provision(new DefaultPackBootstrapProvisioner.BootstrapRequest(dataDirectory, ignored -> {
}, startupPaths, DataVersion.getLatest()));
assertEquals(DefaultPackBootstrapProvisioner.ProvisionStatus.INSTALLED, installed.status());
assertTrue(Files.isRegularFile(installed.datapackRoot().resolve("data/iris/dimension_type/upper.json")));
assertEquals(2, regularFileCount(installed.datapackRoot().resolve("data/iris/worldgen/biome/biomes")));
DefaultPackBootstrapProvisioner.ProvisionResult unchanged =
DefaultPackBootstrapProvisioner.provision(dataDirectory, ignored -> {
}, startupPaths);
DefaultPackBootstrapProvisioner.provision(new DefaultPackBootstrapProvisioner.BootstrapRequest(dataDirectory, ignored -> {
}, startupPaths, DataVersion.getLatest()));
assertEquals(DefaultPackBootstrapProvisioner.ProvisionStatus.UNCHANGED, unchanged.status());
assertFalse(IrisPlatforms.isBound());
}
@@ -7,6 +7,12 @@ import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
public class NmsBindingSelectorTest {
@Test
public void selects263Revision() {
assertEquals("v26_3_R1", NmsBindingSelector.select(MinecraftVersion.fromBukkitVersion("26.3-R0.1-SNAPSHOT")));
assertEquals("v26_3_R1", NmsBindingSelector.select(MinecraftVersion.fromBukkitVersion("26.3.0-R0.1-SNAPSHOT")));
}
@Test
public void selectsOnlyTheExactSupportedRevision() {
MinecraftVersion version = MinecraftVersion.fromBukkitVersion("26.2-R0.1-SNAPSHOT");
@@ -23,12 +29,12 @@ public class NmsBindingSelectorTest {
@Test
public void rejectsUnsupportedVersionsWithoutProbingAnotherRevision() {
MinecraftVersion version = MinecraftVersion.fromBukkitVersion("26.3-R0.1-SNAPSHOT");
MinecraftVersion version = MinecraftVersion.fromBukkitVersion("26.4-R0.1-SNAPSHOT");
IllegalStateException failure = assertThrows(IllegalStateException.class,
() -> NmsBindingSelector.select(version));
assertTrue(failure.getMessage().contains("26.3"));
assertTrue(failure.getMessage().contains("26.4"));
}
@Test
@@ -7,15 +7,26 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
public class DataVersionTest {
@Test
public void runtimeSelectionPreservesEverySupportedVersion() {
assertSame(DataVersion.V26_1_2, DataVersion.forMinecraftVersion("26.1.2"));
assertSame(DataVersion.V26_2, DataVersion.forMinecraftVersion("26.2"));
assertSame(DataVersion.V26_2, DataVersion.forMinecraftVersion("26.2.0"));
assertSame(DataVersion.V26_3, DataVersion.forMinecraftVersion("26.3"));
assertSame(DataVersion.V26_3, DataVersion.forMinecraftVersion("26.3.0"));
assertSame(DataVersion.UNSUPPORTED, DataVersion.forMinecraftVersion("26.4"));
}
@Test
public void latestRemainsNewestSupportedRelease() {
assertSame(DataVersion.V26_2, DataVersion.getLatest());
assertSame(DataVersion.V26_3, DataVersion.getLatest());
}
@Test
public void packFormatsMatchServerVersionJson() {
assertEquals(101, DataVersion.V26_1_2.getPackFormat());
assertEquals(107, DataVersion.V26_2.getPackFormat());
assertEquals(121, DataVersion.V26_3.getPackFormat());
}
@Test
@@ -15,6 +15,10 @@ import art.arcane.iris.structure.object.IrisObject;
import art.arcane.iris.structure.placement.IrisStructure;
import art.arcane.iris.structure.object.ObjectPlaceMode;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.spi.IrisPlatform;
import art.arcane.iris.spi.IrisPlatforms;
import org.junit.Before;
import org.junit.After;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.nbt.io.NBTUtil;
import art.arcane.volmlib.util.nbt.tag.CompoundTag;
@@ -41,6 +45,19 @@ public class VillageImporterConnectorRoundTripTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Before
public void bindPlatform() {
IrisPlatforms.unbind();
IrisPlatform platform = mock(IrisPlatform.class);
when(platform.minecraftVersion()).thenReturn("26.2");
IrisPlatforms.bind(platform);
}
@After
public void unbindPlatform() {
IrisPlatforms.unbind();
}
@Test
public void vanillaNbtMetadataSurvivesIrisPieceAndVanillaExport() throws Exception {
FakeJigsawBlockInfo jigsaw = new FakeJigsawBlockInfo(-29, -17);
@@ -1,6 +1,7 @@
package art.arcane.iris.structure.export;
import art.arcane.volmlib.util.nbt.tag.CompoundTag;
import art.arcane.volmlib.util.nbt.mca.MCABlockStateCodecSupport;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@@ -9,6 +10,16 @@ import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
public class VanillaBlockStateTest {
@Test
public void writes263NamesWithoutChangingTheOlderFormat() {
CompoundTag state = VanillaBlockState.parse("minecraft:oak_stairs[facing=north]")
.toNbt(MCABlockStateCodecSupport.Format.LOWERCASE);
assertEquals("minecraft:oak_stairs", state.getString("id"));
assertEquals("north", state.getCompoundTag("properties").getString("facing"));
assertNull(state.get("Name"));
assertNull(state.get("Properties"));
}
@Test
public void aBareBlockKeepsItsNameAndNoProperties() {
VanillaBlockState state = VanillaBlockState.parse(" minecraft:stone ");
@@ -35,8 +46,8 @@ public class VanillaBlockStateTest {
@Test
public void theNbtFormCarriesTheNameAndOnlyRealProperties() {
CompoundTag bare = VanillaBlockState.parse("minecraft:air").toNbt();
CompoundTag stairs = VanillaBlockState.parse("minecraft:oak_stairs[facing=north]").toNbt();
CompoundTag bare = VanillaBlockState.parse("minecraft:air").toNbt(MCABlockStateCodecSupport.Format.CAPITALIZED);
CompoundTag stairs = VanillaBlockState.parse("minecraft:oak_stairs[facing=north]").toNbt(MCABlockStateCodecSupport.Format.CAPITALIZED);
assertEquals("minecraft:air", bare.getString("Name"));
assertNull(bare.get("Properties"));
@@ -71,6 +71,7 @@ public class VanillaJigsawDatapackExporterTest {
when(registries.block(anyString())).thenReturn(stone);
IrisPlatform platform = mock(IrisPlatform.class);
when(platform.registries()).thenReturn(registries);
when(platform.minecraftVersion()).thenReturn("26.2");
IrisPlatforms.bind(platform);
}
@@ -141,6 +142,30 @@ public class VanillaJigsawDatapackExporterTest {
assertEquals("north_up", paletteEntry.getCompoundTag("Properties").getString("orientation"));
}
@Test
public void exports26_3RuntimeBlockStatesAndPackFormat() throws Exception {
when(IrisPlatforms.get().minecraftVersion()).thenReturn("26.3.0");
try {
Path output = temporaryFolder.getRoot().toPath().resolve("village-263");
VanillaJigsawExportResult result = new VanillaJigsawDatapackExporter().export(
request(connectorGraph(), output).namespace("studio").resourcePath("village/test").build());
assertTrue(result.diagnostics().toString(), result.isSuccess());
JsonObject pack = json(output.resolve("pack.mcmeta")).getAsJsonObject("pack");
assertEquals(121, pack.get("min_format").getAsJsonArray().get(0).getAsInt());
assertEquals(0, pack.get("min_format").getAsJsonArray().get(1).getAsInt());
assertEquals(121, pack.get("max_format").getAsInt());
CompoundTag template = (CompoundTag) NBTUtil.read(output.resolve(
"data/studio/structure/village/test/piece/pieces/start.nbt").toFile()).getTag();
assertEquals(5023, template.getInt("DataVersion"));
CompoundTag palette = (CompoundTag) template.getListTag("palette").get(0);
assertEquals("minecraft:jigsaw", palette.getString("id"));
assertEquals("north_up", palette.getCompoundTag("properties").getString("orientation"));
assertFalse(palette.containsKey("Name"));
} finally {
when(IrisPlatforms.get().minecraftVersion()).thenReturn("26.2");
}
}
@Test
public void exportsZipWithPackFilesAtArchiveRoot() throws Exception {
TestGraph graph = terminalGraph();
@@ -5,6 +5,12 @@ import art.arcane.volmlib.util.nbt.tag.CompoundTag;
import art.arcane.volmlib.util.nbt.tag.ListTag;
import art.arcane.volmlib.util.nbt.tag.StringTag;
import net.jpountz.lz4.LZ4BlockOutputStream;
import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.iris.spi.IrisPlatform;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.spi.PlatformRegistries;
import org.junit.Before;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
@@ -18,6 +24,8 @@ import java.nio.file.Path;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPOutputStream;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThrows;
@@ -27,6 +35,76 @@ public final class SavedTerrainChunkTest {
@Rule
public final TemporaryFolder temporaryFolder = new TemporaryFolder();
@Before
public void bindPlatform() {
IrisPlatforms.unbind();
IrisPlatform platform = mock(IrisPlatform.class);
PlatformRegistries registries = mock(PlatformRegistries.class);
when(platform.registries()).thenReturn(registries);
for (String state : new String[]{"minecraft:stone", "minecraft:water[level=0]",
"minecraft:sea_pickle[pickles=1,waterlogged=true]"}) {
PlatformBlockState block = mock(PlatformBlockState.class);
when(block.key()).thenReturn(state);
when(registries.blockOrNull(state.split("\\[")[0])).thenReturn(block);
}
IrisPlatforms.bind(platform);
}
@After
public void unbindPlatform() {
IrisPlatforms.unbind();
}
@Test
public void reads263LowercasePaletteAtTerrainStatus() throws Exception {
Path world = temporaryFolder.newFolder("terrain-263").toPath();
CompoundTag saved = root("minecraft:terrain");
saved.putInt("DataVersion", 5023);
CompoundTag section = (CompoundTag) saved.getListTag("sections").get(0);
ListTag<?> palette = section.getCompoundTag("block_states").getListTag("palette");
for (int index = 0; index < palette.size(); index++) {
CompoundTag state = (CompoundTag) palette.get(index);
state.put("id", state.remove("Name"));
if (state.containsKey("Properties")) {
state.put("properties", state.remove("Properties"));
}
}
writeChunk(world, saved, 2, false);
SavedTerrainChunk chunk = SavedTerrainChunk.read(world, -1, -2, -16, 16);
assertEquals("minecraft:terrain", chunk.nativeStatus());
assertEquals("minecraft:water[level=0]", chunk.column(-16, -32).geometry().voxelAt(-15).stateKey());
}
@Test
public void reads263StringAndWrappedPaletteEntries() throws Exception {
for (String name : new String[]{"minecraft:stone", "minecraft:water", "minecraft:sea_pickle"}) {
for (boolean wrapped : new boolean[]{false, true}) {
Path world = temporaryFolder.newFolder("terrain-string-" + name.substring(10) + "-" + wrapped).toPath();
CompoundTag saved = root("minecraft:full");
saved.putInt("DataVersion", 5023);
CompoundTag section = (CompoundTag) saved.getListTag("sections").get(0);
CompoundTag blocks = section.getCompoundTag("block_states");
blocks.remove("data");
if (wrapped) {
ListTag<CompoundTag> palette = new ListTag<>(CompoundTag.class);
CompoundTag state = new CompoundTag();
state.putString("", name);
palette.add(state);
blocks.put("palette", palette);
} else {
ListTag<StringTag> palette = new ListTag<>(StringTag.class);
palette.add(new StringTag(name));
blocks.put("palette", palette);
}
writeChunk(world, saved, 2, false);
SavedTerrainChunk chunk = SavedTerrainChunk.read(world, -1, -2, -16, 16);
BoundaryColumnGeometry.Voxel voxel = chunk.column(-16, -32).geometry().voxelAt(-16);
assertEquals(IrisPlatforms.get().registries().blockOrNull(name).key(), voxel.stateKey());
assertEquals(name.equals("minecraft:stone") ? "" : "minecraft:water[level=0]", voxel.fluidStateKey());
}
}
}
@Test
public void readsModernPaletteAtNegativeCoordinatesWithEveryCompression() throws Exception {
for (int compression = 1; compression <= 4; compression++) {