76 lines
2.4 KiB
C#
76 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using ApprovalUtilities.Utilities;
|
|
|
|
namespace csharpcore
|
|
{
|
|
public class GildedRose
|
|
{
|
|
private const int MaxItemQuality = 50;
|
|
|
|
private readonly IList<Item> _items;
|
|
|
|
public GildedRose(IList<Item> items) => _items = items;
|
|
|
|
public void UpdateQuality() => _items.ForEach(UpdateItemQuality);
|
|
|
|
private static void UpdateItemQuality(Item item)
|
|
{
|
|
switch (item.Name)
|
|
{
|
|
case "Sulfuras, Hand of Ragnaros":
|
|
return;
|
|
|
|
case "Aged Brie":
|
|
UpdateAgedBrie(item);
|
|
break;
|
|
|
|
case "Backstage passes to a TAFKAL80ETC concert":
|
|
UpdateBackstagePasses(item);
|
|
break;
|
|
|
|
case "Conjured Mana Cake":
|
|
UpdateConjuredCake(item);
|
|
break;
|
|
|
|
default:
|
|
// Decrease quality twice when sell date is passed
|
|
var qualityDecrement = item.SellIn > 0 ? 1 : 2;
|
|
item.Quality = Math.Max(item.Quality - qualityDecrement, 0);
|
|
break;
|
|
}
|
|
|
|
item.SellIn -= 1;
|
|
}
|
|
|
|
private static void UpdateConjuredCake(Item item)
|
|
{
|
|
// TODO
|
|
// Decrease quality twice when sell date is passed
|
|
var qualityDecrement = item.SellIn > 0 ? 1 : 2;
|
|
item.Quality = Math.Max(item.Quality - qualityDecrement, 0);
|
|
}
|
|
|
|
private static void UpdateBackstagePasses(Item item)
|
|
{
|
|
static int ComputeQualityIncrement(int daysRemaining)
|
|
{
|
|
// "Infinite" increment when sell date is passed
|
|
if (daysRemaining <= 0) return int.MinValue;
|
|
if (daysRemaining <= 5) return 3;
|
|
if (daysRemaining <= 10) return 2;
|
|
return 1;
|
|
}
|
|
|
|
item.Quality = Math.Clamp(item.Quality + ComputeQualityIncrement(item.SellIn), 0, MaxItemQuality);
|
|
}
|
|
|
|
private static void UpdateAgedBrie(Item item)
|
|
{
|
|
// Increase quality twice when sell date is passed
|
|
var qualityIncrement = item.SellIn > 0 ? 1 : 2;
|
|
item.Quality = Math.Clamp(item.Quality + qualityIncrement, 0, MaxItemQuality);
|
|
}
|
|
}
|
|
}
|