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