Skip to content

Instantly share code, notes, and snippets.

@franreyes
Created November 27, 2023 18:41
Show Gist options
  • Save franreyes/ea49f4d4027982fe492e1b40cb613ff5 to your computer and use it in GitHub Desktop.
Save franreyes/ea49f4d4027982fe492e1b40cb613ff5 to your computer and use it in GitHub Desktop.
GildedRoseTest.php
<?php
namespace tests;
use Codesai\TDD\GildedRose\GildedRose;
use Codesai\TDD\GildedRose\Item;
use PHPUnit\Framework\TestCase;
class GildedRoseTest extends TestCase
{
const MIN_QUALITY = 0;
const MAX_QUALITY = 50;
/** @test */
public function regular_items_quality_decreases_every_day() {
$item = $this->createRegularItem(1, 3);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(2, $item->quality);
$this->assertEquals(0, $item->sell_in);
}
/** @test */
public function expired_regular_items_quality_decreases_twice_as_fast_once_sellIn_has_passed() {
$item = $this->createRegularItem(0, 3);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(1, $item->quality);
$this->assertEquals(-1, $item->sell_in);
}
/** @test */
public function regular_items_quality_never_decreases_below_the_minimum_quality() {
$item = $this->createRegularItem(5, self::MIN_QUALITY);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MIN_QUALITY, $item->quality);
$this->assertEquals(4, $item->sell_in);
}
/** @test */
public function expired_regular_items_quality_never_decreases_below_the_minimum_quality() {
$item = $this->createRegularItem(0, 1);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MIN_QUALITY, $item->quality);
$this->assertEquals(-1, $item->sell_in);
}
/** @test */
public function aged_brie_increases_quality_by_1() {
$item = $this->createAgeBrie(5, 8);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(9, $item->quality);
$this->assertEquals(4, $item->sell_in);
}
/** @test */
public function aged_brie_quality_never_increases_over_the_maximun_quality() {
$item = $this->createAgeBrie(5, self::MAX_QUALITY);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MAX_QUALITY, $item->quality);
$this->assertEquals(4, $item->sell_in);
}
/** @test */
public function expired_aged_brie_quality_never_increases_over_the_maximun_quality() {
$item = $this->createAgeBrie(0, self::MAX_QUALITY - 1);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MAX_QUALITY, $item->quality);
$this->assertEquals(-1, $item->sell_in);
}
/** @test */
public function expired_aged_brie_increases_quality_by_2() {
$item = $this->createAgeBrie(0, 8);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(10, $item->quality);
$this->assertEquals(-1, $item->sell_in);
}
/** @test */
public function sulfuras_never_changes() {
$item = $this->createSulfuras(1, 80);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(80, $item->quality);
$this->assertEquals(1, $item->sell_in);
}
/** @test */
public function expired_sulfuras_never_changes() {
$item = $this->createSulfuras(-1, 80);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(80, $item->quality);
$this->assertEquals(-1, $item->sell_in);
}
/** @test */
public function backstage_increase_quality_by_1_when_sellIn_is_greater_than_10() {
$item = $this->createBackstagePasses(11, 6);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(7, $item->quality);
$this->assertEquals(10, $item->sell_in);
}
/** @test */
public function backstage_increase_quality_by_2_when_sellIn_is_between_10_and_6() {
$item1 = $this->createBackstagePasses(10, 6);
$item2 = $this->createBackstagePasses(6, 20);
$gildedRose = new GildedRose([$item1, $item2]);
$gildedRose->updateQuality();
$this->assertEquals(8, $item1->quality);
$this->assertEquals(9, $item1->sell_in);
$this->assertEquals(22, $item2->quality);
$this->assertEquals(5, $item2->sell_in);
}
/** @test */
public function backstage_increase_quality_by_3_when_sellIn_is_between_5_and_1() {
$item1 = $this->createBackstagePasses(5, 6);
$item2 = $this->createBackstagePasses(1, 20);
$gildedRose = new GildedRose([$item1, $item2]);
$gildedRose->updateQuality();
$this->assertEquals(9, $item1->quality);
$this->assertEquals(4, $item1->sell_in);
$this->assertEquals(23, $item2->quality);
$this->assertEquals(0, $item2->sell_in);
}
/** @test */
public function backstage_quality_drops_to_0_after_the_concert() {
$item = $this->createBackstagePasses(0, 6);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MIN_QUALITY, $item->quality);
$this->assertEquals(-1, $item->sell_in);
}
/** @test */
public function backstage_quality_never_increases_over_the_maximun_quality_when_increasing_by_1() {
$item = $this->createBackstagePasses(11, self::MAX_QUALITY);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MAX_QUALITY, $item->quality);
$this->assertEquals(10, $item->sell_in);
}
/** @test */
public function backstage_quality_never_increases_over_the_maximun_quality_when_increasing_by_2() {
$item = $this->createBackstagePasses(8, self::MAX_QUALITY -1);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MAX_QUALITY, $item->quality);
$this->assertEquals(7, $item->sell_in);
}
/** @test */
public function backstage_quality_never_increases_over_the_maximun_quality_when_increasing_by_3() {
$item = $this->createBackstagePasses(4, self::MAX_QUALITY -2);
$gildedRose = new GildedRose([$item]);
$gildedRose->updateQuality();
$this->assertEquals(self::MAX_QUALITY, $item->quality);
$this->assertEquals(3, $item->sell_in);
}
private function createRegularItem($sell_in, $quality): Item
{
return new Item('foo', $sell_in, $quality);
}
private function createAgeBrie(int $sell_in, int $quality)
{
return new Item('Aged Brie', $sell_in, $quality);
}
private function createSulfuras(int $sell_in, int $quality)
{
return new Item('Sulfuras, Hand of Ragnaros', $sell_in, $quality);
}
private function createBackstagePasses(int $sell_in, int $quality)
{
return new Item('Backstage passes to a TAFKAL80ETC concert', $sell_in, $quality);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment