<?php /* ナシオ。ヌス、ホエノヘッ・鬣ケ Satofumi KAMIMURA $Id$ */ class VoteClass { // ・ウ・ケ・ネ・鬣ッ・ソ function VoteClass() { } // ・ヌ。シ・ソ・ユ・。・、・ォ、鯣ノ、゜スミ、キ function load($fname) { } // サリト猯ワ、ヒ」アノシトノイテ function add($title) { } // ・ヌ。シ・ソ・ユ・。・、・リ、ホスュケ゜ function save($fname) { } } ?>
で、空実装のテストクラスは以下の通り。
<?php /* voteClass.php 、ホ・ニ・ケ・ネ Satofumi KAMIMURA $Id */ error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); require_once('phpunit/phpunit.php'); require_once('voteClass.php'); //require_once('voteClass_null.php'); class VoteClassTest extends TestCase { var $voteObj_; // ・ウ・ケ・ネ・鬣ッ・ソ function VoteClassTest($name) { $this->TestCase($name); } // ・ニ・ケ・ネ、ホス魘ス function setUp() { $this->voteObj = new VoteClass(); } // ・ニ・ケ・ネ、ホスェホサ function tearDown() {} // 、ハ、ォ。「コヌス鬢ホ・ニ・ケ・ネ、ャ・ィ・鬘シ、ヒ、ハ、ホ、ヌ・タ・゜。シ・ニ・ケ・ネ、ネ、キ、ニトノイテ function testDummy() { } // ニノ、゜スミ、キ・ニ・ケ・ネ function testLoad() { $this->voteObj->load('loadSample.dat'); $this->assertEquals(8, $this->voteObj->voteInfo['、ヲ、オ、ョ、オ、]); $this->assertEquals(4, $this->voteObj->voteInfo['、ュ、熙オ、]); $this->assertEquals(1, $this->voteObj->voteInfo['、ソ、フ、ュ、オ、]); } // ナシ・ニ・ケ・ネ function testAdd() { $this->voteObj->load('loadSample.dat'); // エ鈐クケ猯ワ、ヒツミ、キ、ニ、ホナシ $this->voteObj->add('、ソ、フ、ュ、オ、); $this->assertEquals(2, $this->voteObj->voteInfo['、ソ、フ、ュ、オ、]); // ソキオャケ猯ワ、ホトノイテ $this->voteObj->add('、セ、ヲ、オ、); $this->assertEquals(1, $this->voteObj->voteInfo['、セ、ヲ、オ、]); } // スュケ゜・ニ・ケ・ネ function testSave() { $this->voteObj->load('loadSample.dat'); $this->voteObj->add('、ソ、フ、ュ、オ、); $this->voteObj->add('、セ、ヲ、オ、); $this->voteObj->save('saveSample.dat'); $this->voteObj->load('saveSample.dat'); $this->assertEquals(8, $this->voteObj->voteInfo['、ヲ、オ、ョ、オ、]); $this->assertEquals(4, $this->voteObj->voteInfo['、ュ、熙オ、]); $this->assertEquals(2, $this->voteObj->voteInfo['、ソ、フ、ュ、オ、]); $this->assertEquals(1, $this->voteObj->voteInfo['、セ、ヲ、オ、]); } } ?> <html> <head> <title>VoteClassTest</title> <STYLE TYPE="text/css"> <?php include ("stylesheet.css"); ?> </STYLE> </head> <body> <?php $suite = new TestSuite('VoteClassTest'); $result = new PrettyTestResult; $suite->run($result); $result->report(); ?>
そのときの実行結果がこれ。まぁ、ちゃんと失敗してる。
で、テストを通過するように調整する。徐々に失敗がなくなっていくのは、やっぱり楽しい。
最初のテストが失敗しているのは、phpunit のせいだと信じる。
テストの実行結果
テストを通過した投票情報の管理クラス
<?php /* ナシオ。ヌス、ホエノヘッ・鬣ケ Satofumi KAMIMURA $Id$ */ class VoteClass { var $voteInfo; // ・ウ・ケ・ネ・鬣ッ・ソ function VoteClass() { } // ・ヌ。シ・ソ・ユ・。・、・ォ、鯣ノ、゜スミ、キ function load($fname) { $fd = fopen($fname, 'r'); if (!$fd) { return; } while ($info = fscanf($fd, "%d\t%s")) { if (count($info) != 2) { continue; } list ($num, $title) = $info; $this->voteInfo[$title] = $num; } fclose($fd); } // サリト猯ワ、ヒ」アノシトノイテ function add($title) { // サリト猯ワ、ャ、「、ミ ++, 、ハ、ア、ミテヘ、1 、ヌトノイテ if (array_key_exists($title, $this->voteInfo)) { ++$this->voteInfo[$title]; } else { $this->voteInfo[$title] = 1; } } // ・ヌ。シ・ソ・ユ・。・、・リ、ホスュケ゜ function save($fname) { if (count($this->voteInfo) <= 0) { return; } $fd = fopen($fname, 'w'); if (!$fd) { return; } foreach ($this->voteInfo as $key => $value) { fputs($fd, $value. "\t". $key. "\n"); } fclose($fd); } } ?>
最後に、投票ページの PHP スクリプトがこれ
<?php /* ナシ・レ。シ・ク Satofumi KAMIMURA $Id$ */ require_once('voteClass.php'); $obj = new VoteClass(); $obj->load('voteInfo.dat'); $this_page = strtok(basename($_SERVER['REQUEST_URI']), '?&#'); // ナシ、オ、ソ、鬘「ツュ、キケヌハンツク、キトセ、ケ if (isset($_GET['add'])) { $obj->add(urldecode($_GET['add'])); $obj->save('voteInfo.dat'); } ?> <html><head><title>ナシ・レ。シ・ク</title></head> <body> ナシキフ<br> <br> <?php // クスコ゜、ホナシキフ、ホニノ、゜スミ、キ if (count($obj->voteInfo) <= 0) { echo 'イ盞釥ホナシセャ、「、熙゛、サ、」'; } else { arsort($obj->voteInfo); reset ($obj->voteInfo); while (list ($key, $val) = each ($obj->voteInfo)) { $encoded = urlencode($key); echo "$key, $val, <a href=$this_page?add=$encoded>ナシ</a><br>"; } } ?> <br> ソキオャケ猯ワ、ホトノイテ<br> <br> !!! フ、シツチbr> </php ?> </body>
ここまでを前回のときにできいればねぇ。
ロック
です。このあたりは次回以降にまわします。
...がんばろう。