mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 22:41:30 +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\BrieItem;
|
||||||
use GildedRose\GildedRoseItem\BackstagePassItem;
|
use GildedRose\GildedRoseItem\BackstagePassItem;
|
||||||
|
use GildedRose\GildedRoseItem\ConjuredItem;
|
||||||
use GildedRose\GildedRoseItem\SulfurasItem;
|
use GildedRose\GildedRoseItem\SulfurasItem;
|
||||||
use GildedRose\GildedRoseItem\DefaultItem;
|
use GildedRose\GildedRoseItem\DefaultItem;
|
||||||
|
|
||||||
@ -20,6 +21,8 @@ class GildedRoseItemFactory
|
|||||||
return new BackstagePassItem($item);
|
return new BackstagePassItem($item);
|
||||||
case SulfurasItem::NAME:
|
case SulfurasItem::NAME:
|
||||||
return new SulfurasItem($item);
|
return new SulfurasItem($item);
|
||||||
|
case ConjuredItem::NAME:
|
||||||
|
return new ConjuredItem($item);
|
||||||
default:
|
default:
|
||||||
return new DefaultItem($item);
|
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, 14, 21
|
||||||
Backstage passes to a TAFKAL80ETC concert, 9, 50
|
Backstage passes to a TAFKAL80ETC concert, 9, 50
|
||||||
Backstage passes to a TAFKAL80ETC concert, 4, 50
|
Backstage passes to a TAFKAL80ETC concert, 4, 50
|
||||||
Conjured Mana Cake, 2, 5
|
Conjured Mana Cake, 2, 4
|
||||||
|
|
||||||
-------- day 2 --------
|
-------- day 2 --------
|
||||||
name, sellIn, quality
|
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, 13, 22
|
||||||
Backstage passes to a TAFKAL80ETC concert, 8, 50
|
Backstage passes to a TAFKAL80ETC concert, 8, 50
|
||||||
Backstage passes to a TAFKAL80ETC concert, 3, 50
|
Backstage passes to a TAFKAL80ETC concert, 3, 50
|
||||||
Conjured Mana Cake, 1, 4
|
Conjured Mana Cake, 1, 2
|
||||||
|
|
||||||
-------- day 3 --------
|
-------- day 3 --------
|
||||||
name, sellIn, quality
|
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, 12, 23
|
||||||
Backstage passes to a TAFKAL80ETC concert, 7, 50
|
Backstage passes to a TAFKAL80ETC concert, 7, 50
|
||||||
Backstage passes to a TAFKAL80ETC concert, 2, 50
|
Backstage passes to a TAFKAL80ETC concert, 2, 50
|
||||||
Conjured Mana Cake, 0, 3
|
Conjured Mana Cake, 0, 0
|
||||||
|
|
||||||
-------- day 4 --------
|
-------- day 4 --------
|
||||||
name, sellIn, quality
|
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, 11, 24
|
||||||
Backstage passes to a TAFKAL80ETC concert, 6, 50
|
Backstage passes to a TAFKAL80ETC concert, 6, 50
|
||||||
Backstage passes to a TAFKAL80ETC concert, 1, 50
|
Backstage passes to a TAFKAL80ETC concert, 1, 50
|
||||||
Conjured Mana Cake, -1, 1
|
Conjured Mana Cake, -1, 0
|
||||||
|
|
||||||
-------- day 5 --------
|
-------- day 5 --------
|
||||||
name, sellIn, quality
|
name, sellIn, quality
|
||||||
|
|||||||
@ -84,4 +84,10 @@ class ServiceLevelContext implements Context
|
|||||||
{
|
{
|
||||||
$this->createItem('Sulfuras, Hand of Ragnaros', $initialSellIn, $initialQuality);
|
$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
|
As a shopkeeper
|
||||||
I want to see the quality of a conjured item decrease by 2 each day
|
I want to see the quality of a conjured item decrease by 2 each day
|
||||||
|
|
||||||
@wip
|
|
||||||
Scenario: Single quality update
|
Scenario: Single quality update
|
||||||
Given a conjured item with a sell-in of 20 and a quality of 20
|
Given a conjured item with a sell-in of 20 and a quality of 20
|
||||||
When I update the quality
|
When I update the quality
|
||||||
Then the item should have a quality of 18
|
Then the item should have a quality of 18
|
||||||
|
|
||||||
@wip
|
|
||||||
Scenario: Quality cannot be negative
|
Scenario: Quality cannot be negative
|
||||||
Given a conjured item with a sell-in of 20 and a quality of 0
|
Given a conjured item with a sell-in of 20 and a quality of 0
|
||||||
When I update the quality
|
When I update the quality
|
||||||
Then the item should have a quality of 0
|
Then the item should have a quality of 0
|
||||||
|
|
||||||
@wip
|
|
||||||
Scenario: Once the sell-by date has passed, quality degrades twice as fast
|
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
|
Given a conjured item with a sell-in of 0 and a quality of 20
|
||||||
When I update the quality
|
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;
|
||||||
use GildedRose\GildedRoseItem\BrieItem;
|
use GildedRose\GildedRoseItem\BrieItem;
|
||||||
use GildedRose\GildedRoseItem\BackstagePassItem;
|
use GildedRose\GildedRoseItem\BackstagePassItem;
|
||||||
|
use GildedRose\GildedRoseItem\ConjuredItem;
|
||||||
use GildedRose\GildedRoseItem\DefaultItem;
|
use GildedRose\GildedRoseItem\DefaultItem;
|
||||||
use GildedRose\GildedRoseItem\SulfurasItem;
|
use GildedRose\GildedRoseItem\SulfurasItem;
|
||||||
use GildedRose\GildedRoseItemFactory;
|
use GildedRose\GildedRoseItemFactory;
|
||||||
@ -58,4 +59,13 @@ class GildedRoseItemFactoryTest extends TestCase
|
|||||||
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
|
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
|
||||||
$this->assertInstanceOf(SulfurasItem::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