To make the application work with Conjured items, add new feature

This commit is contained in:
Sam Burns 2024-01-24 16:26:46 +00:00
parent c07ed14265
commit b2bac6c2a9
7 changed files with 108 additions and 7 deletions

View File

@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem;
use GildedRose\Item;
class ConjuredItem implements GildedRoseItem
{
public const NAME = 'Conjured Mana Cake';
public function __construct(private Item $item) {}
public function ageByOneDay(): void
{
$this->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;
}
}

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}
}

View File

@ -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

View File

@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace PhpUnitTests\GildedRoseItem;
use ApprovalTests\Approvals;
use GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem\ConjuredItem;
use GildedRose\GildedRoseItemFactory;
use GildedRose\Item;
use PHPUnit\Framework\TestCase;
class ConjuredItemTest extends TestCase
{
public function testNormalQualityReduction(): void
{
$item = new Item(ConjuredItem::NAME, 20, 20);
$gildedRoseItem = new ConjuredItem($item);
$gildedRoseItem->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);
}
}

View File

@ -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);
}
}