If you run the tests like:
$ phpunit --testdox BowlingTest.phpyou should see the tests all pass like:
Bowling
[x] Should roll gutter game
[x] Should roll all ones
[x] Should roll one spare
[x] Should roll one strike
[x] Should roll perfect game
<?php
class Game
{
private $rolls = array();
public function roll($pins) {
$this->rolls[] = $pins;
}
public function score() {
$score = 0;
$rollsMax = count($this->rolls);
$firstInFrame = 0;
for ($frame = 0; $frame < 10; $frame++) {
if ($this->isStrike($firstInFrame)) {
$score += 10 + $this->nextTwoBallsForStrike($firstInFrame);
$firstInFrame++;
} else if ($this->isSpare($firstInFrame)) {
$score += 10 + $this->nextBallForSpare($firstInFrame);
$firstInFrame += 2;
} else {
$score += $this->twoBallsInFrame($firstInFrame);
$firstInFrame += 2;
}
}
return $score;
}
public function nextTwoBallsForStrike($firstInFrame) {
return $this->rolls[$firstInFrame + 1] + $this->rolls[$firstInFrame + 2];
}
public function nextBallForSpare($firstInFrame) {
return $this->rolls[$firstInFrame + 2];
}
public function twoBallsInFrame($firstInFrame) {
return $this->rolls[$firstInFrame] + $this->rolls[$firstInFrame + 1];
}
public function isStrike($firstInFrame) {
return $this->rolls[$firstInFrame] == 10;
}
public function isSpare($firstInFrame) {
return $this->rolls[$firstInFrame] + $this->rolls[$firstInFrame+1] == 10;
}
public function rollSpare() {
$this->roll(5);
$this->roll(5);
}
}
class BowlingTest extends PHPUnit_Framework_TestCase {
private $g;
public function setUp() {
$this->g = new Game;
}
/**
* @test
*/
public function Should_roll_gutter_game() {
$this->rollMany(20, 0);
$this->assertEquals(0, $this->g->score());
}
/**
* @test
*/
public function Should_roll_all_ones() {
$this->rollMany(20, 1);
$this->assertEquals(20, $this->g->score());
}
/**
* @test
*/
public function Should_roll_one_spare() {
$this->g->rollSpare();
$this->g->roll(3);
$this->rollMany(17, 0);
$this->assertEquals(16, $this->g->score());
}
/**
* @test
**/
public function Should_roll_one_strike() {
$this->rollStrike();
$this->g->roll(3);
$this->g->roll(4);
$this->rollMany(16, 0);
$this->assertEquals(24, $this->g->score());
}
/**
* @test
**/
public function Should_roll_perfect_game() {
$this->rollMany(12, 10);
$this->assertEquals(300, $this->g->score());
}
public function rollMany($n, $pins) {
for ($i = 0; $i < $n; $i++) {
$this->g->roll($pins);
}
}
public function rollStrike() {
$this->g->roll(10);
}
}
Is there an error here because your test for spare is trying to assert 16 but I figure 13. This is because a spare is 10, plus the next roll which is a 3. This totals 13.
ReplyDelete