получение чанков из региона для отрицательных координат
This commit is contained in:
@@ -51,7 +51,7 @@ class Region implements Closeable {
|
|||||||
Chunk getChunk(int x, int z) {
|
Chunk getChunk(int x, int z) {
|
||||||
int offset;
|
int offset;
|
||||||
try {
|
try {
|
||||||
offset = getOffset(x, z);
|
offset = getOffset(x & 31, z & 31);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return new EmptyChunk(x, z);
|
return new EmptyChunk(x, z);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,19 +21,30 @@ import java.util.List;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
class RegionTest {
|
class RegionTest {
|
||||||
private static Region region;
|
private static RegionManager regionManager;
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
static void before() {
|
static void before() {
|
||||||
region = new Region(Paths.get(RegionTest.class.getResource("/region/r.0.0.mca").toURI()).toFile());
|
regionManager = new RegionManager(Paths.get(RegionTest.class.getResource("/region/").toURI()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Stream<Arguments> streamArguments() {
|
private static void assertZeroPlast(int x, int z, Block block, String msg) {
|
||||||
ChunkChecker chunkChecker00 = new ChunkChecker() {
|
// @formatter:off
|
||||||
|
if (x == 0 && z == 0) assertEquals(BlockType.STONE, block.getType(), msg);
|
||||||
|
else if (x == 15 && z == 0) assertEquals(BlockType.GRANITE, block.getType(), msg);
|
||||||
|
else if (x == 0 && z == 15) assertEquals(BlockType.POLISHED_GRANITE, block.getType(), msg);
|
||||||
|
else if (x == 15 && z == 15) assertEquals(BlockType.DIORITE, block.getType(), msg);
|
||||||
|
else assertEquals(BlockType.BEDROCK, block.getType(), msg);
|
||||||
|
// @formatter:on
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ChunkChecker chunkChecker00() {
|
||||||
|
return new ChunkChecker() {
|
||||||
private void checkSection0(ChunkSection chunkSection) {
|
private void checkSection0(ChunkSection chunkSection) {
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
@@ -42,13 +53,7 @@ class RegionTest {
|
|||||||
String msg = String.format("coords: %d %d %d", x, y, z);
|
String msg = String.format("coords: %d %d %d", x, y, z);
|
||||||
|
|
||||||
if (y == 0) {
|
if (y == 0) {
|
||||||
// @formatter:off
|
assertZeroPlast(x, z, block, msg);
|
||||||
if (x == 0 && z == 0) assertEquals(BlockType.STONE, block.getType(), msg);
|
|
||||||
else if (x == 15 && z == 0) assertEquals(BlockType.GRANITE, block.getType(), msg);
|
|
||||||
else if (x == 0 && z == 15) assertEquals(BlockType.POLISHED_GRANITE, block.getType(), msg);
|
|
||||||
else if (x == 15 && z == 15) assertEquals(BlockType.DIORITE, block.getType(), msg);
|
|
||||||
else assertEquals(BlockType.BEDROCK, block.getType(), msg);
|
|
||||||
// @formatter:on
|
|
||||||
} else {
|
} else {
|
||||||
assertEquals(BlockType.STONE, block.getType(), msg);
|
assertEquals(BlockType.STONE, block.getType(), msg);
|
||||||
}
|
}
|
||||||
@@ -112,8 +117,10 @@ class RegionTest {
|
|||||||
checkSection1(chunkSection);
|
checkSection1(chunkSection);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
ChunkChecker chunkChecker01 = new ChunkChecker() {
|
private static ChunkChecker chunkChecker01() {
|
||||||
|
return new ChunkChecker() {
|
||||||
@Override
|
@Override
|
||||||
public void check(Chunk chunk) {
|
public void check(Chunk chunk) {
|
||||||
ChunkSection section = chunk.getChunkSection(0);
|
ChunkSection section = chunk.getChunkSection(0);
|
||||||
@@ -145,13 +152,7 @@ class RegionTest {
|
|||||||
String msg = String.format("coords: %d %d %d", x, y, z);
|
String msg = String.format("coords: %d %d %d", x, y, z);
|
||||||
|
|
||||||
if (y == 0) {
|
if (y == 0) {
|
||||||
// @formatter:off
|
assertZeroPlast(x, z, block, msg);
|
||||||
if (x == 0 && z == 0) assertEquals(BlockType.STONE, block.getType(), msg);
|
|
||||||
else if (x == 15 && z == 0) assertEquals(BlockType.GRANITE, block.getType(), msg);
|
|
||||||
else if (x == 0 && z == 15) assertEquals(BlockType.POLISHED_GRANITE, block.getType(), msg);
|
|
||||||
else if (x == 15 && z == 15) assertEquals(BlockType.DIORITE, block.getType(), msg);
|
|
||||||
else assertEquals(BlockType.BEDROCK, block.getType(), msg);
|
|
||||||
// @formatter:on
|
|
||||||
} else {
|
} else {
|
||||||
assertEquals(exceptedTypes.get(x), block.getType(), msg);
|
assertEquals(exceptedTypes.get(x), block.getType(), msg);
|
||||||
}
|
}
|
||||||
@@ -160,10 +161,35 @@ class RegionTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ChunkChecker chunkChecker0N1() {
|
||||||
|
return new ChunkChecker() {
|
||||||
|
@Override
|
||||||
|
public void check(Chunk chunk) {
|
||||||
|
ChunkSection section = chunk.getChunkSection(0);
|
||||||
|
assertNotNull(section);
|
||||||
|
|
||||||
|
for (int y = 0; y < 1; y++) {
|
||||||
|
for (int x = 0; x < 16; x++) {
|
||||||
|
for (int z = 0; z < 16; z++) {
|
||||||
|
assertZeroPlast(x, z,
|
||||||
|
section.getBlock(x, y, z),
|
||||||
|
String.format("coords: %d %d %d", x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Stream<Arguments> streamArguments() {
|
||||||
|
|
||||||
|
|
||||||
return Stream.of(
|
return Stream.of(
|
||||||
Arguments.of(0, 0, chunkChecker00),
|
Arguments.of(0, 0, chunkChecker00()),
|
||||||
Arguments.of(0, 1, chunkChecker01)
|
Arguments.of(0, 1, chunkChecker01()),
|
||||||
|
Arguments.of(0, -1, chunkChecker0N1())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,8 +197,12 @@ class RegionTest {
|
|||||||
@ParameterizedTest(name = "[{index}] chunk {0},{1}")
|
@ParameterizedTest(name = "[{index}] chunk {0},{1}")
|
||||||
@MethodSource("streamArguments")
|
@MethodSource("streamArguments")
|
||||||
void testGetChunk(int chunkX, int chunkZ, ChunkChecker chunkChecker) {
|
void testGetChunk(int chunkX, int chunkZ, ChunkChecker chunkChecker) {
|
||||||
|
final Region region = regionManager.getRegion(chunkX >> 5, chunkZ >> 5);
|
||||||
|
assertNotNull(region);
|
||||||
|
|
||||||
final Chunk chunk = region.getChunk(chunkX, chunkZ);
|
final Chunk chunk = region.getChunk(chunkX, chunkZ);
|
||||||
assertNotNull(chunk);
|
assertNotNull(chunk);
|
||||||
|
assertFalse(chunk instanceof EmptyChunk);
|
||||||
|
|
||||||
chunkChecker.check(chunk);
|
chunkChecker.check(chunk);
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
anvil-loader/src/test/resources/region/r.0.-1.mca
Normal file
BIN
anvil-loader/src/test/resources/region/r.0.-1.mca
Normal file
Binary file not shown.
Reference in New Issue
Block a user