Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 56 additions & 34 deletions spec/GildedRoseSpec.php
Original file line number Diff line number Diff line change
@@ -1,195 +1,217 @@
<?php

use App\Item;
use App\AgedBrie;
use App\BackstagePass;
use App\Sulfuras;
use App\ConjuredManaCake;
use App\NormalItem;
use App\GildedRose;

describe('Gilded Rose', function () {
describe('next day', function () {
context('normal Items', function () {
it('updates normal items before 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(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);
});
});
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);
});
});
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);
});
});
*/
});
});
29 changes: 29 additions & 0 deletions src/AgedBrie.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App;

class AgedBrie extends Item
{
public function __construct($quality, $sellIn)
{
parent::__construct('Aged Brie', $quality, $sellIn);
}

/**
* Update quality and sellIn values the item to the next day
*/
public function nextDay()
{
if ($this->quality < 50) {
$this->quality++;
}

$this->sellIn--;

if ($this->sellIn < 0) {
if ($this->quality < 50) {
$this->quality++;
}
}
}
}
38 changes: 38 additions & 0 deletions src/BackstagePass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace App;

class BackstagePass extends Item
{
public function __construct($quality, $sellIn)
{
parent::__construct('Backstage passes to a TAFKAL80ETC concert', $quality, $sellIn);
}

/**
* Update quality and sellIn values the item to the next day
*/
public function nextDay()
{
if ($this->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;
}
}
}
33 changes: 33 additions & 0 deletions src/ConjuredManaCake.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace App;

class ConjuredManaCake extends Item
{
public function __construct($quality, $sellIn)
{
parent::__construct('Conjured Mana Cake', $quality, $sellIn);
}

/**
* Update quality and sellIn values the item to the next day
*/
public function nextDay()
{
if ($this->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;
}
}
}
Loading