Refactored Walls and added test class
This commit is contained in:
parent
50e3bf2988
commit
5f8e8fae99
|
@ -29,98 +29,35 @@ public class Walls extends MinMaxXZ {
|
||||||
|
|
||||||
private static final List<BlockFace> ORDINALS = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST);
|
private static final List<BlockFace> ORDINALS = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST);
|
||||||
|
|
||||||
public Walls(Roof roof) {
|
class WallFinder {
|
||||||
|
int radiusMinX;
|
||||||
|
int radiusMaxX;
|
||||||
|
int radiusMinZ;
|
||||||
|
int radiusMaxZ;
|
||||||
|
boolean stopMinX;
|
||||||
|
boolean stopMaxX;
|
||||||
|
boolean stopMinZ;
|
||||||
|
boolean stopMaxZ;
|
||||||
|
boolean isSearching() {
|
||||||
|
return !stopMinX || !stopMaxX || !stopMinZ || !stopMaxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Walls findWalls(Roof roof) {
|
||||||
// The player is under the roof
|
// The player is under the roof
|
||||||
// Assume the player is inside the greenhouse they are trying to create
|
// Assume the player is inside the greenhouse they are trying to create
|
||||||
Location loc = roof.getLocation();
|
Location loc = roof.getLocation();
|
||||||
World world = roof.getLocation().getWorld();
|
World world = loc.getWorld();
|
||||||
floor = getFloorY(world, roof.getHeight(), roof.getMinX(), roof.getMaxX(), roof.getMinZ(), roof.getMaxZ());
|
floor = getFloorY(world, roof.getHeight(), roof.getMinX(), roof.getMaxX(), roof.getMinZ(), roof.getMaxZ());
|
||||||
// Now start with the player's x and z location
|
// Now start with the player's x and z location
|
||||||
int radiusMinX = 0;
|
WallFinder wf = new WallFinder();
|
||||||
int radiusMaxX = 0;
|
|
||||||
int radiusMinZ = 0;
|
|
||||||
int radiusMaxZ = 0;
|
|
||||||
boolean stopMinX = false;
|
|
||||||
boolean stopMaxX = false;
|
|
||||||
boolean stopMinZ = false;
|
|
||||||
boolean stopMaxZ = false;
|
|
||||||
minX = loc.getBlockX();
|
minX = loc.getBlockX();
|
||||||
maxX = loc.getBlockX();
|
maxX = loc.getBlockX();
|
||||||
minZ = loc.getBlockZ();
|
minZ = loc.getBlockZ();
|
||||||
maxZ = loc.getBlockZ();
|
maxZ = loc.getBlockZ();
|
||||||
do {
|
do {
|
||||||
// Look around player in an ever expanding cube
|
lookAround(loc, wf, roof);
|
||||||
minX = loc.getBlockX() - radiusMinX;
|
} while (wf.isSearching());
|
||||||
maxX = loc.getBlockX() + radiusMaxX;
|
|
||||||
minZ = loc.getBlockZ() - radiusMinZ;
|
|
||||||
maxZ = loc.getBlockZ() + radiusMaxZ;
|
|
||||||
int y;
|
|
||||||
for (y = roof.getHeight() - 1; y > floor; y--) {
|
|
||||||
for (int x = minX; x <= maxX; x++) {
|
|
||||||
for (int z = minZ; z <= maxZ; z++) {
|
|
||||||
// Only look around outside edge
|
|
||||||
if (!((x > minX && x < maxX) && (z > minZ && z < maxZ))) {
|
|
||||||
// Look at block faces
|
|
||||||
for (BlockFace bf: ORDINALS) {
|
|
||||||
switch (bf) {
|
|
||||||
case EAST:
|
|
||||||
// positive x
|
|
||||||
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
|
||||||
stopMaxX = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WEST:
|
|
||||||
// negative x
|
|
||||||
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
|
||||||
stopMinX = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NORTH:
|
|
||||||
// negative Z
|
|
||||||
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
|
||||||
stopMinZ = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SOUTH:
|
|
||||||
// positive Z
|
|
||||||
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
|
||||||
stopMaxZ = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (minX < roof.getMinX()) {
|
|
||||||
stopMinX = true;
|
|
||||||
}
|
|
||||||
if (maxX > roof.getMaxX()) {
|
|
||||||
stopMaxX = true;
|
|
||||||
}
|
|
||||||
if (minZ < roof.getMinZ()) {
|
|
||||||
stopMinZ = true;
|
|
||||||
}
|
|
||||||
if (maxZ > roof.getMaxZ()) {
|
|
||||||
stopMaxZ = true;
|
|
||||||
}
|
|
||||||
// Expand the edges
|
|
||||||
if (!stopMinX) {
|
|
||||||
radiusMinX++;
|
|
||||||
}
|
|
||||||
if (!stopMaxX) {
|
|
||||||
radiusMaxX++;
|
|
||||||
}
|
|
||||||
if (!stopMinZ) {
|
|
||||||
radiusMinZ++;
|
|
||||||
}
|
|
||||||
if (!stopMaxZ) {
|
|
||||||
radiusMaxZ++;
|
|
||||||
}
|
|
||||||
} while (!stopMinX || !stopMaxX || !stopMinZ || !stopMaxZ);
|
|
||||||
// We should have the largest cube we can make now
|
// We should have the largest cube we can make now
|
||||||
minX--;
|
minX--;
|
||||||
maxX++;
|
maxX++;
|
||||||
|
@ -128,9 +65,93 @@ public class Walls extends MinMaxXZ {
|
||||||
maxZ++;
|
maxZ++;
|
||||||
// Find the floor again, only looking within the walls
|
// Find the floor again, only looking within the walls
|
||||||
floor = getFloorY(world, roof.getHeight(), minX, maxX, minZ,maxZ);
|
floor = getFloorY(world, roof.getHeight(), minX, maxX, minZ,maxZ);
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getFloorY(World world, int y, int minX, int maxX, int minZ, int maxZ) {
|
void lookAround(Location loc, WallFinder wf, Roof roof) {
|
||||||
|
World world = loc.getWorld();
|
||||||
|
// Look around player in an ever expanding cube
|
||||||
|
minX = loc.getBlockX() - wf.radiusMinX;
|
||||||
|
maxX = loc.getBlockX() + wf.radiusMaxX;
|
||||||
|
minZ = loc.getBlockZ() - wf.radiusMinZ;
|
||||||
|
maxZ = loc.getBlockZ() + wf.radiusMaxZ;
|
||||||
|
for (int y = roof.getHeight() - 1; y > floor; y--) {
|
||||||
|
for (int x = minX; x <= maxX; x++) {
|
||||||
|
for (int z = minZ; z <= maxZ; z++) {
|
||||||
|
// Only look around outside edge
|
||||||
|
if (!((x > minX && x < maxX) && (z > minZ && z < maxZ))) {
|
||||||
|
// Look at block faces
|
||||||
|
lookAtBlockFaces(wf, world, x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
analyzeFindings(wf, roof);
|
||||||
|
}
|
||||||
|
|
||||||
|
void analyzeFindings(WallFinder wf, Roof roof) {
|
||||||
|
if (minX < roof.getMinX()) {
|
||||||
|
wf.stopMinX = true;
|
||||||
|
}
|
||||||
|
if (maxX > roof.getMaxX()) {
|
||||||
|
wf.stopMaxX = true;
|
||||||
|
}
|
||||||
|
if (minZ < roof.getMinZ()) {
|
||||||
|
wf.stopMinZ = true;
|
||||||
|
}
|
||||||
|
if (maxZ > roof.getMaxZ()) {
|
||||||
|
wf.stopMaxZ = true;
|
||||||
|
}
|
||||||
|
// Expand the edges
|
||||||
|
if (!wf.stopMinX) {
|
||||||
|
wf.radiusMinX++;
|
||||||
|
}
|
||||||
|
if (!wf.stopMaxX) {
|
||||||
|
wf.radiusMaxX++;
|
||||||
|
}
|
||||||
|
if (!wf.stopMinZ) {
|
||||||
|
wf.radiusMinZ++;
|
||||||
|
}
|
||||||
|
if (!wf.stopMaxZ) {
|
||||||
|
wf.radiusMaxZ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lookAtBlockFaces(WallFinder wf, World world, int x, int y, int z) {
|
||||||
|
for (BlockFace bf: ORDINALS) {
|
||||||
|
switch (bf) {
|
||||||
|
case EAST:
|
||||||
|
// positive x
|
||||||
|
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
||||||
|
wf.stopMaxX = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WEST:
|
||||||
|
// negative x
|
||||||
|
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
||||||
|
wf.stopMinX = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NORTH:
|
||||||
|
// negative Z
|
||||||
|
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
||||||
|
wf.stopMinZ = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SOUTH:
|
||||||
|
// positive Z
|
||||||
|
if (WALL_BLOCKS.contains(world.getBlockAt(x, y, z).getRelative(bf).getType())) {
|
||||||
|
wf.stopMaxZ = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int getFloorY(World world, int y, int minX, int maxX, int minZ, int maxZ) {
|
||||||
// Find the floor - defined as the last y under the roof where there are no wall blocks
|
// Find the floor - defined as the last y under the roof where there are no wall blocks
|
||||||
int wallBlockCount;
|
int wallBlockCount;
|
||||||
do {
|
do {
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class GreenhouseFinder {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
// Find the walls
|
// Find the walls
|
||||||
Walls walls = new Walls(roof);
|
Walls walls = new Walls().findWalls(roof);
|
||||||
// Make the initial greenhouse
|
// Make the initial greenhouse
|
||||||
gh = new Greenhouse(location.getWorld(), walls, roof.getHeight());
|
gh = new Greenhouse(location.getWorld(), walls, roof.getHeight());
|
||||||
// Set the original biome
|
// Set the original biome
|
||||||
|
|
|
@ -0,0 +1,231 @@
|
||||||
|
package world.bentobox.greenhouses.greenhouse;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.powermock.modules.junit4.PowerMockRunner;
|
||||||
|
|
||||||
|
import world.bentobox.greenhouses.greenhouse.Walls.WallFinder;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author tastybento
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@RunWith(PowerMockRunner.class)
|
||||||
|
public class WallsTest {
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private Roof roof;
|
||||||
|
@Mock
|
||||||
|
private Block block;
|
||||||
|
@Mock
|
||||||
|
private Location location;
|
||||||
|
@Mock
|
||||||
|
private World world;
|
||||||
|
/**
|
||||||
|
* Class under test
|
||||||
|
*/
|
||||||
|
private Walls walls;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws java.lang.Exception
|
||||||
|
*/
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
walls = new Walls();
|
||||||
|
when(world.getMaxHeight()).thenReturn(255);
|
||||||
|
when(world.getBlockAt(anyInt(), anyInt(), anyInt())).thenReturn(block);
|
||||||
|
when(world.getBlockAt(any(Location.class))).thenReturn(block);
|
||||||
|
when(location.getWorld()).thenReturn(world);
|
||||||
|
when(location.getBlockX()).thenReturn(10);
|
||||||
|
when(location.getBlockY()).thenReturn(10);
|
||||||
|
when(location.getBlockZ()).thenReturn(10);
|
||||||
|
when(location.getBlock()).thenReturn(block);
|
||||||
|
when(location.clone()).thenReturn(location);
|
||||||
|
when(block.getRelative(any())).thenReturn(block);
|
||||||
|
when(block.getType()).thenReturn(Material.GLASS);
|
||||||
|
when(roof.getHeight()).thenReturn(1);
|
||||||
|
when(roof.getLocation()).thenReturn(location);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws java.lang.Exception
|
||||||
|
*/
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#findWalls(world.bentobox.greenhouses.greenhouse.Roof)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testFindWalls() {
|
||||||
|
walls.findWalls(roof);
|
||||||
|
assertEquals("Walls [minX=-2, maxX=11, minZ=-2, maxZ=11, floor=0]", walls.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#lookAround(org.bukkit.Location, world.bentobox.greenhouses.greenhouse.Walls.WallFinder, world.bentobox.greenhouses.greenhouse.Roof)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testLookAround() {
|
||||||
|
WallFinder wf = walls.new WallFinder();
|
||||||
|
walls.lookAround(location, wf, roof);
|
||||||
|
assertTrue(wf.stopMaxX);
|
||||||
|
assertTrue(wf.stopMaxZ);
|
||||||
|
assertFalse(wf.stopMinX);
|
||||||
|
assertFalse(wf.stopMinZ);
|
||||||
|
assertEquals(1, wf.radiusMinX);
|
||||||
|
assertEquals(0, wf.radiusMaxX);
|
||||||
|
assertEquals(1, wf.radiusMinZ);
|
||||||
|
assertEquals(0, wf.radiusMaxZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#analyzeFindings(world.bentobox.greenhouses.greenhouse.Walls.WallFinder, world.bentobox.greenhouses.greenhouse.Roof)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAnalyzeFindings() {
|
||||||
|
WallFinder wf = walls.new WallFinder();
|
||||||
|
walls.analyzeFindings(wf, roof);
|
||||||
|
assertFalse(wf.stopMaxX);
|
||||||
|
assertFalse(wf.stopMaxZ);
|
||||||
|
assertFalse(wf.stopMinX);
|
||||||
|
assertFalse(wf.stopMinZ);
|
||||||
|
assertEquals(1, wf.radiusMinX);
|
||||||
|
assertEquals(1, wf.radiusMaxX);
|
||||||
|
assertEquals(1, wf.radiusMinZ);
|
||||||
|
assertEquals(1, wf.radiusMaxZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#analyzeFindings(world.bentobox.greenhouses.greenhouse.Walls.WallFinder, world.bentobox.greenhouses.greenhouse.Roof)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAnalyzeFindingsStop() {
|
||||||
|
walls.minX = -1;
|
||||||
|
walls.maxX = 1;
|
||||||
|
walls.minZ = -1;
|
||||||
|
walls.maxZ = 1;
|
||||||
|
WallFinder wf = walls.new WallFinder();
|
||||||
|
walls.analyzeFindings(wf, roof);
|
||||||
|
assertTrue(wf.stopMaxX);
|
||||||
|
assertTrue(wf.stopMaxZ);
|
||||||
|
assertTrue(wf.stopMinX);
|
||||||
|
assertTrue(wf.stopMinZ);
|
||||||
|
assertEquals(0, wf.radiusMinX);
|
||||||
|
assertEquals(0, wf.radiusMaxX);
|
||||||
|
assertEquals(0, wf.radiusMinZ);
|
||||||
|
assertEquals(0, wf.radiusMaxZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#lookAtBlockFaces(world.bentobox.greenhouses.greenhouse.Walls.WallFinder, org.bukkit.World, int, int, int)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testLookAtBlockFaces() {
|
||||||
|
WallFinder wf = walls.new WallFinder();
|
||||||
|
walls.lookAtBlockFaces(wf, world, 0, 5, -1);
|
||||||
|
assertTrue(wf.stopMaxX);
|
||||||
|
assertTrue(wf.stopMaxZ);
|
||||||
|
assertTrue(wf.stopMinX);
|
||||||
|
assertTrue(wf.stopMinZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#lookAtBlockFaces(world.bentobox.greenhouses.greenhouse.Walls.WallFinder, org.bukkit.World, int, int, int)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testLookAtBlockFacesNoGlass() {
|
||||||
|
when(block.getType()).thenReturn(Material.AIR);
|
||||||
|
WallFinder wf = walls.new WallFinder();
|
||||||
|
walls.lookAtBlockFaces(wf, world, 0, 5, -1);
|
||||||
|
assertFalse(wf.stopMaxX);
|
||||||
|
assertFalse(wf.stopMaxZ);
|
||||||
|
assertFalse(wf.stopMinX);
|
||||||
|
assertFalse(wf.stopMinZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getFloorY(org.bukkit.World, int, int, int, int, int)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetFloorYZeroY() {
|
||||||
|
assertEquals(0, walls.getFloorY(world, 10, 0, 1, 0, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getFloorY(org.bukkit.World, int, int, int, int, int)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetFloorY() {
|
||||||
|
when(block.getType()).thenReturn(Material.GLASS, Material.GLASS,
|
||||||
|
Material.GLASS, Material.GLASS,
|
||||||
|
Material.GLASS, Material.GLASS,
|
||||||
|
Material.AIR);
|
||||||
|
assertEquals(8, walls.getFloorY(world, 10, 0, 1, 0, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#wallBlocks(org.bukkit.Material)}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testWallBlocks() {
|
||||||
|
assertFalse(Walls.wallBlocks(Material.ACACIA_BOAT));
|
||||||
|
assertTrue(Walls.wallBlocks(Material.GLASS));
|
||||||
|
assertTrue(Walls.wallBlocks(Material.ACACIA_DOOR));
|
||||||
|
assertTrue(Walls.wallBlocks(Material.HOPPER));
|
||||||
|
assertTrue(Walls.wallBlocks(Material.PURPLE_STAINED_GLASS_PANE));
|
||||||
|
assertFalse(Walls.wallBlocks(Material.BIRCH_TRAPDOOR));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getFloor()}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetFloor() {
|
||||||
|
assertEquals(0, walls.getFloor());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getWidth()}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetWidth() {
|
||||||
|
assertEquals(0, walls.getWidth());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#getLength()}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGetLength() {
|
||||||
|
assertEquals(0, walls.getLength());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test method for {@link world.bentobox.greenhouses.greenhouse.Walls#toString()}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testToString() {
|
||||||
|
assertEquals("Walls [minX=0, maxX=0, minZ=0, maxZ=0, floor=0]", walls.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue