diff --git a/.gitignore b/.gitignore index 7a2f8368..d9959b56 100644 --- a/.gitignore +++ b/.gitignore @@ -230,3 +230,4 @@ $RECYCLE.BIN/ *.msi *.msm *.msp +/.vs diff --git a/GildedRose.sln b/GildedRose.sln index 52179edc..f6eaa499 100644 --- a/GildedRose.sln +++ b/GildedRose.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.35004.147 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GildedRose.Tests", "src\GildedRose.Tests\GildedRose.Tests.csproj", "{CD4715A2-532E-4C74-BC40-36EE64F61FCA}" EndProject diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index 82251934..b58931ab 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -41,8 +41,14 @@ + + + + + + diff --git a/src/GildedRose.Console/Inn.cs b/src/GildedRose.Console/Inn.cs new file mode 100644 index 00000000..1d83a88a --- /dev/null +++ b/src/GildedRose.Console/Inn.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace GildedRose.Console +{ + internal class Inn + { + public IReadOnlyList Items { get; } + + public Inn(IList items) + { + this.Items = ((List)items).AsReadOnly(); + } + + public void UpdateItem() + { + for (var i = 0; i < Items.Count; i++) + { + Items[i].Update(); + } + } + } +} diff --git a/src/GildedRose.Console/Items/AgedBrieItem.cs b/src/GildedRose.Console/Items/AgedBrieItem.cs new file mode 100644 index 00000000..a63c2d0d --- /dev/null +++ b/src/GildedRose.Console/Items/AgedBrieItem.cs @@ -0,0 +1,32 @@ +namespace GildedRose.Console +{ + public class AgedBrieItem : Item + { + public AgedBrieItem(int sellIn, int quality) : base() + { + this.Name = "Aged Brie"; + this.SellIn = sellIn; + this.Quality = quality; + } + + public override void Update() + { + this.UpdateQuality(); + + this.DecreaseSellIn(); + + if (this.SellIn < 0) + { + this.UpdateQuality(); + } + } + + protected override void UpdateQuality() + { + if (this.Quality < 50) + { + this.Quality++; + } + } + } +} diff --git a/src/GildedRose.Console/Items/BackstageItem.cs b/src/GildedRose.Console/Items/BackstageItem.cs new file mode 100644 index 00000000..c46f641d --- /dev/null +++ b/src/GildedRose.Console/Items/BackstageItem.cs @@ -0,0 +1,42 @@ +namespace GildedRose.Console +{ + public class BackstageItem : Item + { + public BackstageItem(int sellIn, int quality) : base() + { + this.Name = "Backstage passes to a TAFKAL80ETC concert"; + this.SellIn = sellIn; + this.Quality = quality; + } + + public override void Update() + { + this.UpdateQuality(); + + if (this.SellIn < 11) + { + this.UpdateQuality(); + } + + if (this.SellIn < 6) + { + this.UpdateQuality(); + } + + this.DecreaseSellIn(); + + if (this.SellIn < 0) + { + this.Quality = this.Quality - this.Quality; + } + } + + protected override void UpdateQuality() + { + if (this.Quality < 50) + { + this.Quality++; + } + } + } +} diff --git a/src/GildedRose.Console/Items/ConjuredItem.cs b/src/GildedRose.Console/Items/ConjuredItem.cs new file mode 100644 index 00000000..53d8522b --- /dev/null +++ b/src/GildedRose.Console/Items/ConjuredItem.cs @@ -0,0 +1,19 @@ +namespace GildedRose.Console +{ + public class ConjuredItem : Item + { + public ConjuredItem(int sellIn, int quality) : base() + { + this.Name = "Conjured Mana Cake"; + this.SellIn = sellIn; + this.Quality = quality; + } + + public override void Update() + { + this.UpdateQuality(); + this.UpdateQuality(); + this.DecreaseSellIn(); + } + } +} diff --git a/src/GildedRose.Console/Items/Item.cs b/src/GildedRose.Console/Items/Item.cs new file mode 100644 index 00000000..8d68767f --- /dev/null +++ b/src/GildedRose.Console/Items/Item.cs @@ -0,0 +1,36 @@ +namespace GildedRose.Console +{ + public class Item + { + public string Name { get; set; } + + public int SellIn { get; set; } + + public int Quality { get; set; } + + public virtual void Update() + { + this.UpdateQuality(); + + this.DecreaseSellIn(); + + if (this.SellIn < 0) + { + this.UpdateQuality(); + } + } + + protected virtual void UpdateQuality() + { + if (this.Quality > 0) + { + this.Quality = this.Quality - 1; + } + } + + protected void DecreaseSellIn() + { + this.SellIn = this.SellIn - 1; + } + } +} diff --git a/src/GildedRose.Console/Items/SulfurasItem.cs b/src/GildedRose.Console/Items/SulfurasItem.cs new file mode 100644 index 00000000..572b2809 --- /dev/null +++ b/src/GildedRose.Console/Items/SulfurasItem.cs @@ -0,0 +1,17 @@ +namespace GildedRose.Console +{ + public class SulfurasItem : Item + { + public SulfurasItem(int sellIn, int quality) : base() + { + this.Name = "Sulfuras, Hand of Ragnaros"; + this.SellIn = sellIn; + this.Quality = quality; + } + + public override void Update() + { + // Sulfuras never has to be sold or decreases in Quality + } + } +} diff --git a/src/GildedRose.Console/Program.cs b/src/GildedRose.Console/Program.cs index f39daa35..70d54c2e 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -2,9 +2,10 @@ namespace GildedRose.Console { - class Program + public class Program { - IList Items; + public IList Items; + static void Main(string[] args) { System.Console.WriteLine("OMGHAI!"); @@ -14,16 +15,11 @@ static void Main(string[] args) Items = new List { new Item {Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20}, - new Item {Name = "Aged Brie", SellIn = 2, Quality = 0}, + new AgedBrieItem(sellIn: 2, quality: 0), new Item {Name = "Elixir of the Mongoose", SellIn = 5, Quality = 7}, - new Item {Name = "Sulfuras, Hand of Ragnaros", SellIn = 0, Quality = 80}, - new Item - { - Name = "Backstage passes to a TAFKAL80ETC concert", - SellIn = 15, - Quality = 20 - }, - new Item {Name = "Conjured Mana Cake", SellIn = 3, Quality = 6} + new SulfurasItem(sellIn: 0, quality: 80), + new BackstageItem(sellIn: 15, quality: 20), + new ConjuredItem(sellIn: 3, quality: 6) } }; @@ -36,89 +32,8 @@ static void Main(string[] args) public void UpdateQuality() { - for (var i = 0; i < Items.Count; i++) - { - 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; - } - } - } - } + new Inn(this.Items).UpdateItem(); } } - - public class Item - { - public string Name { get; set; } - - public int SellIn { get; set; } - - public int Quality { get; set; } - } - } diff --git a/src/GildedRose.Tests/GildedRose.Tests.csproj b/src/GildedRose.Tests/GildedRose.Tests.csproj index f169d01a..9196dde2 100644 --- a/src/GildedRose.Tests/GildedRose.Tests.csproj +++ b/src/GildedRose.Tests/GildedRose.Tests.csproj @@ -66,6 +66,12 @@ + + + {F2E879A9-7F1C-4C34-AB0D-2662F9815046} + GildedRose.Console + + diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 70f9ba6f..f34d5b0a 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -1,3 +1,5 @@ +using GildedRose.Console; +using System.Collections.Generic; using Xunit; namespace GildedRose.Tests @@ -9,5 +11,132 @@ public void TestTheTruth() { Assert.True(true); } + + [Fact] + public void UpdateQualityShouldNotThrowException() + { + var app = new Program() + { + Items = new List() + }; + app.UpdateQuality(); + Assert.True(true); + } + + [Theory] + [InlineData(18, 20)] + public void TestItem_Conjured(int expectedQuality, int sellIn) + { + // Arrange + var app = new Program() + { + Items = new List + { + new ConjuredItem(sellIn, 20) + } + }; + + // Act + app.UpdateQuality(); + + // Assert + Assert.Equal(expectedQuality, app.Items[0].Quality); + Assert.Equal(sellIn - 1, app.Items[0].SellIn); + } + + [Theory] + [InlineData(21, 20)] + [InlineData(22, 10)] + [InlineData(23, 4)] + [InlineData(0, 0)] + public void TestItem_Backstage(int expectedQuality, int sellIn) + { + // Arrange + var app = new Program() + { + Items = new List + { + new BackstageItem(sellIn, 20) + } + }; + + // Act + app.UpdateQuality(); + + // Assert + Assert.Equal(expectedQuality, app.Items[0].Quality); + Assert.Equal(sellIn - 1, app.Items[0].SellIn); + } + + [Theory] + [InlineData(21, 4)] + [InlineData(22, 0)] + public void TestItem_AgedBrie(int expectedQuality, int sellIn) + { + // Arrange + var app = new Program() + { + Items = new List + { + new AgedBrieItem(sellIn, 20) + } + }; + + // Act + app.UpdateQuality(); + + // Assert + Assert.Equal(expectedQuality, app.Items[0].Quality); + Assert.Equal(sellIn - 1, app.Items[0].SellIn); + } + + [Theory] + [InlineData(20, 20)] + [InlineData(20, -1)] + public void TestItem_Sulfuras(int expectedQuality, int sellIn) + { + // Arrange + var app = new Program() + { + Items = new List + { + new SulfurasItem(sellIn, 20) + } + }; + + // Act + app.UpdateQuality(); + + // Assert + Assert.Equal(expectedQuality, app.Items[0].Quality); + Assert.Equal(sellIn, app.Items[0].SellIn); + } + + [Theory] + [InlineData(19, 20)] + [InlineData(18, 0)] + public void TestItem_NormalItem(int expectedQuality, int sellIn) + { + // Arrange + var app = new Program() + { + Items = new List + { + new Item + { + Name = "Normal Item", + SellIn = sellIn, + Quality = 20 + } + } + }; + + // Act + app.UpdateQuality(); + + // Assert + Assert.Equal(expectedQuality, app.Items[0].Quality); + Assert.Equal(sellIn - 1, app.Items[0].SellIn); + } } } \ No newline at end of file