diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..5351dbcc 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,21 @@ package com.gildedrose; +import com.gildedrose.item.Item; +import com.gildedrose.item.CustomisedItemFactory; + class GildedRose { + + private final CustomisedItemFactory itemFactory; Item[] items; public GildedRose(Item[] items) { this.items = items; + this.itemFactory = new CustomisedItemFactory(); } 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) { + itemFactory.customiseItem(item).updateState(); } } } \ No newline at end of file diff --git a/Java/src/main/java/com/gildedrose/item/AgedBrie.java b/Java/src/main/java/com/gildedrose/item/AgedBrie.java new file mode 100644 index 00000000..d096eeb9 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/AgedBrie.java @@ -0,0 +1,13 @@ +package com.gildedrose.item; + +class AgedBrie extends CustomisedItem { + + AgedBrie(Item item) { + super(item); + } + + @Override + int updatedItemQuality() { + return item.quality += 1; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/BackstagePassesItem.java b/Java/src/main/java/com/gildedrose/item/BackstagePassesItem.java new file mode 100644 index 00000000..1db96874 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/BackstagePassesItem.java @@ -0,0 +1,33 @@ +package com.gildedrose.item; + +class BackstagePassesItem extends CustomisedItem { + + BackstagePassesItem(Item item) { + super(item); + } + + @Override + int updatedItemQuality() { + if (sellByDayValueIsOver(10)) { + return qualityIncreasedBy(1); + } else if (sellByDayValueIsOver(5)) { + return qualityIncreasedBy(2); + } else if (sellByDayValueIsOver(0)) { + return qualityIncreasedBy(3); + } else { + return qualityDroppedToZero(); + } + } + + private boolean sellByDayValueIsOver(int dayNumber) { + return item.sellIn > dayNumber; + } + + private int qualityIncreasedBy(int qualityValue) { + return item.quality += qualityValue; + } + + private int qualityDroppedToZero() { + return 0; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/ConjuredItem.java b/Java/src/main/java/com/gildedrose/item/ConjuredItem.java new file mode 100644 index 00000000..e4f61761 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/ConjuredItem.java @@ -0,0 +1,21 @@ +package com.gildedrose.item; + +class ConjuredItem extends CustomisedItem { + + ConjuredItem(Item item) { + super(item); + } + + @Override + int updatedItemQuality() { + if (sellByDayValueIsOverZero()) { + return item.quality -= 2; + } else { + return item.quality -= 4; + } + } + + private boolean sellByDayValueIsOverZero() { + return item.sellIn > 0; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/CustomisedItem.java b/Java/src/main/java/com/gildedrose/item/CustomisedItem.java new file mode 100644 index 00000000..9cb5ace1 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/CustomisedItem.java @@ -0,0 +1,35 @@ +package com.gildedrose.item; + +public abstract class CustomisedItem { + + public final Item item; + + CustomisedItem(Item item) { + this.item = item; + } + + public final void updateState() { + item.sellIn = updatedItemSellIn(); + item.quality = updatedItemQuality(); + + if (hasReachedLowestQualityValue()) { + item.quality = QualityValues.lowestValuePossible(); + } else if (hasReachedHighestQualityValue()) { + item.quality = QualityValues.highestValuePossible(item); + } + } + + int updatedItemSellIn() { + return item.sellIn -= 1; + } + + abstract int updatedItemQuality(); + + private boolean hasReachedHighestQualityValue() { + return item.quality > QualityValues.highestValuePossible(item); + } + + private boolean hasReachedLowestQualityValue() { + return item.quality < QualityValues.lowestValuePossible(); + } +} diff --git a/Java/src/main/java/com/gildedrose/item/CustomisedItemFactory.java b/Java/src/main/java/com/gildedrose/item/CustomisedItemFactory.java new file mode 100644 index 00000000..4be371cd --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/CustomisedItemFactory.java @@ -0,0 +1,33 @@ +package com.gildedrose.item; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class CustomisedItemFactory { + + private final static Map> ITEM_TYPES_LIST = new HashMap<>(); + public final static String SULFURAS = "Sulfuras, Hand of Ragnaros"; + public final static String BRIE = "Aged Brie"; + public final static String BACKSTAGE_PASSES_ITEM = "Backstage passes to a TAFKAL80ETC concert"; + public final static String CONJURED_ITEM = "Conjured"; + + public CustomisedItemFactory() { + ITEM_TYPES_LIST.put(SULFURAS, Sulfuras::new); + ITEM_TYPES_LIST.put(BRIE, AgedBrie::new); + ITEM_TYPES_LIST.put(BACKSTAGE_PASSES_ITEM, BackstagePassesItem::new); + ITEM_TYPES_LIST.put(CONJURED_ITEM, ConjuredItem::new); + } + + public CustomisedItem customiseItem(Item item) { + String name = item.name; + if (isStandardItem(name)) { + return new StandardItem(item); + } + return ITEM_TYPES_LIST.get(name).apply(item); + } + + private boolean isStandardItem(String name) { + return !ITEM_TYPES_LIST.keySet().contains(name); + } +} diff --git a/Java/src/main/java/com/gildedrose/Item.java b/Java/src/main/java/com/gildedrose/item/Item.java similarity index 81% rename from Java/src/main/java/com/gildedrose/Item.java rename to Java/src/main/java/com/gildedrose/item/Item.java index 465729ec..d756624b 100644 --- a/Java/src/main/java/com/gildedrose/Item.java +++ b/Java/src/main/java/com/gildedrose/item/Item.java @@ -1,4 +1,4 @@ -package com.gildedrose; +package com.gildedrose.item; public class Item { @@ -14,8 +14,8 @@ public class Item { this.quality = quality; } - @Override - public String toString() { + @Override + public String toString() { return this.name + ", " + this.sellIn + ", " + this.quality; } } diff --git a/Java/src/main/java/com/gildedrose/item/QualityValues.java b/Java/src/main/java/com/gildedrose/item/QualityValues.java new file mode 100644 index 00000000..2d4cffd9 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/QualityValues.java @@ -0,0 +1,15 @@ +package com.gildedrose.item; + +final class QualityValues { + + static int lowestValuePossible() { + return 0; + } + + static int highestValuePossible(Item item) { + if (item.name.equals(CustomisedItemFactory.SULFURAS)) { + return 80; + } + return 50; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/StandardItem.java b/Java/src/main/java/com/gildedrose/item/StandardItem.java new file mode 100644 index 00000000..5aa1fdae --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/StandardItem.java @@ -0,0 +1,21 @@ +package com.gildedrose.item; + +class StandardItem extends CustomisedItem { + + StandardItem(Item item) { + super(item); + } + + @Override + int updatedItemQuality() { + if (sellByDayValueIsOverZero()) { + return item.quality -= 1; + } else { + return item.quality -= 2; + } + } + + private boolean sellByDayValueIsOverZero() { + return item.sellIn > 0; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/Sulfuras.java b/Java/src/main/java/com/gildedrose/item/Sulfuras.java new file mode 100644 index 00000000..dbb29e6e --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/Sulfuras.java @@ -0,0 +1,18 @@ +package com.gildedrose.item; + +class Sulfuras extends CustomisedItem { + + Sulfuras(Item item) { + super(item); + } + + @Override + int updatedItemSellIn() { + return item.sellIn; + } + + @Override + int updatedItemQuality() { + return item.quality; + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 95bfddc4..a27b2d6e 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -2,16 +2,203 @@ package com.gildedrose; import static org.junit.Assert.*; +import com.gildedrose.item.CustomisedItem; +import com.gildedrose.item.Item; +import com.gildedrose.item.CustomisedItemFactory; import org.junit.Test; public class GildedRoseTest { @Test public void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; - GildedRose app = new GildedRose(items); + GildedRose app = newGildedRose("foo", 0, 0); + app.updateQuality(); - assertEquals("fixme", app.items[0].name); + + assertEquals("foo", app.items[0].name); } + @Test + public void standardItemDecreasesSellByDayNumberEachTime() { + GildedRose app = newGildedRose("standard item", 0, 0); + + app.updateQuality(); + + assertEquals(-1, itemSellByDayNumber(app)); + } + + @Test + public void brieDecreasesSellByDayNumberEachTime() { + GildedRose app = newGildedRose(CustomisedItemFactory.BRIE, 0, 0); + + app.updateQuality(); + + assertEquals(-1, itemSellByDayNumber(app)); + } + + @Test + public void backstagePassesItemDecreasesSellByDayNumberEachTime() { + GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 0, 0); + + app.updateQuality(); + + assertEquals(-1, itemSellByDayNumber(app)); + } + + @Test + public void conjuredItemDecreasesSellByDayNumberEachTime() { + GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM, 0, 0); + + app.updateQuality(); + + assertEquals(-1, itemSellByDayNumber(app)); + } + + @Test + public void brieIncreasesInQualityEachTime() { + GildedRose app = newGildedRose(CustomisedItemFactory.BRIE, 1, 1); + + app.updateQuality(); + + assertEquals(2, itemQualityValue(app)); + } + + @Test + public void brieQualityCannotGoAboveFiftyWhenIncreasing() { + GildedRose app = newGildedRose(CustomisedItemFactory.BRIE, 1, 49); + + app.updateQuality(); + app.updateQuality(); + + assertEquals(50, itemQualityValue(app)); + } + + @Test + public void backstagePassesItemIncreasesQualityByOneIfSellByDayMoreThanEleven() { + GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 12, 1); + + app.updateQuality(); + + assertEquals(2, itemQualityValue(app)); + } + + @Test + public void backstagePassesItemIncreasesQualityByTwoIfSellByDayIsMoreThanSix() { + GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 10, 1); + + app.updateQuality(); + + assertEquals(3, itemQualityValue(app)); + } + + @Test + public void backstagePassesItemIncreasesQualityByThreeIfSellByDayIsMoreThanZero() { + GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 1); + + app.updateQuality(); + + assertEquals(4, itemQualityValue(app)); + } + + @Test + public void backstagePassesItemQualityDropsToZeroIfSellByDayIsZeroOrLess() { + GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 0,50); + + app.updateQuality(); + + assertEquals(0, itemQualityValue(app)); + } + + @Test + public void backstagePassesItemQualityCannotGoAboveFiftyWhenIncreasing() { + GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 50); + + app.updateQuality(); + + assertEquals(50, itemQualityValue(app)); + } + + @Test + public void standardItemDecreasesQualityByOneIfSellByDayIsAboveZero() { + GildedRose app = newGildedRose("foo", 2, 1); + + app.updateQuality(); + + assertEquals(0, itemQualityValue(app)); + } + + @Test + public void standardItemDecreasesQualityByTwoOnceSellByDayIsZeroOrLess() { + GildedRose app = newGildedRose("foo",0, 5); + + app.updateQuality(); + + assertEquals(3, itemQualityValue(app)); + } + + @Test + public void standardItemCannotHaveQualityBelowZero() { + GildedRose app = newGildedRose("foo", 0, 0); + + app.updateQuality(); + + assertEquals(0, itemQualityValue(app)); + } + + @Test + public void sulfurasHasQualityEighty() { + GildedRose app = newGildedRose(CustomisedItemFactory.SULFURAS, 1, 80); + + assertEquals(80, itemQualityValue(app)); + } + + @Test + public void sulfurasItemDoesNotAlterValues() { + GildedRose app = newGildedRose(CustomisedItemFactory.SULFURAS, 1, 80); + + app.updateQuality(); + + assertEquals(80, itemQualityValue(app)); + assertEquals(1, itemSellByDayNumber(app)); + } + + @Test + public void conjuredItemDecreasesQualityByTwoIfSellByDayIsAboveZero() { + GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM, 2, 5); + + app.updateQuality(); + + assertEquals(3, itemQualityValue(app)); + } + + @Test + public void conjuredItemDecreasesQualityByFourOnceSellByDayIsZeroOrLess() { + GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM,0, 5); + + app.updateQuality(); + + assertEquals(1, itemQualityValue(app)); + } + + @Test + public void conjuredItemCannotHaveQualityBelowZero() { + GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM, 0, 0); + + app.updateQuality(); + + assertEquals(0, itemQualityValue(app)); + } + + private GildedRose newGildedRose(String itemName, int itemSellIn, int itemQuality) { + Item[] items = new Item[] { new Item(itemName, itemSellIn, itemQuality)}; + return new GildedRose(items); + } + + private int itemSellByDayNumber(GildedRose app) { + return app.items[0].sellIn; + } + + private int itemQualityValue(GildedRose app) { + return app.items[0].quality; + } } diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java index d059c88f..e2b2ce1d 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -1,5 +1,7 @@ package com.gildedrose; +import com.gildedrose.item.Item; + public class TexttestFixture { public static void main(String[] args) { System.out.println("OMGHAI!");