mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-14 22:21:20 +00:00
To make the application work with Conjured items, add new feature
This commit is contained in:
parent
c07ed14265
commit
b2bac6c2a9
30
php/src/GildedRoseItem/ConjuredItem.php
Normal file
30
php/src/GildedRoseItem/ConjuredItem.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
52
php/tests/phpunit/GildedRoseItem/ConjuredItemTest.php
Normal file
52
php/tests/phpunit/GildedRoseItem/ConjuredItemTest.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user