From 79a430019f665306523f88eba1ed8f6824fced79 Mon Sep 17 00:00:00 2001 From: Richard Xu Date: Thu, 22 Dec 2022 16:36:14 -0500 Subject: [PATCH] Add ItemType enum --- .../main/java/com/gildedrose/GildedRose.java | 28 +++++----- .../main/java/com/gildedrose/ItemType.java | 25 ++++++++- .../java/com/gildedrose/GildedRoseTest.java | 54 +++++++++---------- 3 files changed, 66 insertions(+), 41 deletions(-) diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index f3d98db6..1660fc26 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -6,17 +6,15 @@ import java.util.List; import java.util.Map; class GildedRose { - public static final String AGED_BRIE = "Aged Brie"; - public static final String SULFURAS = "Sulfuras, Hand of Ragnaros"; - public static final String BACKSTAGE_PASSES = - "Backstage passes to a TAFKAL80ETC concert"; - private static Map> itemHandlerMap = Map.of( - AGED_BRIE, + private static final Map> ITEM_HANDLER_MAP = Map.of( + ItemType.AGED_BRIE, AgedBrieItemHandler.class, - SULFURAS, + ItemType.SULFURAS, SulfurasItemHandler.class, - BACKSTAGE_PASSES, - BackstagePassesItemHandler.class + ItemType.BACKSTAGE_PASSES, + BackstagePassesItemHandler.class, + ItemType.GENERIC, + GenericItemHandler.class ); // make package-private public final List items; @@ -27,14 +25,18 @@ class GildedRose { // todo: refactor this to use Guice private static void handleDay(Item item) { - // todo: refactor to use enum try { - ItemHandler itemHandler = itemHandlerMap - .getOrDefault(item.name, GenericItemHandler.class) + ItemHandler itemHandler = ITEM_HANDLER_MAP + .get(ItemType.forDisplayName(item.name)) .getDeclaredConstructor() .newInstance(); itemHandler.handleDay(item); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + } catch ( + InstantiationException + | IllegalAccessException + | InvocationTargetException + | NoSuchMethodException e + ) { throw new RuntimeException(e); } } diff --git a/Java/src/main/java/com/gildedrose/ItemType.java b/Java/src/main/java/com/gildedrose/ItemType.java index 02d73908..3c578565 100644 --- a/Java/src/main/java/com/gildedrose/ItemType.java +++ b/Java/src/main/java/com/gildedrose/ItemType.java @@ -1,3 +1,26 @@ package com.gildedrose; -public enum ItemType {} +import java.util.Arrays; + +public enum ItemType { + AGED_BRIE("Aged Brie"), + SULFURAS("Sulfuras, Hand of Ragnaros"), + BACKSTAGE_PASSES("Backstage passes to a TAFKAL80ETC concert"), + GENERIC("Generic item"); + + private final String displayName; + + ItemType(String displayName) { + this.displayName = displayName; + } + + public static ItemType forDisplayName(String displayName) { + return Arrays + .stream(ItemType.values()) + .filter(itemType -> itemType.getDisplayName().equals(displayName)).findFirst().orElse(GENERIC); + } + + public String getDisplayName() { + return displayName; + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 0a9f10f1..4d83f246 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -1,15 +1,15 @@ package com.gildedrose; -import static org.junit.jupiter.api.Assertions.assertEquals; - import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + class GildedRoseTest { private static final int SULFURAS_QUALITY = 80; @Test public void agedBrieIncreasesInQualityByOneEachDay() { - Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 2, 0) }; + Item[] items = new Item[]{new Item(ItemType.AGED_BRIE.getDisplayName(), 2, 0)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 1); @@ -20,8 +20,8 @@ class GildedRoseTest { @Test public void sulfurasSellInDateNeverChanges() { int sellIn = 10; - Item[] items = new Item[] { - new Item(GildedRose.SULFURAS, sellIn, SULFURAS_QUALITY) + Item[] items = new Item[]{ + new Item(ItemType.SULFURAS.getDisplayName(), sellIn, SULFURAS_QUALITY) }; GildedRose app = new GildedRose(items); app.updateQuality(); @@ -32,8 +32,8 @@ class GildedRoseTest { @Test public void sulfurasValueNeverChanges() { - Item[] items = new Item[] { - new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY) + Item[] items = new Item[]{ + new Item(ItemType.SULFURAS.getDisplayName(), 10, SULFURAS_QUALITY) }; GildedRose app = new GildedRose(items); app.updateQuality(); @@ -44,8 +44,8 @@ class GildedRoseTest { @Test public void sulfurasValueIsAlways80() { - Item[] items = new Item[] { - new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY) + Item[] items = new Item[]{ + new Item(ItemType.SULFURAS.getDisplayName(), 10, SULFURAS_QUALITY) }; GildedRose app = new GildedRose(items); app.updateQuality(); @@ -55,8 +55,8 @@ class GildedRoseTest { @Test public void backstagePassesQualityIncreasesByTwoWhenThereAreTenDaysOrLessBeforeTheConcert() { int quality = 0; - Item[] items = new Item[] { - new Item(GildedRose.BACKSTAGE_PASSES, 10, quality) + Item[] items = new Item[]{ + new Item(ItemType.BACKSTAGE_PASSES.getDisplayName(), 10, quality) }; GildedRose app = new GildedRose(items); app.updateQuality(); @@ -68,8 +68,8 @@ class GildedRoseTest { @Test public void backstagePassesQualityIncreasesByThreeWhenThereAreFiveDaysOrLessBeforeTheConcert() { int quality = 0; - Item[] items = new Item[] { - new Item(GildedRose.BACKSTAGE_PASSES, 5, quality) + Item[] items = new Item[]{ + new Item(ItemType.BACKSTAGE_PASSES.getDisplayName(), 5, quality) }; GildedRose app = new GildedRose(items); app.updateQuality(); @@ -83,8 +83,8 @@ class GildedRoseTest { @Test public void backstagePassesQualityDropsToZeroAfterTheConcert() { int quality = 10; - Item[] items = new Item[] { - new Item(GildedRose.BACKSTAGE_PASSES, 1, quality) + Item[] items = new Item[]{ + new Item(ItemType.BACKSTAGE_PASSES.getDisplayName(), 1, quality) }; GildedRose app = new GildedRose(items); app.updateQuality(); @@ -97,7 +97,7 @@ class GildedRoseTest { public void qualityIsNeverNegativeForGenericItems() { // todo: should add a similar case for conjured int quality = 1; - Item[] items = new Item[] { new Item("generic item", 5, quality) }; + Item[] items = new Item[]{new Item("generic item", 5, quality)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 0); @@ -109,7 +109,7 @@ class GildedRoseTest { @Test public void qualityIsNeverOverFiftyForAgedBrie() { - Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 5, 50) }; + Item[] items = new Item[]{new Item(ItemType.AGED_BRIE.getDisplayName(), 5, 50)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 50); @@ -121,7 +121,7 @@ class GildedRoseTest { @Test public void qualityIsNeverOverFiftyForBackstagePasses() { - Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 5, 50) }; + Item[] items = new Item[]{new Item(ItemType.BACKSTAGE_PASSES.getDisplayName(), 5, 50)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 50); @@ -133,7 +133,7 @@ class GildedRoseTest { @Test public void qualityDecreasesByOneEachDayForGenericItems() { - Item[] items = new Item[] { new Item("generic item", 5, 5) }; + Item[] items = new Item[]{new Item("generic item", 5, 5)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 4); @@ -145,7 +145,7 @@ class GildedRoseTest { @Test public void qualityDecreasesByTwoEachDayForGenericItemsAfterSellInDate() { - Item[] items = new Item[] { new Item("generic item", 1, 6) }; + Item[] items = new Item[]{new Item("generic item", 1, 6)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).quality, 5); @@ -157,7 +157,7 @@ class GildedRoseTest { @Test public void sellInDateDecreasesByOneEachDayForAgedBrie() { - Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 5, 1) }; + Item[] items = new Item[]{new Item(ItemType.AGED_BRIE.getDisplayName(), 5, 1)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 4); @@ -169,7 +169,7 @@ class GildedRoseTest { @Test public void sellInDateDecreasesByOneEachDayForBackstagePasses() { - Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 5, 1) }; + Item[] items = new Item[]{new Item(ItemType.BACKSTAGE_PASSES.getDisplayName(), 5, 1)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 4); @@ -181,7 +181,7 @@ class GildedRoseTest { @Test public void sellInDateDecreasesByOneEachDayForGenericItems() { - Item[] items = new Item[] { new Item("generic item", 5, 1) }; + Item[] items = new Item[]{new Item("generic item", 5, 1)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 4); @@ -193,7 +193,7 @@ class GildedRoseTest { @Test public void sellInDateCanBeNegativeForGenericItems() { - Item[] items = new Item[] { new Item("generic item", 1, 1) }; + Item[] items = new Item[]{new Item("generic item", 1, 1)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 0); @@ -205,7 +205,7 @@ class GildedRoseTest { @Test public void sellInDateCanBeNegativeForAgedBrie() { - Item[] items = new Item[] { new Item(GildedRose.AGED_BRIE, 1, 1) }; + Item[] items = new Item[]{new Item(ItemType.AGED_BRIE.getDisplayName(), 1, 1)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 0); @@ -217,7 +217,7 @@ class GildedRoseTest { @Test public void sellInDateCanBeNegativeForBackStagePasses() { - Item[] items = new Item[] { new Item(GildedRose.BACKSTAGE_PASSES, 1, 1) }; + Item[] items = new Item[]{new Item(ItemType.BACKSTAGE_PASSES.getDisplayName(), 1, 1)}; GildedRose app = new GildedRose(items); app.updateQuality(); assertEquals(app.items.get(0).sellIn, 0); @@ -229,7 +229,7 @@ class GildedRoseTest { @Test public void itUpdatesAllItemsPassedIn() { - Item[] items = new Item[] { + Item[] items = new Item[]{ new Item("generic item 1", 5, 5), new Item("generic item 2", 5, 10) };