package rabbitescape.engine.logic;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.*;
import static rabbitescape.engine.ChangeDescription.State.*;
import static rabbitescape.engine.textworld.TextWorldManip.*;
import static rabbitescape.engine.util.WorldAssertions.*;
import org.junit.Test;
import rabbitescape.engine.Token;
import rabbitescape.engine.World;
public class TestTokens
{
// TODO: slopes and bridges
@Test
public void Tokens_fall_slowly_and_stop_on_ground()
{
assertWorldEvolvesLike(
"bdikcp" + "\n" +
" " + "\n" +
" " + "\n" +
" " + "\n" +
"######",
" " + "\n" +
"bdikcp" + "\n" +
"ffffff" + "\n" +
" " + "\n" +
"######",
" " + "\n" +
" " + "\n" +
"bdikcp" + "\n" +
"ffffff" + "\n" +
"######",
" " + "\n" +
" " + "\n" +
" " + "\n" +
"bdikcp" + "\n" +
"######",
" " + "\n" +
" " + "\n" +
" " + "\n" +
"bdikcp" + "\n" +
"######"
);
}
@Test
public void Tokens_disappear_when_they_drop_outside_world()
{
World world = createWorld(
"bdikc",
" "
);
// Sanity - we have 5 things
assertThat( world.things.size(), equalTo( 5 ) );
world.step();
// Still 5 things, not off bottom yet
assertThat( world.things.size(), equalTo( 5 ) );
world.step();
// Now off bottom - all gone
assertThat( world.things.size(), equalTo( 0 ) );
}
@Test
public void Can_add_tokens_on_empty_and_sloping_blocks()
{
World world = createWorld(
"\\) (/", // 2 slopes, 2 bridges
"#####",
":dig=5"
);
// Sanity - no tokens yet
assertThat( world.things.size(), equalTo( 0 ) );
assertThat( world.abilities.get( Token.Type.dig ), equalTo( 5 ) );
// This is what we are testing: add tokens on slopes, bridges, space
world.changes.addToken( 0, 0, Token.Type.dig );
world.changes.addToken( 1, 0, Token.Type.dig );
world.changes.addToken( 2, 0, Token.Type.dig );
world.changes.addToken( 3, 0, Token.Type.dig );
world.changes.addToken( 4, 0, Token.Type.dig );
world.step();
// All 4 tokens were added
assertThat( world.things.size(), equalTo( 5 ) );
assertThat( world.abilities.get( Token.Type.dig ), equalTo( 0 ) );
}
@Test
public void Cant_add_tokens_on_solid_blocks()
{
World world = createWorld(
"\\) (/", // 2 slopes, 2 bridges
"#####",
":dig=5"
);
// Sanity - no tokens yet
assertThat( world.things.size(), equalTo( 0 ) );
assertThat( world.abilities.get( Token.Type.dig ), equalTo( 5 ) );
// This is what we are testing: add tokens on solid blocks
world.changes.addToken( 0, 1, Token.Type.dig );
world.changes.addToken( 1, 1, Token.Type.dig );
world.changes.addToken( 2, 1, Token.Type.dig );
world.changes.addToken( 3, 1, Token.Type.dig );
world.changes.addToken( 4, 1, Token.Type.dig );
world.step();
// None of them were were added
assertThat( world.things.size(), equalTo( 0 ) );
assertThat( world.abilities.get( Token.Type.dig ), equalTo( 5 ) );
}
@Test
public void Tokens_do_not_fall_through_half_built_bridges_from_down_slope()
{
assertWorldEvolvesLike(
"r d" + "\n" +
"#* " + "\n" +
":*=i\\", // Bridging token on down slope
" " + "\n" +
"#rB", // Dig token hits bridge
" " + "\n" +
"#r[",
" " + "\n" +
"#r{",
" " + "\n" +
"#\\D" // Starts digging
);
}
@Test
public void Tokens_do_not_fall_through_half_built_bridges_from_flat()
{
assertWorldEvolvesLike(
" d" + "\n" +
"ri " + "\n" +
"## ", // Bridging token on flat
" " + "\n" +
" rB" + "\n" +
"## ", // Dig token hits bridge
" " + "\n" +
" r[" + "\n" +
"## ",
" " + "\n" +
" r{" + "\n" +
"## ",
" " + "\n" +
" D" + "\n" +
"## " // Starts digging
);
}
@Test
public void Tokens_do_not_fall_through_half_built_bridges_from_up_slope()
{
assertWorldEvolvesLike(
" d" + "\n" +
" " + "\n" +
"r* " + "\n" +
"## " + "\n" +
":*=i/", // Bridging token on up slope
" " + "\n" +
" B" + "\n" +
" r " + "\n" +
"## ", // Dig token hits bridge
" " + "\n" +
" [" + "\n" +
" r " + "\n" +
"## ",
" " + "\n" +
" {" + "\n" +
" r " + "\n" +
"## ",
" " + "\n" +
" D" + "\n" + // Starts digging
" / " + "\n" +
"## "
);
}
@Test
public void Tokens_do_not_fall_through_half_built_bridges_in_tight_corners()
{
assertWorldEvolvesLike(
" d " + "\n" +
"#r#" + "\n" +
"#*#" + "\n" +
"###" + "\n" +
":*=i/", // Bridging token on up slope in hole
" " + "\n" +
"#B#" + "\n" + // Dig token hits bridge
"#r#" + "\n" +
"###",
" " + "\n" +
"#[#" + "\n" +
"#r#" + "\n" +
"###",
" " + "\n" +
"#{#" + "\n" +
"#r#" + "\n" +
"###",
" " + "\n" +
"#D#" + "\n" + // Starts digging
"#/#" + "\n" +
"###"
);
}
@Test
public void Tokens_falling_onto_bridgers_in_corner_take_effect()
{
// This looks like the rabbit catches it when it's off to the side,
// because really the rabbit is stuck in a hole, so it's not too
// bad, but inconsistent with
// Tokens_do_not_fall_through_half_built_bridges_in_tight_corners
assertWorldEvolvesLike(
" d#" + "\n" +
" #" + "\n" +
"ri#" + "\n" +
"###", // Bridging token next to wall
" #" + "\n" +
" d#" + "\n" +
" f#" + "\n" +
"###",
" #" + "\n" +
" #" + "\n" +
" r#" + "\n" + // Dig token hits bridge and converts rabbit
"#D#"
);
}
@Test
public void Rabbits_falling_to_death_do_not_consume_tokens()
{
World world = createWorld(
" r ",
" j ",
" r ",
" j ",
" r ",
" j ",
" r ",
" ",
" ",
" ",
" ",
"#bdikcp*#",
"####)(*/#",
"#########",
":*=db",
":*=\\"
);
assertWorldEvolvesLike(
world,
8,
new String[] {
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"#bdi #",
"####****#",
"#########",
":*=)k",
":*=(c",
":*=\\p",
":*=/db"
});
}
@Test
public void Rabbits_falling_and_living_do_consume_tokens()
{
World world = createWorld(
" r ",
" r r ",
" r ",
"#bpbpcpdp",
"####)(\\/#",
"#########"
);
assertWorldEvolvesLike(
world,
8,
new String[] {
" ",
" ",
" ",
"# p",
"####)(\\ #",
"####### #"
});
}
@Test
public void Tokens_start_off_in_non_falling_states()
{
// See https://github.com/andybalaam/rabbit-escape/issues/447
World world = createWorld(
" ",
" /",
"##"
);
Token inAir = new Token( 0, 0, Token.Type.brolly, world );
Token onSlope = new Token( 1, 1, Token.Type.brolly, world );
// Until a time step passes, these are in non-moving states
assertThat( inAir.state, is( TOKEN_BROLLY_STILL ) );
assertThat( onSlope.state, is( TOKEN_BROLLY_ON_SLOPE ) );
}
}