From 628f7b7e8991918c9f3f083a7e53c92f5dbdd2a8 Mon Sep 17 00:00:00 2001 From: ChangKhao Date: Tue, 26 Jul 2022 22:43:56 +0100 Subject: [PATCH 1/4] adding Conjured items to nextDay --- src/GildedRose.php | 13 ++++++- tests/Unit/GuildedRoseTest.php | 70 +++++++++++++++++++--------------- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/GildedRose.php b/src/GildedRose.php index 8849c40..7b64668 100644 --- a/src/GildedRose.php +++ b/src/GildedRose.php @@ -22,10 +22,15 @@ public function getItem($which = null) public function nextDay() { foreach ($this->items as $item) { + if ($item->name != 'Aged Brie' and $item->name != 'Backstage passes to a TAFKAL80ETC concert') { if ($item->quality > 0) { if ($item->name != 'Sulfuras, Hand of Ragnaros') { - $item->quality = $item->quality - 1; + if ($item->name == 'Conjured Mana Cake' and $item->quality > 1) { + $item->quality = $item->quality - 2; + } else { + $item->quality = $item->quality - 1; + } } } } else { @@ -53,7 +58,11 @@ public function nextDay() if ($item->name != 'Backstage passes to a TAFKAL80ETC concert') { if ($item->quality > 0) { if ($item->name != 'Sulfuras, Hand of Ragnaros') { - $item->quality = $item->quality - 1; + if ($item->name == 'Conjured Mana Cake' and $item->quality > 1) { + $item->quality = $item->quality - 2; + } else { + $item->quality = $item->quality - 1; + } } } } else { diff --git a/tests/Unit/GuildedRoseTest.php b/tests/Unit/GuildedRoseTest.php index 7543498..b0ceeda 100644 --- a/tests/Unit/GuildedRoseTest.php +++ b/tests/Unit/GuildedRoseTest.php @@ -167,36 +167,46 @@ public function itemProvider(): array /** * Conjured items */ - // 'conjured item before sell date' => [ - // 'item' => new Item('Conjured Mana Cake', 10, 10), - // 'expectedQuality' => 8, - // 'expectedSellIn' => 9, - // ], - // 'conjured item at zero quality' => [ - // 'item' => new Item('Conjured Mana Cake', 0, 10), - // 'expectedQuality' => 0, - // 'expectedSellIn' => 9, - // ], - // 'conjured item on sell date' => [ - // 'item' => new Item('Conjured Mana Cake', 10, 0), - // 'expectedQuality' => 6, - // 'expectedSellIn' => -1, - // ], - // 'conjured item on sell date at zero quality' => [ - // 'item' => new Item('Conjured Mana Cake', 0, 0), - // 'expectedQuality' => 0, - // 'expectedSellIn' => -1, - // ], - // 'conjured item after sell date' => [ - // 'item' => new Item('Conjured Mana Cake', 10, -10), - // 'expectedQuality' => 6, - // 'expectedSellIn' => -11, - // ], - // 'conjured item after sell date at zero quality' => [ - // 'item' => new Item('Conjured Mana Cake', 0, -10), - // 'expectedQuality' => 0, - // 'expectedSellIn' => -11, - // ], + 'conjured item at only one quality before sell date' => [ + 'item' => new Item('Conjured Mana Cake', 1, 10), + 'expectedQuality' => 0, + 'expectedSellIn' => 9, + ], + 'conjured item at only one quality after sell date' => [ + 'item' => new Item('Conjured Mana Cake', 1, -10), + 'expectedQuality' => 0, + 'expectedSellIn' => -11, + ], + 'conjured item before sell date' => [ + 'item' => new Item('Conjured Mana Cake', 10, 10), + 'expectedQuality' => 8, + 'expectedSellIn' => 9, + ], + 'conjured item at zero quality' => [ + 'item' => new Item('Conjured Mana Cake', 0, 10), + 'expectedQuality' => 0, + 'expectedSellIn' => 9, + ], + 'conjured item on sell date' => [ + 'item' => new Item('Conjured Mana Cake', 10, 0), + 'expectedQuality' => 6, + 'expectedSellIn' => -1, + ], + 'conjured item on sell date at zero quality' => [ + 'item' => new Item('Conjured Mana Cake', 0, 0), + 'expectedQuality' => 0, + 'expectedSellIn' => -1, + ], + 'conjured item after sell date' => [ + 'item' => new Item('Conjured Mana Cake', 10, -10), + 'expectedQuality' => 6, + 'expectedSellIn' => -11, + ], + 'conjured item after sell date at zero quality' => [ + 'item' => new Item('Conjured Mana Cake', 0, -10), + 'expectedQuality' => 0, + 'expectedSellIn' => -11, + ], ]; } } From 2f089ff2410404c1e3a7171c29c47077a57aa48d Mon Sep 17 00:00:00 2001 From: ChangKhao Date: Wed, 27 Jul 2022 00:15:43 +0100 Subject: [PATCH 2/4] refactored GildedRose class --- src/GildedRose.php | 101 +++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/src/GildedRose.php b/src/GildedRose.php index 7b64668..6ec80d5 100644 --- a/src/GildedRose.php +++ b/src/GildedRose.php @@ -22,57 +22,58 @@ public function getItem($which = null) public function nextDay() { foreach ($this->items as $item) { - - if ($item->name != 'Aged Brie' and $item->name != 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->quality > 0) { - if ($item->name != 'Sulfuras, Hand of Ragnaros') { - if ($item->name == 'Conjured Mana Cake' and $item->quality > 1) { - $item->quality = $item->quality - 2; - } else { - $item->quality = $item->quality - 1; - } - } - } - } else { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - if ($item->name == 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->sellIn < 11) { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - } - } - if ($item->sellIn < 6) { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - } - } - } - } + switch($item->name) { + case 'normal' : $this->normal($item); break; + case 'Aged Brie' : $this->agedBrie($item); break; + case 'Sulfuras, Hand of Ragnaros' : $this->sulfuras($item); break; + case 'Backstage passes to a TAFKAL80ETC concert' : $this->passes($item); break; + case 'Conjured Mana Cake' : $this->conjured($item); break; } - if ($item->name != 'Sulfuras, Hand of Ragnaros') { - $item->sellIn = $item->sellIn - 1; - } - if ($item->sellIn < 0) { - if ($item->name != 'Aged Brie') { - if ($item->name != 'Backstage passes to a TAFKAL80ETC concert') { - if ($item->quality > 0) { - if ($item->name != 'Sulfuras, Hand of Ragnaros') { - if ($item->name == 'Conjured Mana Cake' and $item->quality > 1) { - $item->quality = $item->quality - 2; - } else { - $item->quality = $item->quality - 1; - } - } - } - } else { - $item->quality = $item->quality - $item->quality; - } - } else { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - } - } + } + } + + public function normal($item) { + if ($item->quality > 0) { $item->quality -= 1; } + $item->sellIn -= 1; + if ($item->sellIn < 0) { + if ($item->quality > 0) { $item->quality -= 1; } + } + } + + public function agedBrie($item) { + if ($item->quality < 50) { $item->quality += 1; } + $item->sellIn -= 1; + if ($item->sellIn < 0) { + if ($item->quality < 50) { $item->quality += 1; } + } + } + + public function sulfuras($item) { + return true; + } + + public function passes($item) { + if ($item->quality < 50) { + $item->quality += 1; + if ($item->sellIn < 11) { $item->quality += 1; } + if ($item->sellIn < 6) { $item->quality += 1; } + } + $item->sellIn -= 1; + if($item->sellIn < 0) { + $item->quality = 0; + } + } + + public function conjured($item) { + switch(true){ + case ($item->quality > 1) : $item->quality -= 2; break; + case ($item->quality < 2) : $item->quality = 0; + } + $item->sellIn -= 1; + if ($item->sellIn < 0) { + switch(true){ + case ($item->quality > 1) : $item->quality -= 2; break; + case ($item->quality < 2) : $item->quality = 0; } } } From e1b8b9e4232e9057015dc03e25bd99b30b2e16f8 Mon Sep 17 00:00:00 2001 From: ChangKhao Date: Wed, 27 Jul 2022 16:12:16 +0100 Subject: [PATCH 3/4] refactored adding Item Types --- src/GildedRose.php | 36 +++++++++++++++++-- src/ItemTypes/AgedBrieItemTypes.php | 36 +++++++++++++++++++ src/ItemTypes/BackstagePassesItemTypes.php | 41 ++++++++++++++++++++++ src/ItemTypes/ConjuredItemTypes.php | 37 +++++++++++++++++++ src/ItemTypes/NormalItemTypes.php | 35 ++++++++++++++++++ src/ItemTypes/SulfurasItemTypes.php | 21 +++++++++++ 6 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 src/ItemTypes/AgedBrieItemTypes.php create mode 100644 src/ItemTypes/BackstagePassesItemTypes.php create mode 100644 src/ItemTypes/ConjuredItemTypes.php create mode 100644 src/ItemTypes/NormalItemTypes.php create mode 100644 src/ItemTypes/SulfurasItemTypes.php diff --git a/src/GildedRose.php b/src/GildedRose.php index 6ec80d5..869da4c 100644 --- a/src/GildedRose.php +++ b/src/GildedRose.php @@ -1,14 +1,28 @@ items = $items; + + if($itemTypes === NULL) { + $itemTypes = [ + new ItemTypes\AgedBrieItemTypes, + new ItemTypes\BackstagePassesItemTypes, + new ItemTypes\ConjuredItemTypes, + new ItemTypes\NormalItemTypes, + new ItemTypes\SulfurasItemTypes, + ]; + } + + $this->itemTypes = $itemTypes; } public function getItem($which = null) @@ -21,6 +35,22 @@ public function getItem($which = null) public function nextDay() { + foreach ($this->items as $item) { + $undeclared = true; + foreach ($this->itemTypes as $type) { + if ($type->itemType($item)) { + $type->nextDay($item); + $undeclared = false; + } + } + + if($undeclared) { + throw new \UnexpectedValueException( + sprintf('Item type for %s was not found', $item) + ); + } + } + /* foreach ($this->items as $item) { switch($item->name) { case 'normal' : $this->normal($item); break; @@ -30,8 +60,9 @@ public function nextDay() case 'Conjured Mana Cake' : $this->conjured($item); break; } } + */ } - +/* public function normal($item) { if ($item->quality > 0) { $item->quality -= 1; } $item->sellIn -= 1; @@ -77,4 +108,5 @@ public function conjured($item) { } } } + */ } diff --git a/src/ItemTypes/AgedBrieItemTypes.php b/src/ItemTypes/AgedBrieItemTypes.php new file mode 100644 index 0000000..da6913b --- /dev/null +++ b/src/ItemTypes/AgedBrieItemTypes.php @@ -0,0 +1,36 @@ +name == 'Aged Brie'); + } + + public function nextDay(Item $item) { + // Initial values + $quality = 1; + $sellIn = -1; + + $item->sellIn = $item->sellIn + $sellIn; + if($item->sellIn < 1) { $quality = 2; } + + // Check that qualty will not exceed 50 + if($item->quality + $quality > 50) { $quality = 50 - $item->quality; } + $item->quality = $item->quality + $quality; + } +} \ No newline at end of file diff --git a/src/ItemTypes/BackstagePassesItemTypes.php b/src/ItemTypes/BackstagePassesItemTypes.php new file mode 100644 index 0000000..3cfe983 --- /dev/null +++ b/src/ItemTypes/BackstagePassesItemTypes.php @@ -0,0 +1,41 @@ +name == 'Backstage passes to a TAFKAL80ETC concert'); + } + + public function nextDay(Item $item) { + // Initial values + $quality = 1; + $sellIn = -1; + + // If sell in gets closer to concert quality increases + // After concert, quality is 0 + if ($item->sellIn < 1) { $quality = 0 - $item->quality; + } elseif ($item->sellIn <= 5) { $quality = 3; + } elseif ($item->sellIn <= 10) { $quality = 2; } + + // Check quality does not exceed 50 + if($item->quality + $quality >= 50) { $quality = 50 - $item->quality; } + + $item->sellIn = $item->sellIn + $sellIn; + $item->quality = $item->quality + $quality; + } +} \ No newline at end of file diff --git a/src/ItemTypes/ConjuredItemTypes.php b/src/ItemTypes/ConjuredItemTypes.php new file mode 100644 index 0000000..d27283e --- /dev/null +++ b/src/ItemTypes/ConjuredItemTypes.php @@ -0,0 +1,37 @@ +name == 'Conjured Mana Cake'); + } + + public function nextDay(Item $item) { + // Initial values + $quality = -2; + $sellIn = -1; + + $item->sellIn = $item->sellIn + $sellIn; + if($item->sellIn < 1) { $quality = -4; } + + // Check quality does not drop below 0 + if($item->quality + $quality < 0) { $item->quality = abs($quality); } + $item->quality = $item->quality + $quality; + } +} \ No newline at end of file diff --git a/src/ItemTypes/NormalItemTypes.php b/src/ItemTypes/NormalItemTypes.php new file mode 100644 index 0000000..878724d --- /dev/null +++ b/src/ItemTypes/NormalItemTypes.php @@ -0,0 +1,35 @@ +name == 'normal'); + } + + public function nextDay(Item $item) { + // initial values + $quality = -1; + $sellIn = -1; + + $item->sellIn = $item->sellIn + $sellIn; + if($item->sellIn < 1) { $quality = -2; } + + // Check if quality will drop below 0 + if($item->quality + $quality < 0) { $item->quality = abs($quality); } + $item->quality = $item->quality + $quality; + } +} \ No newline at end of file diff --git a/src/ItemTypes/SulfurasItemTypes.php b/src/ItemTypes/SulfurasItemTypes.php new file mode 100644 index 0000000..ccd48b0 --- /dev/null +++ b/src/ItemTypes/SulfurasItemTypes.php @@ -0,0 +1,21 @@ +name == 'Sulfuras, Hand of Ragnaros'); + } + + public function nextDay(Item $item) { + // Nothing to see here! Although it something changes.. + return true; + } +} \ No newline at end of file From 5b4fbaa6f1e591c5af79e64a11d26bd556991807 Mon Sep 17 00:00:00 2001 From: ChangKhao Date: Wed, 27 Jul 2022 16:14:37 +0100 Subject: [PATCH 4/4] removed backup lines --- src/GildedRose.php | 58 ---------------------------------------------- 1 file changed, 58 deletions(-) diff --git a/src/GildedRose.php b/src/GildedRose.php index 869da4c..619f9ad 100644 --- a/src/GildedRose.php +++ b/src/GildedRose.php @@ -50,63 +50,5 @@ public function nextDay() ); } } - /* - foreach ($this->items as $item) { - switch($item->name) { - case 'normal' : $this->normal($item); break; - case 'Aged Brie' : $this->agedBrie($item); break; - case 'Sulfuras, Hand of Ragnaros' : $this->sulfuras($item); break; - case 'Backstage passes to a TAFKAL80ETC concert' : $this->passes($item); break; - case 'Conjured Mana Cake' : $this->conjured($item); break; - } - } - */ - } -/* - public function normal($item) { - if ($item->quality > 0) { $item->quality -= 1; } - $item->sellIn -= 1; - if ($item->sellIn < 0) { - if ($item->quality > 0) { $item->quality -= 1; } - } - } - - public function agedBrie($item) { - if ($item->quality < 50) { $item->quality += 1; } - $item->sellIn -= 1; - if ($item->sellIn < 0) { - if ($item->quality < 50) { $item->quality += 1; } - } - } - - public function sulfuras($item) { - return true; - } - - public function passes($item) { - if ($item->quality < 50) { - $item->quality += 1; - if ($item->sellIn < 11) { $item->quality += 1; } - if ($item->sellIn < 6) { $item->quality += 1; } - } - $item->sellIn -= 1; - if($item->sellIn < 0) { - $item->quality = 0; - } - } - - public function conjured($item) { - switch(true){ - case ($item->quality > 1) : $item->quality -= 2; break; - case ($item->quality < 2) : $item->quality = 0; - } - $item->sellIn -= 1; - if ($item->sellIn < 0) { - switch(true){ - case ($item->quality > 1) : $item->quality -= 2; break; - case ($item->quality < 2) : $item->quality = 0; - } - } } - */ }