mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 06:21:29 +00:00
To prepare to move business logic out of god object antipattern, provide domain objects and factory pattern
This commit is contained in:
parent
46f45e2661
commit
9fdc9ab29f
10
php/src/GildedRoseItem.php
Normal file
10
php/src/GildedRoseItem.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace GildedRose;
|
||||
|
||||
interface GildedRoseItem
|
||||
{
|
||||
public function ageByOneDay(): void;
|
||||
}
|
||||
19
php/src/GildedRoseItem/BackstagePassItem.php
Normal file
19
php/src/GildedRoseItem/BackstagePassItem.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace GildedRose\GildedRoseItem;
|
||||
|
||||
use GildedRose\GildedRoseItem;
|
||||
use GildedRose\Item;
|
||||
|
||||
class BackstagePassItem implements GildedRoseItem
|
||||
{
|
||||
public const NAME = 'Backstage passes to a TAFKAL80ETC concert';
|
||||
|
||||
public function __construct(private Item $item) {}
|
||||
|
||||
public function ageByOneDay(): void
|
||||
{
|
||||
}
|
||||
}
|
||||
19
php/src/GildedRoseItem/BrieItem.php
Normal file
19
php/src/GildedRoseItem/BrieItem.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace GildedRose\GildedRoseItem;
|
||||
|
||||
use GildedRose\GildedRoseItem;
|
||||
use GildedRose\Item;
|
||||
|
||||
class BrieItem implements GildedRoseItem
|
||||
{
|
||||
public const NAME = 'Aged Brie';
|
||||
|
||||
public function __construct(private Item $item) {}
|
||||
|
||||
public function ageByOneDay(): void
|
||||
{
|
||||
}
|
||||
}
|
||||
17
php/src/GildedRoseItem/DefaultItem.php
Normal file
17
php/src/GildedRoseItem/DefaultItem.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace GildedRose\GildedRoseItem;
|
||||
|
||||
use GildedRose\GildedRoseItem;
|
||||
use GildedRose\Item;
|
||||
|
||||
class DefaultItem implements GildedRoseItem
|
||||
{
|
||||
public function __construct(private Item $item) {}
|
||||
|
||||
public function ageByOneDay(): void
|
||||
{
|
||||
}
|
||||
}
|
||||
19
php/src/GildedRoseItem/SulfurasItem.php
Normal file
19
php/src/GildedRoseItem/SulfurasItem.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace GildedRose\GildedRoseItem;
|
||||
|
||||
use GildedRose\GildedRoseItem;
|
||||
use GildedRose\Item;
|
||||
|
||||
class SulfurasItem implements GildedRoseItem
|
||||
{
|
||||
public const NAME = 'Sulfuras, Hand of Ragnaros';
|
||||
|
||||
public function __construct(private Item $item) {}
|
||||
|
||||
public function ageByOneDay(): void
|
||||
{
|
||||
}
|
||||
}
|
||||
27
php/src/GildedRoseItemFactory.php
Normal file
27
php/src/GildedRoseItemFactory.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace GildedRose;
|
||||
|
||||
use GildedRose\GildedRoseItem\BrieItem;
|
||||
use GildedRose\GildedRoseItem\BackstagePassItem;
|
||||
use GildedRose\GildedRoseItem\SulfurasItem;
|
||||
use GildedRose\GildedRoseItem\DefaultItem;
|
||||
|
||||
class GildedRoseItemFactory
|
||||
{
|
||||
public function createGildedRoseItem(Item $item): GildedRoseItem
|
||||
{
|
||||
switch ($item->name) {
|
||||
case BrieItem::NAME:
|
||||
return new BrieItem($item);
|
||||
case BackstagePassItem::NAME:
|
||||
return new BackstagePassItem($item);
|
||||
case SulfurasItem::NAME:
|
||||
return new SulfurasItem($item);
|
||||
default:
|
||||
return new DefaultItem($item);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpUnitTests;
|
||||
|
||||
use ApprovalTests\Approvals;
|
||||
use GildedRose\GildedRose;
|
||||
use GildedRose\Item;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ExamplelTest extends TestCase
|
||||
{
|
||||
public function testFoo(): void
|
||||
{
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
}
|
||||
61
php/tests/phpunit/GildedRoseItemFactoryTest.php
Normal file
61
php/tests/phpunit/GildedRoseItemFactoryTest.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpUnitTests;
|
||||
|
||||
use ApprovalTests\Approvals;
|
||||
use GildedRose\GildedRoseItem;
|
||||
use GildedRose\GildedRoseItem\BrieItem;
|
||||
use GildedRose\GildedRoseItem\BackstagePassItem;
|
||||
use GildedRose\GildedRoseItem\DefaultItem;
|
||||
use GildedRose\GildedRoseItem\SulfurasItem;
|
||||
use GildedRose\GildedRoseItemFactory;
|
||||
use GildedRose\Item;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class GildedRoseItemFactoryTest extends TestCase
|
||||
{
|
||||
private GildedRoseItemFactory $factory;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->factory = new GildedRoseItemFactory();
|
||||
}
|
||||
|
||||
public function testCreatingDefaultItem(): void
|
||||
{
|
||||
$item = new Item('foo', 0, 0);
|
||||
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
|
||||
|
||||
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
|
||||
$this->assertInstanceOf(DefaultItem::class, $gildedRoseItem);
|
||||
}
|
||||
|
||||
public function testCreatingBrieItem(): void
|
||||
{
|
||||
$item = new Item('Aged Brie', 0, 0);
|
||||
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
|
||||
|
||||
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
|
||||
$this->assertInstanceOf(BrieItem::class, $gildedRoseItem);
|
||||
}
|
||||
|
||||
public function testCreatingBackstagePassItem(): void
|
||||
{
|
||||
$item = new Item('Backstage passes to a TAFKAL80ETC concert', 0, 0);
|
||||
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
|
||||
|
||||
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
|
||||
$this->assertInstanceOf(BackstagePassItem::class, $gildedRoseItem);
|
||||
}
|
||||
|
||||
public function testCreatingSulfuraItem(): void
|
||||
{
|
||||
$item = new Item('Sulfuras, Hand of Ragnaros', 0, 0);
|
||||
$gildedRoseItem = $this->factory->createGildedRoseItem($item);
|
||||
|
||||
$this->assertInstanceOf(GildedRoseItem::class, $gildedRoseItem);
|
||||
$this->assertInstanceOf(SulfurasItem::class, $gildedRoseItem);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user