Refactor Code and write Unit test

This commit is contained in:
Thang Tran 2023-03-01 22:12:50 +07:00
parent d9cbae7169
commit 34048ea304
10 changed files with 39 additions and 140 deletions

View File

@ -14,9 +14,6 @@ final class GildedRose
) {
}
/**
* @return void
*/
public function updateQuality(): void
{
foreach ($this->items as $item) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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