mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 22:41:30 +00:00
Refactor Code and write Unit test
This commit is contained in:
parent
d9cbae7169
commit
34048ea304
@ -14,9 +14,6 @@ final class GildedRose
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function updateQuality(): void
|
||||
{
|
||||
foreach ($this->items as $item) {
|
||||
|
||||
@ -4,27 +4,26 @@ declare(strict_types=1);
|
||||
|
||||
namespace GildedRose;
|
||||
|
||||
use GildedRose\Items\Interface\ItemInterface;
|
||||
use GildedRose\Items\AgedBrieItem;
|
||||
use GildedRose\Items\BackstagePassItem;
|
||||
use GildedRose\Items\ConjuredItem;
|
||||
use GildedRose\Items\Interface\ItemInterface;
|
||||
use GildedRose\Items\NormalItem;
|
||||
use GildedRose\Items\SulfurasItem;
|
||||
|
||||
class ItemFactory
|
||||
{
|
||||
public const AGED_BRIE_ITEM = 'Aged Brie';
|
||||
|
||||
public const BACKSTAGE_ITEM = 'Backstage';
|
||||
|
||||
public const SULFURAS_ITEM = 'Sulfuras';
|
||||
|
||||
public const CONJURED_ITEM = 'Conjured';
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return ItemInterface
|
||||
*/
|
||||
public static function createItem(Item $item): ItemInterface
|
||||
{
|
||||
return match(true) {
|
||||
return match (true) {
|
||||
str_contains($item->name, self::AGED_BRIE_ITEM) => new AgedBrieItem(),
|
||||
str_contains($item->name, self::BACKSTAGE_ITEM) => new BackstagePassItem(),
|
||||
str_contains($item->name, self::SULFURAS_ITEM) => new SulfurasItem(),
|
||||
@ -32,5 +31,4 @@ class ItemFactory
|
||||
default => new NormalItem()
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -10,28 +10,17 @@ use GildedRose\Items\Interface\ItemInterface;
|
||||
abstract class AbstractItem implements ItemInterface
|
||||
{
|
||||
private const MIN_QUALITY = 0;
|
||||
|
||||
private const MAX_QUALITY = 50;
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
abstract public function updateQuality(Item $item): void;
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateSellIn(Item $item): void
|
||||
{
|
||||
$this->decreaseSellIn($item);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getQualityDecrease(Item $item): int
|
||||
@ -39,21 +28,13 @@ abstract class AbstractItem implements ItemInterface
|
||||
return $item->sellIn < 0 ? 2 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function decreaseSellIn(Item $item): void
|
||||
{
|
||||
$item->sellIn--;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
* @param integer $amount
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function decreaseQuality(Item $item, int $amount = 1): void
|
||||
{
|
||||
@ -61,10 +42,7 @@ abstract class AbstractItem implements ItemInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
* @param integer $amount
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function increaseQuality(Item $item, int $amount = 1): void
|
||||
{
|
||||
|
||||
@ -10,11 +10,6 @@ use GildedRose\Items\Interface\ItemInterface;
|
||||
|
||||
class AgedBrieItem extends AbstractItem implements ItemInterface
|
||||
{
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateQuality(Item $item): void
|
||||
{
|
||||
// "Aged Brie" actually increases in Quality the older it gets
|
||||
|
||||
@ -10,14 +10,9 @@ use GildedRose\Items\Interface\ItemInterface;
|
||||
|
||||
class BackstagePassItem extends AbstractItem implements ItemInterface
|
||||
{
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateQuality(Item $item): void
|
||||
{
|
||||
match(true) {
|
||||
match (true) {
|
||||
$item->sellIn <= 0 => $this->decreaseQuality($item, $item->quality),
|
||||
$item->sellIn <= 5 => $this->increaseQuality($item, 3),
|
||||
$item->sellIn <= 10 => $this->increaseQuality($item, 2),
|
||||
|
||||
@ -10,11 +10,6 @@ use GildedRose\Items\Interface\ItemInterface;
|
||||
|
||||
class ConjuredItem extends AbstractItem implements ItemInterface
|
||||
{
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateQuality(Item $item): void
|
||||
{
|
||||
// "Conjured" items degrade in Quality twice as fast as normal items
|
||||
|
||||
@ -8,17 +8,7 @@ use GildedRose\Item;
|
||||
|
||||
interface ItemInterface
|
||||
{
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateQuality(Item $item): void;
|
||||
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateSellIn(Item $item): void;
|
||||
}
|
||||
|
||||
@ -10,11 +10,6 @@ use GildedRose\Items\Interface\ItemInterface;
|
||||
|
||||
class NormalItem extends AbstractItem implements ItemInterface
|
||||
{
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateQuality(Item $item): void
|
||||
{
|
||||
$this->decreaseQuality($item, $this->getQualityDecrease($item));
|
||||
|
||||
@ -10,11 +10,6 @@ use GildedRose\Items\Interface\ItemInterface;
|
||||
|
||||
class SulfurasItem extends AbstractItem implements ItemInterface
|
||||
{
|
||||
/**
|
||||
* @param Item $item
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateQuality(Item $item): void
|
||||
{
|
||||
// Do nothing, Sulfuras never changes in quality
|
||||
|
||||
@ -10,31 +10,10 @@ use PHPUnit\Framework\TestCase;
|
||||
|
||||
class GildedRoseTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
private function getPayloadItems(): array
|
||||
{
|
||||
return [
|
||||
new Item('+5 Dexterity Vest', 10, 20),
|
||||
new Item('Aged Brie', 2, 0),
|
||||
new Item('Elixir of the Mongoose', 5, 7),
|
||||
new Item('Sulfuras, Hand of Ragnaros', 0, 80),
|
||||
new Item('Sulfuras, Hand of Ragnaros', -1, 80),
|
||||
new Item('Backstage passes to a TAFKAL80ETC concert', 15, 20),
|
||||
new Item('Backstage passes to a TAFKAL80ETC concert', 10, 49),
|
||||
new Item('Backstage passes to a TAFKAL80ETC concert', 5, 49),
|
||||
new Item('Conjured Mana Cake', 3, 6),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testQualityDegradesTwiceWhenSellInNegative(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Normal Item', 0, 12)
|
||||
new Item('Normal Item', 0, 12),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -42,13 +21,10 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(10, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testWithQualityNeverNagative(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Normal Item', 9, 0)
|
||||
new Item('Normal Item', 9, 0),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -56,13 +32,10 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(0, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testWithQualityNeverGreaterThan50(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Aged Brie', 9, 50)
|
||||
new Item('Aged Brie', 9, 50),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -70,13 +43,10 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(50, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testAgedBrieIncreaseQualityWhenOlder(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Aged Brie', 10, 10)
|
||||
new Item('Aged Brie', 10, 10),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -84,13 +54,10 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(11, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testAgedBrieIncraseQualityTwiceWhenSellInNagative(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Aged Brie', -1, 10)
|
||||
new Item('Aged Brie', -1, 10),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -98,13 +65,10 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(12, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testSulfurasNeverChangeQuality(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Sulfuras', -1, 10)
|
||||
new Item('Sulfuras', -1, 10),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -112,13 +76,10 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(10, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testBackstageIncreaseQualityBy2WhenSellInLessThanOrEqual10(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Backstage', 9, 10)
|
||||
new Item('Backstage', 9, 10),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -126,27 +87,21 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(12, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testBackstageIncreaseQualityBy3WhenSellInLessThanOrEqual5(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Backstage', 4, 10)
|
||||
new Item('Backstage', 4, 10),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
$this->assertEquals(3, $items[0]->sellIn);
|
||||
$this->assertEquals(13, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
|
||||
public function testBackstageSetQualityZeroWhenSellInLessThanOrEqualZero(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Backstage', 0, 10)
|
||||
new Item('Backstage', 0, 10),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -154,13 +109,10 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(0, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testConjuredDegradesQualityTwiceFastAsNormalItem(): void
|
||||
{
|
||||
$items = [
|
||||
new Item('Conjured', 10, 10)
|
||||
new Item('Conjured', 10, 10),
|
||||
];
|
||||
$GildedRose = new GildedRose($items);
|
||||
$GildedRose->updateQuality();
|
||||
@ -168,16 +120,13 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(8, $items[0]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testUpdateSellInAndQualityWith10Days(): void
|
||||
{
|
||||
$dayTest = 10;
|
||||
$items = $this->getPayloadItems();
|
||||
$GildedRose = new GildedRose($items);
|
||||
|
||||
for ($i = 1; $i < $dayTest ; $i++) {
|
||||
|
||||
for ($i = 1; $i < $dayTest; $i++) {
|
||||
$GildedRose->updateQuality();
|
||||
}
|
||||
|
||||
@ -202,16 +151,13 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(0, $items[8]->quality);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function testUpdateSellInAndQualityWith31Days(): void
|
||||
{
|
||||
$dayTest = 31;
|
||||
$items = $this->getPayloadItems();
|
||||
$GildedRose = new GildedRose($items);
|
||||
|
||||
for ($i = 1; $i < $dayTest ; $i++) {
|
||||
|
||||
for ($i = 1; $i < $dayTest; $i++) {
|
||||
$GildedRose->updateQuality();
|
||||
}
|
||||
|
||||
@ -235,4 +181,19 @@ class GildedRoseTest extends TestCase
|
||||
$this->assertEquals(0, $items[7]->quality);
|
||||
$this->assertEquals(0, $items[8]->quality);
|
||||
}
|
||||
|
||||
private function getPayloadItems(): array
|
||||
{
|
||||
return [
|
||||
new Item('+5 Dexterity Vest', 10, 20),
|
||||
new Item('Aged Brie', 2, 0),
|
||||
new Item('Elixir of the Mongoose', 5, 7),
|
||||
new Item('Sulfuras, Hand of Ragnaros', 0, 80),
|
||||
new Item('Sulfuras, Hand of Ragnaros', -1, 80),
|
||||
new Item('Backstage passes to a TAFKAL80ETC concert', 15, 20),
|
||||
new Item('Backstage passes to a TAFKAL80ETC concert', 10, 49),
|
||||
new Item('Backstage passes to a TAFKAL80ETC concert', 5, 49),
|
||||
new Item('Conjured Mana Cake', 3, 6),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user