From d68387dc6b1d09be6b1e6e76a09758b2f3ce30ab Mon Sep 17 00:00:00 2001 From: Xavier Levaux Date: Sat, 26 Sep 2020 11:23:28 +0200 Subject: [PATCH] Refactored to extract common code Added standard item to cucumber features --- .../AbstractItemQualityUpdater.java | 21 ++++++++++++ ...ater.java => BackstageQualityUpdater.java} | 4 +-- .../gildedrose/ConjuredQualityUpdater.java | 18 +++-------- .../com/gildedrose/DefaultQualityUpdater.java | 15 +++------ .../ItemQualityUpdateStrategyFactory.java | 2 +- .../ItemQualityUpdateStrategyFactoryTest.java | 2 +- .../conjured_quality_update.feature | 32 ++++++++++++++++++- 7 files changed, 66 insertions(+), 28 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/AbstractItemQualityUpdater.java rename Java/src/main/java/com/gildedrose/{BackstageBrieQualityUpdater.java => BackstageQualityUpdater.java} (83%) diff --git a/Java/src/main/java/com/gildedrose/AbstractItemQualityUpdater.java b/Java/src/main/java/com/gildedrose/AbstractItemQualityUpdater.java new file mode 100644 index 00000000..a727417c --- /dev/null +++ b/Java/src/main/java/com/gildedrose/AbstractItemQualityUpdater.java @@ -0,0 +1,21 @@ +package com.gildedrose; + +public abstract class AbstractItemQualityUpdater implements ItemQualityUpdater { + + protected Item item; + + public AbstractItemQualityUpdater(Item item) { + this.item = item; + } + + /** + * Decrease quality of an item, but never go below 0 + * @param decrementValue Value the quality should be decreased by + */ + void decreaseQuality(int decrementValue) { + item.quality = item.quality - decrementValue; + if (item.quality < 0) { + item.quality = 0; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/BackstageBrieQualityUpdater.java b/Java/src/main/java/com/gildedrose/BackstageQualityUpdater.java similarity index 83% rename from Java/src/main/java/com/gildedrose/BackstageBrieQualityUpdater.java rename to Java/src/main/java/com/gildedrose/BackstageQualityUpdater.java index 5558616f..eb024adc 100644 --- a/Java/src/main/java/com/gildedrose/BackstageBrieQualityUpdater.java +++ b/Java/src/main/java/com/gildedrose/BackstageQualityUpdater.java @@ -1,10 +1,10 @@ package com.gildedrose; -public class BackstageBrieQualityUpdater implements ItemQualityUpdater { +public class BackstageQualityUpdater implements ItemQualityUpdater { private final Item item; - public BackstageBrieQualityUpdater(Item item) { + public BackstageQualityUpdater(Item item) { this.item = item; } diff --git a/Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java b/Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java index 81ccab3f..7926d464 100644 --- a/Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java +++ b/Java/src/main/java/com/gildedrose/ConjuredQualityUpdater.java @@ -1,30 +1,22 @@ package com.gildedrose; -public class ConjuredQualityUpdater implements ItemQualityUpdater { +public class ConjuredQualityUpdater extends AbstractItemQualityUpdater { - private final Item item; - private final int normalDailyQualityDegradation = 2; + private final int dailyQualityDegradation = 2; public ConjuredQualityUpdater(Item item) { - this.item = item; + super(item); } @Override public void updateQuality() { - decreaseQuality(normalDailyQualityDegradation); + decreaseQuality(dailyQualityDegradation); item.sellIn = item.sellIn - 1; if (item.sellIn < 0) { - decreaseQuality(normalDailyQualityDegradation); - } - } - - void decreaseQuality(int decrementValue) { - item.quality = item.quality - decrementValue; - if (item.quality < 0) { - item.quality = 0; + decreaseQuality(dailyQualityDegradation); } } } diff --git a/Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java b/Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java index de46c85e..258d8d9a 100644 --- a/Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java +++ b/Java/src/main/java/com/gildedrose/DefaultQualityUpdater.java @@ -1,25 +1,20 @@ package com.gildedrose; -public class DefaultQualityUpdater implements ItemQualityUpdater { - - private final Item item; +public class DefaultQualityUpdater extends AbstractItemQualityUpdater { + private final int dailyQualityDegradation = 1; public DefaultQualityUpdater(Item item) { - this.item = item; + super(item); } @Override public void updateQuality() { - if (item.quality > 0) { - item.quality = item.quality - 1; - } + decreaseQuality(dailyQualityDegradation); item.sellIn = item.sellIn - 1; if (item.sellIn < 0) { - if (item.quality > 0) { - item.quality = item.quality - 1; - } + decreaseQuality(dailyQualityDegradation); } } } diff --git a/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java b/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java index 6b66083d..61f8c586 100644 --- a/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java +++ b/Java/src/main/java/com/gildedrose/ItemQualityUpdateStrategyFactory.java @@ -5,7 +5,7 @@ public class ItemQualityUpdateStrategyFactory { switch (item.name) { case "Sulfuras, Hand of Ragnaros": return new SulfrasQualityUpdater(item); case "Aged Brie": return new AgedBrieQualityUpdater(item); - case "Backstage passes to a TAFKAL80ETC concert": return new BackstageBrieQualityUpdater(item); + case "Backstage passes to a TAFKAL80ETC concert": return new BackstageQualityUpdater(item); case "Conjured": return new ConjuredQualityUpdater(item); default: return new DefaultQualityUpdater(item); } diff --git a/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java b/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java index edf36d25..e0c79db3 100644 --- a/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java +++ b/Java/src/test/java/com/gildedrose/ItemQualityUpdateStrategyFactoryTest.java @@ -10,7 +10,7 @@ class ItemQualityUpdateStrategyFactoryTest { void itemQualityUpdaterFor() { testFactoryFor("Sulfuras, Hand of Ragnaros", SulfrasQualityUpdater.class); testFactoryFor("Aged Brie", AgedBrieQualityUpdater.class); - testFactoryFor("Backstage passes to a TAFKAL80ETC concert", BackstageBrieQualityUpdater.class); + testFactoryFor("Backstage passes to a TAFKAL80ETC concert", BackstageQualityUpdater.class); testFactoryFor("xyz", DefaultQualityUpdater.class); testFactoryFor("Conjured", ConjuredQualityUpdater.class); } diff --git a/Java/src/test/resources/com/gildedrose/conjured_quality_update.feature b/Java/src/test/resources/com/gildedrose/conjured_quality_update.feature index 756756f2..20b7968c 100644 --- a/Java/src/test/resources/com/gildedrose/conjured_quality_update.feature +++ b/Java/src/test/resources/com/gildedrose/conjured_quality_update.feature @@ -11,4 +11,34 @@ Feature: Conjured items quality update | Conjured | 3 | 2 | 1 | 1 | | Conjured | 1 | 1 | 0 | 0 | | Conjured | 6 | 0 | 2 | -1 | - | Conjured | 4 | 0 | 0 | -1 | \ No newline at end of file + | Conjured | 4 | 0 | 0 | -1 | + + + Scenario Outline: Standard items quality degrades by 1 each day, + but degrade by 2 when sellIn is negative + Given name is "", quality is "" and sellIn is "" + When I calculateQuality + Then I should have new quality "" and new sellIn "" + + Examples: + | name | quality | sellIn | newQuality | newSellIn | + | foo | 0 | -1 | 0 | -2 | + | foo | 1 | -1 | 0 | -2 | + | foo | 49 | -1 | 47 | -2 | + | foo | 50 | -1 | 48 | -2 | + | foo | 0 | 0 | 0 | -1 | + | foo | 1 | 0 | 0 | -1 | + | foo | 49 | 0 | 47 | -1 | + | foo | 50 | 0 | 48 | -1 | + | foo | 0 | 5 | 0 | 4 | + | foo | 1 | 5 | 0 | 4 | + | foo | 49 | 5 | 48 | 4 | + | foo | 50 | 5 | 49 | 4 | + | foo | 0 | 6 | 0 | 5 | + | foo | 1 | 6 | 0 | 5 | + | foo | 49 | 6 | 48 | 5 | + | foo | 50 | 6 | 49 | 5 | + | foo | 0 | 11 | 0 | 10 | + | foo | 1 | 11 | 0 | 10 | + | foo | 49 | 11 | 48 | 10 | + | foo | 50 | 11 | 49 | 10 | \ No newline at end of file