Extract the aging (Brie, Passes) Gilded Rose items behaviour

This commit is contained in:
rverlind 2023-12-05 22:53:30 +01:00
parent fdd930f5cd
commit b846c986ed
5 changed files with 97 additions and 9 deletions

View File

@ -4,6 +4,8 @@ import com.gildedrose.Item;
public abstract class AbstractGildedRoseItem implements GildedRoseItem{
protected final static int MAX_QUALITY = 50;
protected final Item item;
public AbstractGildedRoseItem(Item item) {
@ -14,4 +16,12 @@ public abstract class AbstractGildedRoseItem implements GildedRoseItem{
public Item getItem() {
return item;
}
protected int getSellIn() {
return getItem().sellIn;
}
protected int getQuality() {
return getItem().quality;
}
}

View File

@ -0,0 +1,36 @@
package com.gildedrose.items;
import com.gildedrose.Item;
public class AgingGildedRoseItem extends AbstractGildedRoseItem {
final static int DOUBLE_QUALITY_INCREASE_DAYS = 10;
final static int TRIPLE_QUALITY_INCREASE_DAYS = 5;
final Boolean hardDegradation;
public AgingGildedRoseItem(Item item, Boolean hardDegradation) {
super(item);
this.hardDegradation = hardDegradation;
}
@Override
public GildedRoseItem updateQuality() {
item.sellIn = item.sellIn - 1;
int newQuality;
if (getSellIn() <= 0) {
newQuality = hardDegradation ? 0 : getQuality() - 1;
} else if (getSellIn() <= TRIPLE_QUALITY_INCREASE_DAYS) {
newQuality = getQuality() + 3;
} else if (getSellIn() <= DOUBLE_QUALITY_INCREASE_DAYS) {
newQuality = getQuality() + 2;
} else {
newQuality = getQuality() + 1;
}
item.quality = Math.min(Math.max(newQuality, 0), MAX_QUALITY);
return this;
}
}

View File

@ -9,14 +9,18 @@ import static java.util.regex.Pattern.CASE_INSENSITIVE;
public class GildedRoseItemFactory {
static final Pattern LEGENDARY_NAME_PATTERN = Pattern.compile("Sulfuras.*", CASE_INSENSITIVE);
static final Pattern AGING_ITEM = Pattern.compile("", CASE_INSENSITIVE);
static final Pattern AGING_ITEM = Pattern.compile(".*Brie.*", CASE_INSENSITIVE);
static final Pattern AGING_HARD_DEGRADATION_ITEM = Pattern.compile("backstage passes.*", CASE_INSENSITIVE);
static final Pattern CONJURED_ITEM = Pattern.compile("Conjured.*", CASE_INSENSITIVE);
public static GildedRoseItem create(Item item) {
if (AGING_ITEM.matcher(item.name).matches()
|| CONJURED_ITEM.matcher(item.name).matches()) {
if (CONJURED_ITEM.matcher(item.name).matches()) {
return new NonStandardGildedRoseItem(item);
} else if (LEGENDARY_NAME_PATTERN.matcher(item.name).matches()) {
} else if (AGING_ITEM.matcher(item.name).matches()) {
return new AgingGildedRoseItem(item, false);
} else if (AGING_HARD_DEGRADATION_ITEM.matcher(item.name).matches()) {
return new AgingGildedRoseItem(item, true);
} else if (LEGENDARY_NAME_PATTERN.matcher(item.name).matches()) {
return new LegendaryGildedRoseItem(item);
} else {
return new StandardGildedRoseItem(item);

View File

@ -4,8 +4,6 @@ import com.gildedrose.Item;
public class StandardGildedRoseItem extends AbstractGildedRoseItem {
private final static int MAX_QUALITY = 50;
public StandardGildedRoseItem(Item item) {
super(item);
item.quality = Math.min(item.quality, MAX_QUALITY);

View File

@ -49,7 +49,7 @@ class GildedRoseTest {
@Test
void updateQuality_legendaryItem() {
GildedRose app = createApp(createItem("Sulfuras, Hand of Ragnaros ", 10, 80));
GildedRose app = createApp(createItem("SulFUras, Hand of Ragnaros ", 10, 80));
app.updateQuality();
assertEquals(10, app.items[0].sellIn);
@ -57,8 +57,48 @@ class GildedRoseTest {
}
@Test
void updateQuality_agingItem() {
fail("NYI");
void updateQuality_agingItem_normalIncrease() {
GildedRose app = createApp(createItem("Aging Brie", 20, 10));
app.updateQuality();
assertEquals(19, app.items[0].sellIn);
assertEquals(11, app.items[0].quality);
}
@Test
void updateQuality_agingItem_doubleQualityIncrease() {
GildedRose app = createApp(createItem("Aging Brie", 11, 10));
app.updateQuality();
assertEquals(10, app.items[0].sellIn);
assertEquals(12, app.items[0].quality);
}
@Test
void updateQuality_agingItem_doubleTripleIncrease() {
GildedRose app = createApp(createItem("A lot of Aging BRIE", 6, 10));
app.updateQuality();
assertEquals(5, app.items[0].sellIn);
assertEquals(13, app.items[0].quality);
}
@Test
void updateQuality_agingItem_normalDecrease() {
GildedRose app = createApp(createItem("Aging BRIE", 0, 50));
app.updateQuality();
assertEquals(-1, app.items[0].sellIn);
assertEquals(49, app.items[0].quality);
}
@Test
void updateQuality_agingItem_BackstagePasses_HardDegradation() {
GildedRose app = createApp(createItem("Backstage paSSes for", 0, 50));
app.updateQuality();
assertEquals(-1, app.items[0].sellIn);
assertEquals(0, app.items[0].quality);
}
@Test