refactor conditional to polymorphism - Sulfuras

This commit is contained in:
villanibe 2025-06-29 21:51:16 +02:00
parent d9d0bb2060
commit cf46998049
6 changed files with 72 additions and 43 deletions

View File

@ -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)) {

View File

@ -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;
}
}

View File

@ -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<ItemType, UpdateInventoryTemplateRule> updateInventoryRules = new HashMap<>(){{
put(ItemType.AGEG_BRIE, new AgedBrieRule());
put(ItemType.SULFURAS, new SulfurasRule());
}};
public static void processUpdateInventoryRule(ItemAdapter itemAdapter) {

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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);
}
}