Extract item types condition from the DailyItemUpdate method and refactored related tests

* in tests:
   - renamed tests to use the different item types
   - Added more test cases to support the fixed functionality of better types' recognition.

* reran the 30 days texttest to verify the changes until now
This commit is contained in:
Sarah Ashri 2024-03-13 10:17:00 +10:00
parent 165322b336
commit dd66f563e9
2 changed files with 65 additions and 53 deletions

View File

@ -20,14 +20,23 @@ public class GildedRose
DailyItemUpdate(item); DailyItemUpdate(item);
} }
} }
private static bool IsLegendaryItem(Item item) => item.Name.ToLower().Contains("sulfuras");
private static bool IsBackstagePassesItem(Item item) => item.Name.ToLower().Contains("backstage passes");
private static bool IsBetterWithAgeItem(Item item) => item.Name.ToLower().Equals("aged brie");
private void DailyItemUpdate(Item item) private void DailyItemUpdate(Item item)
{ {
if (item.Name != "Aged Brie" && item.Name != "Backstage passes to a TAFKAL80ETC concert") if (!IsBetterWithAgeItem(item) && !IsBackstagePassesItem(item))
{ {
if (item.Quality > MinQuality) if (item.Quality > MinQuality)
{ {
if (item.Name != "Sulfuras, Hand of Ragnaros") if (!IsLegendaryItem(item))
{ {
item.Quality = item.Quality - 1; item.Quality = item.Quality - 1;
} }
@ -39,7 +48,7 @@ public class GildedRose
{ {
item.Quality = item.Quality + 1; item.Quality = item.Quality + 1;
if (item.Name == "Backstage passes to a TAFKAL80ETC concert") if (IsBackstagePassesItem(item))
{ {
if (item.SellIn < 11) if (item.SellIn < 11)
{ {
@ -60,20 +69,20 @@ public class GildedRose
} }
} }
if (item.Name != "Sulfuras, Hand of Ragnaros") if (!IsLegendaryItem(item))
{ {
item.SellIn = item.SellIn - 1; item.SellIn = item.SellIn - 1;
} }
if (item.SellIn < 0) if (item.SellIn < 0)
{ {
if (item.Name != "Aged Brie") if (!IsBetterWithAgeItem(item))
{ {
if (item.Name != "Backstage passes to a TAFKAL80ETC concert") if (!IsBackstagePassesItem(item))
{ {
if (item.Quality > MinQuality) if (item.Quality > MinQuality)
{ {
if (item.Name != "Sulfuras, Hand of Ragnaros") if (!IsLegendaryItem(item))
{ {
item.Quality = item.Quality - 1; item.Quality = item.Quality - 1;
} }

View File

@ -1,5 +1,5 @@
using System.Collections.Generic; using FluentAssertions;
using FluentAssertions; using System.Collections.Generic;
using GildedRoseKata; using GildedRoseKata;
using NUnit.Framework; using NUnit.Framework;
@ -61,7 +61,7 @@ public class UpdateQualityTestFixture
[Test] [Test]
public void AgedBrie_WhenNotExpired_Should_IncreaseQualityByOne() public void BetterWithAgeItems_WhenNotExpired_Should_IncreaseQualityByOne()
{ {
var items = new List<Item> { new() { Name = "Aged Brie", SellIn = 1, Quality = 0 } }; var items = new List<Item> { new() { Name = "Aged Brie", SellIn = 1, Quality = 0 } };
var expectedItemsAfterTest = new List<Item> { new() { Name = "Aged Brie", SellIn = 0, Quality = 1 } }; var expectedItemsAfterTest = new List<Item> { new() { Name = "Aged Brie", SellIn = 0, Quality = 1 } };
@ -73,10 +73,10 @@ public class UpdateQualityTestFixture
} }
[Test] [Test]
public void AgedBrie_WhenExpired_Should_IncreaseQualityByTwo() public void BetterWithAgeItems_WhenExpired_Should_IncreaseQualityByTwo()
{ {
var items = new List<Item> { new() { Name = "Aged Brie", SellIn = 0, Quality = 1 } }; var items = new List<Item> { new() { Name = "aged Brie", SellIn = 0, Quality = 1 } };
var expectedItemsAfterTest = new List<Item> { new() { Name = "Aged Brie", SellIn = -1, Quality = 3 } }; var expectedItemsAfterTest = new List<Item> { new() { Name = "aged Brie", SellIn = -1, Quality = 3 } };
var app = new GildedRose(items); var app = new GildedRose(items);
app.UpdateQuality(); app.UpdateQuality();
@ -103,23 +103,18 @@ public class UpdateQualityTestFixture
[Test] [Test]
public void SulfurasHandOfRagnaros_QualityAndSellIn_NeverChange() public void LegendaryItems_QualityAndSellIn_NeverChange()
{ {
var items = new List<Item> { new() { Name = "Sulfuras, Hand of Ragnaros", SellIn = 3, Quality = 3 } }; var items = new List<Item>
var expectedItemsAfterTest = new List<Item> { new() { Name = "Sulfuras, Hand of Ragnaros", SellIn = 3, Quality = 3 } }; {
new() { Name = "Sulfuras, Hand of Ragnaros", SellIn = 3, Quality = 3 },
var app = new GildedRose(items); new() { Name = "sulfuras", SellIn = 3, Quality = 31 }
};
app.UpdateQuality(); var expectedItemsAfterTest = new List<Item>
items.Should().BeEquivalentTo(expectedItemsAfterTest); {
} new() { Name = "Sulfuras, Hand of Ragnaros", SellIn = 3, Quality = 3 },
new() { Name = "sulfuras", SellIn = 3, Quality = 31 }
[Test] };
[Ignore("Bug in code - support only item with exact name: Sulfuras, Hand of Ragnaros")]
public void Sulfuras_QualityAndSellIn_NeverChange()
{
var items = new List<Item> { new() { Name = "Sulfuras", SellIn = 3, Quality = 3 } };
var expectedItemsAfterTest = new List<Item> { new() { Name = "Sulfuras", SellIn = 3, Quality = 3 } };
var app = new GildedRose(items); var app = new GildedRose(items);
@ -129,10 +124,10 @@ public class UpdateQualityTestFixture
[Test] [Test]
[Ignore("not implemented yet - Legendary Items should not take quality (constant at 80)")] [Ignore("not implemented yet - Legendary Items should not take quality (constant at 80)")]
public void Sulfuras_Quality_IsConstant80() public void LegendaryItems_Quality_IsConstant80()
{ {
var items = new List<Item> { new() { Name = "Sulfuras", SellIn = 3 } }; var items = new List<Item> { new() { Name = "something sulfuras something", SellIn = 3 } };
var expectedItemsAfterTest = new List<Item> { new() { Name = "Sulfuras", SellIn = 3, Quality = 80 } }; var expectedItemsAfterTest = new List<Item> { new() { Name = "something sulfuras something", SellIn = 3, Quality = 80 } };
var app = new GildedRose(items); var app = new GildedRose(items);
@ -142,17 +137,17 @@ public class UpdateQualityTestFixture
[Test] [Test]
public void BackstagePassesFullName_WhenExpiryInOver10Days_QualityIncreaseByOne() public void BackstagePassesItems_WhenExpiryInOver10Days_QualityIncreaseByOne()
{ {
var items = new List<Item> var items = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 11, Quality = 4 }, new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 11, Quality = 4 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 20, Quality = 40 } new() { Name = "backstage passes to some other show", SellIn = 20, Quality = 40 }
}; };
var expectedItemsAfterTest = new List<Item> var expectedItemsAfterTest = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 10, Quality = 5 }, new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 10, Quality = 5 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 19, Quality = 41 } new() { Name = "backstage passes to some other show", SellIn = 19, Quality = 41 }
}; };
var app = new GildedRose(items); var app = new GildedRose(items);
@ -163,17 +158,17 @@ public class UpdateQualityTestFixture
[Test] [Test]
public void BackstagePassesFullName_WhenExpiryIn10To6Days_QualityIncreaseByTwo() public void BackstagePassesItems_WhenExpiryIn10To6Days_QualityIncreaseByTwo()
{ {
var items = new List<Item> var items = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 10, Quality = 4 }, new() { Name = "backstage passes to a TAFKAL80ETC concert", SellIn = 10, Quality = 4 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 6, Quality = 41 } new() { Name = "Backstage passes to some other show", SellIn = 6, Quality = 41 }
}; };
var expectedItemsAfterTest = new List<Item> var expectedItemsAfterTest = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 9, Quality = 6 }, new() { Name = "backstage passes to a TAFKAL80ETC concert", SellIn = 9, Quality = 6 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 5, Quality = 43 } new() { Name = "Backstage passes to some other show", SellIn = 5, Quality = 43 }
}; };
var app = new GildedRose(items); var app = new GildedRose(items);
@ -183,16 +178,16 @@ public class UpdateQualityTestFixture
} }
[Test] [Test]
public void BackstagePassesFullName_WhenExpiryIn5to1Days_QualityIncreaseByThree() public void BackstagePassesItems_WhenExpiryIn5to1Days_QualityIncreaseByThree()
{ {
var items = new List<Item> var items = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 5, Quality = 4 }, new() { Name = "Backstage passes to some other show", SellIn = 5, Quality = 4 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 1, Quality = 41 } new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 1, Quality = 41 }
}; };
var expectedItemsAfterTest = new List<Item> var expectedItemsAfterTest = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 4, Quality = 7 }, new() { Name = "Backstage passes to some other show", SellIn = 4, Quality = 7 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 0, Quality = 44 } new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 0, Quality = 44 }
}; };
@ -203,24 +198,24 @@ public class UpdateQualityTestFixture
} }
[Test] [Test]
public void BackstagePassesFullName_MaximumQuality_Is50() public void BackstagePassesItems_MaximumQuality_Is50()
{ {
var items = new List<Item> var items = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 15, Quality = 49 }, new() { Name = "Backstage passes", SellIn = 15, Quality = 49 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 10, Quality = 49 }, new() { Name = "Backstage passes to some other show", SellIn = 10, Quality = 49 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 5, Quality = 48 } new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 5, Quality = 48 }
}; };
var expectedItemsAfterDay1 = new List<Item> var expectedItemsAfterDay1 = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 14, Quality = 50 }, new() { Name = "Backstage passes", SellIn = 14, Quality = 50 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 9, Quality = 50 }, new() { Name = "Backstage passes to some other show", SellIn = 9, Quality = 50 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 4, Quality = 50 } new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 4, Quality = 50 }
}; };
var expectedItemsAfterDay2 = new List<Item> var expectedItemsAfterDay2 = new List<Item>
{ {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 13, Quality = 50 }, new() { Name = "Backstage passes", SellIn = 13, Quality = 50 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 8, Quality = 50 }, new() { Name = "Backstage passes to some other show", SellIn = 8, Quality = 50 },
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 3, Quality = 50 } new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 3, Quality = 50 }
}; };
@ -234,10 +229,18 @@ public class UpdateQualityTestFixture
} }
[Test] [Test]
public void BackstagePassesFullName_WhenExpired_QualityDropsTo0() public void BackstagePassesItems_WhenExpired_QualityDropsTo0()
{ {
var items = new List<Item> { new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 0, Quality = 4 } }; var items = new List<Item>
var expectedItemsAfterTest = new List<Item> { new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = -1, Quality = 0 } }; {
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 0, Quality = 4 },
new() { Name = "Another type of backstage passes", SellIn = 0, Quality = 4 }
};
var expectedItemsAfterTest = new List<Item>
{
new() { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = -1, Quality = 0 },
new() { Name = "Another type of backstage passes", SellIn = -1, Quality = 0 }
};
var app = new GildedRose(items); var app = new GildedRose(items);