From bb97b98a4894f1184a952c1ddb5b89e7f10b8ae6 Mon Sep 17 00:00:00 2001 From: "daniel.moore" Date: Mon, 21 Mar 2022 16:46:27 +0000 Subject: [PATCH] Dan Moore elucidat coding test --- composer.lock | 7 +++- spec/GildedRoseSpec.php | 90 +++++++++++++++++++++++++--------------- src/AgedBrie.php | 29 +++++++++++++ src/BackstagePass.php | 38 +++++++++++++++++ src/ConjuredManaCake.php | 33 +++++++++++++++ src/GildedRose.php | 47 ++------------------- src/NormalItem.php | 32 ++++++++++++++ src/Sulfuras.php | 20 +++++++++ 8 files changed, 218 insertions(+), 78 deletions(-) create mode 100644 src/AgedBrie.php create mode 100644 src/BackstagePass.php create mode 100644 src/ConjuredManaCake.php create mode 100644 src/NormalItem.php create mode 100644 src/Sulfuras.php diff --git a/composer.lock b/composer.lock index bca9466..bd6c352 100644 --- a/composer.lock +++ b/composer.lock @@ -56,6 +56,10 @@ "testing", "unit test" ], + "support": { + "issues": "https://github.com/crysalead/kahlan/issues", + "source": "https://github.com/crysalead/kahlan/tree/1.3" + }, "abandoned": "kahlan/kahlan", "time": "2016-05-01T23:20:41+00:00" } @@ -66,5 +70,6 @@ "prefer-stable": false, "prefer-lowest": false, "platform": [], - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.0.0" } diff --git a/spec/GildedRoseSpec.php b/spec/GildedRoseSpec.php index 27078e8..a4136f8 100644 --- a/spec/GildedRoseSpec.php +++ b/spec/GildedRoseSpec.php @@ -1,31 +1,36 @@ nextDay(); expect($gr->getItem(0)->quality)->toBe(9); expect($gr->getItem(0)->sellIn)->toBe(4); }); it('updates normal items on the sell date', function () { - $gr = new GildedRose([new Item('normal', 10, 0)]); + $gr = new GildedRose([new NormalItem(10, 0)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(8); expect($gr->getItem(0)->sellIn)->toBe(-1); }); it('updates normal items after the sell date', function () { - $gr = new GildedRose([new Item('normal', 10, -5)]); + $gr = new GildedRose([new NormalItem(10, -5)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(8); expect($gr->getItem(0)->sellIn)->toBe(-6); }); it('updates normal items with a quality of 0', function () { - $gr = new GildedRose([new Item('normal', 0, 5)]); + $gr = new GildedRose([new NormalItem(0, 5)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(0); expect($gr->getItem(0)->sellIn)->toBe(4); @@ -33,43 +38,43 @@ }); context('Brie Items', function () { it('updates Brie items before the sell date', function () { - $gr = new GildedRose([new Item('Aged Brie', 10, 5)]); + $gr = new GildedRose([new AgedBrie(10, 5)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(11); expect($gr->getItem(0)->sellIn)->toBe(4); }); it('updates Brie items before the sell date with maximum quality', function () { - $gr = new GildedRose([new Item('Aged Brie', 50, 5)]); + $gr = new GildedRose([new AgedBrie(50, 5)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(50); expect($gr->getItem(0)->sellIn)->toBe(4); }); it('updates Brie items on the sell date', function () { - $gr = new GildedRose([new Item('Aged Brie', 10, 0)]); + $gr = new GildedRose([new AgedBrie(10, 0)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(12); expect($gr->getItem(0)->sellIn)->toBe(-1); }); it('updates Brie items on the sell date, near maximum quality', function () { - $gr = new GildedRose([new Item('Aged Brie', 49, 0)]); + $gr = new GildedRose([new AgedBrie(49, 0)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(50); expect($gr->getItem(0)->sellIn)->toBe(-1); }); it('updates Brie items on the sell date with maximum quality', function () { - $gr = new GildedRose([new Item('Aged Brie', 50, 0)]); + $gr = new GildedRose([new AgedBrie(50, 0)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(50); expect($gr->getItem(0)->sellIn)->toBe(-1); }); it('updates Brie items after the sell date', function () { - $gr = new GildedRose([new Item('Aged Brie', 10, -10)]); + $gr = new GildedRose([new AgedBrie(10, -10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(12); expect($gr->getItem(0)->sellIn)->toBe(-11); }); it('updates Brie items after the sell date with maximum quality', function () { - $gr = new GildedRose([new Item('Aged Brie', 50, -10)]); + $gr = new GildedRose([new AgedBrie(50, -10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(50); expect($gr->getItem(0)->sellIn)->toBe(-11); @@ -77,119 +82,136 @@ }); context('Sulfuras Items', function () { it('updates Sulfuras items before the sell date', function () { - $gr = new GildedRose([new Item('Sulfuras, Hand of Ragnaros', 10, 5)]); + $gr = new GildedRose([new Sulfuras(5)]); $gr->nextDay(); - expect($gr->getItem(0)->quality)->toBe(10); + expect($gr->getItem(0)->quality)->toBe(80); expect($gr->getItem(0)->sellIn)->toBe(5); }); it('updates Sulfuras items on the sell date', function () { - $gr = new GildedRose([new Item('Sulfuras, Hand of Ragnaros', 10, 5)]); + $gr = new GildedRose([new Sulfuras(5)]); $gr->nextDay(); - expect($gr->getItem(0)->quality)->toBe(10); + expect($gr->getItem(0)->quality)->toBe(80); expect($gr->getItem(0)->sellIn)->toBe(5); }); it('updates Sulfuras items after the sell date', function () { - $gr = new GildedRose([new Item('Sulfuras, Hand of Ragnaros', 10, -1)]); + $gr = new GildedRose([new Sulfuras(-1)]); $gr->nextDay(); - expect($gr->getItem(0)->quality)->toBe(10); + expect($gr->getItem(0)->quality)->toBe(80); expect($gr->getItem(0)->sellIn)->toBe(-1); }); }); context('Backstage Passes', function () { it('updates Backstage pass items long before the sell date', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 10, 11)]); + $gr = new GildedRose([new BackstagePass(10, 11)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(11); expect($gr->getItem(0)->sellIn)->toBe(10); }); it('updates Backstage pass items close to the sell date', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 10, 10)]); + $gr = new GildedRose([new BackstagePass(10, 10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(12); expect($gr->getItem(0)->sellIn)->toBe(9); }); it('updates Backstage pass items close to the sell data, at max quality', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 50, 10)]); + $gr = new GildedRose([new BackstagePass(50, 10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(50); expect($gr->getItem(0)->sellIn)->toBe(9); }); it('updates Backstage pass items very close to the sell date', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 10, 5)]); + $gr = new GildedRose([new BackstagePass(10, 5)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(13); // goes up by 3 expect($gr->getItem(0)->sellIn)->toBe(4); }); it('updates Backstage pass items very close to the sell date, at max quality', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 50, 5)]); + $gr = new GildedRose([new BackstagePass(50, 5)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(50); expect($gr->getItem(0)->sellIn)->toBe(4); }); it('updates Backstage pass items with one day left to sell', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 10, 1)]); + $gr = new GildedRose([new BackstagePass(10, 1)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(13); expect($gr->getItem(0)->sellIn)->toBe(0); }); it('updates Backstage pass items with one day left to sell, at max quality', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 50, 1)]); + $gr = new GildedRose([new BackstagePass(50, 1)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(50); expect($gr->getItem(0)->sellIn)->toBe(0); }); it('updates Backstage pass items on the sell date', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 10, 0)]); + $gr = new GildedRose([new BackstagePass(10, 0)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(0); expect($gr->getItem(0)->sellIn)->toBe(-1); }); it('updates Backstage pass items after the sell date', function () { - $gr = new GildedRose([new Item('Backstage passes to a TAFKAL80ETC concert', 10, -1)]); + $gr = new GildedRose([new BackstagePass(10, -1)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(0); expect($gr->getItem(0)->sellIn)->toBe(-2); }); }); - /* + context("Conjured Items", function () { it('updates Conjured items before the sell date', function () { - $gr = new GildedRose([new Item('Conjured Mana Cake', 10, 10)]); + $gr = new GildedRose([new ConjuredManaCake(10, 10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(8); expect($gr->getItem(0)->sellIn)->toBe(9); }); it('updates Conjured items at zero quality', function () { - $gr = new GildedRose([new Item('Conjured Mana Cake', 0, 10)]); + $gr = new GildedRose([new ConjuredManaCake(0, 10)]); + $gr->nextDay(); + expect($gr->getItem(0)->quality)->toBe(0); + expect($gr->getItem(0)->sellIn)->toBe(9); + }); + it('updates Conjured items at 1 quality', function () { + $gr = new GildedRose([new ConjuredManaCake(1, 10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(0); expect($gr->getItem(0)->sellIn)->toBe(9); }); it('updates Conjured items on the sell date', function () { - $gr = new GildedRose([new Item('Conjured Mana Cake', 10, 0)]); + $gr = new GildedRose([new ConjuredManaCake(10, 0)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(6); expect($gr->getItem(0)->sellIn)->toBe(-1); }); it('updates Conjured items on the sell date at 0 quality', function () { - $gr = new GildedRose([new Item('Conjured Mana Cake', 0, 0)]); + $gr = new GildedRose([new ConjuredManaCake(0, 0)]); + $gr->nextDay(); + expect($gr->getItem(0)->quality)->toBe(0); + expect($gr->getItem(0)->sellIn)->toBe(-1); + }); + it('updates Conjured items on the sell date at 1 quality', function () { + $gr = new GildedRose([new ConjuredManaCake(1, 0)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(0); expect($gr->getItem(0)->sellIn)->toBe(-1); }); it('updates Conjured items after the sell date', function () { - $gr = new GildedRose([new Item('Conjured Mana Cake', 10, -10)]); + $gr = new GildedRose([new ConjuredManaCake(10, -10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(6); expect($gr->getItem(0)->sellIn)->toBe(-11); }); it('updates Conjured items after the sell date at zero quality', function () { - $gr = new GildedRose([new Item('Conjured Mana Cake', 0, -10)]); + $gr = new GildedRose([new ConjuredManaCake(0, -10)]); + $gr->nextDay(); + expect($gr->getItem(0)->quality)->toBe(0); + expect($gr->getItem(0)->sellIn)->toBe(-11); + }); + it('updates Conjured items after the sell date at 1 quality', function () { + $gr = new GildedRose([new ConjuredManaCake(1, -10)]); $gr->nextDay(); expect($gr->getItem(0)->quality)->toBe(0); expect($gr->getItem(0)->sellIn)->toBe(-11); }); }); - */ }); }); diff --git a/src/AgedBrie.php b/src/AgedBrie.php new file mode 100644 index 0000000..9743df0 --- /dev/null +++ b/src/AgedBrie.php @@ -0,0 +1,29 @@ +quality < 50) { + $this->quality++; + } + + $this->sellIn--; + + if ($this->sellIn < 0) { + if ($this->quality < 50) { + $this->quality++; + } + } + } +} diff --git a/src/BackstagePass.php b/src/BackstagePass.php new file mode 100644 index 0000000..e5c71a5 --- /dev/null +++ b/src/BackstagePass.php @@ -0,0 +1,38 @@ +quality < 50) { + $this->quality = $this->quality + 1; + + if ($this->sellIn < 11) { + if ($this->quality < 50) { + $this->quality = $this->quality + 1; + } + } + if ($this->sellIn < 6) { + if ($this->quality < 50) { + $this->quality = $this->quality + 1; + } + } + } + + $this->sellIn = $this->sellIn - 1; + + if ($this->sellIn < 0) { + $this->quality = $this->quality - $this->quality; + } + } +} diff --git a/src/ConjuredManaCake.php b/src/ConjuredManaCake.php new file mode 100644 index 0000000..2813e73 --- /dev/null +++ b/src/ConjuredManaCake.php @@ -0,0 +1,33 @@ +quality > 0) { + $this->quality -= 2; + } + + $this->sellIn--; + + if ($this->sellIn < 0) { + if ($this->quality > 0) { + $this->quality -= 2; + } + } + + if ($this->quality < 0) { + $this->quality = 0; + } + } +} diff --git a/src/GildedRose.php b/src/GildedRose.php index 8849c40..50062af 100644 --- a/src/GildedRose.php +++ b/src/GildedRose.php @@ -19,52 +19,13 @@ public function getItem($which = null) ); } + /** + * Update each item's sellIn and quality values. + */ 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; - } - } - } - } - } - 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; - } - } - } + $item->nextDay(); } } } diff --git a/src/NormalItem.php b/src/NormalItem.php new file mode 100644 index 0000000..08fa119 --- /dev/null +++ b/src/NormalItem.php @@ -0,0 +1,32 @@ +quality > 0) { + $this->quality--; + } + + $this->sellIn--; + + if ($this->sellIn < 0) { + if ($this->quality > 0) { + $this->quality--; + } + } + } +} diff --git a/src/Sulfuras.php b/src/Sulfuras.php new file mode 100644 index 0000000..209675a --- /dev/null +++ b/src/Sulfuras.php @@ -0,0 +1,20 @@ +