mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-16 06:51:27 +00:00
Add ItemType enum
This commit is contained in:
parent
6a2c95d1a8
commit
79a430019f
@ -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<String, Class<? extends ItemHandler>> itemHandlerMap = Map.of(
|
||||
AGED_BRIE,
|
||||
private static final Map<ItemType, Class<? extends ItemHandler>> 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<Item> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user