From c1b9f465d3cb97bc317d35bc3b9498d62523763b Mon Sep 17 00:00:00 2001 From: Sam Burns Date: Wed, 24 Jan 2024 15:37:47 +0000 Subject: [PATCH] To allow new domain to replace god object antipattern, make business logic work in gilded rose item classes --- php/src/GildedRoseItem/BackstagePassItem.php | 17 +++++++ php/src/GildedRoseItem/BrieItem.php | 5 ++ php/src/GildedRoseItem/DefaultItem.php | 5 ++ .../GildedRoseItem/BackstagePassItemTest.php | 51 +++++++++++++++++++ .../phpunit/GildedRoseItem/BrieItemTest.php | 33 ++++++++++++ .../GildedRoseItem/DefaultItemTest.php | 34 +++++++++++++ .../GildedRoseItem/SulfurasItemTest.php | 25 +++++++++ 7 files changed, 170 insertions(+) create mode 100644 php/tests/phpunit/GildedRoseItem/BackstagePassItemTest.php create mode 100644 php/tests/phpunit/GildedRoseItem/BrieItemTest.php create mode 100644 php/tests/phpunit/GildedRoseItem/DefaultItemTest.php create mode 100644 php/tests/phpunit/GildedRoseItem/SulfurasItemTest.php diff --git a/php/src/GildedRoseItem/BackstagePassItem.php b/php/src/GildedRoseItem/BackstagePassItem.php index 633860f3..c5ed82d2 100644 --- a/php/src/GildedRoseItem/BackstagePassItem.php +++ b/php/src/GildedRoseItem/BackstagePassItem.php @@ -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; + } } } diff --git a/php/src/GildedRoseItem/BrieItem.php b/php/src/GildedRoseItem/BrieItem.php index 9a114a5f..1797c65e 100644 --- a/php/src/GildedRoseItem/BrieItem.php +++ b/php/src/GildedRoseItem/BrieItem.php @@ -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; + } } } diff --git a/php/src/GildedRoseItem/DefaultItem.php b/php/src/GildedRoseItem/DefaultItem.php index 9647f4b1..8be584ed 100644 --- a/php/src/GildedRoseItem/DefaultItem.php +++ b/php/src/GildedRoseItem/DefaultItem.php @@ -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; + } } } diff --git a/php/tests/phpunit/GildedRoseItem/BackstagePassItemTest.php b/php/tests/phpunit/GildedRoseItem/BackstagePassItemTest.php new file mode 100644 index 00000000..d3c3f8ea --- /dev/null +++ b/php/tests/phpunit/GildedRoseItem/BackstagePassItemTest.php @@ -0,0 +1,51 @@ +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); + } +} diff --git a/php/tests/phpunit/GildedRoseItem/BrieItemTest.php b/php/tests/phpunit/GildedRoseItem/BrieItemTest.php new file mode 100644 index 00000000..ee19bdca --- /dev/null +++ b/php/tests/phpunit/GildedRoseItem/BrieItemTest.php @@ -0,0 +1,33 @@ +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); + } +} diff --git a/php/tests/phpunit/GildedRoseItem/DefaultItemTest.php b/php/tests/phpunit/GildedRoseItem/DefaultItemTest.php new file mode 100644 index 00000000..9b8661da --- /dev/null +++ b/php/tests/phpunit/GildedRoseItem/DefaultItemTest.php @@ -0,0 +1,34 @@ +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); + } +} diff --git a/php/tests/phpunit/GildedRoseItem/SulfurasItemTest.php b/php/tests/phpunit/GildedRoseItem/SulfurasItemTest.php new file mode 100644 index 00000000..835a9f34 --- /dev/null +++ b/php/tests/phpunit/GildedRoseItem/SulfurasItemTest.php @@ -0,0 +1,25 @@ +ageByOneDay(); + + $this->assertEquals(20, $item->quality); + $this->assertEquals(20, $item->sellIn); + } +}