diff --git a/Java/pom.xml b/Java/pom.xml index 3bd6aff8..b6805a1d 100644 --- a/Java/pom.xml +++ b/Java/pom.xml @@ -10,7 +10,7 @@ 0.0.1-SNAPSHOT - 1.8 + 21 5.8.2 3.1 3.0.0-M4 diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..674d4fc4 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,37 @@ package com.gildedrose; +import com.gildedrose.rule.AgedBrieRule; +import com.gildedrose.rule.BackstageRule; +import com.gildedrose.rule.ConjuredRule; +import com.gildedrose.rule.NormalRule; +import com.gildedrose.rule.Rule; +import com.gildedrose.rule.SulfurasRule; + +import java.util.ArrayList; +import java.util.List; + class GildedRose { Item[] items; + List rules; public GildedRose(Item[] items) { this.items = items; + rules = new ArrayList<>(); + rules.add(new NormalRule()); + rules.add(new AgedBrieRule()); + rules.add(new BackstageRule()); + rules.add(new SulfurasRule()); + rules.add(new ConjuredRule()); + } 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) { + rules.stream() + .filter(rule -> rule.match(item)) + .forEach(rule -> rule.apply(item)); } } } + + diff --git a/Java/src/main/java/com/gildedrose/rule/AgedBrieRule.java b/Java/src/main/java/com/gildedrose/rule/AgedBrieRule.java new file mode 100644 index 00000000..f1e7775b --- /dev/null +++ b/Java/src/main/java/com/gildedrose/rule/AgedBrieRule.java @@ -0,0 +1,22 @@ +package com.gildedrose.rule; + +import com.gildedrose.Item; + +import static com.gildedrose.rule.Goods.AGED_BRIE; + +public class AgedBrieRule implements Rule { + @Override + public boolean match(Item item) { + return AGED_BRIE.equals(Goods.valueOfLabel(item.name)); + } + + @Override + public void apply(Item item) { + increaseQuality(item); + item.sellIn -= 1; + //code below doesn't match with requirements + if (item.sellIn < 0) { + increaseQuality(item); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/rule/BackstageRule.java b/Java/src/main/java/com/gildedrose/rule/BackstageRule.java new file mode 100644 index 00000000..fedb0775 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/rule/BackstageRule.java @@ -0,0 +1,27 @@ +package com.gildedrose.rule; + +import com.gildedrose.Item; + +import static com.gildedrose.rule.Goods.BACKSTAGE; + +public class BackstageRule implements Rule{ + @Override + public boolean match(Item item) { + return BACKSTAGE.equals(Goods.valueOfLabel(item.name)); + } + + @Override + public void apply(Item item) { + increaseQuality(item); + if (item.sellIn < 11) { + increaseQuality(item); + } + if (item.sellIn < 6) { + increaseQuality(item); + } + item.sellIn -= 1; + if (item.sellIn < 0) { + item.quality = 0; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/rule/ConjuredRule.java b/Java/src/main/java/com/gildedrose/rule/ConjuredRule.java new file mode 100644 index 00000000..f24547b6 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/rule/ConjuredRule.java @@ -0,0 +1,24 @@ +package com.gildedrose.rule; + +import com.gildedrose.Item; + +import static com.gildedrose.rule.Goods.CONJURED; + +public class ConjuredRule implements Rule { + @Override + public boolean match(Item item) { + return CONJURED.equals(Goods.valueOfLabel(item.name)); + } + + @Override + public void apply(Item item) { + item.sellIn--; + decreaseQuality(item); + decreaseQuality(item); + if (item.sellIn < 0) { + decreaseQuality(item); + decreaseQuality(item); + } + + } +} diff --git a/Java/src/main/java/com/gildedrose/rule/Goods.java b/Java/src/main/java/com/gildedrose/rule/Goods.java new file mode 100644 index 00000000..c09d9e4c --- /dev/null +++ b/Java/src/main/java/com/gildedrose/rule/Goods.java @@ -0,0 +1,23 @@ +package com.gildedrose.rule; + +public enum Goods { + AGED_BRIE("Aged Brie"), + BACKSTAGE("Backstage passes to a TAFKAL80ETC concert"), + SULFURAS("Sulfuras, Hand of Ragnaros"), + CONJURED("Conjured"); + + public final String label; + + Goods(String label) { + this.label = label; + } + + public static Goods valueOfLabel(String label) { + for (Goods e : values()) { + if (e.label.equals(label)) { + return e; + } + } + return null; + } +} diff --git a/Java/src/main/java/com/gildedrose/rule/NormalRule.java b/Java/src/main/java/com/gildedrose/rule/NormalRule.java new file mode 100644 index 00000000..6ed34e19 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/rule/NormalRule.java @@ -0,0 +1,19 @@ +package com.gildedrose.rule; + +import com.gildedrose.Item; + +public class NormalRule implements Rule { + @Override + public boolean match(Item item) { + return Goods.valueOfLabel(item.name) == null; + } + + @Override + public void apply(Item item) { + item.sellIn--; + decreaseQuality(item); + if (item.sellIn < 0) { + decreaseQuality(item); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/rule/Rule.java b/Java/src/main/java/com/gildedrose/rule/Rule.java new file mode 100644 index 00000000..a52a3de6 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/rule/Rule.java @@ -0,0 +1,21 @@ +package com.gildedrose.rule; + +import com.gildedrose.Item; + +public interface Rule { + boolean match(Item item); + + void apply(Item item); + + default void increaseQuality(Item item) { + if (item.quality < 50) { + item.quality += 1; + } + } + + default void decreaseQuality(Item item) { + if (item.quality > 0) { + item.quality -= 1; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/rule/SulfurasRule.java b/Java/src/main/java/com/gildedrose/rule/SulfurasRule.java new file mode 100644 index 00000000..f667288f --- /dev/null +++ b/Java/src/main/java/com/gildedrose/rule/SulfurasRule.java @@ -0,0 +1,17 @@ +package com.gildedrose.rule; + +import com.gildedrose.Item; + +import static com.gildedrose.rule.Goods.SULFURAS; + +public class SulfurasRule implements Rule { + @Override + public boolean match(Item item) { + return SULFURAS.equals(Goods.valueOfLabel(item.name)); + } + + @Override + public void apply(Item item) { + item.quality = 80; + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..1cac0e09 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -8,10 +8,86 @@ class GildedRoseTest { @Test void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; + Item[] items = new Item[]{new Item("foo", 0, 0)}; GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + assertEquals("foo", app.items[0].name); } + @Test + void normalItem() { + GildedRose gildedRose = newGildedRose("normal item", 8, 30); + + for (int i = 0; i < 10; i++) { + gildedRose.updateQuality(); + } + + assertEquals(-2, gildedRose.items[0].sellIn); + assertEquals(18, gildedRose.items[0].quality); + } + + @Test + void agedBrieItem() { + GildedRose gildedRose = newGildedRose("Aged Brie", 8, 30); + + for (int i = 0; i < 10; i++) { + gildedRose.updateQuality(); + } + + assertEquals(-2, gildedRose.items[0].sellIn); + assertEquals(42, gildedRose.items[0].quality); + } + + @Test + void backstageItem() { + GildedRose gildedRose = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 15, 10); + + for (int i = 0; i < 15; i++) { + gildedRose.updateQuality(); + } + + assertEquals(0, gildedRose.items[0].sellIn); + assertEquals(40, gildedRose.items[0].quality); + } + + @Test + void backstageItemExpired() { + GildedRose gildedRose = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 15, 10); + + for (int i = 0; i < 16; i++) { + gildedRose.updateQuality(); + } + + assertEquals(-1, gildedRose.items[0].sellIn); + assertEquals(0, gildedRose.items[0].quality); + } + + @Test + void conjuredItem() { + GildedRose gildedRose = newGildedRose("Conjured", 8, 30); + + for (int i = 0; i < 10; i++) { + gildedRose.updateQuality(); + } + + assertEquals(-2, gildedRose.items[0].sellIn); + assertEquals(6, gildedRose.items[0].quality); + } + + @Test + void sulfurasItem() { + GildedRose gildedRose = newGildedRose("Sulfuras, Hand of Ragnaros", 8, 80); + + for (int i = 0; i < 10; i++) { + gildedRose.updateQuality(); + } + + assertEquals(8, gildedRose.items[0].sellIn); + assertEquals(80, gildedRose.items[0].quality); + } + + private GildedRose newGildedRose(String itemName, int itemSellIn, int itemQuality) { + Item[] items = new Item[]{new Item(itemName, itemSellIn, itemQuality)}; + return new GildedRose(items); + } }