diff --git a/Java/src/main/java/com/gildedrose/AgedBrieUpdater.java b/Java/src/main/java/com/gildedrose/AgedBrieUpdater.java index 4b145e7e..19975816 100644 --- a/Java/src/main/java/com/gildedrose/AgedBrieUpdater.java +++ b/Java/src/main/java/com/gildedrose/AgedBrieUpdater.java @@ -1,6 +1,6 @@ package com.gildedrose; -public class AgedBrieUpdater extends ItemUpdater { +public class AgedBrieUpdater extends CustomItemUpdater { @Override void updateSellIn(Item item) { diff --git a/Java/src/main/java/com/gildedrose/BackstagePassUpdater.java b/Java/src/main/java/com/gildedrose/BackstagePassUpdater.java index 6cb499e4..df27ef91 100644 --- a/Java/src/main/java/com/gildedrose/BackstagePassUpdater.java +++ b/Java/src/main/java/com/gildedrose/BackstagePassUpdater.java @@ -1,6 +1,6 @@ package com.gildedrose; -public class BackstagePassUpdater extends ItemUpdater { +public class BackstagePassUpdater extends CustomItemUpdater { @Override void updateSellIn(Item item) { diff --git a/Java/src/main/java/com/gildedrose/CustomItemUpdater.java b/Java/src/main/java/com/gildedrose/CustomItemUpdater.java new file mode 100644 index 00000000..f7de3e87 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/CustomItemUpdater.java @@ -0,0 +1,7 @@ +package com.gildedrose; + +public abstract class CustomItemUpdater extends ItemUpdater{ + int getNewQuality(Item item){ + return Math.min(item.quality + getUpdateValue(item), HIGHEST_QUALITY); + } +} diff --git a/Java/src/main/java/com/gildedrose/ItemUpdater.java b/Java/src/main/java/com/gildedrose/ItemUpdater.java index 78aad85e..1e9b209d 100644 --- a/Java/src/main/java/com/gildedrose/ItemUpdater.java +++ b/Java/src/main/java/com/gildedrose/ItemUpdater.java @@ -16,14 +16,11 @@ public abstract class ItemUpdater { private void updateQuality(Item item) { if (canUpdateQuality(item)) { - item.quality = Math.max(getNewQuality(item), 0); + item.quality = Math.max(getNewQuality(item), MIN_QUALITY); } } abstract void updateSellIn(Item item); abstract boolean canUpdateQuality(Item item); abstract int getUpdateValue(Item item); - - private int getNewQuality(Item item){ - return Math.min(item.quality + getUpdateValue(item), HIGHEST_QUALITY); - } + abstract int getNewQuality(Item item); } diff --git a/Java/src/main/java/com/gildedrose/LegendaryItemUpdater.java b/Java/src/main/java/com/gildedrose/LegendaryItemUpdater.java new file mode 100644 index 00000000..224c5a28 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/LegendaryItemUpdater.java @@ -0,0 +1,9 @@ +package com.gildedrose; + +public abstract class LegendaryItemUpdater extends ItemUpdater{ + static int HIGHEST_QUALITY = 80; + + int getNewQuality(Item item){ + return Math.min(item.quality + getUpdateValue(item), HIGHEST_QUALITY); + } +} diff --git a/Java/src/main/java/com/gildedrose/StandardItemUpdater.java b/Java/src/main/java/com/gildedrose/StandardItemUpdater.java index f59f332c..04f14b15 100644 --- a/Java/src/main/java/com/gildedrose/StandardItemUpdater.java +++ b/Java/src/main/java/com/gildedrose/StandardItemUpdater.java @@ -20,4 +20,9 @@ public class StandardItemUpdater extends ItemUpdater { return DEGRADE_NORMAL; } } + + @Override + int getNewQuality(Item item) { + return Math.min(item.quality + getUpdateValue(item), HIGHEST_QUALITY); + } } diff --git a/Java/src/main/java/com/gildedrose/SulfurasUpdater.java b/Java/src/main/java/com/gildedrose/SulfurasUpdater.java index 5c78755f..aec089ab 100644 --- a/Java/src/main/java/com/gildedrose/SulfurasUpdater.java +++ b/Java/src/main/java/com/gildedrose/SulfurasUpdater.java @@ -1,6 +1,6 @@ package com.gildedrose; -public class SulfurasUpdater extends ItemUpdater { +public class SulfurasUpdater extends LegendaryItemUpdater { @Override void updateSellIn(Item item) { System.out.print("########Never gets old ############"); @@ -9,12 +9,12 @@ public class SulfurasUpdater extends ItemUpdater { @Override boolean canUpdateQuality(Item item) { // "Sulfuras", being a legendary item, never decreases in Quality - return false; + return item.quality < HIGHEST_QUALITY; } @Override int getUpdateValue(Item item) { - // "Sulfuras", being a legendary item, never decreases in Quality - return 0; + // "Sulfuras", being a legendary item, never decreases in Quality. Its value is always 80 + return HIGHEST_QUALITY - item.quality; } } diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index f19bfd3b..b05e6146 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -122,6 +122,7 @@ public class GildedRoseTest { assertEquals(originalSellIn - 1, app.items[0].sellIn); assertEquals(originalQuality + 1, app.items[0].quality); } + @Test public void agedBrie_shouldNotIncrease_moreThanHighestValue() { final int originalQuality = agedBrieWithHighestQuality.quality; @@ -151,7 +152,7 @@ public class GildedRoseTest { @Test - public void sulfurus_shouldNeverDegradeAndBeSold() { + public void sulfuras_shouldNeverDegradeAndBeSold() { final Item[] items = new Item[]{sulfuras}; app = new GildedRose(items); app.updateQuality(); @@ -164,6 +165,16 @@ public class GildedRoseTest { assertEquals(80, app.items[0].quality); } + @Test + public void sulfurasQuality_shouldAlwaysBe80() { + final Item[] items = new Item[]{new Item("Sulfuras, Hand of Ragnaros", 0, 40)}; + app = new GildedRose(items); + app.updateQuality(); + assertEquals("Sulfuras, Hand of Ragnaros", app.items[0].name); + assertEquals(0, app.items[0].sellIn); + assertEquals(80, app.items[0].quality); + } + @Test public void qualityOfItem_exceptLegendaryItems_cantBeMoreThanHighestValue() { final Item[] items = new Item[]{standardWithHighestQuality, backstageWithHighestQuality, @@ -211,11 +222,29 @@ public class GildedRoseTest { final Item[] items = new Item[]{conjuredWithHighestQuality}; app = new GildedRose(items); - for (int i=0; i< 7; i++) { + for (int i = 0; i < 7; i++) { app.updateQuality(); } assertEquals(-2, app.items[0].sellIn); assertEquals(32, app.items[0].quality); } -} + + @Test + public void newStandardItem_shouldDegradeAsNormal() { + ItemUpdaterFactory.registerCustomUpdater("New Item", new StandardItemUpdater()); + + final int originalQuality = 40; + final Item newItem = new Item("New Item", 1, originalQuality); + final Item[] items = new Item[]{newItem}; + + app = new GildedRose(items); + app.updateQuality(); + + assertEquals("New Item", app.items[0].name); + assertEquals(0, app.items[0].sellIn); + assertEquals(originalQuality -1, app.items[0].quality); + + assertEquals(newItem.name + ", " + newItem.sellIn + ", " + newItem.quality, app.items[0].toString()); + } +} \ No newline at end of file