From 1255acfa93d2b18de6d6953b99c8fb0b603a2e1c Mon Sep 17 00:00:00 2001 From: Elliott Allmann Date: Tue, 21 Feb 2023 18:06:45 -0800 Subject: [PATCH] 100% code coverage through unit tests --- php/src/GildedRose.php | 5 + php/tests/GildedRoseTest.php | 398 ++++++++++++++++++++++++++++++++++- 2 files changed, 398 insertions(+), 5 deletions(-) diff --git a/php/src/GildedRose.php b/php/src/GildedRose.php index db81ee3b..54d554df 100644 --- a/php/src/GildedRose.php +++ b/php/src/GildedRose.php @@ -14,6 +14,11 @@ final class GildedRose ) { } + public function getItems(): array + { + return $this->items; + } + public function updateQuality(): void { foreach ($this->items as $item) { diff --git a/php/tests/GildedRoseTest.php b/php/tests/GildedRoseTest.php index 52e7ddc6..a501b005 100644 --- a/php/tests/GildedRoseTest.php +++ b/php/tests/GildedRoseTest.php @@ -10,11 +10,399 @@ use PHPUnit\Framework\TestCase; class GildedRoseTest extends TestCase { - public function testFoo(): void - { - $items = [new Item('foo', 0, 0)]; + + /* -- FUNCTION TEMPLATE COPY ME -- + public function testFoo(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + $items = []; + $gildedRose = new GildedRose($items); $gildedRose->updateQuality(); - $this->assertSame('fixme', $items[0]->name); - } + + } // END TestFoo() + */ + + public function testSellInValueDegradesOverTime(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'Foo'; + $quality = 10; + $sellIn = 10; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + $setItems = $gildedRose->getItems(); + + // Make sure the data is the same as we insert + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + + // Update the items + $gildedRose->updateQuality(); + $updatedItems = $gildedRose->getItems(); + + $this->assertSame(($sellIn - 1), $updatedItems[0]->sellIn); + + + } // END testSellInValueDegradesOverTime() + + public function testStdQualityValueDegradesOverTime(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'Foo'; + $quality = 10; + $sellIn = 10; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + $setItems = $gildedRose->getItems(); + + // Make sure the data is the same as we insert + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + + // Update the items + $gildedRose->updateQuality(); + $updatedItems = $gildedRose->getItems(); + + $this->assertSame(($quality - 1), $updatedItems[0]->quality); + } // END testStdQualityValueDegradesOverTime() + + public function testAgedBrieQualityIncreaseOverTime(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = "Aged Brie"; + $sellIn = 10; + $quality = 10; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + $setItems = $gildedRose->getItems(); + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + + $gildedRose->updateQuality(); + $updatedItems = $gildedRose->getItems(); + + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn - 1), $updatedItems[0]->sellIn); + $this->assertSame(($quality + 1), $updatedItems[0]->quality); + } // END testAgedBrieQualityIncreaseOverTime() + + public function testAgedBrieQualityIncreasePastSellInButUnderMax(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = "Aged Brie"; + $sellIn = 10; + $quality = 38; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + + $updatedItems = []; + $previousQuality = $quality; + + for($i = 0; $i < $sellIn; $i++) + { + $gildedRose->updateQuality(); + $updatedItems = $gildedRose->getItems(); + $this->assertSame(($previousQuality + 1), $updatedItems[0]->quality); + $previousQuality = $updatedItems[0]->quality; + } + + $this->assertSame(0, $updatedItems[0]->sellIn); + + // Past the sell-in date + for($i = 0; $i < 5; $i++) + { + $gildedRose->updateQuality(); + $updatedItems = $gildedRose->getItems(); + $this->assertLessThanOrEqual( $updatedItems[0]->quality, $previousQuality); + $this->assertLessThanOrEqual(50, $updatedItems[0]->quality); + $previousQuality = $updatedItems[0]->quality; + } + + + + } // END testAgedBrieQualityIncreaseOverTime() + + public function testItemQualityNeverOver50(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = "Aged Brie"; + $sellIn = 10; + $quality = 45; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + + for($i = 0; $i < $sellIn; $i++) + { + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertLessThanOrEqual(50, $updatedItems[0]->quality); + $gildedRose->updateQuality(); + } + + + } // END testItemQualityNeverOver50() + + public function testStdItemQualityNeverNegative(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'foo'; + $sellIn = 10; + $quality = 5; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + $gildedRose->updateQuality(); + + for($i = 0; $i < $sellIn; $i++) + { + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertGreaterThanOrEqual(0, $updatedItems[0]->quality); + $gildedRose->updateQuality(); + } + + } // END testStdItemQualityNeverNegative() + + public function testStdItemQualityDegradesTwiceAsFastPastSellIn(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'foo'; + $sellIn = 10; + $quality = 20; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + + $previousQuality = $quality; + + $updatedItems = []; + for($i = 0; $i < $sellIn; $i++) + { + $gildedRose->updateQuality(); + $updatedItems = $gildedRose->getItems(); + $this->assertSame(($previousQuality - 1), $updatedItems[0]->quality); + $previousQuality = $updatedItems[0]->quality; + } + + $this->assertSame(0, $updatedItems[0]->sellIn); + + for($i = 0; $i < 3; $i++) + { + $gildedRose->updateQuality(); + $updatedItems = $gildedRose->getItems(); + $this->assertSame(($previousQuality - 2), $updatedItems[0]->quality); + $previousQuality = $updatedItems[0]->quality; + } + + } // END testStdItemQualityDegradesTwiceAsFastPastSellIn() + + public function testSulfurasValuesNeverChange(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'Sulfuras, Hand of Ragnaros'; + $sellIn = 10; + $quality = 80; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + + $setItems = $gildedRose->getItems(); + + // Make sure the data is the same as we insert + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + + $gildedRose->updateQuality(); + + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame($sellIn, $updatedItems[0]->sellIn); + $this->assertSame($quality, $updatedItems[0]->quality); + + } // END testSulfurasValuesNeverChange() + + public function testBackstagePassQualityIncreaseStandard(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'Backstage passes to a TAFKAL80ETC concert'; + $sellIn = 15; + $quality = 10; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + + $setItems = $gildedRose->getItems(); + + // Make sure the data is the same as we insert + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + + $gildedRose->updateQuality(); + + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn -1), $updatedItems[0]->sellIn); + $this->assertSame(($quality + 1), $updatedItems[0]->quality); + } // END testBackstagePassQualityIncreaseStandard() + + public function testBackstagePassQualityIncreaseBy2Within10Days(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'Backstage passes to a TAFKAL80ETC concert'; + $sellIn = 11; + $quality = 10; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + + $setItems = $gildedRose->getItems(); + + // 11 days before + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + + $gildedRose->updateQuality(); + + //10 days before + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn -1), $updatedItems[0]->sellIn); + $this->assertSame(($quality + 1), $updatedItems[0]->quality); + + $gildedRose->updateQuality(); + + // 9 days before + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn -2), $updatedItems[0]->sellIn); + $this->assertSame(($quality + 3), $updatedItems[0]->quality); + } // END testBackstagePassQualityIncreaseBy2Within10Days() + + public function testBackstagePassQualityIncreaseBy3Within5Days(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'Backstage passes to a TAFKAL80ETC concert'; + $sellIn = 6; + $quality = 10; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + + $setItems = $gildedRose->getItems(); + + // 6 days before + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + $gildedRose->updateQuality(); + + //5 days before + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn -1), $updatedItems[0]->sellIn); + $this->assertSame(($quality + 2), $updatedItems[0]->quality); + + $gildedRose->updateQuality(); + + // 4 days before + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn -2), $updatedItems[0]->sellIn); + $this->assertSame(($quality + 5), $updatedItems[0]->quality); + } // END testBackstagePassQualityIncreaseBy3Within5Days() + + public function testBackstagePassQualityIs0AfterConcert(): void + { + echo ("Starting " . __FUNCTION__ . PHP_EOL); + + $name = 'Backstage passes to a TAFKAL80ETC concert'; + $sellIn = 1; + $quality = 10; + + $items = [ + new Item($name, $sellIn, $quality), + ]; + + $gildedRose = new GildedRose($items); + + $setItems = $gildedRose->getItems(); + + // 1 days before + $this->assertSame($name, $setItems[0]->name); + $this->assertSame($sellIn, $setItems[0]->sellIn); + $this->assertSame($quality, $setItems[0]->quality); + $gildedRose->updateQuality(); + + //0 days before + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn -1), $updatedItems[0]->sellIn); + $this->assertSame(($quality + 3), $updatedItems[0]->quality); + + $gildedRose->updateQuality(); + + // 1 days after + $updatedItems = $gildedRose->getItems(); + $this->assertSame($name, $updatedItems[0]->name); + $this->assertSame(($sellIn -2), $updatedItems[0]->sellIn); + $this->assertSame(0, $updatedItems[0]->quality); + } // END testBackstagePassQualityIs0AfterConcert() + }