diff --git a/src/GildedRose.php b/src/GildedRose.php index 8849c40..619f9ad 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) @@ -22,48 +36,18 @@ 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; - } - } - } 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; - } - } - } + $undeclared = true; + foreach ($this->itemTypes as $type) { + if ($type->itemType($item)) { + $type->nextDay($item); + $undeclared = false; } } - 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') { - $item->quality = $item->quality - 1; - } - } - } else { - $item->quality = $item->quality - $item->quality; - } - } else { - if ($item->quality < 50) { - $item->quality = $item->quality + 1; - } - } + + if($undeclared) { + throw new \UnexpectedValueException( + sprintf('Item type for %s was not found', $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 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, + ], ]; } }