From b846c986edbebcf800e33ce38cba195b22445cbf Mon Sep 17 00:00:00 2001 From: rverlind Date: Tue, 5 Dec 2023 22:53:30 +0100 Subject: [PATCH] Extract the aging (Brie, Passes) Gilded Rose items behaviour --- .../items/AbstractGildedRoseItem.java | 10 ++++ .../gildedrose/items/AgingGildedRoseItem.java | 36 +++++++++++++++ .../items/GildedRoseItemFactory.java | 12 +++-- .../items/StandardGildedRoseItem.java | 2 - .../java/com/gildedrose/GildedRoseTest.java | 46 +++++++++++++++++-- 5 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/items/AgingGildedRoseItem.java diff --git a/Java/src/main/java/com/gildedrose/items/AbstractGildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/AbstractGildedRoseItem.java index 1613afbe..7b3880bb 100644 --- a/Java/src/main/java/com/gildedrose/items/AbstractGildedRoseItem.java +++ b/Java/src/main/java/com/gildedrose/items/AbstractGildedRoseItem.java @@ -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; + } } diff --git a/Java/src/main/java/com/gildedrose/items/AgingGildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/AgingGildedRoseItem.java new file mode 100644 index 00000000..20be3be5 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/items/AgingGildedRoseItem.java @@ -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; + } +} diff --git a/Java/src/main/java/com/gildedrose/items/GildedRoseItemFactory.java b/Java/src/main/java/com/gildedrose/items/GildedRoseItemFactory.java index 07ae33ae..873905c8 100644 --- a/Java/src/main/java/com/gildedrose/items/GildedRoseItemFactory.java +++ b/Java/src/main/java/com/gildedrose/items/GildedRoseItemFactory.java @@ -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); diff --git a/Java/src/main/java/com/gildedrose/items/StandardGildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/StandardGildedRoseItem.java index 1af16e92..25861556 100644 --- a/Java/src/main/java/com/gildedrose/items/StandardGildedRoseItem.java +++ b/Java/src/main/java/com/gildedrose/items/StandardGildedRoseItem.java @@ -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); diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 4ad7a140..86ef7bdb 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -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