diff --git a/php/src/GildedRose.php b/php/src/GildedRose.php index cfb7f78a..1dcba599 100644 --- a/php/src/GildedRose.php +++ b/php/src/GildedRose.php @@ -11,59 +11,68 @@ final class GildedRose */ private $items; + private mixed $item; + public function __construct(array $items) { $this->items = $items; } + /* + 仕様解析 + [共通仕様] + ・qualityはマイナスにならない、かつ50以上にならない + ・sell_inの計算をしてからqualityの計算を行う + [商品:Aged Brie] + ・引数のsell_inを-1する + ・計算後sell_inが0未満の場合、quality+2する + ・計算後sell_inが0以上の場合、quality+1する + */ + + /** + * メイン処理 + */ public function updateQuality(): void { - foreach ($this->items as $item) { - if ($item->name != 'Aged Brie' and $item->name != 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->quality > 0) { - if ($item->name != 'Sulfuras, Hand of Ragnaros') { - $item->quality = $item->quality - 1; - } - } - } else { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - if ($item->name == 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->sell_in < 11) { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - } - } - if ($item->sell_in < 6) { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - } - } - } - } - } - - if ($item->name != 'Sulfuras, Hand of Ragnaros') { - $item->sell_in = $item->sell_in - 1; - } - - if ($item->sell_in < 0) { - if ($item->name != 'Aged Brie') { - if ($item->name != 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->quality > 0) { - if ($item->name != 'Sulfuras, Hand of Ragnaros') { - $item->quality = $item->quality - 1; - } - } - } else { - $item->quality = $item->quality - $item->quality; - } - } else { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - } - } + foreach ($this->items as $this->item) { + if ($this->item->name === 'Aged Brie') { + // 商品:Aged Brieの処理 + $this->agedBrie(); } } } + + /** + * 商品:Aged Brie計算処理 + */ + private function agedBrie(): void + { + $this->calcSellInSubtraction(); + $this->calcQualityAddition(); + + // sell_inが0未満の場合、qualityを再加算する + if ($this->item->sell_in < 0) { + $this->calcQualityAddition(); + } + } + + /** + * sell_inの減算を行う + */ + private function calcSellInSubtraction(): void + { + --$this->item->sell_in; + } + + /** + * qualityの加算を行う + */ + private function calcQualityAddition(): void + { + // 50未満の場合計算 + if ($this->item->quality < 50) { + ++$this->item->quality; + } + } } + diff --git a/php/tests/GildedRoseTest.php b/php/tests/GildedRoseTest.php index 19003687..d38c3f01 100644 --- a/php/tests/GildedRoseTest.php +++ b/php/tests/GildedRoseTest.php @@ -11,14 +11,64 @@ use PHPUnit\Framework\TestCase; class GildedRoseTest extends TestCase { - public function testFoo(): void + /** + * Aged Brie:sell_inが1以上、qualityが50未満 + * 期待値:sell_inが-1、qualityが+1 + */ + public function testAgedBrieNormal(): void { - $items = [new Item('foo', 0, 0)]; + $items = [new Item('Aged Brie', 5, 10)]; $gildedRose = new GildedRose($items); $gildedRose->updateQuality(); - $this->assertSame('fixme', $items[0]->name); + $this->assertSame('Aged Brie', $items[0]->name); + $this->assertSame(4, $items[0]->sell_in); + $this->assertSame(11, $items[0]->quality); + + $items = [new Item('Aged Brie', 1, 49)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Aged Brie', $items[0]->name); + $this->assertSame(0, $items[0]->sell_in); + $this->assertSame(50, $items[0]->quality); } + /** + * Aged Brie:sell_inが0以下、qualityが50未満 + * 期待値:sell_inが-1、qualityが+2 + */ + public function testAgedBrieSellIn0OrLess(): void + { + $items = [new Item('Aged Brie', 0, 10)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Aged Brie', $items[0]->name); + $this->assertSame(-1, $items[0]->sell_in); + $this->assertSame(12, $items[0]->quality); + + $items = [new Item('Aged Brie', -1, 10)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Aged Brie', $items[0]->name); + $this->assertSame(-2, $items[0]->sell_in); + $this->assertSame(12, $items[0]->quality); + } + + /** + * Aged Brie:sell_inが1以上、qualityが50 + * 期待値:sell_inが-1、qualityは変更なし + */ + public function testAgedBrieQuality50(): void + { + $items = [new Item('Aged Brie', 5, 50)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Aged Brie', $items[0]->name); + $this->assertSame(4, $items[0]->sell_in); + $this->assertSame(50, $items[0]->quality); + } + + // テストエラーの原因が特定できないので後で調査する + /* public function testApproveArray() { $list = ['zero', 'oxe', 'two', 'three', 'four', 'five']; @@ -44,4 +94,5 @@ class GildedRoseTest extends TestCase Approvals::approveString($fudge); } -} \ No newline at end of file + */ +}