mirror of https://github.com/Minestom/Minestom.git
384 lines
13 KiB
Java
384 lines
13 KiB
Java
package net.minestom.server.utils.block;
|
|
|
|
import net.minestom.server.coordinate.Point;
|
|
import net.minestom.server.coordinate.Vec;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
public class BlockIteratorTest {
|
|
private void assertContains(List<Point> points, Point point) {
|
|
assertTrue(points.contains(point), "Expected " + points + " to contain " + point);
|
|
}
|
|
|
|
@Test
|
|
public void test2dOffsetppp() {
|
|
Vec s = new Vec(0, 0.1, 0);
|
|
Vec e = new Vec(2, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
assertEquals(new Vec(0, 0, 0), iterator.next());
|
|
assertEquals(new Vec(1, 0, 0), iterator.next());
|
|
assertEquals(new Vec(1, 1, 0), iterator.next());
|
|
assertEquals(new Vec(2, 1, 0), iterator.next());
|
|
assertEquals(new Vec(3, 1, 0), iterator.next());
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
|
|
@Test
|
|
public void test2dOffsetppn() {
|
|
Vec s = new Vec(0, 0.1, 0);
|
|
Vec e = new Vec(-2, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
assertEquals(new Vec(0, 0, 0), iterator.next());
|
|
assertEquals(new Vec(-1, 0, 0), iterator.next());
|
|
assertEquals(new Vec(-2, 0, 0), iterator.next());
|
|
assertEquals(new Vec(-2, 1, 0), iterator.next());
|
|
assertEquals(new Vec(-3, 1, 0), iterator.next());
|
|
assertEquals(new Vec(-4, 1, 0), iterator.next());
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
|
|
@Test
|
|
public void test2dOffsetnpp() {
|
|
Vec s = new Vec(0, -0.1, 0);
|
|
Vec e = new Vec(2, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
assertEquals(new Vec(0, -1, 0), iterator.next());
|
|
assertEquals(new Vec(0, 0, 0), iterator.next());
|
|
assertEquals(new Vec(1, 0, 0), iterator.next());
|
|
assertEquals(new Vec(2, 0, 0), iterator.next());
|
|
assertEquals(new Vec(2, 1, 0), iterator.next());
|
|
assertEquals(new Vec(3, 1, 0), iterator.next());
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
|
|
@Test
|
|
public void test2dOffsetnnp() {
|
|
Vec s = new Vec(0, -0.1, 0);
|
|
Vec e = new Vec(-2, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
assertEquals(new Vec(0, -1, 0), iterator.next());
|
|
assertEquals(new Vec(-1, -1, 0), iterator.next());
|
|
assertEquals(new Vec(-1, 0, 0), iterator.next());
|
|
assertEquals(new Vec(-2, 0, 0), iterator.next());
|
|
assertEquals(new Vec(-3, 0, 0), iterator.next());
|
|
assertEquals(new Vec(-3, 1, 0), iterator.next());
|
|
assertEquals(new Vec(-4, 1, 0), iterator.next());
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
|
|
@Test
|
|
public void testZeroVelocity() {
|
|
Vec s = new Vec(0, 0, 0);
|
|
Vec e = new Vec(0, 0, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
|
|
@Test
|
|
public void testLongDistance() {
|
|
Vec s = new Vec(42.5, 0, 51.5);
|
|
Vec e = new Vec(-12, 0, -36);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 37);
|
|
|
|
List<Point> points = new ArrayList<>();
|
|
while (iterator.hasNext()) {
|
|
points.add(iterator.next());
|
|
}
|
|
|
|
Point[] validPoints = new Point[]{
|
|
new Vec(42.0, 0.0, 51.0),
|
|
new Vec(42.0, 0.0, 50.0),
|
|
new Vec(41.0, 0.0, 50.0),
|
|
new Vec(42.0, 0.0, 49.0),
|
|
new Vec(41.0, 0.0, 49.0),
|
|
new Vec(41.0, 0.0, 48.0),
|
|
new Vec(41.0, 0.0, 47.0),
|
|
new Vec(40.0, 0.0, 47.0),
|
|
new Vec(41.0, 0.0, 46.0),
|
|
new Vec(40.0, 0.0, 46.0),
|
|
new Vec(40.0, 0.0, 45.0),
|
|
new Vec(40.0, 0.0, 44.0),
|
|
new Vec(39.0, 0.0, 44.0),
|
|
new Vec(40.0, 0.0, 43.0),
|
|
new Vec(39.0, 0.0, 43.0),
|
|
new Vec(39.0, 0.0, 42.0),
|
|
new Vec(39.0, 0.0, 41.0),
|
|
new Vec(38.0, 0.0, 41.0),
|
|
new Vec(39.0, 0.0, 40.0),
|
|
new Vec(38.0, 0.0, 40.0),
|
|
new Vec(38.0, 0.0, 39.0),
|
|
new Vec(38.0, 0.0, 38.0),
|
|
new Vec(37.0, 0.0, 38.0),
|
|
new Vec(38.0, 0.0, 37.0),
|
|
new Vec(37.0, 0.0, 37.0),
|
|
new Vec(37.0, 0.0, 36.0),
|
|
new Vec(37.0, 0.0, 35.0),
|
|
new Vec(36.0, 0.0, 35.0),
|
|
new Vec(37.0, 0.0, 34.0),
|
|
new Vec(36.0, 0.0, 34.0),
|
|
new Vec(36.0, 0.0, 33.0),
|
|
new Vec(36.0, 0.0, 32.0),
|
|
new Vec(35.0, 0.0, 32.0),
|
|
new Vec(36.0, 0.0, 31.0),
|
|
new Vec(35.0, 0.0, 31.0),
|
|
new Vec(35.0, 0.0, 30.0),
|
|
new Vec(35.0, 0.0, 29.0),
|
|
new Vec(34.0, 0.0, 29.0),
|
|
new Vec(35.0, 0.0, 28.0),
|
|
new Vec(34.0, 0.0, 28.0),
|
|
new Vec(34.0, 0.0, 27.0),
|
|
new Vec(34.0, 0.0, 26.0),
|
|
new Vec(33.0, 0.0, 26.0),
|
|
new Vec(34.0, 0.0, 25.0),
|
|
new Vec(33.0, 0.0, 25.0),
|
|
new Vec(33.0, 0.0, 24.0),
|
|
new Vec(33.0, 0.0, 23.0),
|
|
new Vec(32.0, 0.0, 23.0),
|
|
new Vec(33.0, 0.0, 22.0),
|
|
new Vec(32.0, 0.0, 22.0),
|
|
new Vec(32.0, 0.0, 21.0),
|
|
new Vec(32.0, 0.0, 20.0),
|
|
new Vec(31.0, 0.0, 20.0),
|
|
new Vec(32.0, 0.0, 19.0),
|
|
new Vec(31.0, 0.0, 19.0),
|
|
new Vec(31.0, 0.0, 18.0),
|
|
new Vec(31.0, 0.0, 17.0),
|
|
new Vec(30.0, 0.0, 17.0),
|
|
new Vec(31.0, 0.0, 16.0),
|
|
new Vec(30.0, 0.0, 16.0)
|
|
};
|
|
|
|
for (Point p : validPoints) {
|
|
assertContains(points, p);
|
|
}
|
|
assertEquals(validPoints.length, points.size());
|
|
}
|
|
|
|
@Test
|
|
public void testSkipping() {
|
|
Vec s = new Vec(0.5, 40, 0.5);
|
|
Vec e = new Vec(27, 0, 21);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 34);
|
|
|
|
List<Point> points = new ArrayList<>();
|
|
while (iterator.hasNext()) {
|
|
points.add(iterator.next());
|
|
}
|
|
|
|
Point[] validPoints = new Point[]{
|
|
new Vec(0.0, 40.0, 0.0),
|
|
new Vec(1.0, 40.0, 0.0),
|
|
new Vec(1.0, 40.0, 1.0),
|
|
new Vec(2.0, 40.0, 1.0),
|
|
new Vec(2.0, 40.0, 2.0),
|
|
new Vec(3.0, 40.0, 2.0),
|
|
new Vec(3.0, 40.0, 3.0),
|
|
new Vec(4.0, 40.0, 3.0),
|
|
new Vec(5.0, 40.0, 3.0),
|
|
new Vec(4.0, 40.0, 4.0),
|
|
new Vec(5.0, 40.0, 4.0),
|
|
new Vec(6.0, 40.0, 4.0),
|
|
new Vec(6.0, 40.0, 5.0),
|
|
new Vec(7.0, 40.0, 5.0),
|
|
new Vec(7.0, 40.0, 6.0),
|
|
new Vec(8.0, 40.0, 6.0),
|
|
new Vec(8.0, 40.0, 7.0),
|
|
new Vec(9.0, 40.0, 7.0),
|
|
new Vec(10.0, 40.0, 7.0),
|
|
new Vec(10.0, 40.0, 8.0),
|
|
new Vec(11.0, 40.0, 8.0),
|
|
new Vec(11.0, 40.0, 9.0),
|
|
new Vec(12.0, 40.0, 9.0),
|
|
new Vec(12.0, 40.0, 10.0),
|
|
new Vec(13.0, 40.0, 10.0),
|
|
new Vec(14.0, 40.0, 10.0),
|
|
new Vec(13.0, 40.0, 11.0),
|
|
new Vec(14.0, 40.0, 11.0),
|
|
new Vec(15.0, 40.0, 11.0),
|
|
new Vec(15.0, 40.0, 12.0),
|
|
new Vec(16.0, 40.0, 12.0),
|
|
new Vec(16.0, 40.0, 13.0),
|
|
new Vec(17.0, 40.0, 13.0),
|
|
new Vec(17.0, 40.0, 14.0),
|
|
new Vec(18.0, 40.0, 14.0),
|
|
new Vec(19.0, 40.0, 14.0),
|
|
new Vec(19.0, 40.0, 15.0),
|
|
new Vec(20.0, 40.0, 15.0),
|
|
new Vec(20.0, 40.0, 16.0),
|
|
new Vec(21.0, 40.0, 16.0),
|
|
new Vec(21.0, 40.0, 17.0),
|
|
new Vec(22.0, 40.0, 17.0),
|
|
new Vec(23.0, 40.0, 17.0),
|
|
new Vec(22.0, 40.0, 18.0),
|
|
new Vec(23.0, 40.0, 18.0),
|
|
new Vec(24.0, 40.0, 18.0),
|
|
new Vec(24.0, 40.0, 19.0),
|
|
new Vec(25.0, 40.0, 19.0),
|
|
new Vec(25.0, 40.0, 20.0),
|
|
new Vec(26.0, 40.0, 20.0),
|
|
new Vec(26.0, 40.0, 21.0),
|
|
new Vec(27.0, 40.0, 21.0)
|
|
};
|
|
|
|
for (Point p : validPoints) {
|
|
assertContains(points, p);
|
|
}
|
|
assertEquals(validPoints.length, points.size());
|
|
}
|
|
|
|
@Test
|
|
public void testExactEnd() {
|
|
Vec s = new Vec(0.5, 0, 0.5);
|
|
Vec e = new Vec(0, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 1);
|
|
assertEquals(new Vec(0, 0, 0), iterator.next());
|
|
assertEquals(new Vec(0, 1, 0), iterator.next());
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
|
|
@Test
|
|
public void testSameEnd() {
|
|
Vec s = new Vec(0.5, 0, 0.5);
|
|
Vec e = new Vec(0, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 0.5);
|
|
assertEquals(new Vec(0, 0, 0), iterator.next());
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
|
|
@Test
|
|
public void test3dExtraCollection() {
|
|
Vec s = new Vec(0.1, 0.1, 0.1);
|
|
Vec e = new Vec(1, 1, 1);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
List<Point> points = new ArrayList<>();
|
|
while (iterator.hasNext()) {
|
|
points.add(iterator.next());
|
|
}
|
|
|
|
Point[] validPoints = new Point[]{
|
|
new Vec(0.0, 0.0, 0.0),
|
|
new Vec(1.0, 0.0, 0.0),
|
|
new Vec(0.0, 1.0, 0.0),
|
|
new Vec(0.0, 0.0, 1.0),
|
|
new Vec(1.0, 1.0, 1.0),
|
|
new Vec(2.0, 1.0, 1.0),
|
|
new Vec(1.0, 2.0, 1.0),
|
|
new Vec(1.0, 1.0, 2.0),
|
|
new Vec(2.0, 2.0, 2.0),
|
|
|
|
// todo(mattw): I need to confirm that these are correct
|
|
new Vec(1.0, 1.0, 0.0),
|
|
new Vec(0.0, 1.0, 1.0),
|
|
new Vec(1.0, 0.0, 1.0),
|
|
new Vec(2.0, 2.0, 1.0),
|
|
new Vec(1.0, 2.0, 2.0),
|
|
new Vec(2.0, 1.0, 2.0)
|
|
};
|
|
|
|
for (Point p : validPoints) {
|
|
assertContains(points, p);
|
|
}
|
|
assertEquals(validPoints.length, points.size());
|
|
}
|
|
|
|
@Test
|
|
public void test2dpp() {
|
|
Vec s = new Vec(0, 0, 0);
|
|
Vec e = new Vec(2, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
List<Point> points = new ArrayList<>();
|
|
while (iterator.hasNext()) {
|
|
points.add(iterator.next());
|
|
}
|
|
|
|
Point[] validPoints = new Point[]{
|
|
new Vec(0.0, 0.0, 0.0),
|
|
new Vec(1.0, 0.0, 0.0),
|
|
new Vec(2.0, 0.0, 0.0),
|
|
new Vec(1.0, 1.0, 0.0),
|
|
new Vec(2.0, 1.0, 0.0),
|
|
new Vec(3.0, 1.0, 0.0),
|
|
};
|
|
|
|
for (Point p : validPoints) {
|
|
assertContains(points, p);
|
|
}
|
|
assertEquals(validPoints.length, points.size());
|
|
}
|
|
|
|
@Test
|
|
public void test2dpn() {
|
|
Vec s = new Vec(0, 0, 0);
|
|
Vec e = new Vec(-2, 1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
List<Point> points = new ArrayList<>();
|
|
while (iterator.hasNext()) {
|
|
points.add(iterator.next());
|
|
}
|
|
|
|
Point[] validPoints = new Point[]{
|
|
new Vec(0.0, 0.0, 0.0),
|
|
new Vec(-1.0, 0.0, 0.0),
|
|
new Vec(-2.0, 0.0, 0.0),
|
|
new Vec(-3.0, 0.0, 0.0),
|
|
new Vec(-2.0, 1.0, 0.0),
|
|
new Vec(-3.0, 1.0, 0.0),
|
|
new Vec(-4.0, 1.0, 0.0)
|
|
};
|
|
|
|
for (Point p : validPoints) {
|
|
assertContains(points, p);
|
|
}
|
|
assertEquals(validPoints.length, points.size());
|
|
}
|
|
|
|
@Test
|
|
public void test2dnn() {
|
|
Vec s = new Vec(0, 0, 0);
|
|
Vec e = new Vec(-2, -1, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 4);
|
|
|
|
List<Point> points = new ArrayList<>();
|
|
while (iterator.hasNext()) {
|
|
points.add(iterator.next());
|
|
}
|
|
|
|
Point[] validPoints = new Point[]{
|
|
new Vec(0.0, 0.0, 0.0),
|
|
new Vec(-1.0, 0.0, 0.0),
|
|
new Vec(0.0, -1.0, 0.0),
|
|
new Vec(-1.0, -1.0, 0.0),
|
|
new Vec(-2.0, -1.0, 0.0),
|
|
new Vec(-3.0, -1.0, 0.0),
|
|
new Vec(-2.0, -2.0, 0.0),
|
|
new Vec(-3.0, -2.0, 0.0),
|
|
new Vec(-4.0, -2.0, 0.0)
|
|
};
|
|
|
|
for (Point p : validPoints) {
|
|
assertContains(points, p);
|
|
}
|
|
assertEquals(validPoints.length, points.size());
|
|
}
|
|
|
|
@Test
|
|
public void falling() {
|
|
Vec s = new Vec(0, 42, 0);
|
|
Vec e = new Vec(0, -10, 0);
|
|
BlockIterator iterator = new BlockIterator(s, e, 0, 14.142135623730951);
|
|
|
|
for (int y = 42; y >= 27; --y) assertEquals(new Vec(0, y, 0), iterator.next());
|
|
assertFalse(iterator.hasNext());
|
|
}
|
|
} |