package rabbitescape.engine.logic; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; import static rabbitescape.engine.textworld.TextWorldManip.*; import static rabbitescape.engine.util.WorldAssertions.*; import static rabbitescape.engine.Tools.*; import org.junit.Test; import rabbitescape.engine.Direction; import rabbitescape.engine.Rabbit; import rabbitescape.engine.World; public class TestBridging { @Test public void Bridge_on_the_flat() { assertWorldEvolvesLike( " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " ri ij " + "\n" + "###############", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " rB Ej " + "\n" + "###############", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " r[ ]j " + "\n" + "###############", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " r{ }j " + "\n" + "###############", " " + "\n" + " " + "\n" + " " + "\n" + " B E " + "\n" + " r j " + "\n" + "###############", " " + "\n" + " " + "\n" + " " + "\n" + " [ ] " + "\n" + " r j " + "\n" + "###############", " " + "\n" + " " + "\n" + " " + "\n" + " { } " + "\n" + " r j " + "\n" + "###############", " " + "\n" + " " + "\n" + " B E " + "\n" + " r j " + "\n" + " ( ) " + "\n" + "###############", " " + "\n" + " " + "\n" + " [ ] " + "\n" + " r j " + "\n" + " ( ) " + "\n" + "###############", " " + "\n" + " " + "\n" + " { } " + "\n" + " r j " + "\n" + " ( ) " + "\n" + "###############", " " + "\n" + " ' ! " + "\n" + " r j " + "\n" + " ( ) " + "\n" + " ( ) " + "\n" + "###############", " " + "\n" + " r j " + "\n" + " (f f) " + "\n" + " ( f f ) " + "\n" + " ( ) " + "\n" + "###############" ); } @Test public void Bridge_on_an_up_slope() { assertWorldEvolvesLike( " " + "\n" + " " + "\n" + " " + "\n" + " i i " + "\n" + "r / \\ j" + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " r~ `j " + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " B E " + "\n" + " r j " + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " [ ] " + "\n" + " r j " + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " { } " + "\n" + " r j " + "\n" + "#################", " " + "\n" + " " + "\n" + " B E " + "\n" + " r j " + "\n" + " / \\ " + "\n" + "#################", " " + "\n" + " " + "\n" + " [ ] " + "\n" + " r j " + "\n" + " / \\ " + "\n" + "#################", " " + "\n" + " " + "\n" + " { } " + "\n" + " r j " + "\n" + " / \\ " + "\n" + "#################", " " + "\n" + " B E " + "\n" + " r j " + "\n" + " ( ) " + "\n" + " / \\ " + "\n" + "#################", " " + "\n" + " [ ] " + "\n" + " r j " + "\n" + " ( ) " + "\n" + " / \\ " + "\n" + "#################", " " + "\n" + " { } " + "\n" + " r j " + "\n" + " ( ) " + "\n" + " / \\ " + "\n" + "#################", " ' ! " + "\n" + " r j " + "\n" + " ( ) " + "\n" + " ( ) " + "\n" + " / \\ " + "\n" + "#################", " r j " + "\n" + " (f f) " + "\n" + " ( f f ) " + "\n" + " ( ) " + "\n" + " / \\ " + "\n" + "#################" ); } @Test public void Bridge_on_a_down_slope() { assertWorldEvolvesLike( " " + "\n" + " " + "\n" + " " + "\n" + "ri ij" + "\n" + "#\\ /#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "#rB Ej#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "#r[ ]j#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "#r{ }j#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " B E " + "\n" + "#\\r j/#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " [ ] " + "\n" + "#\\r j/#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " " + "\n" + " { } " + "\n" + "#\\r j/#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " B E " + "\n" + " r j " + "\n" + "#\\( )/#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " [ ] " + "\n" + " r j " + "\n" + "#\\( )/#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " " + "\n" + " { } " + "\n" + " r j " + "\n" + "#\\( )/#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " ' ! " + "\n" + " r j " + "\n" + " ( ) " + "\n" + "#\\( )/#" + "\n" + "##\\ /##" + "\n" + "#################", " " + "\n" + " r j " + "\n" + " (f f) " + "\n" + " ( f f ) " + "\n" + "#\\( )/#" + "\n" + "##\\ /##" + "\n" + "#################" ); } @Test public void Stop_bridging_when_hit_a_wall() { assertWorldEvolvesLike( "# #" + "\n" + "# ij ri #" + "\n" + "############", "# #" + "\n" + "#Ej rB#" + "\n" + "############", "# #" + "\n" + "#]j r[#" + "\n" + "############", "# #" + "\n" + "#}j r{#" + "\n" + "############", "# #" + "\n" + "#| ?#" + "\n" + "############", "# #" + "\n" + "#r_ +j#" + "\n" + "############", "# #" + "\n" + "#)r> <j(#" + "\n" + "############" ); } @Test public void Dont_stop_bridging_when_2_above_head_at_start() { assertWorldEvolvesLike( "# # # #" + "\n" + "# #" + "\n" + "# ij ri #" + "\n" + "############", "# # # #" + "\n" + "# #" + "\n" + "#Ej rB#" + "\n" + "############" ); } @Test public void Can_bridge_out_from_under_block() { assertWorldEvolvesLike( "# #" + "\n" + "# # #" + "\n" + "#ri #" + "\n" + "############", "# #" + "\n" + "# # #" + "\n" + "# rB #" + "\n" + "############" ); } @Test public void Dont_bridge_when_hit_head_in_front_at_start() { assertWorldEvolvesLike( "## ##" + "\n" + "# ij ri #" + "\n" + "############", "## ##" + "\n" + "#<i i>#" + "\n" + "############" ); } @Test public void Two_rabbits_next_to_each_other_bridge_next_to_each_other() { assertWorldEvolvesLike( "# " + "\n" + "# " + "\n" + "# " + "\n" + "#rrii " + "\n" + "############", "# " + "\n" + "# " + "\n" + "# " + "\n" + "# r>B " + "\n" + "############", "# " + "\n" + "# " + "\n" + "# " + "\n" + "# r[ " + "\n" + "############", "# " + "\n" + "# " + "\n" + "# " + "\n" + "# r{B " + "\n" + "############", "# " + "\n" + "# " + "\n" + "# B " + "\n" + "# r[ " + "\n" + "############", "# " + "\n" + "# " + "\n" + "# [ " + "\n" + "# r{ " + "\n" + "############", "# " + "\n" + "# " + "\n" + "# {B " + "\n" + "# rr " + "\n" + "############", "# " + "\n" + "# B " + "\n" + "# r[ " + "\n" + "# (r " + "\n" + "############", "# " + "\n" + "# [ " + "\n" + "# r{ " + "\n" + "# (r " + "\n" + "############", "# " + "\n" + "# {B " + "\n" + "# rr " + "\n" + "# (( " + "\n" + "############" ); } @Test public void Stop_bridging_when_hit_head_here_later() { assertWorldEvolvesLike( "# # # #" + "\n" + "# #" + "\n" + "# ijri #" + "\n" + "############", "# # # #" + "\n" + "# #" + "\n" + "# Ej rB #" + "\n" + "############", "# # # #" + "\n" + "# #" + "\n" + "# ]j r[ #" + "\n" + "############", "# # # #" + "\n" + "# #" + "\n" + "# }j r{ #" + "\n" + "############", "# # # #" + "\n" + "# ! ' #" + "\n" + "# j r #" + "\n" + "############" ); } @Test public void Stop_bridging_when_hit_head_in_front_later() { assertWorldEvolvesLike( "# # # #" + "\n" + "# #" + "\n" + "# ijri #" + "\n" + "############", "# # # #" + "\n" + "# #" + "\n" + "# Ej rB #" + "\n" + "############", "# # # #" + "\n" + "# #" + "\n" + "# ]j r[ #" + "\n" + "############", "# # # #" + "\n" + "# #" + "\n" + "# }j r{ #" + "\n" + "############", "# # # #" + "\n" + "# ! ' #" + "\n" + "# j r #" + "\n" + "############" ); } // TODO: Stop_bridging_when_hit_a_ceiling @Test public void Stop_bridging_when_skim_a_wall_top() { assertWorldEvolvesLike( " " + "\n" + "# #" + "\n" + "# ij ri #" + "\n" + "############", " " + "\n" + "# #" + "\n" + "# Ej rB #" + "\n" + "############", " " + "\n" + "# #" + "\n" + "# ]j r[ #" + "\n" + "############", " " + "\n" + "# #" + "\n" + "# }j r{ #" + "\n" + "############", " " + "\n" + "#E B#" + "\n" + "# j r #" + "\n" + "############", " " + "\n" + "#] [#" + "\n" + "# j r #" + "\n" + "############", " " + "\n" + "#} {#" + "\n" + "# j r #" + "\n" + "############", "! '" + "\n" + "#j r#" + "\n" + "# ) ( #" + "\n" + "############" ); } @Test public void Stop_bridging_when_join_opposite_bridge_long() { assertWorldEvolvesLike( "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( ij ri ) #" + "\n" + "#############", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# (Ej rB) #" + "\n" + "#############", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# (]j r[) #" + "\n" + "#############", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# (}j r{) #" + "\n" + "#############", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# mj r& #" + "\n" + "#############" ); } @Test public void Dont_bridge_and_turn_when_hit_back_slope() { assertWorldEvolvesLike( "# / \\ #" + "\n" + "# / \\ #" + "\n" + "# / ij ri \\ #" + "\n" + "#############", "# / \\ #" + "\n" + "# / \\ #" + "\n" + "# /<i i>\\ #" + "\n" + "#############", "# / \\ #" + "\n" + "# / \\ #" + "\n" + "# /|i i?\\ #" + "\n" + "#############" ); } @Test public void Stop_bridging_and_turn_when_hit_back_slope_later() { assertWorldEvolvesLike( "# / \\ #" + "\n" + "# / \\ #" + "\n" + "# / ij ri \\ #" + "\n" + "#################", "# / \\ #" + "\n" + "# / \\ #" + "\n" + "# / Ej rB \\ #" + "\n" + "#################", "# / \\ #" + "\n" + "# / \\ #" + "\n" + "# / ]j r[ \\ #" + "\n" + "#################", "# / \\ #" + "\n" + "# / \\ #" + "\n" + "# / }j r{ \\ #" + "\n" + "#################", "# / \\ #" + "\n" + "# /! '\\ #" + "\n" + "# / j r \\ #" + "\n" + "#################" ); } @Test public void Stop_bridging_when_join_opposite_bridge_short() { assertWorldEvolvesLike( "# #" + "\n" + "# ( ij ri ) #" + "\n" + "#############", "# #" + "\n" + "# (Ej rB) #" + "\n" + "#############", "# #" + "\n" + "# (]j r[) #" + "\n" + "#############", "# #" + "\n" + "# (}j r{) #" + "\n" + "#############", "# #" + "\n" + "# mj r& #" + "\n" + "#############" ); } @Test public void Stop_bridging_when_join_opposite_bridge_long_later() { assertWorldEvolvesLike( "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( ij ri ) #" + "\n" + "#################", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( Ej rB ) #" + "\n" + "#################", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( ]j r[ ) #" + "\n" + "#################", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( }j r{ ) #" + "\n" + "#################", "# ( ) #" + "\n" + "# (E B) #" + "\n" + "# ( j r ) #" + "\n" + "#################", "# ( ) #" + "\n" + "# (] [) #" + "\n" + "# ( j r ) #" + "\n" + "#################", "# ( ) #" + "\n" + "# (} {) #" + "\n" + "# ( j r ) #" + "\n" + "#################", "# ( ) #" + "\n" + "# mj r& #" + "\n" + "# ( ) ( ) #" + "\n" + "#################" ); } @Test public void Stop_bridging_when_offset_join_opposite_bridge_long_later() { assertWorldEvolvesLike( "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( ijri ) #" + "\n" + "##############", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( Ej rB ) #" + "\n" + "##############", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( ]j r[ ) #" + "\n" + "##############", "# ( ) #" + "\n" + "# ( ) #" + "\n" + "# ( }j r{ ) #" + "\n" + "##############", // Build a bridge and leave an annoying gap "# ( ) #" + "\n" + "# ! ' #" + "\n" + "# ( j r ) #" + "\n" + "##############", "# ( ) #" + "\n" + "# j r #" + "\n" + "# (f) (f) #" + "\n" + "##############" ); } @Test public void Stop_bridging_when_join_opposite_bridge_short_later() { assertWorldEvolvesLike( "# #" + "\n" + "# ( ) #" + "\n" + "# ( ijri ) #" + "\n" + "################", "# #" + "\n" + "# ( ) #" + "\n" + "# ( Ej rB ) #" + "\n" + "################", "# #" + "\n" + "# ( ) #" + "\n" + "# ( ]j r[ ) #" + "\n" + "################", "# #" + "\n" + "# ( ) #" + "\n" + "# ( }j r{ ) #" + "\n" + "################", "# #" + "\n" + "# (E B) #" + "\n" + "# ( j r ) #" + "\n" + "################", "# #" + "\n" + "# (] [) #" + "\n" + "# ( j r ) #" + "\n" + "################", "# #" + "\n" + "# (} {) #" + "\n" + "# ( j r ) #" + "\n" + "################", "# #" + "\n" + "# mj r& #" + "\n" + "# ( ) ( ) #" + "\n" + "################" ); } @Test public void Walker_immediately_behind_bridger_continues_past() { assertWorldEvolvesLike( "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "#rri #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r>B #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r[ #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r{> #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# B #" + "\n" + "# rr> #" + "\n" + "#########" ); } @Test public void Walker_2_behind_bridger_continues_past() { assertWorldEvolvesLike( "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "#r ri #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r>rB #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r>[ #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r{ #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# B #" + "\n" + "# r> #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# [ #" + "\n" + "# rr>#" + "\n" + "#########" ); } @Test public void Walker_3_behind_bridger_climbs_and_falls() { assertWorldEvolvesLike( "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "#r ri #" + "\n" + "###########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r> rB #" + "\n" + "###########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r>r[ #" + "\n" + "###########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r>{ #" + "\n" + "###########", "# #" + "\n" + "# #" + "\n" + "# B #" + "\n" + "# r~ #" + "\n" + // Climbs on "###########", "# #" + "\n" + "# #" + "\n" + "# [ #" + "\n" + "# r #" + "\n" + // Jumps off end "###########", "# #" + "\n" + "# #" + "\n" + "# { #" + "\n" + "# rf #" + "\n" + // Falls "###########", "# #" + "\n" + "# B #" + "\n" + "# r #" + "\n" + "# (r> #" + "\n" + // Walks away "###########" ); } @Test public void Walker_4_behind_bridger_climbs_and_falls() { assertWorldEvolvesLike( "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "#r ri #" + "\n" + "############", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r> rB #" + "\n" + "############", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r> r[ #" + "\n" + "############", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# r>r{ #" + "\n" + "############", "# #" + "\n" + "# #" + "\n" + "# B #" + "\n" + "# r>r #" + "\n" + "############", "# #" + "\n" + "# #" + "\n" + "# [ #" + "\n" + "# r~ #" + "\n" + // Climbs on "############", "# #" + "\n" + "# #" + "\n" + "# { #" + "\n" + "# r #" + "\n" + // Jumps off end "############", "# #" + "\n" + "# B #" + "\n" + "# r #" + "\n" + "# (f #" + "\n" + // Falls "############", "# #" + "\n" + "# [ #" + "\n" + "# r #" + "\n" + "# (r> #" + "\n" + // Walks away "############" ); } @Test public void Bridge_token_next_to_wall_makes_you_bridge_towards_it() { assertWorldEvolvesLike( "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# ri#" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# B#" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# [#" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# {#" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# ?#" + "\n" + "########" ); } @Test public void Bridge_token_next_to_short_wall_makes_you_bridge_towards_it() { assertWorldEvolvesLike( "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "#ri# #" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# B# #" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# [# #" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# #" + "\n" + "# {# #" + "\n" + "########", "# #" + "\n" + "# #" + "\n" + "# ' #" + "\n" + "# r# #" + "\n" + "########" ); } @Test public void Bridge_token_next_to_back_slope_makes_you_bridge_towards_it() { assertWorldEvolvesLike( " " + "\n" + " " + "\n" + " " + "\n" + "/ij ri)" + "\n" + "###########", " " + "\n" + " " + "\n" + " " + "\n" + "/E B)" + "\n" + "###########", " " + "\n" + " " + "\n" + " " + "\n" + "/] [)" + "\n" + "###########", " " + "\n" + " " + "\n" + " " + "\n" + "/} {)" + "\n" + "###########", " " + "\n" + " " + "\n" + " " + "\n" + "mj r&" + "\n" + "###########" ); } @Test public void Bridge_token_at_top_of_bridge_continues() { assertWorldEvolvesLike( "# #" + "\n" + "# i #" + "\n" + "# ( #" + "\n" + "# r( #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# $ #" + "\n" + "# r #" + "\n" + "#########", "# #" + "\n" + "# B #" + "\n" + "# r #" + "\n" + "# ( #" + "\n" + "#########", "# #" + "\n" + "# [ #" + "\n" + "# r #" + "\n" + "# ( #" + "\n" + "#########", "# #" + "\n" + "# { #" + "\n" + "# r #" + "\n" + "# ( #" + "\n" + "#########", "# B #" + "\n" + "# r #" + "\n" + "# ( #" + "\n" + "# ( #" + "\n" + "#########" ); } @Test public void Bridge_token_at_top_of_bridge_by_wall_continues_reversed() { assertWorldEvolvesLike( "# #" + "\n" + "# i#" + "\n" + "# (#" + "\n" + "# r( #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# $#" + "\n" + "# r #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# ?#" + "\n" + "# ( #" + "\n" + "#########", "# #" + "\n" + "# #" + "\n" + "# Ej#" + "\n" + "# ( #" + "\n" + "#########" ); } @Test public void Bridger_ignores_bridging_tokens() { assertWorldEvolvesLike( " i " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "ri " + "\n" + "#########", " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " rB " + "\n" + "#########", " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " r[ " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " rf " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " B " + "\n" + " i " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " [ " + "\n" + " i " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " i " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " B " + "\n" + " i " + "\n" + " i " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " [ " + "\n" + " i " + "\n" + " i " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " { " + "\n" + " i " + "\n" + " i " + "\n" + "#########", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " ' " + "\n" + " r " + "\n" + " i " + "\n" + " i " + "\n" + "#########" ); } @Test public void Bridge_out_of_a_hole() { // Drop bridge tokens on a rabbit in a hole assertWorldEvolvesLike( " i " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " " + "\n" + "##r##" + "\n" + "## ##" + "\n" + "##i##" + "\n" + "#####", " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + "##f##" + "\n" + "## ##" + "\n" + "##B##" + "\n" + "#####", " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "##i##" + "\n" + "##f##" + "\n" + "##[##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + " " + "\n" + "## ##" + "\n" + "##i##" + "\n" + "##f##" + "\n" + // Finish first bridge "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + " " + "\n" + "## ##" + "\n" + "## ##" + "\n" + "##?##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + " f " + "\n" + "## ##" + "\n" + "##E##" + "\n" + "##j##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " i " + "\n" + "##f##" + "\n" + "##]##" + "\n" + "##j##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "##i##" + "\n" + "##f##" + "\n" + // Finish second bridge "##j##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "## ##" + "\n" + "##|##" + "\n" + "##(##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "##B##" + "\n" + "##r##" + "\n" + "##(##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "##[##" + "\n" + "##r##" + "\n" + "##(##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + "##{##" + "\n" + "##r##" + "\n" + "##(##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " ' " + "\n" + "##r##" + "\n" + "##)##" + "\n" + "##(##" + "\n" + "#####", " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " " + "\n" + " r>" + "\n" + "##(##" + "\n" + "##)##" + "\n" + "##(##" + "\n" + "#####" ); } @Test public void Two_rabbits_cant_pick_up_the_same_token() { World world = createWorld( " ", " ", " i ", "#########" ); // Add 2 rabbits in the same place world.rabbits.add( new Rabbit( 2, 2, Direction.RIGHT ) ); world.rabbits.add( new Rabbit( 2, 2, Direction.RIGHT ) ); world.step(); assertThat( renderWorld( world, false, false ), equalTo( " ", " ", " ri ", "#########" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " r> ", // One is walking, one is bridging "#########" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " r[> ", "#########" ) ); world.step(); assertThat( renderWorld( world, true, false ), equalTo( " ", " ", " r{r> ", "#########" ) ); } @Test public void No_build_through_blocker() { World world = createWorld( "r ", " rO", " ik#", "####" ); for ( int i = 0; i < 5 ; i++ ) { world.step(); } // rabbit has been turned by blocker and is bridging the other way. assertThat( renderWorld( world, true, false ), equalTo( " ", " O", "}jH#", "####" ) ); } @Test public void Bridge_out_of_bounds() { World world = createWorld( " *", "* ##", "### ###", " ", "ij ri", "### ###", " ", " ", " ij ri ", "### ###", ":*=ij", ":*=ir" ); // The test will find out of // bounds exceptions from rendering // bridges outside the world. assertWorldEvolvesLike( world, 10, new String[] { " ( ) ", " ( ##", "### ###", " ", " ", "### ###", " ", " ", ") (", "### ###", }); assertThat( world.num_killed, equalTo ( 6 ) ); } }