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{ public abstract class AbstractGildedRoseItem implements GildedRoseItem{
protected final static int MAX_QUALITY = 50;
protected final Item item; protected final Item item;
public AbstractGildedRoseItem(Item item) { public AbstractGildedRoseItem(Item item) {
@ -14,4 +16,12 @@ public abstract class AbstractGildedRoseItem implements GildedRoseItem{
public Item getItem() { public Item getItem() {
return item; 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 { public class GildedRoseItemFactory {
static final Pattern LEGENDARY_NAME_PATTERN = Pattern.compile("Sulfuras.*", CASE_INSENSITIVE); 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); static final Pattern CONJURED_ITEM = Pattern.compile("Conjured.*", CASE_INSENSITIVE);
public static GildedRoseItem create(Item item) { public static GildedRoseItem create(Item item) {
if (AGING_ITEM.matcher(item.name).matches() if (CONJURED_ITEM.matcher(item.name).matches()) {
|| CONJURED_ITEM.matcher(item.name).matches()) {
return new NonStandardGildedRoseItem(item); 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); return new LegendaryGildedRoseItem(item);
} else { } else {
return new StandardGildedRoseItem(item); return new StandardGildedRoseItem(item);

View File

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

View File

@ -49,7 +49,7 @@ class GildedRoseTest {
@Test @Test
void updateQuality_legendaryItem() { 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(); app.updateQuality();
assertEquals(10, app.items[0].sellIn); assertEquals(10, app.items[0].sellIn);
@ -57,8 +57,48 @@ class GildedRoseTest {
} }
@Test @Test
void updateQuality_agingItem() { void updateQuality_agingItem_normalIncrease() {
fail("NYI"); 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 @Test