Skip to content

Instantly share code, notes, and snippets.

@foxreymann
Created December 11, 2012 20:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save foxreymann/7a5657991ea2480ef48c to your computer and use it in GitHub Desktop.
Save foxreymann/7a5657991ea2480ef48c to your computer and use it in GitHub Desktop.
Gilded Rose kata
<?php
require_once 'src/Item.php';
class GildedRose {
const DEFAULT_QUALITY_CHANGE = -1;
const DEGRADES_TWICE_AS_FAST = 2;
const DEFAULT_CHANGE_FOR_BACKSTAGE_PASS = 1;
const CHANGE_FOR_BACKSTAGE_PASS_WHEN_LESS_THAN_5_DAYS = 3;
const CHANGE_FOR_BACKSTAGE_PASS_WHEN_LESS_THAN_10_DAYS = 2;
const MAXIMUM_QUALITY_VALUE = 50;
const MINIMUM_QUALITY_VALUE = 0;
public static function updateQuality($items) {
foreach($items as $item) {
$qualityChange = self::getQualityChange($item);
$item->setQuality($item->getQuality() + $qualityChange);
if($item->getQuality() > self::MAXIMUM_QUALITY_VALUE) {
$item->setQuality(self::MAXIMUM_QUALITY_VALUE);
}
if($item->getQuality() < self::MINIMUM_QUALITY_VALUE) {
$item->setQuality(self::MINIMUM_QUALITY_VALUE);
}
$sellInChange = -1;
if($item->name == "Sulfuras, Hand of Ragnaros") {
$sellInChange = 0;
}
$item->setSellIn($item->getSellIn() + $sellInChange);
}
}
private static function getQualityChange($item) {
$change = self::DEFAULT_QUALITY_CHANGE;
$change = self::modifyQualityBasedOnItemType($item,$change);
$change = self::modifyQualityBasedOnSellIn($item,$change);
if($item->name == "Backstage passes to a TAFKAL80ETC concert") {
$change = self::countBackstagePassQuality($item);
}
return $change;
}
private static function modifyQualityBasedOnItemType($item,$change) {
switch ($item->getName()) {
case "Aged Brie":
return abs($change);
case "Sulfuras, Hand of Ragnaros":
return 0;
case "Conjured Mana Cake":
return $change * 2;
default:
return $change;
}
}
private static function modifyQualityBasedOnSellIn($item,$change) {
if($item->getSellIn() <= 0) {
return $change * self::DEGRADES_TWICE_AS_FAST;
}
return $change;
}
private static function countBackstagePassQuality($item) {
if($item->getSellIn() <= 0) {
return -$item->getQuality();
}
if($item->getSellIn() <= 5) {
return self::CHANGE_FOR_BACKSTAGE_PASS_WHEN_LESS_THAN_5_DAYS;
}
if($item->getSellIn() <= 10) {
return self::CHANGE_FOR_BACKSTAGE_PASS_WHEN_LESS_THAN_10_DAYS;
}
return self::DEFAULT_CHANGE_FOR_BACKSTAGE_PASS;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment