mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-18 07:51:29 +00:00
update GuildedRose to use Linq
Use Linq instead of 8000 if statements. Update tests to use new model
This commit is contained in:
parent
9653512287
commit
250540168e
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,4 +4,8 @@
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="EntityFramework" Version="6.4.4" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<Item> Items = new List<Item> { new Item { Name = "foo", SellIn = 0, Quality = 0 } };
|
||||
IList<Item> Items = new List<Item> { 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<Item>{
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user