Adding new feature - Conjured item

This commit is contained in:
villanibe 2025-06-30 01:50:49 +02:00
parent 0238cf2fe2
commit 7c87dedf57
9 changed files with 120 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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