diff --git a/Java/pom.xml b/Java/pom.xml
index 3bd6aff8..9ed838ed 100644
--- a/Java/pom.xml
+++ b/Java/pom.xml
@@ -40,6 +40,20 @@
maven-surefire-plugin
${maven.maven-surefire-plugin.version}
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 9
+ 9
+
+
+
+ com.hubspot.maven.plugins
+ prettier-maven-plugin
+
+ 0.8
+
diff --git a/Java/src/main/java/com/gildedrose/AgedBrieItem.java b/Java/src/main/java/com/gildedrose/AgedBrieItem.java
deleted file mode 100644
index 410635b6..00000000
--- a/Java/src/main/java/com/gildedrose/AgedBrieItem.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.gildedrose;
-
-public class AgedBrieItem {
- public static void handleDay(Item item) {
- if (item.quality != 50) {
- item.quality += 1;
- }
- item.sellIn -= 1;
- }
-}
diff --git a/Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java b/Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java
new file mode 100644
index 00000000..a0eb58f0
--- /dev/null
+++ b/Java/src/main/java/com/gildedrose/AgedBrieItemHandler.java
@@ -0,0 +1,14 @@
+package com.gildedrose;
+
+public class AgedBrieItemHandler extends ItemHandler {
+
+ public AgedBrieItemHandler() {}
+
+ @Override
+ public void handleDay(Item item) {
+ if (item.quality != 50) {
+ item.quality += 1;
+ }
+ item.sellIn -= 1;
+ }
+}
diff --git a/Java/src/main/java/com/gildedrose/BackstagePassesItem.java b/Java/src/main/java/com/gildedrose/BackstagePassesItem.java
deleted file mode 100644
index fd8cf19b..00000000
--- a/Java/src/main/java/com/gildedrose/BackstagePassesItem.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.gildedrose;
-
-public class BackstagePassesItem {
- public static void handleDay(Item item) {
- // todo: make it so these items can't be initialized with over 50
- if (item.quality == 50) {
- return;
- }
- if (item.sellIn == 0) {
- item.quality = 0;
- } else if (item.sellIn <= 5) {
- item.quality += 3;
- } else if (item.sellIn <= 10) {
- item.quality += 2;
- }
- item.sellIn -= 1;
- }
-}
diff --git a/Java/src/main/java/com/gildedrose/BackstagePassesItemHandler.java b/Java/src/main/java/com/gildedrose/BackstagePassesItemHandler.java
new file mode 100644
index 00000000..337031ff
--- /dev/null
+++ b/Java/src/main/java/com/gildedrose/BackstagePassesItemHandler.java
@@ -0,0 +1,20 @@
+package com.gildedrose;
+
+public class BackstagePassesItemHandler extends ItemHandler {
+
+ @Override
+ public void handleDay(Item item) {
+ // todo: make it so these items can't be initialized with over 50
+ if (item.quality == 50) {
+ return;
+ }
+ if (item.sellIn == 0) {
+ item.quality = 0;
+ } else if (item.sellIn <= 5) {
+ item.quality += 3;
+ } else if (item.sellIn <= 10) {
+ item.quality += 2;
+ }
+ item.sellIn -= 1;
+ }
+}
diff --git a/Java/src/main/java/com/gildedrose/GenericItem.java b/Java/src/main/java/com/gildedrose/GenericItemHandler.java
similarity index 63%
rename from Java/src/main/java/com/gildedrose/GenericItem.java
rename to Java/src/main/java/com/gildedrose/GenericItemHandler.java
index a7f5c942..beba8258 100644
--- a/Java/src/main/java/com/gildedrose/GenericItem.java
+++ b/Java/src/main/java/com/gildedrose/GenericItemHandler.java
@@ -1,7 +1,9 @@
package com.gildedrose;
-public class GenericItem {
- public static void handleDay(Item item) {
+public class GenericItemHandler extends ItemHandler {
+
+ @Override
+ public void handleDay(Item item) {
item.sellIn -= 1;
if (item.quality == 0) {
return;
diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java
index 61587415..f3d98db6 100644
--- a/Java/src/main/java/com/gildedrose/GildedRose.java
+++ b/Java/src/main/java/com/gildedrose/GildedRose.java
@@ -1,35 +1,45 @@
package com.gildedrose;
+import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
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";
-
- final List- items;
+ public static final String BACKSTAGE_PASSES =
+ "Backstage passes to a TAFKAL80ETC concert";
+ private static Map> itemHandlerMap = Map.of(
+ AGED_BRIE,
+ AgedBrieItemHandler.class,
+ SULFURAS,
+ SulfurasItemHandler.class,
+ BACKSTAGE_PASSES,
+ BackstagePassesItemHandler.class
+ );
+ // make package-private
+ public final List
- items;
public GildedRose(Item[] items) {
this.items = Arrays.asList(items);
}
+ // 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)
+ .getDeclaredConstructor()
+ .newInstance();
+ itemHandler.handleDay(item);
+ } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
public void updateQuality() {
items.forEach(GildedRose::handleDay);
}
-
- private static void handleDay(Item item) {
- switch (item.name) {
- case AGED_BRIE:
- AgedBrieItem.handleDay(item);
- return;
- case SULFURAS:
- return;
- case BACKSTAGE_PASSES:
- BackstagePassesItem.handleDay(item);
- return;
- default:
- GenericItem.handleDay(item);
- }
- }
}
diff --git a/Java/src/main/java/com/gildedrose/Item.java b/Java/src/main/java/com/gildedrose/Item.java
index 465729ec..8728dcf7 100644
--- a/Java/src/main/java/com/gildedrose/Item.java
+++ b/Java/src/main/java/com/gildedrose/Item.java
@@ -1,21 +1,20 @@
package com.gildedrose;
public class Item {
+ public String name;
- public String name;
+ public int sellIn;
- public int sellIn;
+ public int quality;
- public int quality;
+ public Item(String name, int sellIn, int quality) {
+ this.name = name;
+ this.sellIn = sellIn;
+ this.quality = quality;
+ }
- public Item(String name, int sellIn, int quality) {
- this.name = name;
- this.sellIn = sellIn;
- this.quality = quality;
- }
-
- @Override
- public String toString() {
- return this.name + ", " + this.sellIn + ", " + this.quality;
- }
+ @Override
+ public String toString() {
+ return this.name + ", " + this.sellIn + ", " + this.quality;
+ }
}
diff --git a/Java/src/main/java/com/gildedrose/ItemHandler.java b/Java/src/main/java/com/gildedrose/ItemHandler.java
new file mode 100644
index 00000000..2395d81d
--- /dev/null
+++ b/Java/src/main/java/com/gildedrose/ItemHandler.java
@@ -0,0 +1,6 @@
+package com.gildedrose;
+
+public abstract class ItemHandler {
+
+ public void handleDay(Item item) {}
+}
diff --git a/Java/src/main/java/com/gildedrose/ItemType.java b/Java/src/main/java/com/gildedrose/ItemType.java
new file mode 100644
index 00000000..02d73908
--- /dev/null
+++ b/Java/src/main/java/com/gildedrose/ItemType.java
@@ -0,0 +1,3 @@
+package com.gildedrose;
+
+public enum ItemType {}
diff --git a/Java/src/main/java/com/gildedrose/SulfurasItem.java b/Java/src/main/java/com/gildedrose/SulfurasItem.java
deleted file mode 100644
index 7aaef7cb..00000000
--- a/Java/src/main/java/com/gildedrose/SulfurasItem.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.gildedrose;
-
-public class SulfurasItem {
-}
diff --git a/Java/src/main/java/com/gildedrose/SulfurasItemHandler.java b/Java/src/main/java/com/gildedrose/SulfurasItemHandler.java
new file mode 100644
index 00000000..935b6abc
--- /dev/null
+++ b/Java/src/main/java/com/gildedrose/SulfurasItemHandler.java
@@ -0,0 +1,3 @@
+package com.gildedrose;
+
+public class SulfurasItemHandler extends ItemHandler {}
diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java
index 975bf66a..0a9f10f1 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 org.junit.jupiter.api.Test;
-
import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
+
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(GildedRose.AGED_BRIE, 2, 0) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, 1);
@@ -20,7 +20,9 @@ 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(GildedRose.SULFURAS, sellIn, SULFURAS_QUALITY)
+ };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).sellIn, sellIn);
@@ -30,7 +32,9 @@ class GildedRoseTest {
@Test
public void sulfurasValueNeverChanges() {
- Item[] items = new Item[]{new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)};
+ Item[] items = new Item[] {
+ new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)
+ };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, SULFURAS_QUALITY);
@@ -40,7 +44,9 @@ class GildedRoseTest {
@Test
public void sulfurasValueIsAlways80() {
- Item[] items = new Item[]{new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)};
+ Item[] items = new Item[] {
+ new Item(GildedRose.SULFURAS, 10, SULFURAS_QUALITY)
+ };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, SULFURAS_QUALITY);
@@ -49,7 +55,9 @@ 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(GildedRose.BACKSTAGE_PASSES, 10, quality)
+ };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, 2);
@@ -60,7 +68,9 @@ 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(GildedRose.BACKSTAGE_PASSES, 5, quality)
+ };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, 3);
@@ -73,7 +83,9 @@ 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(GildedRose.BACKSTAGE_PASSES, 1, quality)
+ };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, 13);
@@ -85,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);
@@ -97,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(GildedRose.AGED_BRIE, 5, 50) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, 50);
@@ -109,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(GildedRose.BACKSTAGE_PASSES, 5, 50) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).quality, 50);
@@ -121,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);
@@ -133,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);
@@ -145,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(GildedRose.AGED_BRIE, 5, 1) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).sellIn, 4);
@@ -157,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(GildedRose.BACKSTAGE_PASSES, 5, 1) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).sellIn, 4);
@@ -169,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);
@@ -181,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);
@@ -193,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(GildedRose.AGED_BRIE, 1, 1) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).sellIn, 0);
@@ -205,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(GildedRose.BACKSTAGE_PASSES, 1, 1) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(app.items.get(0).sellIn, 0);
@@ -217,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)
};
diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java
index 35060206..6bb4490a 100644
--- a/Java/src/test/java/com/gildedrose/TexttestFixture.java
+++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java
@@ -1,35 +1,36 @@
package com.gildedrose;
public class TexttestFixture {
- public static void main(String[] args) {
- 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), //
- new Item("Sulfuras, Hand of Ragnaros", 0, 80), //
- new Item("Sulfuras, Hand of Ragnaros", -1, 80),
- new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20),
- new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49),
- new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49),
- // this conjured item does not work properly yet
- new Item("Conjured Mana Cake", 3, 6) };
- GildedRose app = new GildedRose(items);
+ public static void main(String[] args) {
+ 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), //
+ new Item("Sulfuras, Hand of Ragnaros", 0, 80), //
+ new Item("Sulfuras, Hand of Ragnaros", -1, 80),
+ new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20),
+ new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49),
+ new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49),
+ // this conjured item does not work properly yet
+ new Item("Conjured Mana Cake", 3, 6)
+ };
- int days = 2;
- if (args.length > 0) {
- days = Integer.parseInt(args[0]) + 1;
- }
+ GildedRose app = new GildedRose(items);
- for (int i = 0; i < days; i++) {
- System.out.println("-------- day " + i + " --------");
- System.out.println("name, sellIn, quality");
- for (Item item : items) {
- System.out.println(item);
- }
- System.out.println();
- app.updateQuality();
- }
+ int days = 2;
+ if (args.length > 0) {
+ days = Integer.parseInt(args[0]) + 1;
}
+ for (int i = 0; i < days; i++) {
+ System.out.println("-------- day " + i + " --------");
+ System.out.println("name, sellIn, quality");
+ for (Item item : items) {
+ System.out.println(item);
+ }
+ System.out.println();
+ app.updateQuality();
+ }
+ }
}