From cf4699804914b022b0f75cf9157c50e7fbf6a144 Mon Sep 17 00:00:00 2001 From: villanibe Date: Sun, 29 Jun 2025 21:51:16 +0200 Subject: [PATCH] refactor conditional to polymorphism - Sulfuras --- .../main/java/com/gildedrose/GildedRose.java | 3 +- .../application/sulfuras/SulfurasRule.java | 27 +++++++++++++ .../gildedrose/core/InventoryRuleEngine.java | 2 + .../java/com/gildedrose/SulfurasTest.java | 39 ------------------ .../java/com/gildedrose/TexttestFixture.java | 4 +- .../sulfuras/SulfurasRuleTest.java | 40 +++++++++++++++++++ 6 files changed, 72 insertions(+), 43 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java delete mode 100644 Java/src/test/java/com/gildedrose/SulfurasTest.java create mode 100644 Java/src/test/java/com/gildedrose/application/sulfuras/SulfurasRuleTest.java diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 41e61815..f817da99 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -62,8 +62,7 @@ class GildedRose { item.quality = MINIMUM_QUALITY; } } else if (isSulfuras) { - //sulfuras is doing nothing - + InventoryRuleEngine.processUpdateInventoryRule(itemAdapter); } else { //standard item if (shouldDecreaseQuality(item)) { diff --git a/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java b/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java new file mode 100644 index 00000000..555258f0 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/application/sulfuras/SulfurasRule.java @@ -0,0 +1,27 @@ +package com.gildedrose.application.sulfuras; + +import com.gildedrose.core.rules.UpdateInventoryTemplateRule; +import com.gildedrose.domain.item.ItemAdapter; + +public class SulfurasRule extends UpdateInventoryTemplateRule { + + @Override + protected boolean canSubtractSellIn(final ItemAdapter itemAdapter) { + return false; + } + + @Override + protected int getQualityFactor(final boolean isExpired, final ItemAdapter itemAdapter) { + return 0; + } + + @Override + protected boolean canIncreaseQuality(final ItemAdapter itemAdapter) { + return false; + } + + @Override + protected boolean canDecreaseQuality(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 925b4e96..cfd17e8a 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.sulfuras.SulfurasRule; import com.gildedrose.core.rules.UpdateInventoryTemplateRule; import com.gildedrose.domain.item.ItemAdapter; import com.gildedrose.domain.item.ItemType; @@ -12,6 +13,7 @@ public class InventoryRuleEngine { private static final Map updateInventoryRules = new HashMap<>(){{ put(ItemType.AGEG_BRIE, new AgedBrieRule()); + put(ItemType.SULFURAS, new SulfurasRule()); }}; public static void processUpdateInventoryRule(ItemAdapter itemAdapter) { diff --git a/Java/src/test/java/com/gildedrose/SulfurasTest.java b/Java/src/test/java/com/gildedrose/SulfurasTest.java deleted file mode 100644 index 98a5472f..00000000 --- a/Java/src/test/java/com/gildedrose/SulfurasTest.java +++ /dev/null @@ -1,39 +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 SulfurasTest { - - @Test - void sulfurasNeverChanges() { - //given - Item sulfuras = new Item("Sulfuras, Hand of Ragnaros", -1, 80); - Item[] items = new Item[] {sulfuras}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(0, app.items[0].sellIn); - assertEquals(80, app.items[0].quality); - } - - @Test - void sulfurasQualityLevelIsAlways80() { - //given - Item sulfuras = new Item("Sulfuras, Hand of Ragnaros", 0, 80); - Item[] items = new Item[] {sulfuras}; - - //when - GildedRose app = new GildedRose(items); - app.updateQuality(); - - //then - assertEquals(80, 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 b682c866..d4e4171b 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -1,6 +1,6 @@ package com.gildedrose; -import com.gildedrose.item.Item; +import com.gildedrose.domain.item.Item; public class TexttestFixture { public static void main(String[] args) { @@ -20,7 +20,7 @@ public class TexttestFixture { GildedRose app = new GildedRose(items); - int days = 3; + int days = 5; if (args.length > 0) { days = Integer.parseInt(args[0]) + 1; } diff --git a/Java/src/test/java/com/gildedrose/application/sulfuras/SulfurasRuleTest.java b/Java/src/test/java/com/gildedrose/application/sulfuras/SulfurasRuleTest.java new file mode 100644 index 00000000..656f0a13 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/application/sulfuras/SulfurasRuleTest.java @@ -0,0 +1,40 @@ +package com.gildedrose.application.sulfuras; + +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 SulfurasRuleTest { + + @Test + void sulfurasNeverChanges() { + //given + Item sulfuras = new Item("Sulfuras, Hand of Ragnaros", -1, 80); + ItemAdapter sulfurasAdapter = new ItemAdapter(ItemType.SULFURAS, sulfuras); + SulfurasRule sulfurasRule = new SulfurasRule(); + + //when + sulfurasRule.processItem(sulfurasAdapter); + + //then + assertEquals(-1, sulfurasAdapter.getItem().sellIn); + assertEquals(80, sulfurasAdapter.getItem().quality); + } + + @Test + void sulfurasQualityLevelIsAlways80() { + //given + Item sulfuras = new Item("Sulfuras, Hand of Ragnaros", 0, 80); + ItemAdapter sulfurasAdapter = new ItemAdapter(ItemType.SULFURAS, sulfuras); + SulfurasRule sulfurasRule = new SulfurasRule(); + + //when + sulfurasRule.processItem(sulfurasAdapter); + + //then + assertEquals(80, sulfurasAdapter.getItem().quality); + } +}