package rabbitescape.engine.logic; import static org.hamcrest.MatcherAssert.*; 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 TestBashing { @Test public void Token_not_next_to_wall_makes_useless_bash() { World world = createWorld( " rb bj ", "#########" ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " rI Jj ", "#########" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r> <j ", "#########" ) ); } @Test public void Bash_through_single_wall() { World world = createWorld( " rb# #bj ", "#############" ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " rK Wj ", "#############" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r> <j ", "#############" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r> <j ", "#############" ) ); } @Test public void Bash_through_longer_wall() { World world = createWorld( " rb### ###bj ", "#################" ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " rK## ##Wj ", "#################" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r>## ##<j ", "#################" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " rK# #Wj ", "#################" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r># #<j ", "#################" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " rK Wj ", "#################" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r> <j ", "#################" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r> <j ", "#################" ) ); } @Test public void Bashing_doesnt_last() { World world = createWorld( " rb# # # #bj ", "#############" ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " rK # # Wj ", "#############" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r> # # <j ", "#############" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " r># #<j ", "#############" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ?# #| ", "#############" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " <j# #r> ", "#############" ) ); } @Test public void Bash_through_single_slope() { assertWorldEvolvesLike( " rb/ " + "\n" + "#######", " rK " + "\n" + "#######", " r> " + "\n" + "#######", " r> " + "\n" + "#######", " r> " + "\n" + "#######" ); } @Test public void Bash_through_slope_plus_blocks() { assertWorldEvolvesLike( " rb/#\\ " + "\n" + "########", " rK#\\ " + "\n" + "########", " r>#\\ " + "\n" + "########", " rK\\ " + "\n" + "########", " r>\\ " + "\n" + "########", " rK " + "\n" + "########", " r> " + "\n" + "########", " r> " + "\n" + "########", " r>" + "\n" + "########" ); } @Test public void Bash_on_single_slope() { assertWorldEvolvesLike( " / " + "\n" + " r* " + "\n" + // Bash token on a slope "#######" + "\n" + ":*=b/", " K " + "\n" + " r " + "\n" + "#######", " r> " + "\n" + " / " + "\n" + "#######", " r " + "\n" + " /f " + "\n" + "#######" ); } @Test public void Bash_on_single_bridge() { assertWorldEvolvesLike( " ( " + "\n" + " r* " + "\n" + // Bash token on a slope "#######" + "\n" + ":*=b(", " K " + "\n" + " r " + "\n" + "#######", " r> " + "\n" + " ( " + "\n" + "#######", " r " + "\n" + " (f " + "\n" + "#######" ); } @Test public void Bash_on_slope_followed_by_blocks() { assertWorldEvolvesLike( " / " + "\n" + " r*# " + "\n" + // Bash token on a slope "#######" + "\n" + ":*=b/", " K " + "\n" + " r# " + "\n" + "#######", " r> " + "\n" + " /# " + "\n" + "#######", " r> " + "\n" + " /# " + "\n" + "#######" ); } @Test public void Bash_on_slope_plus_blocks() { assertWorldEvolvesLike( " /# " + "\n" + " r*## " + "\n" + // Bash token on a slope "#######" + "\n" + ":*=b/", " K# " + "\n" + " r## " + "\n" + "#######", " r># " + "\n" + " /## " + "\n" + "#######", " rK " + "\n" + " /## " + "\n" + "#######" ); } @Test public void Bash_on_bridge_plus_blocks() { assertWorldEvolvesLike( " (# " + "\n" + " r*## " + "\n" + // Bash token on a slope "#######" + "\n" + ":*=b(", " K# " + "\n" + " r## " + "\n" + "#######", " r># " + "\n" + " (## " + "\n" + "#######", " rK " + "\n" + " (## " + "\n" + "#######" ); } @Test public void Bash_purposefully_at_top_of_slope() { assertWorldEvolvesLike( "rb/" + "\n" + "#/#", " r/" + "\n" + "#h#", " K" + "\n" + "#r#", " r>" + "\n" + "#/#", " r" + "\n" + "#/#" ); } @Test public void Bash_uselessly_at_top_of_slope() { assertWorldEvolvesLike( "rb " + "\n" + "#/#", " r " + "\n" + "#h#", " " + "\n" + "#rI", " r>" + "\n" + "#/#", " r" + "\n" + "#/#" ); assertWorldEvolvesLike( " bj" + "\n" + "#\\#", " j " + "\n" + "#a#", " " + "\n" + "Jj#", "<j " + "\n" + "#\\#", "j " + "\n" + "#\\#" ); } @Test public void Bashing_fails_if_first_block_is_unbreakable() { assertWorldEvolvesLike( "rbM" + "\n" + "###", " rI" + "\n" + "###", " ?M" + "\n" + "###", "<jM" + "\n" + "###" ); } @Test public void Bashing_fails_if_later_block_is_unbreakable() { assertWorldEvolvesLike( "rb#M" + "\n" + "####", " rKM" + "\n" + "####", " r>M" + "\n" + "####", " rI" + "\n" + "####", " ?M" + "\n" + "####", " <jM" + "\n" + "####" ); } @Test public void Standing_on_slope_bashing_fails_if_first_block_is_unbreakable() { assertWorldEvolvesLike( " bM" + "\n" + " r/#" + "\n" + "####", " M" + "\n" + " rI" + "\n" + "####", " ?M" + "\n" + " /#" + "\n" + "####", " jM" + "\n" + // This is a bit glitchy " s#" + "\n" + // because the rabbit floats then falls. "####", " M" + "\n" + " +j#" + "\n" + "####" ); } }