mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-11-01 08:50:06 +00:00
Modded terrain write tests
- Tests cover fresh section writes in the modded chunk generator
This commit is contained in:
1 parent
b61d2f305b
commit
b00e28e42e
2 files changed
+202
No files matched your search
+104
@@ -0,0 +1,104 @@
|
|||||||
|
package art.arcane.volmlib.nativelib.minecraft26_2.modded;
|
||||||
|
|
||||||
|
import art.arcane.volmlib.nativelib.terrain.NativeBlockState;
|
||||||
|
import com.mojang.serialization.Codec;
|
||||||
|
import net.minecraft.SharedConstants;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.core.IdMapper;
|
||||||
|
import net.minecraft.server.Bootstrap;
|
||||||
|
import net.minecraft.world.level.ChunkPos;
|
||||||
|
import net.minecraft.world.level.LevelHeightAccessor;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.biome.BiomeGenerationSettings;
|
||||||
|
import net.minecraft.world.level.biome.BiomeSpecialEffects;
|
||||||
|
import net.minecraft.world.level.biome.MobSpawnSettings;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
|
import net.minecraft.world.level.chunk.PalettedContainer;
|
||||||
|
import net.minecraft.world.level.chunk.PalettedContainerFactory;
|
||||||
|
import net.minecraft.world.level.chunk.PalettedContainerRO;
|
||||||
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
|
import net.minecraft.world.level.chunk.Strategy;
|
||||||
|
import net.minecraft.world.level.chunk.UpgradeData;
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
public class NativeModdedChunkGeneratorTerrainWriteTest {
|
||||||
|
private static final int MIN_Y = -64;
|
||||||
|
private static final int HEIGHT = 384;
|
||||||
|
private static final int SURFACE = 10;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void bootstrap() {
|
||||||
|
SharedConstants.tryDetectVersion();
|
||||||
|
Bootstrap.bootStrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void freshSectionsInstallWithoutSelfLockingTheirContainers() throws Exception {
|
||||||
|
BlockState stone = Blocks.STONE.defaultBlockState();
|
||||||
|
Assume.assumeTrue("block-state ids are not baked on this classpath",
|
||||||
|
Block.BLOCK_STATE_REGISTRY.getId(stone) >= 0);
|
||||||
|
NativeBlockState nativeStone = mock(NativeBlockState.class);
|
||||||
|
when(nativeStone.nativeHandle()).thenReturn(stone);
|
||||||
|
NativeModdedGeneratorPolicy.BlockBuffer blocks = (x, y, z) -> y + MIN_Y < SURFACE ? nativeStone : null;
|
||||||
|
ProtoChunk chunk = newChunk();
|
||||||
|
Method writeBlocks = NativeModdedChunkGenerator.class.getDeclaredMethod("writeBlocks", ChunkAccess.class,
|
||||||
|
NativeModdedGeneratorPolicy.BlockBuffer.class, int.class, int.class);
|
||||||
|
writeBlocks.setAccessible(true);
|
||||||
|
|
||||||
|
CompletableFuture.runAsync(() -> invoke(writeBlocks, chunk, blocks)).get(30, TimeUnit.SECONDS);
|
||||||
|
|
||||||
|
assertSame(stone, chunk.getBlockState(new BlockPos(3, SURFACE - 1, 5)));
|
||||||
|
assertSame(stone, chunk.getBlockState(new BlockPos(0, MIN_Y, 0)));
|
||||||
|
assertSame(Blocks.AIR.defaultBlockState(), chunk.getBlockState(new BlockPos(3, SURFACE, 5)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void invoke(Method writeBlocks, ChunkAccess chunk, NativeModdedGeneratorPolicy.BlockBuffer blocks) {
|
||||||
|
try {
|
||||||
|
writeBlocks.invoke(null, chunk, blocks, MIN_Y, HEIGHT);
|
||||||
|
} catch (IllegalAccessException | InvocationTargetException failure) {
|
||||||
|
throw new IllegalStateException(failure);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProtoChunk newChunk() {
|
||||||
|
return new ProtoChunk(new ChunkPos(0, 0), UpgradeData.EMPTY, LevelHeightAccessor.create(MIN_Y, HEIGHT),
|
||||||
|
palettedContainerFactory(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PalettedContainerFactory palettedContainerFactory() {
|
||||||
|
Strategy<BlockState> blockStrategy = Strategy.createForBlockStates(Block.BLOCK_STATE_REGISTRY);
|
||||||
|
Codec<PalettedContainer<BlockState>> blockCodec = PalettedContainer.codecRW(
|
||||||
|
BlockState.CODEC, blockStrategy, Blocks.AIR.defaultBlockState());
|
||||||
|
Biome biome = new Biome.BiomeBuilder()
|
||||||
|
.hasPrecipitation(false)
|
||||||
|
.temperature(0.8F)
|
||||||
|
.downfall(0.4F)
|
||||||
|
.specialEffects(new BiomeSpecialEffects.Builder().waterColor(0x3F76E4).build())
|
||||||
|
.mobSpawnSettings(MobSpawnSettings.EMPTY)
|
||||||
|
.generationSettings(BiomeGenerationSettings.EMPTY)
|
||||||
|
.build();
|
||||||
|
Holder<Biome> biomeHolder = Holder.direct(biome);
|
||||||
|
IdMapper<Holder<Biome>> biomeIds = new IdMapper<>(1);
|
||||||
|
biomeIds.add(biomeHolder);
|
||||||
|
Strategy<Holder<Biome>> biomeStrategy = Strategy.createForBiomes(biomeIds);
|
||||||
|
Codec<PalettedContainerRO<Holder<Biome>>> biomeCodec = PalettedContainer.codecRO(
|
||||||
|
Biome.CODEC, biomeStrategy, biomeHolder);
|
||||||
|
return new PalettedContainerFactory(blockStrategy, Blocks.AIR.defaultBlockState(), blockCodec,
|
||||||
|
biomeStrategy, biomeHolder, biomeCodec);
|
||||||
|
}
|
||||||
|
}
|
||||||
+98
@@ -0,0 +1,98 @@
|
|||||||
|
package art.arcane.volmlib.nativelib.minecraft26_2.modded;
|
||||||
|
|
||||||
|
import art.arcane.volmlib.nativelib.terrain.NativeBlockState;
|
||||||
|
import com.mojang.serialization.Lifecycle;
|
||||||
|
import net.minecraft.SharedConstants;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.MappedRegistry;
|
||||||
|
import net.minecraft.core.RegistrationInfo;
|
||||||
|
import net.minecraft.core.Registry;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.Bootstrap;
|
||||||
|
import net.minecraft.world.level.ChunkPos;
|
||||||
|
import net.minecraft.world.level.LevelHeightAccessor;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.biome.BiomeGenerationSettings;
|
||||||
|
import net.minecraft.world.level.biome.BiomeSpecialEffects;
|
||||||
|
import net.minecraft.world.level.biome.MobSpawnSettings;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
|
import net.minecraft.world.level.chunk.ProtoChunk;
|
||||||
|
import net.minecraft.world.level.chunk.UpgradeData;
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
public class NativeModdedChunkGeneratorTerrainWriteTest {
|
||||||
|
private static final int MIN_Y = -64;
|
||||||
|
private static final int HEIGHT = 384;
|
||||||
|
private static final int SURFACE = 10;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void bootstrap() {
|
||||||
|
SharedConstants.tryDetectVersion();
|
||||||
|
Bootstrap.bootStrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void freshSectionsInstallWithoutSelfLockingTheirContainers() throws Exception {
|
||||||
|
BlockState stone = Blocks.STONE.defaultBlockState();
|
||||||
|
Assume.assumeTrue("block-state ids are not baked on this classpath",
|
||||||
|
Block.BLOCK_STATE_REGISTRY.getId(stone) >= 0);
|
||||||
|
NativeBlockState nativeStone = mock(NativeBlockState.class);
|
||||||
|
when(nativeStone.nativeHandle()).thenReturn(stone);
|
||||||
|
NativeModdedGeneratorPolicy.BlockBuffer blocks = (x, y, z) -> y + MIN_Y < SURFACE ? nativeStone : null;
|
||||||
|
ProtoChunk chunk = newChunk();
|
||||||
|
Method writeBlocks = NativeModdedChunkGenerator.class.getDeclaredMethod("writeBlocks", ChunkAccess.class,
|
||||||
|
NativeModdedGeneratorPolicy.BlockBuffer.class, int.class, int.class);
|
||||||
|
writeBlocks.setAccessible(true);
|
||||||
|
|
||||||
|
CompletableFuture.runAsync(() -> invoke(writeBlocks, chunk, blocks)).get(30, TimeUnit.SECONDS);
|
||||||
|
|
||||||
|
assertSame(stone, chunk.getBlockState(new BlockPos(3, SURFACE - 1, 5)));
|
||||||
|
assertSame(stone, chunk.getBlockState(new BlockPos(0, MIN_Y, 0)));
|
||||||
|
assertSame(Blocks.AIR.defaultBlockState(), chunk.getBlockState(new BlockPos(3, SURFACE, 5)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void invoke(Method writeBlocks, ChunkAccess chunk, NativeModdedGeneratorPolicy.BlockBuffer blocks) {
|
||||||
|
try {
|
||||||
|
writeBlocks.invoke(null, chunk, blocks, MIN_Y, HEIGHT);
|
||||||
|
} catch (IllegalAccessException | InvocationTargetException failure) {
|
||||||
|
throw new IllegalStateException(failure);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProtoChunk newChunk() {
|
||||||
|
return new ProtoChunk(new ChunkPos(0, 0), UpgradeData.EMPTY, LevelHeightAccessor.create(MIN_Y, HEIGHT),
|
||||||
|
biomeRegistry(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Registry<Biome> biomeRegistry() {
|
||||||
|
Biome biome = new Biome.BiomeBuilder()
|
||||||
|
.hasPrecipitation(false)
|
||||||
|
.temperature(0.8F)
|
||||||
|
.downfall(0.4F)
|
||||||
|
.specialEffects(new BiomeSpecialEffects.Builder().fogColor(0).waterColor(0x3F76E4)
|
||||||
|
.waterFogColor(0).skyColor(0).build())
|
||||||
|
.mobSpawnSettings(MobSpawnSettings.EMPTY)
|
||||||
|
.generationSettings(BiomeGenerationSettings.EMPTY)
|
||||||
|
.build();
|
||||||
|
MappedRegistry<Biome> registry = new MappedRegistry<>(Registries.BIOME, Lifecycle.stable());
|
||||||
|
registry.register(ResourceKey.create(Registries.BIOME, ResourceLocation.withDefaultNamespace("plains")),
|
||||||
|
biome, RegistrationInfo.BUILT_IN);
|
||||||
|
return registry.freeze();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user