/** 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)));
    }
  }