package kevin.lawrence.bowling;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.*;
import java.util.Iterator;
import org.junit.Before;
import org.junit.Test;
public class GameTest {
private Game game;
@Before
public void createGame() {
game = new Game();
}
@Test
public void shouldBeTenFramesWithTwoRollsInEach() {
for(int frame = 0; frame < 10; frame++){
game.bowl(0);
game.bowl(0);
}
assertThat(game.isGameOver(), is(true));
}
@Test
public void theGameShouldNotBeOverAfterNineAndHalfFrames() {
for(int frame = 0; frame < 9; frame++){
game.bowl(0);
game.bowl(0);
}
game.bowl(0);
assertThat(game.isGameOver(), is(false));
}
@Test(expected=IllegalArgumentException.class)
public void shouldThrowAnExceptionIfMoreThanTenPins() {
game.bowl(11);
}
@Test(expected=IllegalArgumentException.class)
public void shouldThrowAnExceptionIfLessThanZeroPins() {
game.bowl(-1);
}
@Test
public void shouldBeNoScoreUntilBallIsBowled() {
Frame frame = game.iterator().next();
assertThat(frame.getFirstBall(), is(""));
assertThat(frame.getSecondBall(), is(""));
}
@Test
public void firstBallShouldBeAddedToTheFirstFrame() {
game.bowl(3);
Frame frame = game.iterator().next();
assertThat(frame.getFirstBall(), is("3"));
}
@Test
public void thirdBallShouldBeAddedToTheSecondFrame() {
game.bowl(1);
game.bowl(2);
game.bowl(3);
game.bowl(4);
Iterator frames = game.iterator();
Frame frameOne = frames.next();
assertThat(frameOne.getFirstBall(), is("1"));
assertThat(frameOne.getSecondBall(), is("2"));
Frame frameTwo = frames.next();
assertThat(frameTwo.getFirstBall(), is("3"));
assertThat(frameTwo.getSecondBall(), is("4"));
}
@Test
public void thereShouldBeTenFrames() {
int counter = 0;
for (Iterator frames = game.iterator(); frames.hasNext();) {
frames.next();
counter++;
}
assertThat(counter, is(10));
}
@Test
public void frameScoreShouldAccumulate() {
game.bowl(1);
game.bowl(2);
game.bowl(3);
game.bowl(4);
Iterator frames = game.iterator();
Frame frameOne = frames.next();
assertThat(frameOne.getScore(), is("3"));
Frame frameTwo = frames.next();
assertThat(frameTwo.getScore(), is("10"));
}
@Test
public void gameShouldShowCurrentScoreAfterEachBall() {
game.bowl(9);
assertThat(game.getScore(), is(9));
}
@Test
public void aStrikeFrameHasOnlyOneBall() {
game.bowl(10);
game.bowl(2);
game.bowl(3);
Iterator frames = game.iterator();
Frame frameOne = frames.next();
assertThat(frameOne.getFirstBall(), is("X"));
Frame frameTwo = frames.next();
assertThat(frameTwo.getFirstBall(), is("2"));
assertThat(frameTwo.getSecondBall(), is("3"));
}
}