From 30ed72f8deb6290f860c3aec84cd89aff338f4f2 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 25 Sep 2022 18:14:21 +0100 Subject: [PATCH] Adding unit tests and refactoring - looks good ;-) --- .../main/java/com/gildedrose/GildedRose.java | 107 +++++++++++------- Java/src/main/java/com/gildedrose/Item.java | 32 +++++- .../java/com/gildedrose/GildedRoseTest.java | 77 ++++++++++++- 3 files changed, 171 insertions(+), 45 deletions(-) diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..e38bc296 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,89 @@ package com.gildedrose; class GildedRose { + + public static final String SULFURAS = "Sulfuras, Hand of Ragnaros"; + public static final String CHEESE = "Aged Brie"; + //TODO: brainstorm the naming a bit here. + public static final String BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT + = "Backstage passes to a TAFKAL80ETC concert"; + Item[] items; public GildedRose(Item[] items) { this.items = items; } + /** + * Update the staet of the items. + */ public void updateQuality() { - for (int i = 0; i < items.length; i++) { - if (!items[i].name.equals("Aged Brie") - && !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items[i].quality > 0) { - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].quality = items[i].quality - 1; + for (Item item : items) { + if (!item.name.equals(CHEESE) + && !item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) { + if (item.quality > 0) { + if (!item.name.equals(SULFURAS)) { + item.quality = item.quality - 1; } } } else { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - - if (items[i].name.equals("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; - } - } - } - } + dealWithPasses(item); } - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].sellIn = items[i].sellIn - 1; + if (!item.name.equals("Sulfuras, Hand of Ragnaros")) { + decrementSellIn(item); } - if (items[i].sellIn < 0) { - if (!items[i].name.equals("Aged Brie")) { - if (!items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items[i].quality > 0) { - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].quality = items[i].quality - 1; - } - } - } else { - items[i].quality = items[i].quality - items[i].quality; - } + if (item.sellIn < 0) { + if (!item.name.equals(CHEESE) && + !item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) { + dealWithExpiredItem(item); } else { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - } + dealWithExpiredCheeseOrPasses(item); } } } } -} \ No newline at end of file + + private void decrementSellIn(Item item) { + item.sellIn = item.sellIn - 1; + } + + private void dealWithPasses(Item item) { + if (item.quality < 50) { + item.quality = item.quality + 1; + + if (item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) { + if (item.sellIn < 11) { + if (item.quality < 50) { + item.quality = item.quality + 1; + } + } + + // If the sellIn is 5 days or fewer add to the quality again + if (item.sellIn < 6) { + item.quality = item.quality + 1; + } + } + } + } + + private void dealWithExpiredItem(Item item) { + if (item.quality > 0) { + if (!item.name.equals(SULFURAS)) { + item.quality = item.quality - 1; + } + } else { + item.quality = 0; + } + } + + private void dealWithExpiredCheeseOrPasses(Item item) { + if (item.quality < 50 && !item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) { + item.quality = item.quality + 1; + } else { + item.quality = 0; + } + } + +} diff --git a/Java/src/main/java/com/gildedrose/Item.java b/Java/src/main/java/com/gildedrose/Item.java index 465729ec..9463e334 100644 --- a/Java/src/main/java/com/gildedrose/Item.java +++ b/Java/src/main/java/com/gildedrose/Item.java @@ -14,8 +14,36 @@ public class Item { this.quality = quality; } - @Override - public String toString() { + @Override + public String toString() { return this.name + ", " + this.sellIn + ", " + this.quality; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Item item = (Item) o; + + if (sellIn != item.sellIn) { + return false; + } + if (quality != item.quality) { + return false; + } + return name != null ? name.equals(item.name) : item.name == null; + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + sellIn; + result = 31 * result + quality; + return result; + } } diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..ffd0ec0e 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -7,11 +7,82 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class GildedRoseTest { @Test - void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; + void testNormalDegrade() { + Item testItem = new Item("test_item", 3, 10); + Item[] items = new Item[] {testItem}; GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + Item updatedItem = app.items[0]; + assertEquals(new Item("test_item", 2, 9), updatedItem); } + @Test + void testPastSellInDegrade() { + Item testItem = new Item("test_item", 0, 10); + Item[] items = new Item[] {testItem}; + GildedRose app = new GildedRose(items); + app.updateQuality(); + Item updatedItem = app.items[0]; + assertEquals(new Item("test_item", -1, 8), updatedItem); + } + + @Test + void testQualityMustNotEverGoUnderZero() { + Item testItem = new Item("test_item", 5, 0); + Item[] items = new Item[] {testItem}; + GildedRose app = new GildedRose(items); + app.updateQuality(); + Item updatedItem = app.items[0]; + assertEquals(0, testItem.quality); + } + + @Test + void testAgedBrieGetsBetterWithAge() { + Item testItem = new Item("Aged Brie", 5, 10); + Item[] items = new Item[] {testItem}; + GildedRose app = new GildedRose(items); + app.updateQuality(); + Item updatedItem = app.items[0]; + assertEquals(new Item("Aged Brie", 4, 11), updatedItem); + } + + @Test + void testQualityIsCappedAt50() { + Item testItem = new Item("Aged Brie", 5, 50); + Item[] items = new Item[] {testItem}; + GildedRose app = new GildedRose(items); + app.updateQuality(); + Item updatedItem = app.items[0]; + assertEquals(50, updatedItem.quality); + } + + @Test + void testBackstagePass() { + Item testItem = new Item("Backstage passes to a TAFKAL80ETC concert", 6, 10); + Item[] items = new Item[] {testItem}; + GildedRose app = new GildedRose(items); + app.updateQuality(); + Item updatedItem = app.items[0]; + assertEquals(12, updatedItem.quality); + } + + @Test + void testBackstagePassWhenLessThan3DaysRemaining() { + Item testItem = new Item("Backstage passes to a TAFKAL80ETC concert", 3, 10); + Item[] items = new Item[] {testItem}; + GildedRose app = new GildedRose(items); + app.updateQuality(); + Item updatedItem = app.items[0]; + assertEquals(13, updatedItem.quality); + } + + @Test + void testExpiredBackstagePass() { + Item testItem = new Item("Backstage passes to a TAFKAL80ETC concert", 0, 10); + Item[] items = new Item[] {testItem}; + GildedRose app = new GildedRose(items); + app.updateQuality(); + Item updatedItem = app.items[0]; + assertEquals(0, updatedItem.quality); + } }