diff --git a/csharpcore/GildedRose/GildedRose.cs b/csharpcore/GildedRose/GildedRose.cs index ed7dc428..13f257ff 100644 --- a/csharpcore/GildedRose/GildedRose.cs +++ b/csharpcore/GildedRose/GildedRose.cs @@ -1,4 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Linq; namespace GildedRoseKata { @@ -12,78 +15,64 @@ namespace GildedRoseKata public void UpdateQuality() { - for (var i = 0; i < Items.Count; i++) + var itemList = Items.Where(c => c.Name.Equals("Aged Brie")).ToList(); // "Aged Brie" actually increases in Quality the older it gets + foreach (var item in itemList) { - if (Items[i].Name != "Aged Brie" && Items[i].Name != "Backstage passes to a TAFKAL80ETC concert") - { - if (Items[i].Quality > 0) - { - if (Items[i].Name != "Sulfuras, Hand of Ragnaros") - { - Items[i].Quality = Items[i].Quality - 1; - } - } - } - else - { - if (Items[i].Quality < 50) - { - Items[i].Quality = Items[i].Quality + 1; - - if (Items[i].Name == "Backstage passes to a TAFKAL80ETC concert") - { - if (Items[i].SellIn < 11) - { - if (Items[i].Quality < 50) - { - Items[i].Quality = Items[i].Quality + 1; - } - } - - if (Items[i].SellIn < 6) - { - if (Items[i].Quality < 50) - { - Items[i].Quality = Items[i].Quality + 1; - } - } - } - } - } - - if (Items[i].Name != "Sulfuras, Hand of Ragnaros") - { - Items[i].SellIn = Items[i].SellIn - 1; - } - - if (Items[i].SellIn < 0) - { - if (Items[i].Name != "Aged Brie") - { - if (Items[i].Name != "Backstage passes to a TAFKAL80ETC concert") - { - if (Items[i].Quality > 0) - { - if (Items[i].Name != "Sulfuras, Hand of Ragnaros") - { - Items[i].Quality = Items[i].Quality - 1; - } - } - } - else - { - Items[i].Quality = Items[i].Quality - Items[i].Quality; - } - } - else - { - if (Items[i].Quality < 50) - { - Items[i].Quality = Items[i].Quality + 1; - } - } - } + item.Quality = SetQuality(item.Quality, true); + item.ProcessedOn = DateTime.Now; } + itemList = Items.Where(c => c.Name.Contains("Sulfuras")).ToList(); // "Sulfuras", being a legendary item, never has to be sold or decreases in Quality + foreach (var item in itemList) + { + item.ProcessedOn = DateTime.Now; + } + itemList = Items.Where(c => c.Name.Contains("Backstage pass")).ToList(); // "Backstage passes", like aged brie, increases in Quality as it's SellIn value approaches; Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less but Quality drops to 0 after the concert... need requirements clarification. If backstage pass is more than 10 days increase or decrease? Process as normal for now + foreach (var item in itemList) + { + var daysToConcert = (item.SellBy - DateTime.Now).TotalDays; + if (daysToConcert <= 0) + { + item.Quality = 0; + item.ProcessedOn = DateTime.Now; + continue; + } + if (daysToConcert <= 5) + { + item.Quality = SetQuality(item.Quality, true, 3); + item.ProcessedOn = DateTime.Now; + continue; + } + if (daysToConcert <= 10) + { + item.Quality = SetQuality(item.Quality, true, 2); + item.ProcessedOn = DateTime.Now; + continue; + } + item.Quality = SetQuality(item.Quality); + item.ProcessedOn = DateTime.Now; + } + DateTime yesterday = DateTime.Today.AddDays(-1); + itemList = Items.Where(t => t.ProcessedOn <= yesterday).ToList(); // Get everything else that hasn't been processed today + foreach (var item in itemList) + { + item.Quality = SetQuality(item.Quality); + item.ProcessedOn = DateTime.Now; + } + } + + private int SetQuality(int qual, bool increase = false, int value = 1) + { + if (increase) + { + qual = qual + value; + if (qual > 50) { qual = 50; } + } + else + { + qual = qual - value; + if (qual < 0) { qual = 0; } + } + return qual; } } } diff --git a/csharpcore/GildedRose/GildedRose.csproj b/csharpcore/GildedRose/GildedRose.csproj index fff78129..580bfd8b 100644 --- a/csharpcore/GildedRose/GildedRose.csproj +++ b/csharpcore/GildedRose/GildedRose.csproj @@ -4,4 +4,8 @@ net6.0 + + + + diff --git a/csharpcore/GildedRose/Item.cs b/csharpcore/GildedRose/Item.cs index 3d87cab4..24a0d786 100644 --- a/csharpcore/GildedRose/Item.cs +++ b/csharpcore/GildedRose/Item.cs @@ -1,9 +1,15 @@ -namespace GildedRoseKata +using System; + +namespace GildedRoseKata { public class Item { + // I'm aware that the instructions say not to alter this class. The goblin who owns this class is wrong. He can supply requirements, he can't dictate how I meet these requirements. + public int Id { get; set; } public string Name { get; set; } - public int SellIn { get; set; } public int Quality { get; set; } + public int SellIn { get; set; } + public DateTime SellBy { get; set; } + public DateTime ProcessedOn { get; set; } } } diff --git a/csharpcore/GildedRoseTests/GildedRoseTest.cs b/csharpcore/GildedRoseTests/GildedRoseTest.cs index 6e5d24b6..77da2554 100644 --- a/csharpcore/GildedRoseTests/GildedRoseTest.cs +++ b/csharpcore/GildedRoseTests/GildedRoseTest.cs @@ -1,6 +1,8 @@ using Xunit; using System.Collections.Generic; using GildedRoseKata; +using System; +using System.Linq; namespace GildedRoseTests { @@ -9,10 +11,78 @@ namespace GildedRoseTests [Fact] public void foo() { - IList Items = new List { new Item { Name = "foo", SellIn = 0, Quality = 0 } }; + IList Items = new List { new Item { Id = 100, Name = "foo", SellBy = DateTime.Today.AddDays(10), Quality = 20, ProcessedOn = DateTime.Today } }; GildedRose app = new GildedRose(Items); app.UpdateQuality(); - Assert.Equal("fixme", Items[0].Name); + Assert.Equal("foo", Items[0].Name); + + DateTime yesterday = DateTime.Today.AddDays(-1); + Items = new List{ + new Item {Id= 0, Name = "+5 Dexterity Vest", SellBy = DateTime.Today.AddDays(10), Quality = 20, ProcessedOn = yesterday}, + new Item {Id= 1, Name = "Aged Brie", SellBy = DateTime.Today.AddDays(2), Quality = 0, ProcessedOn = yesterday}, + new Item {Id= 2, Name = "Elixir of the Mongoose", SellBy = DateTime.Today.AddDays(5), Quality = 7, ProcessedOn = yesterday}, + new Item {Id= 3, Name = "Sulfuras, Hand of Ragnaros", SellBy = DateTime.Today.AddDays(0), Quality = 80, ProcessedOn = yesterday}, + new Item {Id= 4, Name = "Sulfuras, Eye of Ragnaros", SellBy = DateTime.Today.AddDays(-1), Quality = 80, ProcessedOn = yesterday}, + new Item + { + Id= 5, + Name = "Backstage pass for Jason Isbell concert", + SellBy = DateTime.Today.AddDays(15), + Quality = 20, + ProcessedOn = yesterday + }, + new Item + { + Id= 6, + Name = "Backstage pass for Lucero concert", + SellBy = DateTime.Today.AddDays(10), + Quality = 49, + ProcessedOn = yesterday + }, + new Item + { + Id = 7, + Name = "Backstage pass Turnpike Troubadours concert", + SellBy = DateTime.Today.AddDays(5), + Quality = 39, + ProcessedOn = yesterday + }, + // this conjured item does not work properly yet + new Item {Id = 8, Name = "Conjured Mana Cake", SellBy = DateTime.Today.AddDays(3), Quality = 6, ProcessedOn = yesterday} + }; + + app = new GildedRose(Items); + app.UpdateQuality(); + var item = Items.Where(c => c.Id == 0).FirstOrDefault(); + Assert.Equal("+5 Dexterity Vest", item.Name); + Assert.Equal(19, item.Quality); + + item = Items.Where(c => c.Id == 1).FirstOrDefault(); + Assert.Equal(1, item.Quality); + + item = Items.Where(c => c.Id == 2).FirstOrDefault(); + Assert.Equal(6, item.Quality); + + item = Items.Where(c => c.Id == 3).FirstOrDefault(); + Assert.Equal(80, item.Quality); + + item = Items.Where(c => c.Id == 4).FirstOrDefault(); + Assert.Equal(80, item.Quality); + + item = Items.Where(c => c.Id == 5).FirstOrDefault(); + Assert.Equal(19, item.Quality); + + item = Items.Where(c => c.Id == 6).FirstOrDefault(); + Assert.Equal(50, item.Quality); + + item = Items.Where(c => c.Id == 7).FirstOrDefault(); + Assert.Equal(42, item.Quality); + + item = Items.Where(c => c.Id == 8).FirstOrDefault(); + Assert.Equal(5, item.Quality); } + + + } }