From 9fe2d497d9da490dfa5a3c3eeadf66b40b464687 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 22:16:20 +0530 Subject: [PATCH 01/19] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7a2f8368..d9959b56 100644 --- a/.gitignore +++ b/.gitignore @@ -230,3 +230,4 @@ $RECYCLE.BIN/ *.msi *.msm *.msp +/.vs From 6d4866a018f8523d8e974727867399595cb67d23 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 22:17:01 +0530 Subject: [PATCH 02/19] extract item to file and write basic test --- src/GildedRose.Console/GildedRose.Console.csproj | 1 + src/GildedRose.Console/Item.cs | 12 ++++++++++++ src/GildedRose.Console/Program.cs | 15 +++------------ src/GildedRose.Tests/GildedRose.Tests.csproj | 6 ++++++ src/GildedRose.Tests/TestAssemblyTests.cs | 13 +++++++++++++ 5 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 src/GildedRose.Console/Item.cs diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index 82251934..d4ea5a1a 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -41,6 +41,7 @@ + diff --git a/src/GildedRose.Console/Item.cs b/src/GildedRose.Console/Item.cs new file mode 100644 index 00000000..5d859696 --- /dev/null +++ b/src/GildedRose.Console/Item.cs @@ -0,0 +1,12 @@ +namespace GildedRose.Console +{ + public class Item + { + public string Name { get; set; } + + public int SellIn { get; set; } + + public int Quality { get; set; } + } + +} diff --git a/src/GildedRose.Console/Program.cs b/src/GildedRose.Console/Program.cs index f39daa35..24f6a3a5 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!"); @@ -111,14 +112,4 @@ public void UpdateQuality() } } - - 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..2516a949 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,16 @@ public void TestTheTruth() { Assert.True(true); } + + [Fact] + public void UpdateQualityShouldNotThrowException() + { + var app = new Program() + { + Items = new List() + }; + app.UpdateQuality(); + Assert.True(true); + } } } \ No newline at end of file From 7c8b119346c4a9f906b40e34b1fa6b071122db81 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 22:54:43 +0530 Subject: [PATCH 03/19] add tests --- src/GildedRose.Tests/TestAssemblyTests.cs | 111 ++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 2516a949..7dbbcc5a 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -1,6 +1,7 @@ using GildedRose.Console; using System.Collections.Generic; using Xunit; +using Xunit.Sdk; namespace GildedRose.Tests { @@ -22,5 +23,115 @@ public void UpdateQualityShouldNotThrowException() app.UpdateQuality(); Assert.True(true); } + + [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 Item + { + Name = "Backstage passes to a TAFKAL80ETC concert", + SellIn = sellIn, + Quality = 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 Item + { + Name = "Aged Brie", + SellIn = sellIn, + Quality = 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 Item + { + Name = "Sulfuras, Hand of Ragnaros", + SellIn = sellIn, + Quality = 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 From a0980ff3c2e6e3b572968c64e2098698423c76a1 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 22:54:56 +0530 Subject: [PATCH 04/19] nit --- src/GildedRose.Tests/TestAssemblyTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 7dbbcc5a..080ea963 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -1,7 +1,6 @@ using GildedRose.Console; using System.Collections.Generic; using Xunit; -using Xunit.Sdk; namespace GildedRose.Tests { From ba651b11fad60bca4b590470f980a6283321d014 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 23:05:40 +0530 Subject: [PATCH 05/19] create class and move method Added a new Inn class in Inn.cs to encapsulate the logic for updating the quality and sell-in values of items. Updated GildedRose.Console.csproj to include Inn.cs. Modified Program.cs to use the new Inn class for updating item quality, replacing the previous call to app.UpdateQuality(). --- .../GildedRose.Console.csproj | 1 + src/GildedRose.Console/Inn.cs | 90 +++++++++++++++++++ src/GildedRose.Console/Program.cs | 73 +-------------- 3 files changed, 92 insertions(+), 72 deletions(-) create mode 100644 src/GildedRose.Console/Inn.cs diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index d4ea5a1a..e7c15ac9 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -41,6 +41,7 @@ + diff --git a/src/GildedRose.Console/Inn.cs b/src/GildedRose.Console/Inn.cs new file mode 100644 index 00000000..920072f2 --- /dev/null +++ b/src/GildedRose.Console/Inn.cs @@ -0,0 +1,90 @@ +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 UpdateItemQuality() + { + 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; + } + } + } + } + } + } +} diff --git a/src/GildedRose.Console/Program.cs b/src/GildedRose.Console/Program.cs index 24f6a3a5..35980100 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -37,78 +37,7 @@ 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).UpdateItemQuality(); } } From 6ee4a4fc5dd9476853116b3e8e14916d2fffa437 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 23:11:48 +0530 Subject: [PATCH 06/19] rename method --- src/GildedRose.Console/Inn.cs | 2 +- src/GildedRose.Console/Program.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/GildedRose.Console/Inn.cs b/src/GildedRose.Console/Inn.cs index 920072f2..ebacc900 100644 --- a/src/GildedRose.Console/Inn.cs +++ b/src/GildedRose.Console/Inn.cs @@ -11,7 +11,7 @@ public Inn(IList items) this.Items = ((List)items).AsReadOnly(); } - public void UpdateItemQuality() + public void UpdateItem() { for (var i = 0; i < Items.Count; i++) { diff --git a/src/GildedRose.Console/Program.cs b/src/GildedRose.Console/Program.cs index 35980100..72dc3a88 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -37,7 +37,7 @@ static void Main(string[] args) public void UpdateQuality() { - new Inn(this.Items).UpdateItemQuality(); + new Inn(this.Items).UpdateItem(); } } From 4038e8a9b693205ab5d9d776f433b881c80942b3 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 23:16:00 +0530 Subject: [PATCH 07/19] move method Refactored the `UpdateItem` method in the `Inn` class to delegate item update logic to a new `Update` extension method in the `ItemExtensions` class. Added `ItemExtensions.cs` to the project compilation in `GildedRose.Console.csproj`. --- .../GildedRose.Console.csproj | 1 + src/GildedRose.Console/Inn.cs | 70 +---------------- src/GildedRose.Console/ItemExtensions.cs | 78 +++++++++++++++++++ 3 files changed, 80 insertions(+), 69 deletions(-) create mode 100644 src/GildedRose.Console/ItemExtensions.cs diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index e7c15ac9..0260e0e4 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -43,6 +43,7 @@ + diff --git a/src/GildedRose.Console/Inn.cs b/src/GildedRose.Console/Inn.cs index ebacc900..1d83a88a 100644 --- a/src/GildedRose.Console/Inn.cs +++ b/src/GildedRose.Console/Inn.cs @@ -15,75 +15,7 @@ public void UpdateItem() { 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; - } - } - } + Items[i].Update(); } } } diff --git a/src/GildedRose.Console/ItemExtensions.cs b/src/GildedRose.Console/ItemExtensions.cs new file mode 100644 index 00000000..31c4201c --- /dev/null +++ b/src/GildedRose.Console/ItemExtensions.cs @@ -0,0 +1,78 @@ +namespace GildedRose.Console +{ + internal static class ItemExtensions + { + public static void Update(this Item item) + { + if (item.Name != "Aged Brie" && item.Name != "Backstage passes to a TAFKAL80ETC concert") + { + if (item.Quality > 0) + { + if (item.Name != "Sulfuras, Hand of Ragnaros") + { + item.Quality = item.Quality - 1; + } + } + } + else + { + if (item.Quality < 50) + { + item.Quality = item.Quality + 1; + + if (item.Name == "Backstage passes to a TAFKAL80ETC concert") + { + if (item.SellIn < 11) + { + if (item.Quality < 50) + { + item.Quality = item.Quality + 1; + } + } + + if (item.SellIn < 6) + { + if (item.Quality < 50) + { + item.Quality = item.Quality + 1; + } + } + } + } + } + + if (item.Name != "Sulfuras, Hand of Ragnaros") + { + item.SellIn = item.SellIn - 1; + } + + if (item.SellIn < 0) + { + if (item.Name != "Aged Brie") + { + if (item.Name != "Backstage passes to a TAFKAL80ETC concert") + { + if (item.Quality > 0) + { + if (item.Name != "Sulfuras, Hand of Ragnaros") + { + item.Quality = item.Quality - 1; + } + } + } + else + { + item.Quality = item.Quality - item.Quality; + } + } + else + { + if (item.Quality < 50) + { + item.Quality = item.Quality + 1; + } + } + } + } + } +} From de54e7109da7c5363b4569477fadb633a8441530 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 23:29:49 +0530 Subject: [PATCH 08/19] move method Removed ItemExtensions.cs and updated GildedRose.Console.csproj to exclude it from compilation. Moved the update logic into a new Update method within the Item class, handling specific rules for different item types directly. --- .../GildedRose.Console.csproj | 1 - src/GildedRose.Console/Item.cs | 74 +++++++++++++++++- src/GildedRose.Console/ItemExtensions.cs | 78 ------------------- 3 files changed, 73 insertions(+), 80 deletions(-) delete mode 100644 src/GildedRose.Console/ItemExtensions.cs diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index 0260e0e4..e7c15ac9 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -43,7 +43,6 @@ - diff --git a/src/GildedRose.Console/Item.cs b/src/GildedRose.Console/Item.cs index 5d859696..55858e45 100644 --- a/src/GildedRose.Console/Item.cs +++ b/src/GildedRose.Console/Item.cs @@ -7,6 +7,78 @@ public class Item public int SellIn { get; set; } public int Quality { get; set; } - } + public virtual void Update() + { + if (this.Name != "Aged Brie" && this.Name != "Backstage passes to a TAFKAL80ETC concert") + { + if (this.Quality > 0) + { + if (this.Name != "Sulfuras, Hand of Ragnaros") + { + this.Quality = this.Quality - 1; + } + } + } + else + { + if (this.Quality < 50) + { + this.Quality = this.Quality + 1; + + if (this.Name == "Backstage passes to a TAFKAL80ETC concert") + { + if (this.SellIn < 11) + { + if (this.Quality < 50) + { + this.Quality = this.Quality + 1; + } + } + + if (this.SellIn < 6) + { + if (this.Quality < 50) + { + this.Quality = this.Quality + 1; + } + } + } + } + } + + if (this.Name != "Sulfuras, Hand of Ragnaros") + { + this.SellIn = this.SellIn - 1; + } + + if (this.SellIn < 0) + { + if (this.Name != "Aged Brie") + { + if (this.Name != "Backstage passes to a TAFKAL80ETC concert") + { + if (this.Quality > 0) + { + if (this.Name != "Sulfuras, Hand of Ragnaros") + { + this.Quality = this.Quality - 1; + } + } + } + else + { + this.Quality = this.Quality - this.Quality; + } + } + else + { + if (this.Quality < 50) + { + this.Quality = this.Quality + 1; + } + } + } + } + } } diff --git a/src/GildedRose.Console/ItemExtensions.cs b/src/GildedRose.Console/ItemExtensions.cs deleted file mode 100644 index 31c4201c..00000000 --- a/src/GildedRose.Console/ItemExtensions.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace GildedRose.Console -{ - internal static class ItemExtensions - { - public static void Update(this Item item) - { - if (item.Name != "Aged Brie" && item.Name != "Backstage passes to a TAFKAL80ETC concert") - { - if (item.Quality > 0) - { - if (item.Name != "Sulfuras, Hand of Ragnaros") - { - item.Quality = item.Quality - 1; - } - } - } - else - { - if (item.Quality < 50) - { - item.Quality = item.Quality + 1; - - if (item.Name == "Backstage passes to a TAFKAL80ETC concert") - { - if (item.SellIn < 11) - { - if (item.Quality < 50) - { - item.Quality = item.Quality + 1; - } - } - - if (item.SellIn < 6) - { - if (item.Quality < 50) - { - item.Quality = item.Quality + 1; - } - } - } - } - } - - if (item.Name != "Sulfuras, Hand of Ragnaros") - { - item.SellIn = item.SellIn - 1; - } - - if (item.SellIn < 0) - { - if (item.Name != "Aged Brie") - { - if (item.Name != "Backstage passes to a TAFKAL80ETC concert") - { - if (item.Quality > 0) - { - if (item.Name != "Sulfuras, Hand of Ragnaros") - { - item.Quality = item.Quality - 1; - } - } - } - else - { - item.Quality = item.Quality - item.Quality; - } - } - else - { - if (item.Quality < 50) - { - item.Quality = item.Quality + 1; - } - } - } - } - } -} From 3d6bf3d9b96bcacc5a36c04d0da7ff33025297ef Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sat, 29 Jun 2024 23:36:15 +0530 Subject: [PATCH 09/19] extract subclass- Refactor Aged Brie handling into its own class Added a new `AgedBrie` class in `AgedBrie.cs` inheriting from `Item` with a custom `Update` method for "Aged Brie" items. Updated `GildedRose.Console.csproj` to include this new file. Removed special handling for "Aged Brie" from the `Item` class in `Item.cs`. Changed instantiation of "Aged Brie" items in `Program.cs` to use the new `AgedBrie` class. Updated `TestItem_AgedBrie` in `TestAssemblyTests.cs` to create an instance of the `AgedBrie` class. --- src/GildedRose.Console/AgedBrie.cs | 27 +++++++++++++++++++ .../GildedRose.Console.csproj | 1 + src/GildedRose.Console/Item.cs | 22 +++++---------- src/GildedRose.Console/Program.cs | 2 +- src/GildedRose.Tests/TestAssemblyTests.cs | 7 +---- 5 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 src/GildedRose.Console/AgedBrie.cs diff --git a/src/GildedRose.Console/AgedBrie.cs b/src/GildedRose.Console/AgedBrie.cs new file mode 100644 index 00000000..02bf7d94 --- /dev/null +++ b/src/GildedRose.Console/AgedBrie.cs @@ -0,0 +1,27 @@ +namespace GildedRose.Console +{ + public class AgedBrie : Item + { + public AgedBrie(int sellIn, int quality) : base() + { + this.Name = "Aged Brie"; + this.SellIn = sellIn; + this.Quality = quality; + } + + public override void Update() + { + if (this.Quality < 50) + { + this.Quality++; + } + + this.SellIn--; + + if (this.SellIn < 0 && this.Quality < 50) + { + this.Quality++; + } + } + } +} diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index e7c15ac9..84326797 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -41,6 +41,7 @@ + diff --git a/src/GildedRose.Console/Item.cs b/src/GildedRose.Console/Item.cs index 55858e45..a9a94eec 100644 --- a/src/GildedRose.Console/Item.cs +++ b/src/GildedRose.Console/Item.cs @@ -10,7 +10,7 @@ public class Item public virtual void Update() { - if (this.Name != "Aged Brie" && this.Name != "Backstage passes to a TAFKAL80ETC concert") + if (this.Name != "Backstage passes to a TAFKAL80ETC concert") { if (this.Quality > 0) { @@ -54,29 +54,19 @@ public virtual void Update() if (this.SellIn < 0) { - if (this.Name != "Aged Brie") + if (this.Name != "Backstage passes to a TAFKAL80ETC concert") { - if (this.Name != "Backstage passes to a TAFKAL80ETC concert") + if (this.Quality > 0) { - if (this.Quality > 0) + if (this.Name != "Sulfuras, Hand of Ragnaros") { - if (this.Name != "Sulfuras, Hand of Ragnaros") - { - this.Quality = this.Quality - 1; - } + this.Quality = this.Quality - 1; } } - else - { - this.Quality = this.Quality - this.Quality; - } } else { - if (this.Quality < 50) - { - this.Quality = this.Quality + 1; - } + this.Quality = this.Quality - this.Quality; } } } diff --git a/src/GildedRose.Console/Program.cs b/src/GildedRose.Console/Program.cs index 72dc3a88..ad709ec1 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -15,7 +15,7 @@ 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 AgedBrie(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 diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 080ea963..6212ba12 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -62,12 +62,7 @@ public void TestItem_AgedBrie(int expectedQuality, int sellIn) { Items = new List { - new Item - { - Name = "Aged Brie", - SellIn = sellIn, - Quality = 20 - } + new AgedBrie(sellIn, 20) } }; From 4623b87498d5b2c0d1077cce8fce7b6b6f0560b6 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:13:10 +0530 Subject: [PATCH 10/19] extract subclass - Refactor Backstage passes logic into BackstageItem class Refactored the `Item` class to remove specific logic for "Backstage passes to a TAFKAL80ETC concert" and introduced a new `BackstageItem` class to handle this behavior. Updated `GildedRose.Console.csproj` to include `BackstageItem.cs`. Modified `Program.cs` and `TestAssemblyTests.cs` to use the new `BackstageItem` class. This change adheres to the Open/Closed Principle by extending functionality without modifying the existing `Item` class. --- src/GildedRose.Console/BackstageItem.cs | 43 +++++++++++++++++ .../GildedRose.Console.csproj | 1 + src/GildedRose.Console/Item.cs | 48 +++---------------- src/GildedRose.Console/Program.cs | 7 +-- src/GildedRose.Tests/TestAssemblyTests.cs | 7 +-- 5 files changed, 52 insertions(+), 54 deletions(-) create mode 100644 src/GildedRose.Console/BackstageItem.cs diff --git a/src/GildedRose.Console/BackstageItem.cs b/src/GildedRose.Console/BackstageItem.cs new file mode 100644 index 00000000..4240de39 --- /dev/null +++ b/src/GildedRose.Console/BackstageItem.cs @@ -0,0 +1,43 @@ +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() + { + if (this.Quality < 50) + { + this.Quality = this.Quality + 1; + + if (this.SellIn < 11) + { + if (this.Quality < 50) + { + this.Quality = this.Quality + 1; + } + } + + if (this.SellIn < 6) + { + if (this.Quality < 50) + { + this.Quality = this.Quality + 1; + } + } + } + + this.SellIn = this.SellIn - 1; + + if (this.SellIn < 0) + { + this.Quality = this.Quality - this.Quality; + } + } + } +} diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index 84326797..172ebc29 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -42,6 +42,7 @@ + diff --git a/src/GildedRose.Console/Item.cs b/src/GildedRose.Console/Item.cs index a9a94eec..7acf079d 100644 --- a/src/GildedRose.Console/Item.cs +++ b/src/GildedRose.Console/Item.cs @@ -10,40 +10,11 @@ public class Item public virtual void Update() { - if (this.Name != "Backstage passes to a TAFKAL80ETC concert") + if (this.Quality > 0) { - if (this.Quality > 0) - { - if (this.Name != "Sulfuras, Hand of Ragnaros") - { - this.Quality = this.Quality - 1; - } - } - } - else - { - if (this.Quality < 50) + if (this.Name != "Sulfuras, Hand of Ragnaros") { - this.Quality = this.Quality + 1; - - if (this.Name == "Backstage passes to a TAFKAL80ETC concert") - { - if (this.SellIn < 11) - { - if (this.Quality < 50) - { - this.Quality = this.Quality + 1; - } - } - - if (this.SellIn < 6) - { - if (this.Quality < 50) - { - this.Quality = this.Quality + 1; - } - } - } + this.Quality = this.Quality - 1; } } @@ -54,20 +25,13 @@ public virtual void Update() if (this.SellIn < 0) { - if (this.Name != "Backstage passes to a TAFKAL80ETC concert") + if (this.Quality > 0) { - if (this.Quality > 0) + if (this.Name != "Sulfuras, Hand of Ragnaros") { - if (this.Name != "Sulfuras, Hand of Ragnaros") - { - this.Quality = this.Quality - 1; - } + this.Quality = this.Quality - 1; } } - else - { - this.Quality = this.Quality - this.Quality; - } } } } diff --git a/src/GildedRose.Console/Program.cs b/src/GildedRose.Console/Program.cs index ad709ec1..6af295e7 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -18,12 +18,7 @@ static void Main(string[] args) new AgedBrie(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 BackstageItem(sellIn: 15, quality: 20), new Item {Name = "Conjured Mana Cake", SellIn = 3, Quality = 6} } diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 6212ba12..55452abc 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -35,12 +35,7 @@ public void TestItem_Backstage(int expectedQuality, int sellIn) { Items = new List { - new Item - { - Name = "Backstage passes to a TAFKAL80ETC concert", - SellIn = sellIn, - Quality = 20 - } + new BackstageItem(sellIn, 20) } }; From 97f27f14eaf4c860a556f74914f71e7a27a31fdb Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:17:17 +0530 Subject: [PATCH 11/19] extract subclass - Refactor Item class and introduce Sulfuras class Refactored the `Item` class to remove special handling for "Sulfuras, Hand of Ragnaros". Introduced a new `Sulfuras` class that inherits from `Item` and overrides the `Update` method to do nothing, reflecting its unique behavior. Updated `Program.cs` to instantiate `Sulfuras` instead of `Item` for "Sulfuras, Hand of Ragnaros". Modified `TestAssemblyTests.cs` to use `Sulfuras` in the `TestItem_Sulfuras` test. --- src/GildedRose.Console/Item.cs | 30 ++++++++++++++--------- src/GildedRose.Console/Program.cs | 2 +- src/GildedRose.Tests/TestAssemblyTests.cs | 7 +----- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/GildedRose.Console/Item.cs b/src/GildedRose.Console/Item.cs index 7acf079d..d9c1ce8a 100644 --- a/src/GildedRose.Console/Item.cs +++ b/src/GildedRose.Console/Item.cs @@ -12,27 +12,33 @@ public virtual void Update() { if (this.Quality > 0) { - if (this.Name != "Sulfuras, Hand of Ragnaros") - { - this.Quality = this.Quality - 1; - } + this.Quality = this.Quality - 1; } - if (this.Name != "Sulfuras, Hand of Ragnaros") - { - this.SellIn = this.SellIn - 1; - } + this.SellIn = this.SellIn - 1; if (this.SellIn < 0) { if (this.Quality > 0) { - if (this.Name != "Sulfuras, Hand of Ragnaros") - { - this.Quality = this.Quality - 1; - } + this.Quality = this.Quality - 1; } } } } + + public class Sulfuras : Item + { + public Sulfuras(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 6af295e7..078e51a3 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -17,7 +17,7 @@ static void Main(string[] args) new Item {Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20}, new AgedBrie(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 Sulfuras(sellIn: 0, quality: 80), new BackstageItem(sellIn: 15, quality: 20), new Item {Name = "Conjured Mana Cake", SellIn = 3, Quality = 6} } diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 55452abc..433512e3 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -79,12 +79,7 @@ public void TestItem_Sulfuras(int expectedQuality, int sellIn) { Items = new List { - new Item - { - Name = "Sulfuras, Hand of Ragnaros", - SellIn = sellIn, - Quality = 20 - } + new Sulfuras(sellIn, 20) } }; From 5d37b596edb89ed7609ca6cc00c854abb286d906 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:17:53 +0530 Subject: [PATCH 12/19] Refactor: Move Sulfuras class to its own file The Sulfuras class, which represents the "Sulfuras, Hand of Ragnaros" item, has been moved from Item.cs to a new file named Sulfuras.cs. The GildedRose.Console.csproj file has been updated accordingly. The functionality of the Sulfuras class remains unchanged. --- .../GildedRose.Console.csproj | 1 + src/GildedRose.Console/Item.cs | 15 --------------- src/GildedRose.Console/Sulfuras.cs | 17 +++++++++++++++++ 3 files changed, 18 insertions(+), 15 deletions(-) create mode 100644 src/GildedRose.Console/Sulfuras.cs diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index 172ebc29..56f9cb4b 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -47,6 +47,7 @@ + diff --git a/src/GildedRose.Console/Item.cs b/src/GildedRose.Console/Item.cs index d9c1ce8a..7b18af05 100644 --- a/src/GildedRose.Console/Item.cs +++ b/src/GildedRose.Console/Item.cs @@ -26,19 +26,4 @@ public virtual void Update() } } } - - public class Sulfuras : Item - { - public Sulfuras(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/Sulfuras.cs b/src/GildedRose.Console/Sulfuras.cs new file mode 100644 index 00000000..19d91ca2 --- /dev/null +++ b/src/GildedRose.Console/Sulfuras.cs @@ -0,0 +1,17 @@ +namespace GildedRose.Console +{ + public class Sulfuras : Item + { + public Sulfuras(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 + } + } +} From 3dcd1a78b1df86a8d970c273dafdcc49d87207d5 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:19:37 +0530 Subject: [PATCH 13/19] Update VS version, move and reformat item files Updated `GildedRose.sln` to Visual Studio 17.10.35004.147. Moved `AgedBrie.cs`, `BackstageItem.cs`, `Item.cs`, and `Sulfuras.cs` to `Items` directory. Reformatted the moved files for consistency. Updated `GildedRose.Console.csproj` to reflect new file paths. --- GildedRose.sln | 4 ++-- src/GildedRose.Console/GildedRose.Console.csproj | 8 ++++---- src/GildedRose.Console/{ => Items}/AgedBrie.cs | 0 src/GildedRose.Console/{ => Items}/BackstageItem.cs | 0 src/GildedRose.Console/{ => Items}/Item.cs | 0 src/GildedRose.Console/{ => Items}/Sulfuras.cs | 0 6 files changed, 6 insertions(+), 6 deletions(-) rename src/GildedRose.Console/{ => Items}/AgedBrie.cs (100%) rename src/GildedRose.Console/{ => Items}/BackstageItem.cs (100%) rename src/GildedRose.Console/{ => Items}/Item.cs (100%) rename src/GildedRose.Console/{ => Items}/Sulfuras.cs (100%) 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 56f9cb4b..b1153e58 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -41,13 +41,13 @@ - - + + - + - + diff --git a/src/GildedRose.Console/AgedBrie.cs b/src/GildedRose.Console/Items/AgedBrie.cs similarity index 100% rename from src/GildedRose.Console/AgedBrie.cs rename to src/GildedRose.Console/Items/AgedBrie.cs diff --git a/src/GildedRose.Console/BackstageItem.cs b/src/GildedRose.Console/Items/BackstageItem.cs similarity index 100% rename from src/GildedRose.Console/BackstageItem.cs rename to src/GildedRose.Console/Items/BackstageItem.cs diff --git a/src/GildedRose.Console/Item.cs b/src/GildedRose.Console/Items/Item.cs similarity index 100% rename from src/GildedRose.Console/Item.cs rename to src/GildedRose.Console/Items/Item.cs diff --git a/src/GildedRose.Console/Sulfuras.cs b/src/GildedRose.Console/Items/Sulfuras.cs similarity index 100% rename from src/GildedRose.Console/Sulfuras.cs rename to src/GildedRose.Console/Items/Sulfuras.cs From 1ef4a97a1f71755a1e4c34daf64e5320fc68da2f Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:24:26 +0530 Subject: [PATCH 14/19] Refactor SellIn decrement logic in Update methods Introduced a new protected method `DecreaseSellIn()` in `Item.cs` to encapsulate the logic for decrementing the `SellIn` property by 1. Updated the `Update` methods in `AgedBrie`, `BackstageItem`, and `Item` classes to use this new method instead of directly manipulating the `SellIn` property. This refactoring enhances code readability and maintainability by centralizing the decrement logic. --- src/GildedRose.Console/Items/AgedBrie.cs | 2 +- src/GildedRose.Console/Items/BackstageItem.cs | 2 +- src/GildedRose.Console/Items/Item.cs | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/GildedRose.Console/Items/AgedBrie.cs b/src/GildedRose.Console/Items/AgedBrie.cs index 02bf7d94..1730fa91 100644 --- a/src/GildedRose.Console/Items/AgedBrie.cs +++ b/src/GildedRose.Console/Items/AgedBrie.cs @@ -16,7 +16,7 @@ public override void Update() this.Quality++; } - this.SellIn--; + this.DecreaseSellIn(); if (this.SellIn < 0 && this.Quality < 50) { diff --git a/src/GildedRose.Console/Items/BackstageItem.cs b/src/GildedRose.Console/Items/BackstageItem.cs index 4240de39..d394dd80 100644 --- a/src/GildedRose.Console/Items/BackstageItem.cs +++ b/src/GildedRose.Console/Items/BackstageItem.cs @@ -32,7 +32,7 @@ public override void Update() } } - this.SellIn = this.SellIn - 1; + this.DecreaseSellIn(); if (this.SellIn < 0) { diff --git a/src/GildedRose.Console/Items/Item.cs b/src/GildedRose.Console/Items/Item.cs index 7b18af05..5ff7ecd1 100644 --- a/src/GildedRose.Console/Items/Item.cs +++ b/src/GildedRose.Console/Items/Item.cs @@ -15,7 +15,7 @@ public virtual void Update() this.Quality = this.Quality - 1; } - this.SellIn = this.SellIn - 1; + this.DecreaseSellIn(); if (this.SellIn < 0) { @@ -25,5 +25,10 @@ public virtual void Update() } } } + + protected void DecreaseSellIn() + { + this.SellIn = this.SellIn - 1; + } } } From 51004912434ee6e14ba0f354a03afc054b37f31e Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:35:16 +0530 Subject: [PATCH 15/19] extract method - Refactor Update methods to use new UpdateQuality method Refactored the `Update` methods in `AgedBrie.cs`, `BackstageItem.cs`, and `Item.cs` to use a new `UpdateQuality` method. This method encapsulates the logic for updating the quality of items, ensuring that quality constraints (not exceeding 50 or dropping below 0) are maintained. This change promotes code reuse and simplifies the `Update` methods by delegating the quality update logic to a separate method. --- src/GildedRose.Console/Items/AgedBrie.cs | 15 ++++++--- src/GildedRose.Console/Items/BackstageItem.cs | 33 +++++++++---------- src/GildedRose.Console/Items/Item.cs | 18 +++++----- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/GildedRose.Console/Items/AgedBrie.cs b/src/GildedRose.Console/Items/AgedBrie.cs index 1730fa91..13509c8e 100644 --- a/src/GildedRose.Console/Items/AgedBrie.cs +++ b/src/GildedRose.Console/Items/AgedBrie.cs @@ -11,14 +11,19 @@ public AgedBrie(int sellIn, int quality) : base() public override void Update() { - if (this.Quality < 50) - { - this.Quality++; - } + this.UpdateQuality(); this.DecreaseSellIn(); - if (this.SellIn < 0 && this.Quality < 50) + 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 index d394dd80..c46f641d 100644 --- a/src/GildedRose.Console/Items/BackstageItem.cs +++ b/src/GildedRose.Console/Items/BackstageItem.cs @@ -11,25 +11,16 @@ public BackstageItem(int sellIn, int quality) : base() public override void Update() { - if (this.Quality < 50) - { - this.Quality = this.Quality + 1; + this.UpdateQuality(); - if (this.SellIn < 11) - { - if (this.Quality < 50) - { - this.Quality = this.Quality + 1; - } - } + if (this.SellIn < 11) + { + this.UpdateQuality(); + } - if (this.SellIn < 6) - { - if (this.Quality < 50) - { - this.Quality = this.Quality + 1; - } - } + if (this.SellIn < 6) + { + this.UpdateQuality(); } this.DecreaseSellIn(); @@ -39,5 +30,13 @@ public override void Update() this.Quality = this.Quality - this.Quality; } } + + protected override void UpdateQuality() + { + if (this.Quality < 50) + { + this.Quality++; + } + } } } diff --git a/src/GildedRose.Console/Items/Item.cs b/src/GildedRose.Console/Items/Item.cs index 5ff7ecd1..8d68767f 100644 --- a/src/GildedRose.Console/Items/Item.cs +++ b/src/GildedRose.Console/Items/Item.cs @@ -10,19 +10,21 @@ public class Item public virtual void Update() { - if (this.Quality > 0) - { - this.Quality = this.Quality - 1; - } + this.UpdateQuality(); this.DecreaseSellIn(); if (this.SellIn < 0) { - if (this.Quality > 0) - { - this.Quality = this.Quality - 1; - } + this.UpdateQuality(); + } + } + + protected virtual void UpdateQuality() + { + if (this.Quality > 0) + { + this.Quality = this.Quality - 1; } } From 246e14a815aeec0d2831cc5cbd189e31234e6d81 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:55:05 +0530 Subject: [PATCH 16/19] Refactor UpdateQuality methods to private and update logic The UpdateQuality methods in AgedBrie.cs, BackstageItem.cs, and Item.cs were changed from protected to private, restricting their access to within their respective classes. Additionally, the logic was updated: AgedBrie and BackstageItem now increment Quality by 1 if it is less than 50, while Item decrements Quality by 1 if it is greater than 0. --- src/GildedRose.Console/Items/AgedBrie.cs | 2 +- src/GildedRose.Console/Items/BackstageItem.cs | 2 +- src/GildedRose.Console/Items/Item.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/GildedRose.Console/Items/AgedBrie.cs b/src/GildedRose.Console/Items/AgedBrie.cs index 13509c8e..07f9a2b9 100644 --- a/src/GildedRose.Console/Items/AgedBrie.cs +++ b/src/GildedRose.Console/Items/AgedBrie.cs @@ -21,7 +21,7 @@ public override void Update() } } - protected override void UpdateQuality() + private void UpdateQuality() { if (this.Quality < 50) { diff --git a/src/GildedRose.Console/Items/BackstageItem.cs b/src/GildedRose.Console/Items/BackstageItem.cs index c46f641d..7fbb24ed 100644 --- a/src/GildedRose.Console/Items/BackstageItem.cs +++ b/src/GildedRose.Console/Items/BackstageItem.cs @@ -31,7 +31,7 @@ public override void Update() } } - protected override void UpdateQuality() + private void UpdateQuality() { if (this.Quality < 50) { diff --git a/src/GildedRose.Console/Items/Item.cs b/src/GildedRose.Console/Items/Item.cs index 8d68767f..179a87a3 100644 --- a/src/GildedRose.Console/Items/Item.cs +++ b/src/GildedRose.Console/Items/Item.cs @@ -20,7 +20,7 @@ public virtual void Update() } } - protected virtual void UpdateQuality() + private void UpdateQuality() { if (this.Quality > 0) { From 8bd56f30114c1d0a53f6307aff151653b09200de Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:57:15 +0530 Subject: [PATCH 17/19] Refactor class names for AgedBrie and Sulfuras items Updated project file `GildedRose.Console.csproj` to reflect renaming of `AgedBrie.cs` to `AgedBrieItem.cs` and `Sulfuras.cs` to `SulfurasItem.cs`. Renamed class `AgedBrie` to `AgedBrieItem` in `AgedBrieItem.cs` and updated the constructor accordingly. Renamed class `Sulfuras` to `SulfurasItem` in `SulfurasItem.cs` and updated the constructor accordingly. Updated `Program.cs` to use the new class names `AgedBrieItem` and `SulfurasItem`. Updated test methods in `TestAssemblyTests.cs` to use the new class names `AgedBrieItem` and `SulfurasItem`. --- src/GildedRose.Console/GildedRose.Console.csproj | 4 ++-- src/GildedRose.Console/Items/{AgedBrie.cs => AgedBrieItem.cs} | 4 ++-- src/GildedRose.Console/Items/{Sulfuras.cs => SulfurasItem.cs} | 4 ++-- src/GildedRose.Console/Program.cs | 4 ++-- src/GildedRose.Tests/TestAssemblyTests.cs | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/GildedRose.Console/Items/{AgedBrie.cs => AgedBrieItem.cs} (84%) rename src/GildedRose.Console/Items/{Sulfuras.cs => SulfurasItem.cs} (76%) diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index b1153e58..c7a48c91 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -41,13 +41,13 @@ - + - + diff --git a/src/GildedRose.Console/Items/AgedBrie.cs b/src/GildedRose.Console/Items/AgedBrieItem.cs similarity index 84% rename from src/GildedRose.Console/Items/AgedBrie.cs rename to src/GildedRose.Console/Items/AgedBrieItem.cs index 07f9a2b9..5d1f47f5 100644 --- a/src/GildedRose.Console/Items/AgedBrie.cs +++ b/src/GildedRose.Console/Items/AgedBrieItem.cs @@ -1,8 +1,8 @@ namespace GildedRose.Console { - public class AgedBrie : Item + public class AgedBrieItem : Item { - public AgedBrie(int sellIn, int quality) : base() + public AgedBrieItem(int sellIn, int quality) : base() { this.Name = "Aged Brie"; this.SellIn = sellIn; diff --git a/src/GildedRose.Console/Items/Sulfuras.cs b/src/GildedRose.Console/Items/SulfurasItem.cs similarity index 76% rename from src/GildedRose.Console/Items/Sulfuras.cs rename to src/GildedRose.Console/Items/SulfurasItem.cs index 19d91ca2..572b2809 100644 --- a/src/GildedRose.Console/Items/Sulfuras.cs +++ b/src/GildedRose.Console/Items/SulfurasItem.cs @@ -1,8 +1,8 @@ namespace GildedRose.Console { - public class Sulfuras : Item + public class SulfurasItem : Item { - public Sulfuras(int sellIn, int quality) : base() + public SulfurasItem(int sellIn, int quality) : base() { this.Name = "Sulfuras, Hand of Ragnaros"; this.SellIn = sellIn; diff --git a/src/GildedRose.Console/Program.cs b/src/GildedRose.Console/Program.cs index 078e51a3..d3c46760 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -15,9 +15,9 @@ static void Main(string[] args) Items = new List { new Item {Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20}, - new AgedBrie(sellIn: 2, quality: 0), + new AgedBrieItem(sellIn: 2, quality: 0), new Item {Name = "Elixir of the Mongoose", SellIn = 5, Quality = 7}, - new Sulfuras(sellIn: 0, quality: 80), + new SulfurasItem(sellIn: 0, quality: 80), new BackstageItem(sellIn: 15, quality: 20), new Item {Name = "Conjured Mana Cake", SellIn = 3, Quality = 6} } diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 433512e3..82d7bdf5 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -57,7 +57,7 @@ public void TestItem_AgedBrie(int expectedQuality, int sellIn) { Items = new List { - new AgedBrie(sellIn, 20) + new AgedBrieItem(sellIn, 20) } }; @@ -79,7 +79,7 @@ public void TestItem_Sulfuras(int expectedQuality, int sellIn) { Items = new List { - new Sulfuras(sellIn, 20) + new SulfurasItem(sellIn, 20) } }; From a73484697cf71dcd418b82730b1df85272505c76 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Sun, 30 Jun 2024 23:59:10 +0530 Subject: [PATCH 18/19] Revert "Refactor UpdateQuality methods to private and update logic" This reverts commit 246e14a815aeec0d2831cc5cbd189e31234e6d81. --- src/GildedRose.Console/Items/AgedBrieItem.cs | 2 +- src/GildedRose.Console/Items/BackstageItem.cs | 2 +- src/GildedRose.Console/Items/Item.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/GildedRose.Console/Items/AgedBrieItem.cs b/src/GildedRose.Console/Items/AgedBrieItem.cs index 5d1f47f5..a63c2d0d 100644 --- a/src/GildedRose.Console/Items/AgedBrieItem.cs +++ b/src/GildedRose.Console/Items/AgedBrieItem.cs @@ -21,7 +21,7 @@ public override void Update() } } - private void UpdateQuality() + protected override void UpdateQuality() { if (this.Quality < 50) { diff --git a/src/GildedRose.Console/Items/BackstageItem.cs b/src/GildedRose.Console/Items/BackstageItem.cs index 7fbb24ed..c46f641d 100644 --- a/src/GildedRose.Console/Items/BackstageItem.cs +++ b/src/GildedRose.Console/Items/BackstageItem.cs @@ -31,7 +31,7 @@ public override void Update() } } - private void UpdateQuality() + protected override void UpdateQuality() { if (this.Quality < 50) { diff --git a/src/GildedRose.Console/Items/Item.cs b/src/GildedRose.Console/Items/Item.cs index 179a87a3..8d68767f 100644 --- a/src/GildedRose.Console/Items/Item.cs +++ b/src/GildedRose.Console/Items/Item.cs @@ -20,7 +20,7 @@ public virtual void Update() } } - private void UpdateQuality() + protected virtual void UpdateQuality() { if (this.Quality > 0) { From 17958da2c343ee01dec35666a3512068ff35eb56 Mon Sep 17 00:00:00 2001 From: Naresh Kumar Date: Mon, 1 Jul 2024 00:01:53 +0530 Subject: [PATCH 19/19] Add ConjuredItem class and update related logic Added a new ConjuredItem class that inherits from Item and overrides the Update method to decrease quality twice as fast. Updated the project file to include ConjuredItem.cs. Modified the Main method to use ConjuredItem for "Conjured Mana Cake". Added a unit test to verify ConjuredItem behavior. --- .../GildedRose.Console.csproj | 1 + src/GildedRose.Console/Items/ConjuredItem.cs | 19 +++++++++++++++++ src/GildedRose.Console/Program.cs | 2 +- src/GildedRose.Tests/TestAssemblyTests.cs | 21 +++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/GildedRose.Console/Items/ConjuredItem.cs diff --git a/src/GildedRose.Console/GildedRose.Console.csproj b/src/GildedRose.Console/GildedRose.Console.csproj index c7a48c91..b58931ab 100644 --- a/src/GildedRose.Console/GildedRose.Console.csproj +++ b/src/GildedRose.Console/GildedRose.Console.csproj @@ -44,6 +44,7 @@ + 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/Program.cs b/src/GildedRose.Console/Program.cs index d3c46760..70d54c2e 100644 --- a/src/GildedRose.Console/Program.cs +++ b/src/GildedRose.Console/Program.cs @@ -19,7 +19,7 @@ static void Main(string[] args) new Item {Name = "Elixir of the Mongoose", SellIn = 5, Quality = 7}, new SulfurasItem(sellIn: 0, quality: 80), new BackstageItem(sellIn: 15, quality: 20), - new Item {Name = "Conjured Mana Cake", SellIn = 3, Quality = 6} + new ConjuredItem(sellIn: 3, quality: 6) } }; diff --git a/src/GildedRose.Tests/TestAssemblyTests.cs b/src/GildedRose.Tests/TestAssemblyTests.cs index 82d7bdf5..f34d5b0a 100644 --- a/src/GildedRose.Tests/TestAssemblyTests.cs +++ b/src/GildedRose.Tests/TestAssemblyTests.cs @@ -23,6 +23,27 @@ public void UpdateQualityShouldNotThrowException() 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)]