100% code coverage through unit tests

This commit is contained in:
Elliott Allmann 2023-02-21 18:06:45 -08:00
parent 8249460e7e
commit 1255acfa93
2 changed files with 398 additions and 5 deletions

View File

@ -14,6 +14,11 @@ final class GildedRose
) {
}
public function getItems(): array
{
return $this->items;
}
public function updateQuality(): void
{
foreach ($this->items as $item) {

View File

@ -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()
}