-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGildedRose.cs
More file actions
68 lines (57 loc) · 2.25 KB
/
Copy pathGildedRose.cs
File metadata and controls
68 lines (57 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.Linq;
using ApprovalUtilities.Utilities;
namespace csharpcore
{
public class GildedRose
{
const string AgedBrie = "Aged Brie";
const string BackstagePasses = "Backstage passes";
const string Conjured = "Conjured";
const string Sulfuras = "Sulfuras";
const int MaxQuality = 50;
readonly string[] _specialItems = { AgedBrie, BackstagePasses, Conjured, Sulfuras };
Dictionary<Func<Item, bool>, Action<Item>> _itemRules;
IList<Item> Items;
public GildedRose(IList<Item> items)
{
Items = items;
InitializeItemRules();
}
private void InitializeItemRules()
{
// Define item update rules
_itemRules = new Dictionary<Func<Item, bool>, Action<Item>>();
// Aged brie rule
_itemRules.Add(item => item.Name.Contains(AgedBrie),
item => item.Quality = Math.Min(MaxQuality, item.Quality + 1));
// Backstage passes rule
_itemRules.Add(item => item.Name.Contains(BackstagePasses),
item =>
{
var qualityChange = item.SellIn > 10 ? 1
: item.SellIn > 5 ? 2
: item.SellIn > 0 ? 3
: -item.Quality;
item.Quality = Math.Min(MaxQuality, item.Quality + qualityChange);
});
// Conjured items rule
_itemRules.Add(item => item.Name.Contains(Conjured),
item => item.Quality = Math.Max(0, item.Quality - (item.SellIn > 0 ? 2 : 4)));
// Non-special items rule
_itemRules.Add(item => !_specialItems.Any(si => item.Name.Contains(si)),
item => item.Quality = Math.Max(0, item.Quality - (item.SellIn > 0 ? 1 : 2)));
// Update sell in rule
_itemRules.Add(item => !item.Name.Contains(Sulfuras), item => item.SellIn--);
}
public void UpdateQuality()
{
foreach (var item in Items)
{
// Apply rules
_itemRules.Where(rule => rule.Key(item)).ForEach(rule => rule.Value(item));
}
}
}
}