diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..3ccacda9 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,5 +1,8 @@ package com.gildedrose; +import com.gildedrose.updaters.ItemUpdater; +import com.gildedrose.updaters.ItemUpdaterFactory; + class GildedRose { Item[] items; @@ -8,55 +11,9 @@ class GildedRose { } 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; - } - } - } 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; - } - } - } - } - } - - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].sellIn = items[i].sellIn - 1; - } - - 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; - } - } else { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - } - } - } + for (Item item : items) { + ItemUpdater updater = ItemUpdaterFactory.getUpdater(item); + updater.update(); } } } diff --git a/Java/src/main/java/com/gildedrose/GildedRoseConstants.java b/Java/src/main/java/com/gildedrose/GildedRoseConstants.java new file mode 100644 index 00000000..f70fa282 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/GildedRoseConstants.java @@ -0,0 +1,8 @@ +package com.gildedrose; + +public class GildedRoseConstants { + public static final String AGED_BRIE = "Aged Brie"; + public static final String SULFURAS = "Sulfuras, Hand of Ragnaros"; + public static final String BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert"; + public static final String CONJURED = "conjured"; +} diff --git a/Java/src/main/java/com/gildedrose/updaters/AgedBrieUpdater.java b/Java/src/main/java/com/gildedrose/updaters/AgedBrieUpdater.java new file mode 100644 index 00000000..37f6650f --- /dev/null +++ b/Java/src/main/java/com/gildedrose/updaters/AgedBrieUpdater.java @@ -0,0 +1,18 @@ +package com.gildedrose.updaters; + +import com.gildedrose.Item; + +public class AgedBrieUpdater extends ItemUpdater { + public AgedBrieUpdater(Item item) { + super(item); + } + + @Override + public void update() { + increaseQuality(1); + decreaseSellIn(); + if (item.sellIn < 0) { + increaseQuality(1); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/updaters/BackstagePassUpdater.java b/Java/src/main/java/com/gildedrose/updaters/BackstagePassUpdater.java new file mode 100644 index 00000000..d976a760 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/updaters/BackstagePassUpdater.java @@ -0,0 +1,23 @@ +package com.gildedrose.updaters; + +import com.gildedrose.Item; + +public class BackstagePassUpdater extends ItemUpdater { + public BackstagePassUpdater(Item item) { + super(item); + } + + @Override + public void update() { + if (item.sellIn <= 0) { + item.quality = 0; + } else if (item.sellIn <= 5) { + increaseQuality(3); + } else if (item.sellIn <= 10) { + increaseQuality(2); + } else { + increaseQuality(1); + } + decreaseSellIn(); + } +} diff --git a/Java/src/main/java/com/gildedrose/updaters/ConjuredItemUpdater.java b/Java/src/main/java/com/gildedrose/updaters/ConjuredItemUpdater.java new file mode 100644 index 00000000..2a1eed81 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/updaters/ConjuredItemUpdater.java @@ -0,0 +1,18 @@ +package com.gildedrose.updaters; + +import com.gildedrose.Item; + +public class ConjuredItemUpdater extends ItemUpdater { + public ConjuredItemUpdater(Item item) { + super(item); + } + + @Override + public void update() { + decreaseQuality(2); + decreaseSellIn(); + if (item.sellIn < 0) { + decreaseQuality(2); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/updaters/ItemUpdater.java b/Java/src/main/java/com/gildedrose/updaters/ItemUpdater.java new file mode 100644 index 00000000..6f8f7e20 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/updaters/ItemUpdater.java @@ -0,0 +1,25 @@ +package com.gildedrose.updaters; + +import com.gildedrose.Item; + +public abstract class ItemUpdater { + protected final Item item; + + public ItemUpdater(Item item) { + this.item = item; + } + + public abstract void update(); + + protected void increaseQuality(int amount) { + item.quality = Math.min(50, item.quality + amount); + } + + protected void decreaseQuality(int amount) { + item.quality = Math.max(0, item.quality - amount); + } + + protected void decreaseSellIn() { + item.sellIn--; + } +} diff --git a/Java/src/main/java/com/gildedrose/updaters/ItemUpdaterFactory.java b/Java/src/main/java/com/gildedrose/updaters/ItemUpdaterFactory.java new file mode 100644 index 00000000..5bae24e9 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/updaters/ItemUpdaterFactory.java @@ -0,0 +1,23 @@ +package com.gildedrose.updaters; + +import com.gildedrose.Item; + +import static com.gildedrose.GildedRoseConstants.*; + +public class ItemUpdaterFactory { + public static ItemUpdater getUpdater(Item item) { + String name = item.name; + + if (name.equals(AGED_BRIE)) { + return new AgedBrieUpdater(item); + } else if (name.equals(SULFURAS)) { + return new SulfurasUpdater(item); + } else if (name.equals(BACKSTAGE_PASS)) { + return new BackstagePassUpdater(item); + } else if (name.toLowerCase().contains(CONJURED)) { + return new ConjuredItemUpdater(item); + } else { + return new NormalItemUpdater(item); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/updaters/NormalItemUpdater.java b/Java/src/main/java/com/gildedrose/updaters/NormalItemUpdater.java new file mode 100644 index 00000000..dcff719e --- /dev/null +++ b/Java/src/main/java/com/gildedrose/updaters/NormalItemUpdater.java @@ -0,0 +1,18 @@ +package com.gildedrose.updaters; + +import com.gildedrose.Item; + +public class NormalItemUpdater extends ItemUpdater { + public NormalItemUpdater(Item item) { + super(item); + } + + @Override + public void update() { + decreaseQuality(1); + decreaseSellIn(); + if (item.sellIn < 0) { + decreaseQuality(1); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/updaters/SulfurasUpdater.java b/Java/src/main/java/com/gildedrose/updaters/SulfurasUpdater.java new file mode 100644 index 00000000..6007088c --- /dev/null +++ b/Java/src/main/java/com/gildedrose/updaters/SulfurasUpdater.java @@ -0,0 +1,14 @@ +package com.gildedrose.updaters; + +import com.gildedrose.Item; + +public class SulfurasUpdater extends ItemUpdater { + public SulfurasUpdater(Item item) { + super(item); + } + + @Override + public void update() { + // Legendary item, do nothing + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..fd1d54b7 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -2,16 +2,34 @@ package com.gildedrose; import org.junit.jupiter.api.Test; +import static com.gildedrose.GildedRoseConstants.*; import static org.junit.jupiter.api.Assertions.assertEquals; -class GildedRoseTest { - +public class GildedRoseTest { @Test - void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; + void agedBrieIncreasesInQuality() { + Item[] items = new Item[] { new Item(AGED_BRIE, 2, 0) }; GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + assertEquals(1, items[0].quality); + assertEquals(1, items[0].sellIn); } + @Test + void sulfurasDoesNotChange() { + Item[] items = new Item[] { new Item(SULFURAS, 0, 80) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(80, items[0].quality); + assertEquals(0, items[0].sellIn); + } + + @Test + void backstagePassIncreasesCorrectly() { + Item[] items = new Item[] { new Item(BACKSTAGE_PASS, 5, 10) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(13, items[0].quality); + assertEquals(4, items[0].sellIn); + } }