diff --git a/Java/src/main/java/com/gildedrose/AgedBrieUpdater.java b/Java/src/main/java/com/gildedrose/AgedBrieUpdater.java new file mode 100644 index 00000000..46d2a934 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/AgedBrieUpdater.java @@ -0,0 +1,14 @@ +package com.gildedrose; + +public class AgedBrieUpdater extends BaseItemUpdater { + + @Override + public void update(Item item) { + decreaseSellIn(item); + if (item.sellIn < 0) { + increaseQuality(item , 2); + } + else + increaseQuality(item); + } +} diff --git a/Java/src/main/java/com/gildedrose/BackstagePassUpdater.java b/Java/src/main/java/com/gildedrose/BackstagePassUpdater.java new file mode 100644 index 00000000..36dc7aa8 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/BackstagePassUpdater.java @@ -0,0 +1,20 @@ +package com.gildedrose; + +public class BackstagePassUpdater extends BaseItemUpdater{ + @Override + public void update(Item item) { + decreaseSellIn(item); + if (item.sellIn <0) { + item.quality = 0; + return; + } + if (item.sellIn <= 5) { + increaseQuality(item , 3); + } + else if (item.sellIn <= 10) { + increaseQuality(item , 2); + } + else + increaseQuality(item); + } +} diff --git a/Java/src/main/java/com/gildedrose/BaseItemUpdater.java b/Java/src/main/java/com/gildedrose/BaseItemUpdater.java new file mode 100644 index 00000000..775e2aee --- /dev/null +++ b/Java/src/main/java/com/gildedrose/BaseItemUpdater.java @@ -0,0 +1,22 @@ +package com.gildedrose; + +public abstract class BaseItemUpdater implements ItemUpdater { + + public abstract void update(Item item); + protected void decreaseQuality(Item item) { + item.quality = Math.max(item.quality - 1, 0); + } + protected void decreaseQuality(Item item , int amount) { + item.quality = Math.max(0, item.quality - amount); + } + protected void increaseQuality(Item item) { + item.quality = Math.min(item.quality + 1, 50); + } + protected void increaseQuality(Item item , int amount) { + item.quality = Math.min(item.quality + amount, 50); + } + protected void decreaseSellIn(Item item) { + item.sellIn--; + } + +} diff --git a/Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java b/Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java new file mode 100644 index 00000000..cb9506bc --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ConjuredItemUpdater.java @@ -0,0 +1,12 @@ +package com.gildedrose; + +public class ConjuredItemUpdater extends BaseItemUpdater { + @Override + public void update(Item item) { + decreaseSellIn(item); + if (item.sellIn < 0) { + decreaseQuality(item, 4); + } + else decreaseQuality(item, 2); + } +} diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..1ba52c3c 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,14 @@ package com.gildedrose; - -class GildedRose { - Item[] items; - +public class GildedRose { + public Item[] items; public GildedRose(Item[] items) { this.items = 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; - } - } - } 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.getItemUpdater(item); + updater.update(item); } } } diff --git a/Java/src/main/java/com/gildedrose/ItemUpdater.java b/Java/src/main/java/com/gildedrose/ItemUpdater.java new file mode 100644 index 00000000..f1c57ad3 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemUpdater.java @@ -0,0 +1,5 @@ +package com.gildedrose; + +public interface ItemUpdater { + void update(Item item); +} diff --git a/Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java b/Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java new file mode 100644 index 00000000..a4ac314b --- /dev/null +++ b/Java/src/main/java/com/gildedrose/ItemUpdaterFactory.java @@ -0,0 +1,19 @@ +package com.gildedrose; + +public class ItemUpdaterFactory { + public static ItemUpdater getItemUpdater(Item item) { + if (item.name.contains("Aged Brie")) + return new AgedBrieUpdater(); + + if (item.name.contains("Sulfuras")) + return new SulfurasUpdater(); + + if (item.name.contains("Backstage")) + return new BackstagePassUpdater(); + + if (item.name.contains("Conjured")) + return new ConjuredItemUpdater(); + + return new NormalItemUpdater(); + } +} diff --git a/Java/src/main/java/com/gildedrose/NormalItemUpdater.java b/Java/src/main/java/com/gildedrose/NormalItemUpdater.java new file mode 100644 index 00000000..d8cd7a10 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/NormalItemUpdater.java @@ -0,0 +1,14 @@ +package com.gildedrose; + +public class NormalItemUpdater extends BaseItemUpdater { + @Override + public void update(Item item) { + decreaseSellIn(item); + if (item.sellIn <0) { + decreaseQuality(item, 2); + } + else { + decreaseQuality(item); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/SulfurasUpdater.java b/Java/src/main/java/com/gildedrose/SulfurasUpdater.java new file mode 100644 index 00000000..e4bff0e2 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/SulfurasUpdater.java @@ -0,0 +1,8 @@ +package com.gildedrose; + +public class SulfurasUpdater extends BaseItemUpdater { + @Override + public void update(Item item) { + System.out.println("Legendary Item can not be updated"); + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..600e7105 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -1,17 +1,52 @@ package com.gildedrose; import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; class GildedRoseTest { @Test - void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; + void normalItemDegrades() { + Item[] items = new Item[] { new Item("Normal Item", 10, 20) }; GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + assertEquals(9, app.items[0].sellIn); + assertEquals(19, app.items[0].quality); } + @Test + void agedBrieIncreasesQuality() { + Item[] items = new Item[] { new Item("Aged Brie", 10, 20) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(9, app.items[0].sellIn); + assertEquals(21, app.items[0].quality); + } + + @Test + void sulfurasNeverChanges() { + Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", 10, 80) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(10, app.items[0].sellIn); + assertEquals(80, app.items[0].quality); + } + + @Test + void backstagePassIncreasesQualityNearConcert() { + Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 5, 20) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(4, app.items[0].sellIn); + assertEquals(23, app.items[0].quality); // +3 when 5 days or less + } + + @Test + void conjuredItemDegradesTwiceAsFast() { + Item[] items = new Item[] { new Item("Conjured Mana Cake", 10, 20) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(9, app.items[0].sellIn); + assertEquals(18, app.items[0].quality); // -2 instead of -1 + } } diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java index d059c88f..dd5949bd 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -1,10 +1,9 @@ package com.gildedrose; - public class TexttestFixture { public static void main(String[] args) { System.out.println("OMGHAI!"); - Item[] items = new Item[] { + Item [] items = new Item[] { new Item("+5 Dexterity Vest", 10, 20), // new Item("Aged Brie", 2, 0), // new Item("Elixir of the Mongoose", 5, 7), //