Browse files

- Merge [3422].

  • Loading branch information...
1 parent a42b71d commit ee637b90e10d22231c768de238b1f4467df77509 @sebastianbergmann committed Jul 10, 2008
View
107 PHPUnit/Samples/BowlingGame/BowlingGame.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2008, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id$
+ * @link http://www.phpunit.de/
+ * @since File available since Release 3.3.0
+ */
+
+class BowlingGame
+{
+ protected $rolls = array();
+
+ public function roll($pins)
+ {
+ $this->rolls[] = $pins;
+ }
+
+ protected function isSpare($frameIndex)
+ {
+ return $this->sumOfPinsInFrame($frameIndex) == 10;
+ }
+
+ protected function isStrike($frameIndex)
+ {
+ return $this->rolls[$frameIndex] == 10;
+ }
+
+ protected function sumOfPinsInFrame($frameIndex)
+ {
+ return $this->rolls[$frameIndex] +
+ $this->rolls[$frameIndex + 1];
+ }
+
+ protected function spareBonus($frameIndex)
+ {
+ return $this->rolls[$frameIndex + 2];
+ }
+
+ protected function strikeBonus($frameIndex)
+ {
+ return $this->rolls[$frameIndex + 1] +
+ $this->rolls[$frameIndex + 2];
+ }
+
+ public function score()
+ {
+ $score = 0;
+ $frameIndex = 0;
+
+ for ($frame = 0; $frame < 10; $frame++) {
+ if ($this->isStrike($frameIndex)) {
+ $score += 10 + $this->strikeBonus($frameIndex);
+ $frameIndex++;
+ }
+
+ else if ($this->isSpare($frameIndex)) {
+ $score += 10 + $this->spareBonus($frameIndex);
+ $frameIndex += 2;
+ }
+
+ else {
+ $score += $this->sumOfPinsInFrame($frameIndex);
+ $frameIndex += 2;
+ }
+ }
+
+ return $score;
+ }
+}
View
112 PHPUnit/Samples/BowlingGame/BowlingGameSpec.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2008, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id$
+ * @link http://www.phpunit.de/
+ * @since File available since Release 3.3.0
+ */
+
+require_once 'PHPUnit/Extensions/Story/TestCase.php';
+require_once 'BowlingGame.php';
+
+class BowlingGameSpec extends PHPUnit_Extensions_Story_TestCase
+{
+ /**
+ * @scenario
+ */
+ public function scoreForOneSpareIs16()
+ {
+ $this->given('New game')
+ ->when('Player rolls', 5)
+ ->and('Player rolls', 5)
+ ->and('Player rolls', 3)
+ ->then('Score should be', 16);
+ }
+
+ public function runGiven(&$world, $action, $arguments)
+ {
+ switch($action) {
+ case 'New game': {
+ $world['game'] = new BowlingGame;
+ $world['rolls'] = 0;
+ }
+ break;
+
+ default: {
+ return $this->notImplemented($action);
+ }
+ }
+ }
+
+ public function runWhen(&$world, $action, $arguments)
+ {
+ switch($action) {
+ case 'Player rolls': {
+ $world['game']->roll($arguments[0]);
+ $world['rolls']++;
+ }
+ break;
+
+ default: {
+ return $this->notImplemented($action);
+ }
+ }
+ }
+
+ public function runThen(&$world, $action, $arguments)
+ {
+ switch($action) {
+ case 'Score should be': {
+ for ($i = $world['rolls']; $i < 20; $i++) {
+ $world['game']->roll(0);
+ }
+
+ $this->assertEquals($arguments[0], $world['game']->score());
+ }
+ break;
+
+ default: {
+ return $this->notImplemented($action);
+ }
+ }
+ }
+}
+
View
110 PHPUnit/Samples/BowlingGame/BowlingGameTest.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2008, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id$
+ * @link http://www.phpunit.de/
+ * @since File available since Release 3.3.0
+ */
+
+require_once 'BowlingGame.php';
+
+class BowlingGameTest extends PHPUnit_Framework_TestCase
+{
+ protected $game;
+
+ protected function setUp()
+ {
+ $this->game = new BowlingGame;
+ }
+
+ public function testScoreForGutterGameIs0()
+ {
+ $this->rollMany(20, 0);
+ $this->assertEquals(0, $this->game->score());
+ }
+
+ public function testScoreForAllOnesIs20()
+ {
+ $this->rollMany(20, 1);
+ $this->assertEquals(20, $this->game->score());
+ }
+
+ public function testScoreForOneSpareAnd3Is16()
+ {
+ $this->rollSpare();
+ $this->game->roll(3);
+ $this->rollMany(17, 0);
+ $this->assertEquals(16, $this->game->score());
+ }
+
+ public function testScoreForOneStrikeAnd3And4Is24()
+ {
+ $this->rollStrike();
+ $this->game->roll(3);
+ $this->game->roll(4);
+ $this->rollMany(17, 0);
+ $this->assertEquals(24, $this->game->score());
+ }
+
+ public function testScoreForPerfectGameIs300()
+ {
+ $this->rollMany(12, 10);
+ $this->assertEquals(300, $this->game->score());
+ }
+
+ protected function rollMany($n, $pins)
+ {
+ for ($i = 0; $i < $n; $i++) {
+ $this->game->roll($pins);
+ }
+ }
+
+ protected function rollSpare()
+ {
+ $this->game->roll(5);
+ $this->game->roll(5);
+ }
+
+ protected function rollStrike()
+ {
+ $this->game->roll(10);
+ }
+}
View
24 PHPUnit/Tests/TextUI/story.phpt
@@ -0,0 +1,24 @@
+--TEST--
+phpunit --story BowlingGameSpec ../Samples/BowlingGame/BowlingGameSpec.php
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--story';
+$_SERVER['argv'][2] = 'BowlingGameSpec';
+$_SERVER['argv'][3] = '../Samples/BowlingGame/BowlingGameSpec.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/TextUI/Command.php';
+?>
+--EXPECT--
+PHPUnit @package_version@ by Sebastian Bergmann.
+
+BowlingGameSpec
+ - Score for one spare is 16 [successful]
+
+ Given New game
+ When Player rolls
+ and Player rolls
+ and Player rolls
+ Then Score should be
+
+Scenarios: 1, Failed: 0, Skipped: 0, Incomplete: 0.
+
View
12 package.xml
@@ -604,6 +604,17 @@
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
</dir>
+ <dir name="BowlingGame">
+ <file baseinstalldir="/" name="BowlingGame.php" role="doc">
+ <tasks:replace from="@package_version@" to="version" type="package-info" />
+ </file>
+ <file baseinstalldir="/" name="BowlingGameSpec.php" role="doc">
+ <tasks:replace from="@package_version@" to="version" type="package-info" />
+ </file>
+ <file baseinstalldir="/" name="BowlingGameTest.php" role="doc">
+ <tasks:replace from="@package_version@" to="version" type="package-info" />
+ </file>
+ </dir>
<dir name="Money">
<file baseinstalldir="/" name="IMoney.php" role="doc">
<tasks:replace from="@package_version@" to="version" type="package-info" />
@@ -796,6 +807,7 @@
<file baseinstalldir="/" name="log-xml.phpt" role="test" />
<file baseinstalldir="/" name="repeat.phpt" role="test" />
<file baseinstalldir="/" name="skeleton.phpt" role="test" />
+ <file baseinstalldir="/" name="story.phpt" role="test" />
<file baseinstalldir="/" name="tap.phpt" role="test" />
<file baseinstalldir="/" name="testdox-html.phpt" role="test" />
<file baseinstalldir="/" name="testdox.phpt" role="test" />

0 comments on commit ee637b9

Please sign in to comment.