diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 5c930e8b..9edc9e17 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,23 +1,12 @@ package com.gildedrose; -import com.gildedrose.core.InventoryRuleEngine; +import com.gildedrose.core.rule.InventoryRuleEngine; import com.gildedrose.domain.item.Item; import com.gildedrose.domain.item.ItemAdapter; import com.gildedrose.domain.item.ItemAdapterSimpleFactory; class GildedRose { - public static final String AGED_BRIE = "Aged Brie"; - public static final String BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert"; - public static final String SULFURAS = "Sulfuras, Hand of Ragnaros"; - - public static final int MINIMUM_QUALITY = 0; - public static final int MAXIMUM_QUALITY = 50; - - public static final int SELL_IN_DAY11 = 11; - public static final int SELL_IN_DAY6 = 6; - public static final int SELL_IN_EXPIRED = 0; - Item[] items; public GildedRose(Item[] items) { @@ -26,61 +15,8 @@ class GildedRose { public void updateQuality() { for (Item item : items) { - doUpdateQuality(item); + ItemAdapter itemAdapter = ItemAdapterSimpleFactory.createItemAdapter(item); + InventoryRuleEngine.applyUpdateRule(itemAdapter); } } - - private void doUpdateQuality(Item item) { - - boolean isAgedBrie = item.name.equals(AGED_BRIE); - boolean isBackstagePasses = item.name.equals(BACKSTAGE_PASSES); - boolean isSulfuras = item.name.equals(SULFURAS); - ItemAdapter itemAdapter = ItemAdapterSimpleFactory.createItemAdapter(item); - - if (isAgedBrie) { - InventoryRuleEngine.applyUpdateRule(itemAdapter); - } else if (isBackstagePasses) { - InventoryRuleEngine.applyUpdateRule(itemAdapter); - } else if (isSulfuras) { - InventoryRuleEngine.applyUpdateRule(itemAdapter); - } else { - //standard item - if (shouldDecreaseQuality(item)) { - decreaseQuality(item); - } - - decreaseDay(item); - - if (isExpired(item)) { - if (shouldDecreaseQuality(item)) { - decreaseQuality(item); - } - } - } - } - - private boolean shouldDecreaseQuality(Item item) { - return item.quality > MINIMUM_QUALITY; - } - - private boolean shouldIncreaseQuality(Item item) { - return item.quality < MAXIMUM_QUALITY; - } - - private void decreaseDay(Item item) { - item.sellIn = item.sellIn - 1; - } - - private boolean isExpired(Item item) { - return item.sellIn < SELL_IN_EXPIRED; - } - - private void decreaseQuality(Item item) { - item.quality = item.quality - 1; - } - - private void increaseQuality(Item item) { - item.quality = item.quality + 1; - } - } diff --git a/Java/src/main/java/com/gildedrose/application/agedbrie/AgedBrieRule.java b/Java/src/main/java/com/gildedrose/application/agedbrie/AgedBrieRule.java index 2caf54cf..f1dbfeaa 100644 --- a/Java/src/main/java/com/gildedrose/application/agedbrie/AgedBrieRule.java +++ b/Java/src/main/java/com/gildedrose/application/agedbrie/AgedBrieRule.java @@ -1,6 +1,6 @@ package com.gildedrose.application.agedbrie; -import com.gildedrose.core.rules.UpdateInventoryTemplateRule; +import com.gildedrose.core.rule.UpdateInventoryTemplateRule; import com.gildedrose.domain.item.ItemAdapter; public class AgedBrieRule extends UpdateInventoryTemplateRule { diff --git a/Java/src/main/java/com/gildedrose/application/backstagepasses/BackstagePassesRule.java b/Java/src/main/java/com/gildedrose/application/backstagepasses/BackstagePassesRule.java index 850ba2f5..a6c40c0b 100644 --- a/Java/src/main/java/com/gildedrose/application/backstagepasses/BackstagePassesRule.java +++ b/Java/src/main/java/com/gildedrose/application/backstagepasses/BackstagePassesRule.java @@ -1,6 +1,6 @@ package com.gildedrose.application.backstagepasses; -import com.gildedrose.core.rules.UpdateInventoryTemplateRule; +import com.gildedrose.core.rule.UpdateInventoryTemplateRule; import com.gildedrose.domain.item.ItemAdapter; public class BackstagePassesRule extends UpdateInventoryTemplateRule { diff --git a/Java/src/main/java/com/gildedrose/application/standard/StandardItemRule.java b/Java/src/main/java/com/gildedrose/application/standard/StandardItemRule.java new file mode 100644 index 00000000..88f98ee5 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/application/standard/StandardItemRule.java @@ -0,0 +1,27 @@ +package com.gildedrose.application.standard; + +import com.gildedrose.core.rule.UpdateInventoryTemplateRule; +import com.gildedrose.domain.item.ItemAdapter; + +public class StandardItemRule extends UpdateInventoryTemplateRule { + + @Override + protected boolean canSubtractSellIn(final ItemAdapter itemAdapter) { + return true; + } + + @Override + protected int getQualityFactor(final boolean isExpired, final ItemAdapter itemAdapter) { + return isExpired ? 2 : 1; + } + + @Override + protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { + return false; + } + + @Override + protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { + return true; + } +} diff --git a/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java b/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java index 5fba30b6..c5bddd9c 100644 --- a/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java +++ b/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java @@ -1,6 +1,6 @@ package com.gildedrose.application.sulfuras; -import com.gildedrose.core.rules.UpdateInventoryTemplateRule; +import com.gildedrose.core.rule.UpdateInventoryTemplateRule; import com.gildedrose.domain.item.ItemAdapter; public class SulfurasRule extends UpdateInventoryTemplateRule { diff --git a/Java/src/main/java/com/gildedrose/core/InventoryRuleEngine.java b/Java/src/main/java/com/gildedrose/core/rule/InventoryRuleEngine.java similarity index 85% rename from Java/src/main/java/com/gildedrose/core/InventoryRuleEngine.java rename to Java/src/main/java/com/gildedrose/core/rule/InventoryRuleEngine.java index 216ac632..7020c710 100644 --- a/Java/src/main/java/com/gildedrose/core/InventoryRuleEngine.java +++ b/Java/src/main/java/com/gildedrose/core/rule/InventoryRuleEngine.java @@ -1,9 +1,9 @@ -package com.gildedrose.core; +package com.gildedrose.core.rule; import com.gildedrose.application.agedbrie.AgedBrieRule; import com.gildedrose.application.backstagepasses.BackstagePassesRule; +import com.gildedrose.application.standard.StandardItemRule; import com.gildedrose.application.sulfuras.SulfurasRule; -import com.gildedrose.core.rules.UpdateInventoryTemplateRule; import com.gildedrose.domain.item.ItemAdapter; import com.gildedrose.domain.item.ItemType; @@ -16,6 +16,7 @@ public class InventoryRuleEngine { put(ItemType.AGEG_BRIE, new AgedBrieRule()); put(ItemType.SULFURAS, new SulfurasRule()); put(ItemType.BACKSTAGE_PASSES, new BackstagePassesRule()); + put(ItemType.STANDARD, new StandardItemRule()); }}; public static void applyUpdateRule(ItemAdapter itemAdapter) { diff --git a/Java/src/main/java/com/gildedrose/core/rules/UpdateInventoryTemplateRule.java b/Java/src/main/java/com/gildedrose/core/rule/UpdateInventoryTemplateRule.java similarity index 98% rename from Java/src/main/java/com/gildedrose/core/rules/UpdateInventoryTemplateRule.java rename to Java/src/main/java/com/gildedrose/core/rule/UpdateInventoryTemplateRule.java index 288db1f0..66c1d0cb 100644 --- a/Java/src/main/java/com/gildedrose/core/rules/UpdateInventoryTemplateRule.java +++ b/Java/src/main/java/com/gildedrose/core/rule/UpdateInventoryTemplateRule.java @@ -1,4 +1,4 @@ -package com.gildedrose.core.rules; +package com.gildedrose.core.rule; import com.gildedrose.domain.item.ItemAdapter; diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java deleted file mode 100644 index b8527e05..00000000 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.gildedrose; - -import com.gildedrose.domain.item.Item; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class GildedRoseTest { - - //GENERAL RULES - @Test - void whenSellInDateIsPassed_qualityDegradesTwiceAsFast() { - //given - Item testItem = new Item("standard item", 0, 3); - Item[] items = new Item[] {testItem}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(-1, app.items[0].sellIn); - assertEquals(1, app.items[0].quality); - } - - @Test - void qualityOfAnItemIsNeverNegative() { - //given - Item testItem = new Item("standard item", 0, 0); - Item[] items = new Item[] {testItem}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(-1, app.items[0].sellIn); - assertEquals(0, app.items[0].quality); - } - - @Test - void qualityOfAnItemIsNeverMoreThan50() { - //given - Item testItem = new Item("standard item", 5, 50); - Item[] items = new Item[] {testItem}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(4, app.items[0].sellIn); - assertEquals(50, app.items[0].quality); - } - - @Test - void standardItemQualityDecreasesByOne() { - //given - Item testItem = new Item("standard item", 5, 2); - Item[] items = new Item[] {testItem}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(4, app.items[0].sellIn); - assertEquals(1, app.items[0].quality); - } - -} diff --git a/Java/src/test/java/com/gildedrose/application/aggedbrie/AgedBrieRuleTest.java b/Java/src/test/java/com/gildedrose/application/aggedbrie/AgedBrieRuleTest.java index e8ee68ef..e68b18b2 100644 --- a/Java/src/test/java/com/gildedrose/application/aggedbrie/AgedBrieRuleTest.java +++ b/Java/src/test/java/com/gildedrose/application/aggedbrie/AgedBrieRuleTest.java @@ -39,4 +39,34 @@ public class AgedBrieRuleTest { assertEquals(-1, agedBrieAdapter.getItem().sellIn); assertEquals(4, agedBrieAdapter.getItem().quality); } + + @Test + void agedBrieQualityIncreasesNoMoreThan50() { + //given + Item agedBrie = new Item("Aged Brie", 5, 50); + ItemAdapter agedBrieAdapter = new ItemAdapter(ItemType.AGEG_BRIE, agedBrie); + AgedBrieRule agedBrieRule = new AgedBrieRule(); + + //when + agedBrieRule.processItem(agedBrieAdapter); + + //then + assertEquals(4, agedBrieAdapter.getItem().sellIn); + assertEquals(50, agedBrieAdapter.getItem().quality); + } + + @Test + void agedBrieQualityIncreasesNoMoreThan50WhenIsExpired() { + //given + Item agedBrie = new Item("Aged Brie", 0, 50); + ItemAdapter agedBrieAdapter = new ItemAdapter(ItemType.AGEG_BRIE, agedBrie); + AgedBrieRule agedBrieRule = new AgedBrieRule(); + + //when + agedBrieRule.processItem(agedBrieAdapter); + + //then + assertEquals(-1, agedBrieAdapter.getItem().sellIn); + assertEquals(50, agedBrieAdapter.getItem().quality); + } } diff --git a/Java/src/test/java/com/gildedrose/application/backstagepasses/BackstagePassesRuleTest.java b/Java/src/test/java/com/gildedrose/application/backstagepasses/BackstagePassesRuleTest.java index b286b977..a8b03f3c 100644 --- a/Java/src/test/java/com/gildedrose/application/backstagepasses/BackstagePassesRuleTest.java +++ b/Java/src/test/java/com/gildedrose/application/backstagepasses/BackstagePassesRuleTest.java @@ -68,4 +68,49 @@ public class BackstagePassesRuleTest { assertEquals(-1, backstageAdapter.getItem().sellIn); assertEquals(0, backstageAdapter.getItem().quality); } + + @Test + void backStageQualityIncreasesNoMoreThan50WhenThereAre5DaysOrLess() { + //given + Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 50); + ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5); + BackstagePassesRule backstagePassesRule = new BackstagePassesRule(); + + //when + backstagePassesRule.processItem(backstageAdapter); + + //then + assertEquals(4, backstageAdapter.getItem().sellIn); + assertEquals(50, backstageAdapter.getItem().quality); + } + + @Test + void backStageQualityIncreasesNoMoreThan50WhenThereAre10DaysOrLess() { + //given + Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 50); + ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5); + BackstagePassesRule backstagePassesRule = new BackstagePassesRule(); + + //when + backstagePassesRule.processItem(backstageAdapter); + + //then + assertEquals(9, backstageAdapter.getItem().sellIn); + assertEquals(50, backstageAdapter.getItem().quality); + } + + @Test + void backStageQualityIncreasesNoMoreThan50WhenIsGreaterThan10Days() { + //given + Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 11, 50); + ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5); + BackstagePassesRule backstagePassesRule = new BackstagePassesRule(); + + //when + backstagePassesRule.processItem(backstageAdapter); + + //then + assertEquals(10, backstageAdapter.getItem().sellIn); + assertEquals(50, backstageAdapter.getItem().quality); + } } diff --git a/Java/src/test/java/com/gildedrose/application/standard/StandardItemRuleTest.java b/Java/src/test/java/com/gildedrose/application/standard/StandardItemRuleTest.java new file mode 100644 index 00000000..c876c470 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/application/standard/StandardItemRuleTest.java @@ -0,0 +1,56 @@ +package com.gildedrose.application.standard; + +import com.gildedrose.domain.item.Item; +import com.gildedrose.domain.item.ItemAdapter; +import com.gildedrose.domain.item.ItemType; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StandardItemRuleTest { + + @Test + void whenSellInDateIsPassed_qualityDegradesTwiceAsFast() { + //given + Item testItem = new Item("standard item", 0, 3); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, testItem); + StandardItemRule standardItemRule = new StandardItemRule(); + + //when + standardItemRule.processItem(itemAdapter); + + //then + assertEquals(-1, itemAdapter.getItem().sellIn); + assertEquals(1, itemAdapter.getItem().quality); + } + + @Test + void qualityOfAnItemIsNeverNegative() { + //given + Item testItem = new Item("standard item", 0, 0); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, testItem); + StandardItemRule standardItemRule = new StandardItemRule(); + + //when + standardItemRule.processItem(itemAdapter); + + //then + assertEquals(-1, itemAdapter.getItem().sellIn); + assertEquals(0, itemAdapter.getItem().quality); + } + + @Test + void standardItemQualityDecreasesByOne() { + //given + Item testItem = new Item("standard item", 5, 2); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, testItem); + StandardItemRule standardItemRule = new StandardItemRule(); + + //when + standardItemRule.processItem(itemAdapter); + + //then + assertEquals(4, itemAdapter.getItem().sellIn); + assertEquals(1, itemAdapter.getItem().quality); + } +} diff --git a/Java/src/test/java/com/gildedrose/core/InventoryRuleEngineTest.java b/Java/src/test/java/com/gildedrose/core/rule/InventoryRuleEngineTest.java similarity index 94% rename from Java/src/test/java/com/gildedrose/core/InventoryRuleEngineTest.java rename to Java/src/test/java/com/gildedrose/core/rule/InventoryRuleEngineTest.java index 46c0f673..1e7cd554 100644 --- a/Java/src/test/java/com/gildedrose/core/InventoryRuleEngineTest.java +++ b/Java/src/test/java/com/gildedrose/core/rule/InventoryRuleEngineTest.java @@ -1,4 +1,4 @@ -package com.gildedrose.core; +package com.gildedrose.core.rule; import com.gildedrose.domain.item.Item; import com.gildedrose.domain.item.ItemAdapter; diff --git a/Java/src/test/java/com/gildedrose/core/rules/UpdateInventoryTemplateRuleTest.java b/Java/src/test/java/com/gildedrose/core/rule/UpdateInventoryTemplateRuleTest.java similarity index 98% rename from Java/src/test/java/com/gildedrose/core/rules/UpdateInventoryTemplateRuleTest.java rename to Java/src/test/java/com/gildedrose/core/rule/UpdateInventoryTemplateRuleTest.java index bae7a4ca..f468a084 100644 --- a/Java/src/test/java/com/gildedrose/core/rules/UpdateInventoryTemplateRuleTest.java +++ b/Java/src/test/java/com/gildedrose/core/rule/UpdateInventoryTemplateRuleTest.java @@ -1,4 +1,4 @@ -package com.gildedrose.core.rules; +package com.gildedrose.core.rule; import com.gildedrose.domain.item.Item; import com.gildedrose.domain.item.ItemAdapter;