From 9071e804c0f5d7472f399003c93efef970972d03 Mon Sep 17 00:00:00 2001 From: matiasalessandrini Date: Mon, 3 Jul 2023 15:26:02 -0300 Subject: [PATCH] refactor code, add conjured item --- .../main/java/com/gildedrose/GildedRose.java | 58 +++---------------- .../business/AgedBrieItemHandler.java | 19 ++++++ .../business/BackstagePassesItemHandler.java | 23 ++++++++ .../business/ConjuredItemHandler.java | 20 +++++++ .../com/gildedrose/business/ItemEnum.java | 18 ++++++ .../com/gildedrose/business/ItemHandler.java | 24 ++++++++ .../business/ItemHandlerFactory.java | 21 +++++++ .../business/RegularItemHandler.java | 26 +++++++++ .../java/com/gildedrose/GildedRoseTest.java | 30 ++++++++-- 9 files changed, 184 insertions(+), 55 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/business/AgedBrieItemHandler.java create mode 100644 Java/src/main/java/com/gildedrose/business/BackstagePassesItemHandler.java create mode 100644 Java/src/main/java/com/gildedrose/business/ConjuredItemHandler.java create mode 100644 Java/src/main/java/com/gildedrose/business/ItemEnum.java create mode 100644 Java/src/main/java/com/gildedrose/business/ItemHandler.java create mode 100644 Java/src/main/java/com/gildedrose/business/ItemHandlerFactory.java create mode 100644 Java/src/main/java/com/gildedrose/business/RegularItemHandler.java diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..9a0bc635 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,22 @@ package com.gildedrose; +import com.gildedrose.business.ItemHandler; +import com.gildedrose.business.ItemHandlerFactory; + class GildedRose { Item[] items; + ItemHandlerFactory itemHandlerFactory; public GildedRose(Item[] items) { this.items = items; + this.itemHandlerFactory = new ItemHandlerFactory(); } 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){ + ItemHandler itemHandler = itemHandlerFactory.createItemHandler(item.name); + itemHandler.updateItem(item); } } -} \ No newline at end of file +} diff --git a/Java/src/main/java/com/gildedrose/business/AgedBrieItemHandler.java b/Java/src/main/java/com/gildedrose/business/AgedBrieItemHandler.java new file mode 100644 index 00000000..976d04bf --- /dev/null +++ b/Java/src/main/java/com/gildedrose/business/AgedBrieItemHandler.java @@ -0,0 +1,19 @@ +package com.gildedrose.business; + +import com.gildedrose.Item; + +public class AgedBrieItemHandler implements ItemHandler { + + @Override + public void updateItem(Item item) { + if (item.quality < 50) { + incrementQuality(item); + } + decrementSellIn(item); + + if (hasExpired(item) && item.quality < 50) { + incrementQuality(item); + } + } +} + diff --git a/Java/src/main/java/com/gildedrose/business/BackstagePassesItemHandler.java b/Java/src/main/java/com/gildedrose/business/BackstagePassesItemHandler.java new file mode 100644 index 00000000..a03ebdc8 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/business/BackstagePassesItemHandler.java @@ -0,0 +1,23 @@ +package com.gildedrose.business; + +import com.gildedrose.Item; + +public class BackstagePassesItemHandler implements ItemHandler{ + @Override + public void updateItem(Item item) { + if (item.quality < 50) { + incrementQuality(item); + if (item.sellIn < 11 && item.quality < 50) { + incrementQuality(item); + } + if (item.sellIn < 6 && item.quality < 50) { + incrementQuality(item); + } + } + decrementSellIn(item); + + if (hasExpired(item)) { + item.quality = 0; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/business/ConjuredItemHandler.java b/Java/src/main/java/com/gildedrose/business/ConjuredItemHandler.java new file mode 100644 index 00000000..cef5aa0c --- /dev/null +++ b/Java/src/main/java/com/gildedrose/business/ConjuredItemHandler.java @@ -0,0 +1,20 @@ +package com.gildedrose.business; + +import com.gildedrose.Item; + +public class ConjuredItemHandler implements ItemHandler { + + @Override + public void updateItem(Item item) { + if (item.quality > 0) { + decrementQuality(item); + decrementQuality(item); + } + decrementSellIn(item); + + if (hasExpired(item) && item.quality > 0) { + decrementQuality(item); + decrementQuality(item); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/business/ItemEnum.java b/Java/src/main/java/com/gildedrose/business/ItemEnum.java new file mode 100644 index 00000000..5fe47af5 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/business/ItemEnum.java @@ -0,0 +1,18 @@ +package com.gildedrose.business; + +public enum ItemEnum { + AGED_BRIE("Aged Brie"), + SULFURAS("Sulfuras, Hand of Ragnaros"), + BACKSTAGE_PASSES("Backstage passes to a TAFKAL80ETC concert"), + CONJURED_MANA_CAKE("Conjured Mana Cake"); + + private final String value; + + ItemEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/Java/src/main/java/com/gildedrose/business/ItemHandler.java b/Java/src/main/java/com/gildedrose/business/ItemHandler.java new file mode 100644 index 00000000..2c48b562 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/business/ItemHandler.java @@ -0,0 +1,24 @@ +package com.gildedrose.business; + +import com.gildedrose.Item; + +public interface ItemHandler { + + void updateItem(Item item); + + default void incrementQuality(Item item){ + item.quality++; + } + + default void decrementQuality(Item item){ + item.quality--; + } + + default void decrementSellIn(Item item){ + item.sellIn--; + } + + default boolean hasExpired(Item item) { + return item.sellIn < 0; + } +} diff --git a/Java/src/main/java/com/gildedrose/business/ItemHandlerFactory.java b/Java/src/main/java/com/gildedrose/business/ItemHandlerFactory.java new file mode 100644 index 00000000..971449bf --- /dev/null +++ b/Java/src/main/java/com/gildedrose/business/ItemHandlerFactory.java @@ -0,0 +1,21 @@ +package com.gildedrose.business; + +public class ItemHandlerFactory { + + public ItemHandler createItemHandler(String itemName) { + + if (ItemEnum.AGED_BRIE.getValue().equals(itemName)) { + return new AgedBrieItemHandler(); + + } else if (ItemEnum.BACKSTAGE_PASSES.getValue().equals(itemName)) { + return new BackstagePassesItemHandler(); + + } else if (ItemEnum.CONJURED_MANA_CAKE.getValue().equals(itemName)) { + return new ConjuredItemHandler(); + + } else { + return new RegularItemHandler(); + } + } +} + diff --git a/Java/src/main/java/com/gildedrose/business/RegularItemHandler.java b/Java/src/main/java/com/gildedrose/business/RegularItemHandler.java new file mode 100644 index 00000000..c0bde10b --- /dev/null +++ b/Java/src/main/java/com/gildedrose/business/RegularItemHandler.java @@ -0,0 +1,26 @@ +package com.gildedrose.business; + +import com.gildedrose.Item; + +import java.util.Arrays; +import java.util.List; + +public class RegularItemHandler implements ItemHandler { + + private static final List LEGENDARY_ITEMS = Arrays.asList(new String[]{ItemEnum.SULFURAS.getValue()}); + + @Override + public void updateItem(Item item) { + if (!LEGENDARY_ITEMS.contains(item.name)) { + if (item.quality > 0) { + decrementQuality(item); + } + decrementSellIn(item); + + if (hasExpired(item) && item.quality > 0) { + decrementQuality(item); + } + } + } +} + diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..245c8e2b 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -1,17 +1,35 @@ package com.gildedrose; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; 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) }; + @ParameterizedTest + @DisplayName("Test updateQuality method") + @CsvSource({ + "+5 Dexterity Vest, 10, 20, 9, 19", + "Elixir of the Mongoose, 0, 2, -1, 0", + "Aged Brie, 10, 20, 9, 21", + "Aged Brie, 10, 50, 9, 50", + "Aged Brie, 0, 10, -1, 12", + "'Sulfuras, Hand of Ragnaros', 10, 80, 10, 80", + "Backstage passes to a TAFKAL80ETC concert, 10, 30, 9, 32", + "Backstage passes to a TAFKAL80ETC concert, 5, 30, 4, 33", + "Backstage passes to a TAFKAL80ETC concert, 0, 30, -1, 0", + "Conjured Mana Cake, 10, 20, 9, 18", + "Conjured Mana Cake, 0, 4, -1, 0" + }) + void testItemQuality(String itemName, int sellIn, int quality, int expectedSellIn, int expectedQuality) { + Item item = new Item(itemName, sellIn, quality); + Item[] items = new Item[] { item }; GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + assertEquals(expectedSellIn, item.sellIn); + assertEquals(expectedQuality, item.quality); } }