/** Create a table containing a half-full and completely full cell. */ @Test public void Water_table_can_contain_standing_water() { List<Block> blocks = Collections.emptyList(); LookupTable2D<Block> blockTable = new LookupTable2D<>(blocks, new Dimension(2, 2)); HashMap<Position, Integer> waterAmounts = new HashMap<Position, Integer>(); waterAmounts.put(new Position(0, 0), WaterUtil.HALF_CAPACITY); waterAmounts.put(new Position(1, 1), WaterUtil.MAX_CAPACITY); LookupTable2D<WaterRegion> waterTable = WaterRegionFactory.generateWaterTable(blockTable, waterAmounts); assertThat(waterTable.size, equalTo(blockTable.size)); Set<CellularDirection> allDirs = Util.newSet(UP, LEFT, RIGHT, DOWN); // The cell at 0,0 should be half-full. assertThat( waterTable.getItemAt(0, 0), equalTo(new WaterRegion(0, 0, allDirs, MAX_CAPACITY, HALF_CAPACITY, false))); // These two cells should be empty. assertThat(waterTable.getItemAt(0, 1), equalTo(new WaterRegion(0, 1, allDirs, MAX_CAPACITY))); assertThat(waterTable.getItemAt(1, 0), equalTo(new WaterRegion(1, 0, allDirs, MAX_CAPACITY))); // The cell at 1,1 should be full. assertThat( waterTable.getItemAt(1, 1), equalTo(new WaterRegion(1, 1, allDirs, MAX_CAPACITY, MAX_CAPACITY, false))); }
/** Test creating regions for a cell with both types of ramps in it. */ @Test public void Make_water_region_two_ramps() { List<WaterRegion> waterRegions = WaterRegionFactory.makeWaterRegion( 0, 0, new Shape[] {Shape.UP_RIGHT, Shape.UP_LEFT}, false); List<WaterRegion> expected = Arrays.asList(new WaterRegion(0, 0, Util.newSet(UP), QUARTER_CAPACITY)); assertThat(waterRegions, equalTo(expected)); }
/** Test creating regions for a cell with both types of bridges in it. */ @Test public void Make_water_region_two_bridges() { List<WaterRegion> waterRegions = WaterRegionFactory.makeWaterRegion( 0, 0, new Shape[] {Shape.BRIDGE_UP_RIGHT, Shape.BRIDGE_UP_LEFT}, false); List<WaterRegion> expected = Arrays.asList(new WaterRegion(0, 0, Util.newSet(UP, LEFT, RIGHT, DOWN), MAX_CAPACITY)); assertThat(waterRegions, equalTo(expected)); }
/** Create a table containing a block and two ramps. Check the generated water table. */ @Test public void Generate_water_table() { Block block = new Block(0, 0, Material.EARTH, Shape.FLAT, 0); Block leftRamp = new Block(0, 1, Material.EARTH, Shape.UP_LEFT, 0); Block rightRamp = new Block(1, 0, Material.EARTH, Shape.UP_RIGHT, 0); List<Block> blocks = Arrays.asList(block, leftRamp, rightRamp); LookupTable2D<Block> blockTable = new LookupTable2D<>(blocks, new Dimension(2, 2)); LookupTable2D<WaterRegion> waterTable = WaterRegionFactory.generateWaterTable(blockTable, new HashMap<Position, Integer>()); assertThat(waterTable.size, equalTo(blockTable.size)); assertNull(waterTable.getItemAt(0, 0)); assertThat( waterTable.getItemAt(0, 1), equalTo(new WaterRegion(0, 1, Util.newSet(UP, RIGHT), HALF_CAPACITY))); assertThat( waterTable.getItemAt(1, 0), equalTo(new WaterRegion(1, 0, Util.newSet(UP, LEFT), HALF_CAPACITY))); assertThat( waterTable.getItemAt(1, 1), equalTo(new WaterRegion(1, 1, Util.newSet(UP, LEFT, RIGHT, DOWN), MAX_CAPACITY))); // Also check the perimeter. for (int i = -1; i <= 2; i++) { assertThat( waterTable.getItemAt(-1, i), equalTo(new WaterRegion(-1, i, Util.newSet(UP, LEFT, RIGHT, DOWN), MAX_CAPACITY))); assertThat( waterTable.getItemAt(i, -1), equalTo(new WaterRegion(i, -1, Util.newSet(UP, LEFT, RIGHT, DOWN), MAX_CAPACITY))); assertThat( waterTable.getItemAt(i, 2), equalTo(new WaterRegion(i, 2, Util.newSet(UP, LEFT, RIGHT, DOWN), MAX_CAPACITY))); assertThat( waterTable.getItemAt(2, i), equalTo(new WaterRegion(2, i, Util.newSet(UP, LEFT, RIGHT, DOWN), MAX_CAPACITY))); } }