diff --git a/php/src/GildedRoseItem/ConjuredItem.php b/php/src/GildedRoseItem/ConjuredItem.php new file mode 100644 index 00000000..732cee4d --- /dev/null +++ b/php/src/GildedRoseItem/ConjuredItem.php @@ -0,0 +1,30 @@ +item->sellIn -= 1; + $this->item->quality = max(0, $this->getNewQuality($this->item->quality, $this->item->sellIn)); + } + + private function getNewQuality(int $previousQuality, int $sellIn): int + { + if ($sellIn < 0) { + return $previousQuality - 4; + } + + return $previousQuality - 2; + } +} diff --git a/php/src/GildedRoseItemFactory.php b/php/src/GildedRoseItemFactory.php index 8817401d..6885164a 100644 --- a/php/src/GildedRoseItemFactory.php +++ b/php/src/GildedRoseItemFactory.php @@ -6,6 +6,7 @@ namespace GildedRose; use GildedRose\GildedRoseItem\BrieItem; use GildedRose\GildedRoseItem\BackstagePassItem; +use GildedRose\GildedRoseItem\ConjuredItem; use GildedRose\GildedRoseItem\SulfurasItem; use GildedRose\GildedRoseItem\DefaultItem; @@ -20,6 +21,8 @@ class GildedRoseItemFactory return new BackstagePassItem($item); case SulfurasItem::NAME: return new SulfurasItem($item); + case ConjuredItem::NAME: + return new ConjuredItem($item); default: return new DefaultItem($item); } diff --git a/php/tests/approval/approvals/ApprovalTest.testThirtyDays.approved.txt b/php/tests/approval/approvals/ApprovalTest.testThirtyDays.approved.txt index f0bce04d..2d5be71d 100644 --- a/php/tests/approval/approvals/ApprovalTest.testThirtyDays.approved.txt +++ b/php/tests/approval/approvals/ApprovalTest.testThirtyDays.approved.txt @@ -21,7 +21,7 @@ Sulfuras, Hand of Ragnaros, -1, 80 Backstage passes to a TAFKAL80ETC concert, 14, 21 Backstage passes to a TAFKAL80ETC concert, 9, 50 Backstage passes to a TAFKAL80ETC concert, 4, 50 -Conjured Mana Cake, 2, 5 +Conjured Mana Cake, 2, 4 -------- day 2 -------- name, sellIn, quality @@ -33,7 +33,7 @@ Sulfuras, Hand of Ragnaros, -1, 80 Backstage passes to a TAFKAL80ETC concert, 13, 22 Backstage passes to a TAFKAL80ETC concert, 8, 50 Backstage passes to a TAFKAL80ETC concert, 3, 50 -Conjured Mana Cake, 1, 4 +Conjured Mana Cake, 1, 2 -------- day 3 -------- name, sellIn, quality @@ -45,7 +45,7 @@ Sulfuras, Hand of Ragnaros, -1, 80 Backstage passes to a TAFKAL80ETC concert, 12, 23 Backstage passes to a TAFKAL80ETC concert, 7, 50 Backstage passes to a TAFKAL80ETC concert, 2, 50 -Conjured Mana Cake, 0, 3 +Conjured Mana Cake, 0, 0 -------- day 4 -------- name, sellIn, quality @@ -57,7 +57,7 @@ Sulfuras, Hand of Ragnaros, -1, 80 Backstage passes to a TAFKAL80ETC concert, 11, 24 Backstage passes to a TAFKAL80ETC concert, 6, 50 Backstage passes to a TAFKAL80ETC concert, 1, 50 -Conjured Mana Cake, -1, 1 +Conjured Mana Cake, -1, 0 -------- day 5 -------- name, sellIn, quality diff --git a/php/tests/behat/contexts/ServiceLevelContext.php b/php/tests/behat/contexts/ServiceLevelContext.php index bfce862f..ad9b3e1e 100644 --- a/php/tests/behat/contexts/ServiceLevelContext.php +++ b/php/tests/behat/contexts/ServiceLevelContext.php @@ -84,4 +84,10 @@ class ServiceLevelContext implements Context { $this->createItem('Sulfuras, Hand of Ragnaros', $initialSellIn, $initialQuality); } + + #[Given('a conjured item with a sell-in of :initialSellIn and a quality of :initialQuality')] + public function aConjuredItemWithASellInOfAndAQualityOf(int $initialSellIn, int $initialQuality): void + { + $this->createItem('Conjured Mana Cake', $initialSellIn, $initialQuality); + } } diff --git a/php/tests/behat/feature_files/conjured-items.feature b/php/tests/behat/feature_files/conjured-items.feature index 657712b2..7b309eda 100644 --- a/php/tests/behat/feature_files/conjured-items.feature +++ b/php/tests/behat/feature_files/conjured-items.feature @@ -3,19 +3,19 @@ Feature: Conjured items As a shopkeeper I want to see the quality of a conjured item decrease by 2 each day - @wip + Scenario: Single quality update Given a conjured item with a sell-in of 20 and a quality of 20 When I update the quality Then the item should have a quality of 18 - @wip + Scenario: Quality cannot be negative Given a conjured 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 - @wip + Scenario: Once the sell-by date has passed, quality degrades twice as fast Given a conjured item with a sell-in of 0 and a quality of 20 When I update the quality diff --git a/php/tests/phpunit/GildedRoseItem/ConjuredItemTest.php b/php/tests/phpunit/GildedRoseItem/ConjuredItemTest.php new file mode 100644 index 00000000..21d4122d --- /dev/null +++ b/php/tests/phpunit/GildedRoseItem/ConjuredItemTest.php @@ -0,0 +1,52 @@ +ageByOneDay(); + + $this->assertEquals(18, $item->quality); + $this->assertEquals(19, $item->sellIn); + } + + public function testQualityCantBeNegative(): void + { + $item = new Item(ConjuredItem::NAME, 20, 0); + $gildedRoseItem = new ConjuredItem($item); + $gildedRoseItem->ageByOneDay(); + + $this->assertEquals(0, $item->quality); + } + + public function testQualityDegradesTwiceAsFastAsDefault(): void + { + $item = new Item(ConjuredItem::NAME, 20, 20); + $gildedRoseItem = new ConjuredItem($item); + $gildedRoseItem->ageByOneDay(); + + $this->assertEquals(18, $item->quality); + } + + public function testQualityDegradesTwiceAsFastAfterSellBy(): void + { + $item = new Item(ConjuredItem::NAME, 0, 20); + $gildedRoseItem = new ConjuredItem($item); + $gildedRoseItem->ageByOneDay(); + + $this->assertEquals(16, $item->quality); + } +} diff --git a/php/tests/phpunit/GildedRoseItemFactoryTest.php b/php/tests/phpunit/GildedRoseItemFactoryTest.php index 66237fdb..f854ca11 100644 --- a/php/tests/phpunit/GildedRoseItemFactoryTest.php +++ b/php/tests/phpunit/GildedRoseItemFactoryTest.php @@ -8,6 +8,7 @@ use ApprovalTests\Approvals; use GildedRose\GildedRoseItem; use GildedRose\GildedRoseItem\BrieItem; use GildedRose\GildedRoseItem\BackstagePassItem; +use GildedRose\GildedRoseItem\ConjuredItem; use GildedRose\GildedRoseItem\DefaultItem; use GildedRose\GildedRoseItem\SulfurasItem; use GildedRose\GildedRoseItemFactory; @@ -58,4 +59,13 @@ class GildedRoseItemFactoryTest extends TestCase $this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem); $this->assertInstanceOf(SulfurasItem::class, $gildedRoseItem); } + + public function testCreatingConjuredItem(): void + { + $item = new Item('Conjured Mana Cake', 0, 0); + $gildedRoseItem = $this->factory->createGildedRoseItem($item); + + $this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem); + $this->assertInstanceOf(ConjuredItem::class, $gildedRoseItem); + } }