From 7c87dedf5770951e8d6bf3a2e2788c32637af627 Mon Sep 17 00:00:00 2001 From: villanibe Date: Mon, 30 Jun 2025 01:50:49 +0200 Subject: [PATCH] Adding new feature - Conjured item --- .../application/conjured/ConjuredRule.java | 27 ++++++++++++ .../core/rule/InventoryRuleEngine.java | 2 + .../domain/item/ItemAdapterSimpleFactory.java | 5 +++ .../com/gildedrose/domain/item/ItemType.java | 3 +- .../java/com/gildedrose/TexttestFixture.java | 1 - .../conjured/ConjuredRuleTest.java | 41 +++++++++++++++++++ .../core/rule/InventoryRuleEngineTest.java | 14 +++++++ .../item/ItemAdapterSimpleFactoryTest.java | 13 ++++++ .../gildedrose/domain/item/ItemTypeTest.java | 22 +++++++--- 9 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/application/conjured/ConjuredRule.java create mode 100644 Java/src/test/java/com/gildedrose/application/conjured/ConjuredRuleTest.java diff --git a/Java/src/main/java/com/gildedrose/application/conjured/ConjuredRule.java b/Java/src/main/java/com/gildedrose/application/conjured/ConjuredRule.java new file mode 100644 index 00000000..790e0624 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/application/conjured/ConjuredRule.java @@ -0,0 +1,27 @@ +package com.gildedrose.application.conjured; + +import com.gildedrose.core.rule.UpdateInventoryTemplateRule; +import com.gildedrose.domain.item.ItemAdapter; + +public class ConjuredRule extends UpdateInventoryTemplateRule { + + @Override + protected boolean canSubtractSellIn(ItemAdapter itemAdapter) { + return true; + } + + @Override + protected int getQualityFactor(boolean isExpired, ItemAdapter itemAdapter) { + return 2; + } + + @Override + protected boolean canIncreaseQuality(boolean isExpired, ItemAdapter itemAdapter) { + return false; + } + + @Override + protected boolean canDecreaseQuality(boolean isExpired, ItemAdapter itemAdapter) { + return true; + } +} diff --git a/Java/src/main/java/com/gildedrose/core/rule/InventoryRuleEngine.java b/Java/src/main/java/com/gildedrose/core/rule/InventoryRuleEngine.java index 7020c710..c5de5cee 100644 --- a/Java/src/main/java/com/gildedrose/core/rule/InventoryRuleEngine.java +++ b/Java/src/main/java/com/gildedrose/core/rule/InventoryRuleEngine.java @@ -2,6 +2,7 @@ package com.gildedrose.core.rule; import com.gildedrose.application.agedbrie.AgedBrieRule; import com.gildedrose.application.backstagepasses.BackstagePassesRule; +import com.gildedrose.application.conjured.ConjuredRule; import com.gildedrose.application.standard.StandardItemRule; import com.gildedrose.application.sulfuras.SulfurasRule; import com.gildedrose.domain.item.ItemAdapter; @@ -17,6 +18,7 @@ public class InventoryRuleEngine { put(ItemType.SULFURAS, new SulfurasRule()); put(ItemType.BACKSTAGE_PASSES, new BackstagePassesRule()); put(ItemType.STANDARD, new StandardItemRule()); + put(ItemType.CONJURED, new ConjuredRule()); }}; public static void applyUpdateRule(ItemAdapter itemAdapter) { diff --git a/Java/src/main/java/com/gildedrose/domain/item/ItemAdapterSimpleFactory.java b/Java/src/main/java/com/gildedrose/domain/item/ItemAdapterSimpleFactory.java index 5bbb1d48..7c148bbe 100644 --- a/Java/src/main/java/com/gildedrose/domain/item/ItemAdapterSimpleFactory.java +++ b/Java/src/main/java/com/gildedrose/domain/item/ItemAdapterSimpleFactory.java @@ -10,6 +10,7 @@ public final class ItemAdapterSimpleFactory { case AGEG_BRIE -> createAgedBrie(item); case BACKSTAGE_PASSES -> createBackStagePasses(item); case SULFURAS -> createSulfuras(item); + case CONJURED -> createConjured(item); default -> createStandardItem(item); }; } @@ -29,4 +30,8 @@ public final class ItemAdapterSimpleFactory { private static ItemAdapter createStandardItem(Item item) { return new ItemAdapter(ItemType.STANDARD, item); } + + private static ItemAdapter createConjured(Item item) { + return new ItemAdapter(ItemType.CONJURED, item); + } } diff --git a/Java/src/main/java/com/gildedrose/domain/item/ItemType.java b/Java/src/main/java/com/gildedrose/domain/item/ItemType.java index 727bd303..7a22bb92 100644 --- a/Java/src/main/java/com/gildedrose/domain/item/ItemType.java +++ b/Java/src/main/java/com/gildedrose/domain/item/ItemType.java @@ -7,7 +7,8 @@ public enum ItemType { STANDARD("Standard item"), AGEG_BRIE("Aged Brie"), BACKSTAGE_PASSES("Backstage passes to a TAFKAL80ETC concert"), - SULFURAS ("Sulfuras, Hand of Ragnaros") + SULFURAS ("Sulfuras, Hand of Ragnaros"), + CONJURED("Conjured Mana Cake") ; private final String name; diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java index 4ac7fff3..5c79a249 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -15,7 +15,6 @@ public class TexttestFixture { 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) }; diff --git a/Java/src/test/java/com/gildedrose/application/conjured/ConjuredRuleTest.java b/Java/src/test/java/com/gildedrose/application/conjured/ConjuredRuleTest.java new file mode 100644 index 00000000..03f5b5e2 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/application/conjured/ConjuredRuleTest.java @@ -0,0 +1,41 @@ +package com.gildedrose.application.conjured; + +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 ConjuredRuleTest { + + @Test + void conjuredItemQualityDecreasesByTwo() { + //given + Item testItem = new Item("Conjured Mana Cake", 3, 6); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.CONJURED, testItem); + ConjuredRule conjuredRule = new ConjuredRule(); + + //when + conjuredRule.processItem(itemAdapter); + + //then + assertEquals(2, itemAdapter.getItem().sellIn); + assertEquals(4, itemAdapter.getItem().quality); + } + + @Test + void conjuredItemQualityDecreasesByTwoWhenExpired() { + //given + Item testItem = new Item("Conjured Mana Cake", 0, 6); + ItemAdapter itemAdapter = new ItemAdapter(ItemType.CONJURED, testItem); + ConjuredRule conjuredRule = new ConjuredRule(); + + //when + conjuredRule.processItem(itemAdapter); + + //then + assertEquals(-1, itemAdapter.getItem().sellIn); + assertEquals(4, itemAdapter.getItem().quality); + } +} diff --git a/Java/src/test/java/com/gildedrose/core/rule/InventoryRuleEngineTest.java b/Java/src/test/java/com/gildedrose/core/rule/InventoryRuleEngineTest.java index 35acd054..86817421 100644 --- a/Java/src/test/java/com/gildedrose/core/rule/InventoryRuleEngineTest.java +++ b/Java/src/test/java/com/gildedrose/core/rule/InventoryRuleEngineTest.java @@ -62,4 +62,18 @@ public class InventoryRuleEngineTest { assertEquals(4, itemAdapter.getItem().sellIn); assertEquals(6, itemAdapter.getItem().quality); } + + @Test + void shouldApplyConjuredRule() { + //given + ItemAdapter itemAdapter = new ItemAdapter(ItemType.CONJURED, + new Item("Conjured Mana Cake", 3, 6)); + + //when + InventoryRuleEngine.applyUpdateRule(itemAdapter); + + //then + assertEquals(2, itemAdapter.getItem().sellIn); + assertEquals(4, itemAdapter.getItem().quality); + } } diff --git a/Java/src/test/java/com/gildedrose/domain/item/ItemAdapterSimpleFactoryTest.java b/Java/src/test/java/com/gildedrose/domain/item/ItemAdapterSimpleFactoryTest.java index c4107731..1eb9f8f2 100644 --- a/Java/src/test/java/com/gildedrose/domain/item/ItemAdapterSimpleFactoryTest.java +++ b/Java/src/test/java/com/gildedrose/domain/item/ItemAdapterSimpleFactoryTest.java @@ -56,4 +56,17 @@ public class ItemAdapterSimpleFactoryTest { assertEquals(standardItem.quality, result.getItem().quality); } + + @Test + void shouldCreateConjuredItemAdapter(){ + //given + Item conjured = new Item("Conjured Mana Cake", 3, 6); + //when + ItemAdapter result = ItemAdapterSimpleFactory.createItemAdapter(conjured); + //then + assertEquals(conjured.name, result.getItem().name); + assertEquals(conjured.sellIn, result.getItem().sellIn); + assertEquals(conjured.quality, result.getItem().quality); + + } } diff --git a/Java/src/test/java/com/gildedrose/domain/item/ItemTypeTest.java b/Java/src/test/java/com/gildedrose/domain/item/ItemTypeTest.java index 7b5c926f..d5cad15e 100644 --- a/Java/src/test/java/com/gildedrose/domain/item/ItemTypeTest.java +++ b/Java/src/test/java/com/gildedrose/domain/item/ItemTypeTest.java @@ -18,9 +18,9 @@ public class ItemTypeTest { @Test void findByValue_BackStagePasses() { // given - String agedBrie = "Backstage passes to a TAFKAL80ETC concert"; + String backstage = "Backstage passes to a TAFKAL80ETC concert"; //when - ItemType result = ItemType.findByValue(agedBrie); + ItemType result = ItemType.findByValue(backstage); //then assertEquals(ItemType.BACKSTAGE_PASSES, result); } @@ -28,9 +28,9 @@ public class ItemTypeTest { @Test void findByValue_Sulfuras() { // given - String agedBrie = "Sulfuras, Hand of Ragnaros"; + String sulfuras = "Sulfuras, Hand of Ragnaros"; //when - ItemType result = ItemType.findByValue(agedBrie); + ItemType result = ItemType.findByValue(sulfuras); //then assertEquals(ItemType.SULFURAS, result); } @@ -38,10 +38,20 @@ public class ItemTypeTest { @Test void findByValue_StandardItem() { // given - String agedBrie = "Elixir of the Mongoose"; + String standardItem = "Elixir of the Mongoose"; //when - ItemType result = ItemType.findByValue(agedBrie); + ItemType result = ItemType.findByValue(standardItem); //then assertEquals(ItemType.STANDARD, result); } + + @Test + void findByValue_Conjured() { + // given + String conjured = "Conjured Mana Cake"; + //when + ItemType result = ItemType.findByValue(conjured); + //then + assertEquals(ItemType.CONJURED, result); + } }