package kevin.lawrence.bowling;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;

import java.util.Iterator;

import org.junit.Before;
import org.junit.Test;

import bowling.acceptance.SingleGameScoring;

public class SingleGameScoringTest extends SingleGameScoring {
  private Game game;

  @Before
  public void setUp() {
    game = new Game();
  }
  
  @Test
  public void hookUpAdaptorMethods() {
    deliverBall(0);
    
    assertThat(gameOver(), is(false));
    assertThat(numberOfFrames(), is(10));
    assertThat(firstBallInFrame(1), is("-"));
    assertThat(secondBallInFrame(1), is(""));
  }

  @Override
  protected void deliverBall(int pins) {
    game.bowl(pins);
  }
  
  @Override
  protected boolean gameOver() {
    return game.isGameOver();
  }
  
  @Override
  protected int numberOfFrames() {
    return Game.FRAMES_PER_GAME;
  }

  @Override
  protected String firstBallInFrame(int frameIndex) {
    return getFrame(frameIndex).getFirstBall();
  }

  @Override
  protected String secondBallInFrame(int frameIndex) {
    return getFrame(frameIndex).getSecondBall();
  }

  @Override
  protected String thirdBallInFrame(int frameIndex) {
    return getFrame(frameIndex).getThirdBall();
  }

  @Override
  protected String scoreForFrame(int frameIndex) {
    return getFrame(frameIndex).getScore();
  }

  @Override
  protected String scoreForGame() {
    return "" + game.getScore();
  }
  
  private Frame getFrame(int frameIndex) {
    int counter = 1;
    for (Frame frame : game) {
      if(counter++ == frameIndex){
        return frame;
      }      
    }
    throw new IllegalArgumentException("Bad frame : " + frameIndex);
  }
}
