From d7bb4c9f945a6acb9fda9c3a4af869d32ce24958 Mon Sep 17 00:00:00 2001 From: Sam Burns Date: Wed, 24 Jan 2024 16:11:35 +0000 Subject: [PATCH] To begin taking advantage of new domain, use wrt default items, and fix business logic --- php/src/GildedRose.php | 20 ++----------------- php/src/GildedRoseItem/DefaultItem.php | 10 ++++++++-- .../default-quality-degradation.feature | 14 +++++++++---- .../GildedRoseItem/DefaultItemTest.php | 9 +++++++++ 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/php/src/GildedRose.php b/php/src/GildedRose.php index 770d13f2..0efca91d 100644 --- a/php/src/GildedRose.php +++ b/php/src/GildedRose.php @@ -25,24 +25,8 @@ final class GildedRose public function updateQuality(): void { foreach ($this->items as $item) { - - if ($item->name === 'Sulfuras, Hand of Ragnaros' || $item->name === 'Backstage passes to a TAFKAL80ETC concert' || $item->name === 'Aged Brie') { - $gildedRoseItem = $this->gildedRoseItemFactory->createGildedRoseItem($item); - $gildedRoseItem->ageByOneDay(); - continue; - } - - if ($item->quality > 0) { - $item->quality = $item->quality - 1; - } - - $item->sellIn = $item->sellIn - 1; - - if ($item->sellIn < 0) { - if ($item->quality > 0) { - $item->quality = $item->quality - 1; - } - } + $gildedRoseItem = $this->gildedRoseItemFactory->createGildedRoseItem($item); + $gildedRoseItem->ageByOneDay(); } } } diff --git a/php/src/GildedRoseItem/DefaultItem.php b/php/src/GildedRoseItem/DefaultItem.php index 8be584ed..c8f4c6f5 100644 --- a/php/src/GildedRoseItem/DefaultItem.php +++ b/php/src/GildedRoseItem/DefaultItem.php @@ -14,9 +14,15 @@ class DefaultItem implements GildedRoseItem public function ageByOneDay(): void { $this->item->sellIn -= 1; + $this->item->quality = max(0, $this->getNewQuality($this->item->quality, $this->item->sellIn)); + } - if ($this->item->quality >= 1) { - $this->item->quality -= 1; + private function getNewQuality(int $previousQuality, int $sellIn): int + { + if ($sellIn < 0) { + return $previousQuality - 2; } + + return $previousQuality - 1; } } diff --git a/php/tests/behat/feature_files/default-quality-degradation.feature b/php/tests/behat/feature_files/default-quality-degradation.feature index 4d712852..d83edf40 100644 --- a/php/tests/behat/feature_files/default-quality-degradation.feature +++ b/php/tests/behat/feature_files/default-quality-degradation.feature @@ -16,7 +16,13 @@ Feature: Default quality degradation Then the item should have a quality of 15 -Scenario: Quality cannot be negative - Given an item with a sell-in of 20 and a quality of 0 - When I update the quality - Then the item should have a quality of 0 + Scenario: Quality cannot be negative + Given an item with a sell-in of 20 and a quality of 0 + When I update the quality + Then the item should have a quality of 0 + + + Scenario: Once the sell-by date has passed, quality degrades twice as fast + Given an item with a sell-in of 0 and a quality of 20 + When I update the quality + Then the item should have a quality of 18 diff --git a/php/tests/phpunit/GildedRoseItem/DefaultItemTest.php b/php/tests/phpunit/GildedRoseItem/DefaultItemTest.php index 9b8661da..bb798542 100644 --- a/php/tests/phpunit/GildedRoseItem/DefaultItemTest.php +++ b/php/tests/phpunit/GildedRoseItem/DefaultItemTest.php @@ -31,4 +31,13 @@ class DefaultItemTest extends TestCase $this->assertEquals(0, $item->quality); } + + public function testQualityDegradesTwiceAsFastAfterSellBy(): void + { + $item = new Item('foo', 0, 20); + $gildedRoseItem = new DefaultItem($item); + $gildedRoseItem->ageByOneDay(); + + $this->assertEquals(18, $item->quality); + } }