From b8077d986a16e07d2a6efdfc688d48b69fd8846f Mon Sep 17 00:00:00 2001 From: Federico Coraglio Date: Mon, 10 Jul 2023 18:11:48 -0300 Subject: [PATCH] Refactoring and adding conjured item --- .../main/java/com/gildedrose/GildedRose.java | 66 +++-------- .../item/quality/QualityUpdater.java | 11 ++ .../item/quality/QualityUpdaterMapper.java | 23 ++++ .../item/quality/type/QualifyUpdaterType.java | 19 ++++ .../updater/QualityUpdaterAgedBrie.java | 22 ++++ .../QualityUpdaterBackstagePasses.java | 30 +++++ .../updater/QualityUpdaterConjured.java | 24 ++++ .../updater/QualityUpdaterDefault.java | 24 ++++ .../updater/QualityUpdaterSulfuras.java | 11 ++ .../java/com/gildedrose/GildedRoseTest.java | 105 +++++++++++++++++- 10 files changed, 281 insertions(+), 54 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/item/quality/QualityUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/item/quality/QualityUpdaterMapper.java create mode 100644 Java/src/main/java/com/gildedrose/item/quality/type/QualifyUpdaterType.java create mode 100644 Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterAgedBrie.java create mode 100644 Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterBackstagePasses.java create mode 100644 Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterConjured.java create mode 100644 Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterDefault.java create mode 100644 Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterSulfuras.java diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..27a4114e 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,26 @@ package com.gildedrose; +import java.util.Arrays; +import java.util.List; +import java.util.Collections; + +import com.gildedrose.item.quality.QualityUpdater; +import com.gildedrose.item.quality.QualityUpdaterMapper; + class GildedRose { - Item[] items; + private final List items; + private final QualityUpdaterMapper qualityUpdaterMapper = new QualityUpdaterMapper(); public GildedRose(Item[] items) { - this.items = items; + this.items = items != null ? Arrays.asList(items) : Collections.EMPTY_LIST; } 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 (final Item item : items) { + if (item != null) { + final QualityUpdater updater = qualityUpdaterMapper.getQualityUpdater(item.name); + updater.updateQuality(item); } } } -} \ No newline at end of file +} diff --git a/Java/src/main/java/com/gildedrose/item/quality/QualityUpdater.java b/Java/src/main/java/com/gildedrose/item/quality/QualityUpdater.java new file mode 100644 index 00000000..50122a46 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/QualityUpdater.java @@ -0,0 +1,11 @@ +package com.gildedrose.item.quality; + +import com.gildedrose.Item; + +public interface QualityUpdater { + int MAX_LIMIT_QUALITY = 50; + int MIM_LIMIT_QUALITY = 0; + int MIM_LIMIT_SELL_IN = 0; + void updateQuality(final Item item); +} + diff --git a/Java/src/main/java/com/gildedrose/item/quality/QualityUpdaterMapper.java b/Java/src/main/java/com/gildedrose/item/quality/QualityUpdaterMapper.java new file mode 100644 index 00000000..411dbf54 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/QualityUpdaterMapper.java @@ -0,0 +1,23 @@ +package com.gildedrose.item.quality; + +import com.gildedrose.item.quality.type.QualifyUpdaterType; +import com.gildedrose.item.quality.updater.*; + +import java.util.HashMap; +import java.util.Map; + +public class QualityUpdaterMapper { + private final Map qualityUpdaters = new HashMap<>(); + private final static QualityUpdater DEFAULT_UPDATER = new QualityUpdaterDefault(); + + public QualityUpdaterMapper() { + qualityUpdaters.put(QualifyUpdaterType.AGED_BRIE.getValue().toUpperCase(), new QualityUpdaterAgedBrie()); + qualityUpdaters.put(QualifyUpdaterType.BACKSTAGE_PASSES.getValue().toUpperCase(), new QualityUpdaterBackstagePasses()); + qualityUpdaters.put(QualifyUpdaterType.CONJURED.getValue().toUpperCase(), new QualityUpdaterConjured()); + qualityUpdaters.put(QualifyUpdaterType.SULFURAS.getValue().toUpperCase(), new QualityUpdaterSulfuras()); + } + + public QualityUpdater getQualityUpdater(final String itemName) { + return qualityUpdaters.getOrDefault(itemName.toUpperCase(), DEFAULT_UPDATER); + } +} diff --git a/Java/src/main/java/com/gildedrose/item/quality/type/QualifyUpdaterType.java b/Java/src/main/java/com/gildedrose/item/quality/type/QualifyUpdaterType.java new file mode 100644 index 00000000..a6cbdeb0 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/type/QualifyUpdaterType.java @@ -0,0 +1,19 @@ +package com.gildedrose.item.quality.type; + +public enum QualifyUpdaterType { + + AGED_BRIE("Aged Brie"), + BACKSTAGE_PASSES("Backstage passes to a TAFKAL80ETC concert"), + CONJURED("Conjured"), + SULFURAS("Sulfuras"); + + + QualifyUpdaterType(final String name) { + this.value = name; + } + private final String value; + + public String getValue() { + return value; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterAgedBrie.java b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterAgedBrie.java new file mode 100644 index 00000000..b977b994 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterAgedBrie.java @@ -0,0 +1,22 @@ +package com.gildedrose.item.quality.updater; + +import com.gildedrose.Item; +import com.gildedrose.item.quality.QualityUpdater; + +public class QualityUpdaterAgedBrie implements QualityUpdater { + public void updateQuality(final Item item) { + if (item.quality < MAX_LIMIT_QUALITY) { + increaseQuality(item); + } + item.sellIn--; + if (item.sellIn < MIM_LIMIT_SELL_IN) { + increaseQuality(item); + } + } + + private void increaseQuality(final Item item) { + if (item.quality < MAX_LIMIT_QUALITY) { + item.quality++; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterBackstagePasses.java b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterBackstagePasses.java new file mode 100644 index 00000000..b152008d --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterBackstagePasses.java @@ -0,0 +1,30 @@ +package com.gildedrose.item.quality.updater; + +import com.gildedrose.Item; +import com.gildedrose.item.quality.QualityUpdater; + +public class QualityUpdaterBackstagePasses implements QualityUpdater { + + private static final int FIRST_SELL_IN_LIMIT = 6; + private static final int SECOND_SELL_IN_LIMIT = 11; + + public void updateQuality(final Item item) { + increaseQuality(item); + if (item.sellIn < FIRST_SELL_IN_LIMIT) { + increaseQuality(item); + } + if (item.sellIn < SECOND_SELL_IN_LIMIT) { + increaseQuality(item); + } + item.sellIn--; + if (item.sellIn < MIM_LIMIT_SELL_IN) { + item.quality = MIM_LIMIT_QUALITY; + } + } + + private void increaseQuality(final Item item) { + if (item.quality < MAX_LIMIT_QUALITY) { + item.quality++; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterConjured.java b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterConjured.java new file mode 100644 index 00000000..5cd999d6 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterConjured.java @@ -0,0 +1,24 @@ +package com.gildedrose.item.quality.updater; + +import com.gildedrose.Item; +import com.gildedrose.item.quality.QualityUpdater; + +public class QualityUpdaterConjured implements QualityUpdater { + + private static final int AMOUNT_OF_QUALITY_TO_DECREASE = 2; + + public void updateQuality(final Item item) { + decreaseQuality(item); + updateSellIn(item); + } + + private void decreaseQuality(final Item item) { + if (item.quality > MIM_LIMIT_SELL_IN) { + item.quality -= AMOUNT_OF_QUALITY_TO_DECREASE; + } + } + + private void updateSellIn(final Item item) { + item.sellIn--; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterDefault.java b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterDefault.java new file mode 100644 index 00000000..456f25f2 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterDefault.java @@ -0,0 +1,24 @@ +package com.gildedrose.item.quality.updater; + +import com.gildedrose.Item; +import com.gildedrose.item.quality.QualityUpdater; + +public class QualityUpdaterDefault implements QualityUpdater { + public void updateQuality(final Item item) { + decreaseQuality(item); + updateSellIn(item); + if (item.sellIn < MIM_LIMIT_SELL_IN) { + decreaseQuality(item); + } + } + + private void decreaseQuality(final Item item) { + if (item.quality > MIM_LIMIT_QUALITY) { + item.quality--; + } + } + + private void updateSellIn(final Item item) { + item.sellIn--; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterSulfuras.java b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterSulfuras.java new file mode 100644 index 00000000..14c8d513 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/quality/updater/QualityUpdaterSulfuras.java @@ -0,0 +1,11 @@ +package com.gildedrose.item.quality.updater; + +import com.gildedrose.Item; +import com.gildedrose.item.quality.QualityUpdater; + +public class QualityUpdaterSulfuras implements QualityUpdater { + + public void updateQuality(final Item item) { + item.sellIn--; + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..af82a4c7 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -8,10 +8,109 @@ class GildedRoseTest { @Test void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; - GildedRose app = new GildedRose(items); + final String itemName = "foo"; + final Item[] items = new Item[]{createItem("foo", 0, 0)}; + final GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + + validateItem(items[0], itemName, -1, 0); } + @Test + public void testUpdateQualityConjuredItem() { + final String itemName = "Conjured"; + final Item[] items = new Item[]{createItem(itemName, 4, 8)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + validateItem(items[0], itemName, 3, 6); + } + + @Test + public void testUpdateQualitySulfuras() { + final String itemName = "Sulfuras"; + final Item[] items = new Item[]{new Item(itemName, 0, 80)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + + validateItem(items[0], itemName, -1, 80); + } + + @Test + public void testUpdateQualityBackstagePassesSelinDayLessThanZero() { + final String itemName = "Backstage passes to a TAFKAL80ETC concert"; + final Item[] items = new Item[]{new Item(itemName, 0, 50)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + + validateItem(items[0], itemName, -1, 0); + } + + @Test + public void testUpdateQualityBackstagePassesLessThanSixDays() { + final String itemName = "Backstage passes to a TAFKAL80ETC concert"; + final Item[] items = new Item[]{new Item(itemName, 5, 40)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + + validateItem(items[0], itemName, 4, 43); + } + + @Test + public void testUpdateQualityBackstagePassesGreaterThanElevenDays() { + final String itemName = "Backstage passes to a TAFKAL80ETC concert"; + final Item[] items = new Item[]{new Item(itemName, 12, 40)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + + validateItem(items[0], itemName, 11, 41); + } + + @Test + public void testUpdateQualityAgedBrieSelinGreaterThanZero() { + final String itemName = "Backstage passes to a TAFKAL80ETC concert"; + final Item[] items = new Item[]{new Item(itemName, 12, 39)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + + validateItem(items[0], itemName, 11, 40); + } + + @Test + public void testUpdateQualityAgedBrieSelinEqualToZero() { + final String itemName = "Aged Brie"; + final Item[] items = new Item[]{new Item(itemName, 0, 39)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + + validateItem(items[0], itemName, -1, 41); + } + + @Test + public void testUpdateQualityDefaultSelinEqualToZero() { + final String itemName = "Another foo"; + final Item[] items = new Item[]{new Item(itemName, 0, 40)}; + final GildedRose gildedRose = new GildedRose(items); + + gildedRose.updateQuality(); + + validateItem(items[0], itemName, -1, 38); + } + + private Item createItem(final String name, final int sellIn, final int quality) { + return new Item(name, sellIn, quality); + } + + private void validateItem(final Item item, final String expectedName, final int expectedSellIn, + final int expectedQuality) { + assertEquals(expectedName, item.name, "The name must be " + expectedName); + assertEquals(expectedSellIn, item.sellIn, "The sellIn must be " + expectedSellIn); + assertEquals(expectedQuality, item.quality, "The quality must be " + expectedQuality); + } }