diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index f817da99..5c930e8b 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -38,31 +38,11 @@ class GildedRose { ItemAdapter itemAdapter = ItemAdapterSimpleFactory.createItemAdapter(item); if (isAgedBrie) { - InventoryRuleEngine.processUpdateInventoryRule(itemAdapter); + InventoryRuleEngine.applyUpdateRule(itemAdapter); } else if (isBackstagePasses) { - if (shouldIncreaseQuality(item)) { - increaseQuality(item); - - if (item.sellIn < SELL_IN_DAY11) { - if (shouldIncreaseQuality(item)) { - increaseQuality(item); - } - } - - if (item.sellIn < SELL_IN_DAY6) { - if (shouldIncreaseQuality(item)) { - increaseQuality(item); - } - } - } - - decreaseDay(item); - - if (isExpired(item)) { - item.quality = MINIMUM_QUALITY; - } + InventoryRuleEngine.applyUpdateRule(itemAdapter); } else if (isSulfuras) { - InventoryRuleEngine.processUpdateInventoryRule(itemAdapter); + InventoryRuleEngine.applyUpdateRule(itemAdapter); } else { //standard item if (shouldDecreaseQuality(item)) { 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 a1299f40..2caf54cf 100644 --- a/Java/src/main/java/com/gildedrose/application/agedbrie/AgedBrieRule.java +++ b/Java/src/main/java/com/gildedrose/application/agedbrie/AgedBrieRule.java @@ -16,12 +16,12 @@ public class AgedBrieRule extends UpdateInventoryTemplateRule { } @Override - protected boolean canIncreaseQuality(final ItemAdapter itemAdapter) { + protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { return true; } @Override - protected boolean canDecreaseQuality(final ItemAdapter itemAdapter) { + protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { return false; } } diff --git a/Java/src/main/java/com/gildedrose/application/backstagepasses/BackstagePassesRule.java b/Java/src/main/java/com/gildedrose/application/backstagepasses/BackstagePassesRule.java new file mode 100644 index 00000000..850ba2f5 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/application/backstagepasses/BackstagePassesRule.java @@ -0,0 +1,40 @@ +package com.gildedrose.application.backstagepasses; + +import com.gildedrose.core.rules.UpdateInventoryTemplateRule; +import com.gildedrose.domain.item.ItemAdapter; + +public class BackstagePassesRule extends UpdateInventoryTemplateRule { + + final int SELL_IN_DAY10 = 10; + final int SELL_IN_DAY5 = 5; + + @Override + protected boolean canSubtractSellIn(final ItemAdapter itemAdapter) { + return true; + } + + @Override + protected int getQualityFactor(final boolean isExpired, final ItemAdapter itemAdapter) { + return isExpired ? itemAdapter.getItem().quality : checkSellInRange(itemAdapter); + } + + @Override + protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { + return !isExpired; + } + + @Override + protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { + return isExpired; + } + + private int checkSellInRange(final ItemAdapter itemAdapter) { + int qualityFactor = 1; + if (itemAdapter.getItem().sellIn <= SELL_IN_DAY5) { + qualityFactor = 3; + } else if (itemAdapter.getItem().sellIn <= SELL_IN_DAY10) { + qualityFactor = 2; + } + return qualityFactor; + } +} 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 555258f0..5fba30b6 100644 --- a/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java +++ b/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java @@ -16,12 +16,12 @@ public class SulfurasRule extends UpdateInventoryTemplateRule { } @Override - protected boolean canIncreaseQuality(final ItemAdapter itemAdapter) { + protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { return false; } @Override - protected boolean canDecreaseQuality(final ItemAdapter itemAdapter) { + protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) { return false; } } diff --git a/Java/src/main/java/com/gildedrose/core/InventoryRuleEngine.java b/Java/src/main/java/com/gildedrose/core/InventoryRuleEngine.java index cfd17e8a..216ac632 100644 --- a/Java/src/main/java/com/gildedrose/core/InventoryRuleEngine.java +++ b/Java/src/main/java/com/gildedrose/core/InventoryRuleEngine.java @@ -1,6 +1,7 @@ package com.gildedrose.core; import com.gildedrose.application.agedbrie.AgedBrieRule; +import com.gildedrose.application.backstagepasses.BackstagePassesRule; import com.gildedrose.application.sulfuras.SulfurasRule; import com.gildedrose.core.rules.UpdateInventoryTemplateRule; import com.gildedrose.domain.item.ItemAdapter; @@ -14,9 +15,10 @@ public class InventoryRuleEngine { private static final Map updateInventoryRules = new HashMap<>(){{ put(ItemType.AGEG_BRIE, new AgedBrieRule()); put(ItemType.SULFURAS, new SulfurasRule()); + put(ItemType.BACKSTAGE_PASSES, new BackstagePassesRule()); }}; - public static void processUpdateInventoryRule(ItemAdapter itemAdapter) { + public static void applyUpdateRule(ItemAdapter itemAdapter) { if (null != updateInventoryRules.get(itemAdapter.getItemType())) { updateInventoryRules.get(itemAdapter.getItemType()).processItem(itemAdapter); } diff --git a/Java/src/main/java/com/gildedrose/core/rules/UpdateInventoryTemplateRule.java b/Java/src/main/java/com/gildedrose/core/rules/UpdateInventoryTemplateRule.java index d22257a1..288db1f0 100644 --- a/Java/src/main/java/com/gildedrose/core/rules/UpdateInventoryTemplateRule.java +++ b/Java/src/main/java/com/gildedrose/core/rules/UpdateInventoryTemplateRule.java @@ -11,33 +11,33 @@ public abstract class UpdateInventoryTemplateRule { public final void processItem(final ItemAdapter itemAdapter) { + boolean isExpired = isExpired(itemAdapter); + int qualityFactor = getQualityFactor(isExpired, itemAdapter); + + if (canIncreaseQuality(isExpired, itemAdapter)) { + increaseQuality(itemAdapter, qualityFactor); + } + if (canSubtractSellIn(itemAdapter)) { subtractSellIn(itemAdapter); } - boolean isExpired = isExpired(itemAdapter); - int qualityFactor = getQualityFactor(isExpired, itemAdapter); - - if (canIncreaseQuality(itemAdapter)) { - increaseQuality(itemAdapter, qualityFactor); - } - - if (canDecreaseQuality(itemAdapter)) { + if (canDecreaseQuality(isExpired, itemAdapter)) { decreaseQuality(itemAdapter, qualityFactor); } } protected abstract boolean canSubtractSellIn(final ItemAdapter itemAdapter); protected abstract int getQualityFactor(final boolean isExpired, final ItemAdapter itemAdapter); - protected abstract boolean canIncreaseQuality(final ItemAdapter itemAdapter); - protected abstract boolean canDecreaseQuality(final ItemAdapter itemAdapter); + protected abstract boolean canIncreaseQuality(final boolean isExpired, final ItemAdapter itemAdapter); + protected abstract boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter); private void subtractSellIn(final ItemAdapter itemAdapter) { itemAdapter.getItem().sellIn -= SELL_IN_UNIT; } private boolean isExpired(final ItemAdapter itemAdapter) { - return itemAdapter.getItem().sellIn < SELL_IN_EXPIRED; + return itemAdapter.getItem().sellIn <= SELL_IN_EXPIRED; } private void increaseQuality(final ItemAdapter itemAdapter, final int qualityFactor) { @@ -47,6 +47,6 @@ public abstract class UpdateInventoryTemplateRule { private void decreaseQuality(final ItemAdapter itemAdapter, final int qualityFactor) { int decreasedQuality = itemAdapter.getItem().quality - qualityFactor; - itemAdapter.getItem().quality = Math.min(decreasedQuality, MINIMUM_QUALITY); + itemAdapter.getItem().quality = Math.max(decreasedQuality, MINIMUM_QUALITY); } } diff --git a/Java/src/test/java/com/gildedrose/BackStageTest.java b/Java/src/test/java/com/gildedrose/BackStageTest.java deleted file mode 100644 index 5354bdb3..00000000 --- a/Java/src/test/java/com/gildedrose/BackStageTest.java +++ /dev/null @@ -1,62 +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 BackStageTest { - - @Test - void backStageQualityIncreasesByTwoWhenThereAre10DaysOrLess() { - //given - Item backStage10 = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 2); - Item backStage6 = new Item("Backstage passes to a TAFKAL80ETC concert", 6, 2); - Item[] items = new Item[] {backStage10, backStage6}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(9, app.items[0].sellIn); - assertEquals(4, app.items[0].quality); - - assertEquals(5, app.items[1].sellIn); - assertEquals(4, app.items[1].quality); - } - - @Test - void backStageQualityIncreasesByThreeWhenThereAre5DaysOrLess() { - //given - Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 3); - Item backStage4 = new Item("Backstage passes to a TAFKAL80ETC concert", 4, 3); - Item[] items = new Item[] {backStage5, backStage4}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(4, app.items[0].sellIn); - assertEquals(6, app.items[0].quality); - - assertEquals(3, app.items[1].sellIn); - assertEquals(6, app.items[1].quality); - } - - @Test - void backStageQualityDecreasesToZeroWhenIsExpired() { - //given - Item backStage = new Item("Backstage passes to a TAFKAL80ETC concert", 0, 3); - Item[] items = new Item[] {backStage}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(-1, app.items[0].sellIn); - assertEquals(0, 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 d4e4171b..4ac7fff3 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -16,11 +16,12 @@ public class TexttestFixture { 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) }; + new Item("Conjured Mana Cake", 3, 6) + }; GildedRose app = new GildedRose(items); - int days = 5; + int days = 32; if (args.length > 0) { days = Integer.parseInt(args[0]) + 1; } diff --git a/Java/src/test/java/com/gildedrose/application/backstagepasses/BackstagePassesRuleTest.java b/Java/src/test/java/com/gildedrose/application/backstagepasses/BackstagePassesRuleTest.java new file mode 100644 index 00000000..b286b977 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/application/backstagepasses/BackstagePassesRuleTest.java @@ -0,0 +1,71 @@ +package com.gildedrose.application.backstagepasses; + +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 BackstagePassesRuleTest { + + @Test + void backStageQualityIncreasesByOneWhenIsGreaterThan10Days() { + //given + Item backStage11 = new Item("Backstage passes to a TAFKAL80ETC concert", 11, 2); + ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage11); + BackstagePassesRule backstagePassesRule = new BackstagePassesRule(); + + //when + backstagePassesRule.processItem(backstageAdapter); + + //then + assertEquals(10, backstageAdapter.getItem().sellIn); + assertEquals(3, backstageAdapter.getItem().quality); + } + + @Test + void backStageQualityIncreasesByTwoWhenThereAre10DaysOrLess() { + //given + Item backStage10 = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 2); + ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage10); + BackstagePassesRule backstagePassesRule = new BackstagePassesRule(); + + //when + backstagePassesRule.processItem(backstageAdapter); + + //then + assertEquals(9, backstageAdapter.getItem().sellIn); + assertEquals(4, backstageAdapter.getItem().quality); + } + + @Test + void backStageQualityIncreasesByThreeWhenThereAre5DaysOrLess() { + //given + Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 3); + ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5); + BackstagePassesRule backstagePassesRule = new BackstagePassesRule(); + + //when + backstagePassesRule.processItem(backstageAdapter); + + //then + assertEquals(4, backstageAdapter.getItem().sellIn); + assertEquals(6, backstageAdapter.getItem().quality); + } + + @Test + void backStageQualityDecreasesToZeroWhenIsExpired() { + //given + Item backStage = new Item("Backstage passes to a TAFKAL80ETC concert", 0, 3); + ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage); + BackstagePassesRule backstagePassesRule = new BackstagePassesRule(); + + //when + backstagePassesRule.processItem(backstageAdapter); + + //then + assertEquals(-1, backstageAdapter.getItem().sellIn); + assertEquals(0, backstageAdapter.getItem().quality); + } +} diff --git a/Java/src/test/java/com/gildedrose/core/InventoryRuleEngineTest.java b/Java/src/test/java/com/gildedrose/core/InventoryRuleEngineTest.java index 77281000..46c0f673 100644 --- a/Java/src/test/java/com/gildedrose/core/InventoryRuleEngineTest.java +++ b/Java/src/test/java/com/gildedrose/core/InventoryRuleEngineTest.java @@ -14,7 +14,7 @@ public class InventoryRuleEngineTest { ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Aged Brie", 3, 0)); //when - InventoryRuleEngine.processUpdateInventoryRule(itemAdapter); + InventoryRuleEngine.applyUpdateRule(itemAdapter); //then assertEquals(2, itemAdapter.getItem().sellIn); diff --git a/Java/src/test/java/com/gildedrose/core/rules/UpdateInventoryTemplateRuleTest.java b/Java/src/test/java/com/gildedrose/core/rules/UpdateInventoryTemplateRuleTest.java index 56d00dab..bae7a4ca 100644 --- a/Java/src/test/java/com/gildedrose/core/rules/UpdateInventoryTemplateRuleTest.java +++ b/Java/src/test/java/com/gildedrose/core/rules/UpdateInventoryTemplateRuleTest.java @@ -13,7 +13,7 @@ public class UpdateInventoryTemplateRuleTest { void processItemCorrectly() { //given UpdateInventoryTemplateRule testRule = createTestRule(true, true, true); - ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Just a test item", 3, 0)); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, new Item("Just a test item", 3, 0)); //when testRule.processItem(itemAdapter); @@ -26,20 +26,20 @@ public class UpdateInventoryTemplateRuleTest { void processItemCorrectlyWhenIsExpired() { //given UpdateInventoryTemplateRule testRule = createTestRule(true, true, true); - ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Just a test item", 0, 2)); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, new Item("Just a test item", 0, 2)); //when testRule.processItem(itemAdapter); //then assertEquals(-1, itemAdapter.getItem().sellIn); - assertEquals(0, itemAdapter.getItem().quality); + assertEquals(2, itemAdapter.getItem().quality); } @Test void processItemCorrectlyWhenNoChangesAreAllowed() { //given UpdateInventoryTemplateRule testRule = createTestRule(false, false, false); - ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Just a test item", 10, 2)); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, new Item("Just a test item", 10, 2)); //when testRule.processItem(itemAdapter); @@ -63,12 +63,12 @@ public class UpdateInventoryTemplateRuleTest { } @Override - protected boolean canIncreaseQuality(ItemAdapter itemAdapter) { + protected boolean canIncreaseQuality(boolean isExpired, ItemAdapter itemAdapter) { return canIncreaseQuality; } @Override - protected boolean canDecreaseQuality(ItemAdapter itemAdapter) { + protected boolean canDecreaseQuality(boolean isExpired, ItemAdapter itemAdapter) { return canDecreaseQuality; } };