tdd-katas/lib/gilded_rose.dart

89 lines
1.9 KiB
Dart

// WARNING: DO NOT modify the Item class - the goblin in the corner will insta-rage!
class Item {
String name;
int sellIn;
int quality;
Item(this.name, this.sellIn, this.quality);
@override
String toString() => '$name, $sellIn, $quality';
}
class GildedRose {
List<Item> items;
GildedRose(this.items);
void updateQuality() {
for (final item in items) {
if (item.name == 'Sulfuras, Hand of Ragnaros') {
_updateSulfuras(item);
} else if (item.name == 'Aged Brie') {
_updateAgedBrie(item);
} else if (item.name == 'Backstage passes to a TAFKAL80ETC concert') {
_updateBackstagePasses(item);
} else {
_updateNormalItem(item);
}
}
}
void _updateNormalItem(Item item) {
// Quality decreases by 1 each day
if (item.quality > 0) {
item.quality -= 1;
}
item.sellIn -= 1;
// After sell-by date, quality degrades twice as fast
if (item.sellIn < 0 && item.quality > 0) {
item.quality -= 1;
}
}
void _updateAgedBrie(Item item) {
// Quality increases as it ages
if (item.quality < 50) {
item.quality += 1;
}
item.sellIn -= 1;
// After sell-by date, quality increases twice as fast
if (item.sellIn < 0 && item.quality < 50) {
item.quality += 1;
}
}
void _updateBackstagePasses(Item item) {
// Quality increases as concert approaches
if (item.quality < 50) {
item.quality += 1;
// 10 days or less: +2 quality/day
if (item.sellIn < 11 && item.quality < 50) {
item.quality += 1;
}
// 5 days or less: +3 quality/day
if (item.sellIn < 6 && item.quality < 50) {
item.quality += 1;
}
}
item.sellIn -= 1;
// After concert, quality drops to 0
if (item.sellIn < 0) {
item.quality = 0;
}
}
void _updateSulfuras(Item item) {
// Legendary item never changes
// Quality always 80, sellIn never decreases
}
}