To allow new domain to replace god object antipattern, make business logic work in gilded rose item classes

This commit is contained in:
Sam Burns 2024-01-24 15:37:47 +00:00
parent 9fdc9ab29f
commit c1b9f465d3
7 changed files with 170 additions and 0 deletions

View File

@ -15,5 +15,22 @@ class BackstagePassItem implements GildedRoseItem
public function ageByOneDay(): void
{
$this->item->sellIn -= 1;
if ($this->item->quality < 50) {
$this->item->quality += 1;
if ($this->item->sellIn <= 10 && $this->item->quality < 50) {
$this->item->quality += 1;
}
if ($this->item->sellIn <= 5 && $this->item->quality < 50) {
$this->item->quality += 1;
}
}
if ($this->item->sellIn < 0) {
$this->item->quality = 0;
}
}
}

View File

@ -15,5 +15,10 @@ class BrieItem implements GildedRoseItem
public function ageByOneDay(): void
{
$this->item->sellIn -= 1;
if ($this->item->quality < 50) {
$this->item->quality += 1;
}
}
}

View File

@ -13,5 +13,10 @@ class DefaultItem implements GildedRoseItem
public function ageByOneDay(): void
{
$this->item->sellIn -= 1;
if ($this->item->quality >= 1) {
$this->item->quality -= 1;
}
}
}

View File

@ -0,0 +1,51 @@
<?php
declare(strict_types=1);
namespace PhpUnitTests\GildedRoseItem;
use ApprovalTests\Approvals;
use GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem\BackstagePassItem;
use GildedRose\GildedRoseItemFactory;
use GildedRose\Item;
use PHPUnit\Framework\TestCase;
class BackstagePassItemTest extends TestCase
{
public function testQualityIncreases(): void
{
$item = new Item(BackstagePassItem::NAME, 20, 20);
$gildedRoseItem = new BackstagePassItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(21, $item->quality);
}
public function testQualityIncreasesFasterUnder10Days(): void
{
$item = new Item(BackstagePassItem::NAME, 10, 20);
$gildedRoseItem = new BackstagePassItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(22, $item->quality);
}
public function testQualityIncreasesEvenFasterUnder5Days(): void
{
$item = new Item(BackstagePassItem::NAME, 5, 20);
$gildedRoseItem = new BackstagePassItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(23, $item->quality);
}
public function testQualityIsZeroAfterConcert(): void
{
$item = new Item(BackstagePassItem::NAME, 0, 20);
$gildedRoseItem = new BackstagePassItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(0, $item->quality);
}
}

View File

@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
namespace PhpUnitTests\GildedRoseItem;
use ApprovalTests\Approvals;
use GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem\BrieItem;
use GildedRose\GildedRoseItemFactory;
use GildedRose\Item;
use PHPUnit\Framework\TestCase;
class BrieItemTest extends TestCase
{
public function testQualityIncreases(): void
{
$item = new Item(BrieItem::NAME, 20, 20);
$gildedRoseItem = new BrieItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(21, $item->quality);
}
public function testQualityCantGoOver50(): void
{
$item = new Item(BrieItem::NAME, 20, 50);
$gildedRoseItem = new BrieItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(50, $item->quality);
}
}

View File

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace PhpUnitTests\GildedRoseItem;
use ApprovalTests\Approvals;
use GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem\DefaultItem;
use GildedRose\GildedRoseItemFactory;
use GildedRose\Item;
use PHPUnit\Framework\TestCase;
class DefaultItemTest extends TestCase
{
public function testNormalQualityReduction(): void
{
$item = new Item('foo', 20, 20);
$gildedRoseItem = new DefaultItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(19, $item->quality);
$this->assertEquals(19, $item->sellIn);
}
public function testQualityCantBeNegative(): void
{
$item = new Item('foo', 20, 0);
$gildedRoseItem = new DefaultItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(0, $item->quality);
}
}

View File

@ -0,0 +1,25 @@
<?php
declare(strict_types=1);
namespace PhpUnitTests\GildedRoseItem;
use ApprovalTests\Approvals;
use GildedRose\GildedRoseItem;
use GildedRose\GildedRoseItem\SulfurasItem;
use GildedRose\GildedRoseItemFactory;
use GildedRose\Item;
use PHPUnit\Framework\TestCase;
class SulfurasItemTest extends TestCase
{
public function testTimelessness(): void
{
$item = new Item(SulfurasItem::NAME, 20, 20);
$gildedRoseItem = new SulfurasItem($item);
$gildedRoseItem->ageByOneDay();
$this->assertEquals(20, $item->quality);
$this->assertEquals(20, $item->sellIn);
}
}