package rabbitescape.engine; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static rabbitescape.engine.CellularDirection.DOWN; import static rabbitescape.engine.CellularDirection.LEFT; import static rabbitescape.engine.CellularDirection.RIGHT; import static rabbitescape.engine.CellularDirection.UP; import static rabbitescape.engine.textworld.TextWorldManip.createWorld; import java.util.Map; import org.junit.Test; import rabbitescape.engine.util.Util; public class TestWaterRegion { @Test public void round_trip_persistance() { WaterRegion start = new WaterRegion( 0, 0, Util.newSet( UP, LEFT, RIGHT, DOWN ), 25 ); start.addContents( 10 ); Map<String, String> persisted = start.saveState(); WaterRegion end = new WaterRegion( 0, 0, null, 0 ); end.restoreFromState( persisted ); assertThat( end, equalTo( start ) ); } @Test public void no_need_to_calc_new_state_outside_world() { WaterRegion waterRegion = new WaterRegion( -1, 0, null, 25, 25, true ); // Pass in a null world and check that there's no NPE. waterRegion.calcNewState( null ); } @Test public void no_need_to_calc_new_state_for_empty_cell() { WaterRegion waterRegion = new WaterRegion( 1, 1, null, 25, 0, false ); // Pass in a null world and check that there's no NPE. waterRegion.calcNewState( null ); } @Test public void empty_flow_causes_noop_step() { WaterRegion waterRegion = new WaterRegion( 0, 0, null, 25 ); // Pass in a null world and check that there's no NPE. waterRegion.step( null ); } @Test public void flow_is_set_and_then_reset() { String[] worldString = { "# #", "# #", "###" }; World world = createWorld( worldString ); // Add one unit of water to the top cell. WaterRegion topWaterRegion = world.waterTable.getItemAt( 1, 0 ); topWaterRegion.addContents( 1 ); WaterRegion bottomWaterRegion = world.waterTable.getItemAt( 1, 1 ); // After calcNewState the flow should be set, but the bottom cell should still be empty. topWaterRegion.calcNewState( world ); assertThat( topWaterRegion.getFlow( DOWN ), equalTo( 1 ) ); assertThat( bottomWaterRegion.getContents(), equalTo( 0 ) ); // After step the bottom cell should contain water and the flow should be reset. topWaterRegion.step( world ); assertThat( topWaterRegion.getFlow( DOWN ), equalTo( 0 ) ); assertThat( bottomWaterRegion.getContents(), equalTo( 1 ) ); } @Test public void water_disappears_off_the_bottom_of_the_world() { String[] worldString = { "# #" }; World world = createWorld( worldString ); // Add one unit of water to the empty cell. WaterRegion waterRegion = world.waterTable.getItemAt( 1, 0 ); waterRegion.addContents( 1 ); WaterRegion waterRegionOffBottom = world.waterTable.getItemAt( 1, 1 ); // After calcNewState the flow should be set. waterRegion.calcNewState( world ); assertThat( waterRegion.getFlow( DOWN ), equalTo( 1 ) ); // After step the water should have disappeared. waterRegion.step( world ); assertThat( waterRegion.getContents(), equalTo( 0 ) ); assertThat( waterRegion.getFlow( DOWN ), equalTo( 0 ) ); assertThat( "The water should disappear off the bottom of the world", waterRegionOffBottom.getContents(), equalTo( 0 ) ); } }