diff --git a/php/src/GildedRose.php b/php/src/GildedRose.php index 5751a93e..6e1b1239 100644 --- a/php/src/GildedRose.php +++ b/php/src/GildedRose.php @@ -38,10 +38,11 @@ final class GildedRose [商品:Conjured] ・引数のsell_inを-1する ・引数のqualityを-2する + ・sell_inが0未満の場合、さらにquality-2する [その他商品] ・引数のsell_inを-1する ・引数のqualityを-1する - ・sell_inが0未満の場合、さらにquality-1する ★仕様書に記載なかったがコード上はこのようになっている + ・sell_inが0未満の場合、さらにquality-1する */ /** @@ -119,9 +120,12 @@ final class GildedRose private function conjured(): void { $this->calcSellInSubtraction(); - // 新たな関数は作成せず減算処理を2回実行する - $this->calcQualitySubtraction(); - $this->calcQualitySubtraction(); + $this->calcQualityDoubleSubtraction(); + + // sell_inが0未満の場合、sell_inを再減算する + if ($this->item->sell_in < 0) { + $this->calcQualityDoubleSubtraction(); + } } /** @@ -167,4 +171,20 @@ final class GildedRose --$this->item->quality; } } + + /** + * qualityを2倍の減算を行う + */ + private function calcQualityDoubleSubtraction(): void + { + // 1以上の場合計算 + if ($this->item->quality >= 1) { + $this->item->quality -=2; + } + + // qualityが0未満の場合、0を設定 + if ($this->item->quality < 0) { + $this->item->quality = 0; + } + } } diff --git a/php/tests/GildedRoseTest.php b/php/tests/GildedRoseTest.php index 7ffe28be..e316fd8d 100644 --- a/php/tests/GildedRoseTest.php +++ b/php/tests/GildedRoseTest.php @@ -284,6 +284,62 @@ class GildedRoseTest extends TestCase $this->assertSame(0, $items[0]->quality); } + /** + * Conjured:sell_inが0以下、qualityが50未満 + * 期待値:sell_inが-1、qualityが-4 + */ + public function testConjuredSellIn0OrLess(): void + { + $items = [new Item('Conjured Mana Cake', 0, 10)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Conjured Mana Cake', $items[0]->name); + $this->assertSame(-1, $items[0]->sell_in); + $this->assertSame(6, $items[0]->quality); + + $items = [new Item('Conjured Mana Cake', -1, 10)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Conjured Mana Cake', $items[0]->name); + $this->assertSame(-2, $items[0]->sell_in); + $this->assertSame(6, $items[0]->quality); + } + + /** + * Conjured:sell_inが0以下、qualityが2以下 + * 期待値:sell_inが-1、qualityを減算、0が下限 + */ + public function testConjuredSellIn0OrLessAndQuality2OrLess(): void + { + $items = [new Item('Conjured Mana Cake', 0, 2)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Conjured Mana Cake', $items[0]->name); + $this->assertSame(-1, $items[0]->sell_in); + $this->assertSame(0, $items[0]->quality); + + $items = [new Item('Conjured Mana Cake', 0, 1)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Conjured Mana Cake', $items[0]->name); + $this->assertSame(-1, $items[0]->sell_in); + $this->assertSame(0, $items[0]->quality); + } + + /** + * Conjured:sell_inが0、qualityが0 + * 期待値:sell_inが-1、qualityは変更なし + */ + public function testConjuredSellIn0AndQuality0(): void + { + $items = [new Item('Conjured Mana Cake', 0, 0)]; + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + $this->assertSame('Conjured Mana Cake', $items[0]->name); + $this->assertSame(-1, $items[0]->sell_in); + $this->assertSame(0, $items[0]->quality); + } + /** * 複数商品 */