MadGenius88
1/20/2017 - 6:55 PM

BlowingGameSpec.php

<?php namespace spec;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
class BowlingGameSpec extends ObjectBehavior {
	function it_scores_a_gutter_game_as_zero() {
		$this->rollTimes( 20, 0 );
		$this->score()->shouldBe( 0 );
	}
	function it_scores_the_sum_of_all_knocked_down_pins_for_a_game() {
		$this->rollTimes( 20, 1 );
		$this->score()->shouldBe( 20 );
	}
	function it_awards_a_one_roll_bonus_for_every_spare() {
		$this->rollSpare();
		$this->roll( 5 );
		$this->rollTimes( 17, 0 );
		$this->score()->shouldBe( 20 );
	}
	function it_awards_a_two_roll_bonus_for_a_strike_in_the_previous_frame() {
		$this->rollTen();
		$this->roll( 7 );
		$this->roll( 2 );
		$this->rollTimes( 17, 0 );
		$this->score()->shouldBe( 28 );
	}
	function it_awards_a_one_roll_bonus_for_a_gutter_and_a_ten() {
		$this->roll( 0 );
		$this->roll( 10 );
		$this->roll( 7 );
		$this->roll( 2 );
		$this->rollTimes( 16, 0 );
		$this->score()->shouldBe( 26 );
	}
	function it_should_roll_three_frames() {
		$this->roll( 0 );
		$this->roll( 10 );
		$this->roll( 7 );
		$this->roll( 3 );
		$this->roll( 2 );
		$this->roll( 3 );
		$this->rollTimes( 14, 0 );
		$this->score()->shouldBe( 34 );
	}
	function it_scores_a_perfect_game() {
		$this->rollTimes( 12, 10 );
		$this->score()->shouldBe( 300 );
	}
	function it_takes_exception_with_invalid_rolls() {
		$this->shouldThrow( 'InvalidArgumentException' )->duringRoll( - 10 );
	}
	private function rollSpare() {
		$this->roll( 2 );
		$this->roll( 8 );
	}
	private function rollTen() {
		$this->roll( 10 );
	}
	private function rollTimes( $count, $pins ) {
		for ( $i = 0; $i < $count; $i ++ ) {
			$this->roll( $pins );
		}
	}
}