package rabbitescape.engine.logic; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; import static rabbitescape.engine.Tools.*; import static rabbitescape.engine.textworld.TextWorldManip.*; import static rabbitescape.engine.util.WorldAssertions.*; import org.junit.Test; import rabbitescape.engine.World; public class TestFalling { @Test public void Fall_when_no_floor() { World world = createWorld( " r ", " ", " ", " ", "#####" ); world.step(); assertThat( renderWorld( world, false, false ), equalTo( " ", " ", " r ", " ", "#####" ) ); } @Test public void Fall_only_1_when_floor_is_1_below() { World world = createWorld( " r ", " ", " # ", " ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " f ", " # ", " ", "#####" ) ); world.step(); assertThat( renderWorld( world, false, false ), equalTo( " ", " r ", " # ", " ", "#####" ) ); } @Test public void Fall_4_squares_without_dieing() { World world = createWorld( " r ", " ", " ", " ", " ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " f ", " f ", " ", " ", // Falling "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " r ", " f ", " f ", // Falling "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " r>", // Landed and going to walk off "#####" ) ); } @Test public void Fall_6_squares_and_you_die() { World world = createWorld( " r ", " ", " ", " ", " ", " ", " ", "#####" ); world.step(); // Falling world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " r ", " f ", " f ", // Still falling "#####" ) ); world.step(); assertThat( renderWorld( world, false, false ), equalTo( " ", " ", " ", " ", " ", " ", " r ", // Landed ... "#####" ) ); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " ", " X ", // ... and going to die "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " ", " ", // and now dead "#####" ) ); } @Test public void Fall_5_squares_and_you_die_earlier() { World world = createWorld( " r ", " ", " ", " ", " ", " ", "#####" ); world.step(); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " r ", // Not quite landed ... " x ", // ... but about to die ... "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " y ", // ... and will continue dying next step "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " ", // and now dead "#####" ) ); } @Test public void Fall_onto_slope_down_right() { World world = createWorld( " r ", " ", " #\\ ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " f ", " #e ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " #r_", "#####" ) ); } @Test public void Fall_onto_brige_down_right() { World world = createWorld( " r ", " ) ", " ) ", " )" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " )f ", " e ", " )" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ) ", " r ", " @" ) ); } @Test public void Fall_odd_to_death_on_bridge() { assertWorldEvolvesLike( "r r" + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + ") (", " " + "\n" + " " + "\n" + "r r" + "\n" + "f f" + "\n" + "f f" + "\n" + ") (", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "r r" + "\n" + "x x" ); } @Test public void Fall_even_to_death_on_bridge() { assertWorldEvolvesLike( "r r" + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + ") (", " " + "\n" + " " + "\n" + "r r" + "\n" + "f f" + "\n" + "f f" + "\n" + " " + "\n" + ") (", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "r r" + "\n" + "f f" + "\n" + "x x", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "X X" ); } @Test public void Fall_onto_slope_down_left() { World world = createWorld( " j ", " ", " /# ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " j ", " f ", " s# ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " +j# ", "#####" ) ); } @Test public void Fall_onto_bridge_down_left() { World world = createWorld( " j ", " ", " (# ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " j ", " f ", " s# ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " +j# ", "#####" ) ); } @Test public void Fall_onto_slope_up_right() { World world = createWorld( " r ", " ", " /# ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " f ", " h# ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ' ", " r# ", "#####" ) ); } @Test public void Fall_onto_bridge_up_right() { World world = createWorld( " r ", " ", " (# ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " f ", " h# ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ' ", " r# ", "#####" ) ); } @Test public void Fall_onto_slope_up_left() { World world = createWorld( " j ", " ", " #\\ ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " j ", " f ", " #a ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ! ", " #j ", "#####" ) ); } @Test public void Fall_onto_bridge_up_left() { World world = createWorld( " j ", " ", " #) ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " j ", " f ", " #a ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ! ", " #j ", "#####" ) ); } @Test public void Fall_1_onto_slope_down_right() { World world = createWorld( " r ", " #\\ ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " #e ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " #r_", "#####" ) ); } @Test public void Fall_1_onto_bridge_down() { assertWorldEvolvesLike( " r " + "\n" + " ) " + "\n" + " ", " " + "\n" + " r_" + "\n" + " " ); } @Test public void Fall_1_onto_slope_down() { assertWorldEvolvesLike( " j " + "\n" + " / " + "\n" + " ", " " + "\n" + " +j " + "\n" + " " ); } @Test public void Fall_1_onto_slope_up_right() { World world = createWorld( " r ", " /# ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " h# ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ' ", " r# ", "#####" ) ); } @Test public void Fall_1_onto_bridge_up_right() { World world = createWorld( " r ", " (# ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " r ", " h# ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ' ", " r# ", "#####" ) ); } @Test public void Fall_1_onto_slope_up_left() { World world = createWorld( " j ", " #\\ ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " j ", " #a ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ! ", " #j ", "#####" ) ); } @Test public void Fall_1_onto_bridge_up_left() { World world = createWorld( " j ", " #) ", "#####" ); assertThat( renderWorld( world, true, false ), equalTo( " j ", " #a ", "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ! ", " #j ", "#####" ) ); } @Test public void Fall_to_death_onto_slopes() { // The animation for this is wrong so this test will need updating, // but the behaviour must show the rabbits dying. // done for right slope. left rise outstanding. World world = createWorld( "rrrr", " ", " ", " ", " ", " /\\ ", "/##\\", "####" ); world.step(); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", "rrrr", "fxxf", "x##x", "####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " yy ", "X##X", "####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " /\\ ", "/##\\", "####" ) ); } @Test public void Fall_to_death_onto_bridges() { // The animation for this is wrong so this test will need updating, // but the behaviour must show the rabbits dying. World world = createWorld( "rrrr", " ", " ", " ", " ", " () ", "(##)", "####" ); world.step(); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", "rrrr", "fxxf", "x##x", "####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " yy ", "X##X", "####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", " () ", "(##)", "####" ) ); } @Test public void Multiple_falls_are_not_additive() { World world = createWorld( "r ", " ", " ", " ", " ", "# ", " ", "#####" ); world.step(); // Falling world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", "r> ", "# ", " ", // Stopped "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " r ", "#f ", " f ", // Fall the last bit "#####" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " ", " ", " ", "# ", " r> ", // Not dead "#####" ) ); } @Test public void Fall_off_the_end_of_a_rise() { assertWorldEvolvesLike( " " + "\n" + " r / " + "\n" + "######", " " + "\n" + " r~ " + "\n" + "######", " ' " + "\n" + " r " + "\n" + "######", " r " + "\n" + " /f " + "\n" + "######" ); } @Test public void Fall_off_the_end_of_a_slide() { assertWorldEvolvesLike( " r " + "\n" + " #) " + "\n" + " " + "\n" + " " + "\n" + " ", " " + "\n" + " #r_ " + "\n" + " " + "\n" + " " + "\n" + " ", " " + "\n" + " #)r " + "\n" + " f " + "\n" + " f " + "\n" + " " ); } @Test public void Dont_pick_up_tokens_when_falling_except_explode() { assertWorldEvolvesLike( "rrrrrr" + "\n" + "bdikcp" + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " ", " " + "\n" + " " + "\n" + "bdikrP" + "\n" + "fffff " + "\n" + "fffff " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " ", " " + "\n" + " " + "\n" + " " + "\n" + "bdik " + "\n" + "ffffr " + "\n" + "fffff " + "\n" + "fffff " + "\n" + " " + "\n" + " ", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "bdik " + "\n" + "ffff " + "\n" + "rrrrr " + "\n" + "fffff " + "\n" + "fffff " ); } @Test public void Fall_through_fresh_dig() { // All must die World world = createWorld( " d( d/ rrr d ", " ( / ##### ", "rrr( O rrr/ O O", "#### ## #### ## #### ##" ); assertWorldEvolvesLike( world, 10, new String[] { " ( / ", " #### ", " ( O / O O", "#### ## #### ## #### ##" }); // None lived assertThat( world.num_saved, equalTo ( 0 ) ); } @Test public void Fall_through_fresh_dig_again() { // All must exit World world = createWorld( " r ", " rd(", " )( ", " (O ", " ###", " d ", " )jj", " O) ", "####" ); assertWorldEvolvesLike( world, 6, new String[] { " ", " (", " ) ", " (O ", " ###", " ", " ", " O) ", "####" }); assertThat( world.num_saved, equalTo ( 4 ) ); } @Test public void Fall_through_fresh_dig_just_removed_block_cache_clear() { // First digs to exit. Next bridges over exit. World world = createWorld( " ", " id( ", " ( ", "r r(O ", "#######" ); // Don't really need to insist on the double bridge // block, but it seems harmless. assertWorldEvolvesLike( world, 14, new String[] { " (", " * ", " ( ", " (O ", "#######", ":*=((" }); assertThat( world.num_saved, equalTo ( 1 ) ); } @Test public void Fall_through_fresh_bash() { World world = createWorld( " ", " rb( ", " r (O ", "######" ); assertWorldEvolvesLike( world, 14, new String[] { " ", " ", " (O ", "######" }); assertThat( world.num_saved, equalTo ( 2 ) ); } }