diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..aa5506de 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,26 @@ package com.gildedrose; +import com.gildedrose.strategy.StrategyProvider; +import com.gildedrose.strategy.UpdateStrategy; + class GildedRose { Item[] items; + private final StrategyProvider strategyProvider; public GildedRose(Item[] items) { this.items = items; + this.strategyProvider = new StrategyProvider(); + } + + public GildedRose(Item[] items, StrategyProvider strategyProvider) { + this.items = items; + this.strategyProvider = strategyProvider; } public void updateQuality() { - for (int i = 0; i < items.length; i++) { - if (!items[i].name.equals("Aged Brie") - && !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items[i].quality > 0) { - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].quality = items[i].quality - 1; - } - } - } else { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - - if (items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items[i].sellIn < 11) { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - } - } - - if (items[i].sellIn < 6) { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - } - } - } - } - } - - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].sellIn = items[i].sellIn - 1; - } - - if (items[i].sellIn < 0) { - if (!items[i].name.equals("Aged Brie")) { - if (!items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (items[i].quality > 0) { - if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { - items[i].quality = items[i].quality - 1; - } - } - } else { - items[i].quality = items[i].quality - items[i].quality; - } - } else { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - } - } - } + for (Item item : items) { + UpdateStrategy strategy = this.strategyProvider.getStrategyForItem(item); + strategy.update(item); } } } diff --git a/Java/src/main/java/com/gildedrose/calculator/quality/QualityCalculator.java b/Java/src/main/java/com/gildedrose/calculator/quality/QualityCalculator.java new file mode 100644 index 00000000..7b5dbec9 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/quality/QualityCalculator.java @@ -0,0 +1,7 @@ +package com.gildedrose.calculator.quality; + +import com.gildedrose.Item; + +public interface QualityCalculator { + int calculate(Item item, int updatedSellIn); +} diff --git a/Java/src/main/java/com/gildedrose/calculator/quality/impl/AgedBrieQualityCalculator.java b/Java/src/main/java/com/gildedrose/calculator/quality/impl/AgedBrieQualityCalculator.java new file mode 100644 index 00000000..31c16170 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/quality/impl/AgedBrieQualityCalculator.java @@ -0,0 +1,13 @@ +package com.gildedrose.calculator.quality.impl; + +import com.gildedrose.Item; +import com.gildedrose.calculator.quality.QualityCalculator; + +public class AgedBrieQualityCalculator implements QualityCalculator { + @Override + public int calculate(Item item, int updatedSellIn) { + int increaseAmount = (updatedSellIn < 0) ? 2 : 1; + int newQuality = item.quality + increaseAmount; + return Math.min(50, newQuality); + } +} diff --git a/Java/src/main/java/com/gildedrose/calculator/quality/impl/BackstagePassQualityCalculator.java b/Java/src/main/java/com/gildedrose/calculator/quality/impl/BackstagePassQualityCalculator.java new file mode 100644 index 00000000..6a24ee8a --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/quality/impl/BackstagePassQualityCalculator.java @@ -0,0 +1,18 @@ +package com.gildedrose.calculator.quality.impl; + +import com.gildedrose.Item; +import com.gildedrose.calculator.quality.QualityCalculator; + +public class BackstagePassQualityCalculator implements QualityCalculator { + @Override + public int calculate(Item item, int updatedSellIn) { + if (updatedSellIn < 0) { + return 0; + } + + int qualityIncrease = 1 + (item.sellIn < 11 ? 1 : 0) + (item.sellIn < 6 ? 1 : 0); + int newQuality = item.quality + qualityIncrease; + + return Math.min(50, newQuality); + } +} diff --git a/Java/src/main/java/com/gildedrose/calculator/quality/impl/DefaultQualityCalculator.java b/Java/src/main/java/com/gildedrose/calculator/quality/impl/DefaultQualityCalculator.java new file mode 100644 index 00000000..2feb041d --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/quality/impl/DefaultQualityCalculator.java @@ -0,0 +1,13 @@ +package com.gildedrose.calculator.quality.impl; + +import com.gildedrose.Item; +import com.gildedrose.calculator.quality.QualityCalculator; + +public class DefaultQualityCalculator implements QualityCalculator { + @Override + public int calculate(Item item, int updatedSellIn) { + int decreaseAmount = (updatedSellIn < 0) ? 2 : 1; + int newQuality = item.quality - decreaseAmount; + return Math.max(0, newQuality); + } +} diff --git a/Java/src/main/java/com/gildedrose/calculator/quality/impl/SulfurasQualityCalculator.java b/Java/src/main/java/com/gildedrose/calculator/quality/impl/SulfurasQualityCalculator.java new file mode 100644 index 00000000..9af11f8c --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/quality/impl/SulfurasQualityCalculator.java @@ -0,0 +1,11 @@ +package com.gildedrose.calculator.quality.impl; + +import com.gildedrose.Item; +import com.gildedrose.calculator.quality.QualityCalculator; + +public class SulfurasQualityCalculator implements QualityCalculator { + @Override + public int calculate(Item item, int updatedSellIn) { + return item.quality; + } +} diff --git a/Java/src/main/java/com/gildedrose/calculator/sellIn/SellInCalculator.java b/Java/src/main/java/com/gildedrose/calculator/sellIn/SellInCalculator.java new file mode 100644 index 00000000..162a7dc1 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/sellIn/SellInCalculator.java @@ -0,0 +1,7 @@ +package com.gildedrose.calculator.sellIn; + +import com.gildedrose.Item; + +public interface SellInCalculator { + int calculate(Item item); +} diff --git a/Java/src/main/java/com/gildedrose/calculator/sellIn/impl/StandardSellInCalculator.java b/Java/src/main/java/com/gildedrose/calculator/sellIn/impl/StandardSellInCalculator.java new file mode 100644 index 00000000..bbc6b0ed --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/sellIn/impl/StandardSellInCalculator.java @@ -0,0 +1,11 @@ +package com.gildedrose.calculator.sellIn.impl; + +import com.gildedrose.Item; +import com.gildedrose.calculator.sellIn.SellInCalculator; + +public class StandardSellInCalculator implements SellInCalculator { + @Override + public int calculate(Item item) { + return item.sellIn - 1; + } +} diff --git a/Java/src/main/java/com/gildedrose/calculator/sellIn/impl/SulfurasSellInCalculator.java b/Java/src/main/java/com/gildedrose/calculator/sellIn/impl/SulfurasSellInCalculator.java new file mode 100644 index 00000000..19ddc1ed --- /dev/null +++ b/Java/src/main/java/com/gildedrose/calculator/sellIn/impl/SulfurasSellInCalculator.java @@ -0,0 +1,11 @@ +package com.gildedrose.calculator.sellIn.impl; + +import com.gildedrose.Item; +import com.gildedrose.calculator.sellIn.SellInCalculator; + +public class SulfurasSellInCalculator implements SellInCalculator { + @Override + public int calculate(Item item) { + return item.sellIn; + } +} diff --git a/Java/src/main/java/com/gildedrose/strategy/StrategyProvider.java b/Java/src/main/java/com/gildedrose/strategy/StrategyProvider.java new file mode 100644 index 00000000..8cde4dd9 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/strategy/StrategyProvider.java @@ -0,0 +1,51 @@ +package com.gildedrose.strategy; + +import com.gildedrose.Item; +import com.gildedrose.calculator.quality.impl.AgedBrieQualityCalculator; +import com.gildedrose.calculator.quality.impl.BackstagePassQualityCalculator; +import com.gildedrose.calculator.quality.impl.DefaultQualityCalculator; +import com.gildedrose.calculator.quality.impl.SulfurasQualityCalculator; +import com.gildedrose.calculator.sellIn.impl.StandardSellInCalculator; +import com.gildedrose.calculator.sellIn.impl.SulfurasSellInCalculator; +import com.gildedrose.strategy.impl.ItemUpdateStrategy; + +import java.util.Map; + +public class StrategyProvider { + + private final Map strategies; + private final UpdateStrategy defaultStrategy; + + public static final String AGED_BRIE_NAME = "Aged Brie"; + public static final String BACKSTAGE_NAME = "Backstage passes to a TAFKAL80ETC concert"; + public static final String SULFURAS_NAME = "Sulfuras, Hand of Ragnaros"; + + public StrategyProvider() { + UpdateStrategy normalStrategy = new ItemUpdateStrategy(new DefaultQualityCalculator(), new StandardSellInCalculator()); + UpdateStrategy agedBrieStrategy = new ItemUpdateStrategy(new AgedBrieQualityCalculator(), new StandardSellInCalculator()); + Map strategyMap = getUpdateStrategyMap(agedBrieStrategy); + this.strategies = strategyMap; + this.defaultStrategy = normalStrategy; + } + + public StrategyProvider(Map strategyMap, UpdateStrategy defaultStrategy) { + this.strategies = strategyMap; + this.defaultStrategy = defaultStrategy; + } + + public UpdateStrategy getStrategyForItem(Item item) { + return strategies.getOrDefault(item.name, defaultStrategy); + } + + private static Map getUpdateStrategyMap(UpdateStrategy agedBrieStrategy) { + UpdateStrategy backstageStrategy = new ItemUpdateStrategy(new BackstagePassQualityCalculator(), new StandardSellInCalculator()); + UpdateStrategy sulfurasStrategy = new ItemUpdateStrategy(new SulfurasQualityCalculator(), new SulfurasSellInCalculator()); + + Map strategyMap = Map.of( + AGED_BRIE_NAME, agedBrieStrategy, + BACKSTAGE_NAME, backstageStrategy, + SULFURAS_NAME, sulfurasStrategy + ); + return strategyMap; + } +} diff --git a/Java/src/main/java/com/gildedrose/strategy/UpdateStrategy.java b/Java/src/main/java/com/gildedrose/strategy/UpdateStrategy.java new file mode 100644 index 00000000..a2950692 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/strategy/UpdateStrategy.java @@ -0,0 +1,7 @@ +package com.gildedrose.strategy; + +import com.gildedrose.Item; + +public interface UpdateStrategy { + void update(Item item); +} diff --git a/Java/src/main/java/com/gildedrose/strategy/impl/ItemUpdateStrategy.java b/Java/src/main/java/com/gildedrose/strategy/impl/ItemUpdateStrategy.java new file mode 100644 index 00000000..e04ef974 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/strategy/impl/ItemUpdateStrategy.java @@ -0,0 +1,25 @@ +package com.gildedrose.strategy.impl; + +import com.gildedrose.Item; +import com.gildedrose.calculator.quality.QualityCalculator; +import com.gildedrose.calculator.sellIn.SellInCalculator; +import com.gildedrose.strategy.UpdateStrategy; + +public class ItemUpdateStrategy implements UpdateStrategy { + + private final QualityCalculator qualityCalculator; + private final SellInCalculator sellinCalculator; + + public ItemUpdateStrategy(QualityCalculator qualityCalculator, SellInCalculator sellinCalculator) { + this.qualityCalculator = qualityCalculator; + this.sellinCalculator = sellinCalculator; + } + + @Override + public void update(Item item) { + int updatedSellIn = this.sellinCalculator.calculate(item); + int updatedQuality = this.qualityCalculator.calculate(item, updatedSellIn); + item.sellIn = updatedSellIn; + item.quality = updatedQuality; + } +} diff --git a/start_texttest.sh b/start_texttest.sh index 805922b1..c61adcb8 100755 --- a/start_texttest.sh +++ b/start_texttest.sh @@ -1,7 +1,7 @@ #!/bin/sh if [ ! -d "venv" ]; then - python -m venv venv + python3 -m venv venv fi venv/bin/pip install texttest venv/bin/texttest -d . -con "$@" diff --git a/texttests/config.gr b/texttests/config.gr index 8716d11d..931e9971 100755 --- a/texttests/config.gr +++ b/texttests/config.gr @@ -22,7 +22,7 @@ diff_program:meld # Settings for the Java version using Gradle wrapped in a python script #executable:${TEXTTEST_HOME}/Java/texttest_rig.py -#interpreter:python +#interpreter:python3 # Settings for the Java version using the classpath #executable:com.gildedrose.TexttestFixture @@ -30,12 +30,12 @@ diff_program:meld # note you'll also need to update the file environment.gr with your classpath if you keep your classfiles somewhere unusual # Settings for the Kotlin version using Gradle wrapped in a python script -#executable:${TEXTTEST_HOME}/Kotlin/texttest_rig.py -#interpreter:python +executable:${TEXTTEST_HOME}/Kotlin/texttest_rig.py +interpreter:python3 # Settings for the Ruby version -executable:${TEXTTEST_HOME}/ruby/texttest_fixture.rb -interpreter:ruby +#executable:${TEXTTEST_HOME}/ruby/texttest_fixture.rb +#interpreter:ruby # Settings for the C# Core version #executable:${TEXTTEST_HOME}/csharpcore/GildedRoseTests/bin/Debug/net8.0/GildedRoseTests