From 21e1a0c9766d812fc23f7ef07f022e1da38168a4 Mon Sep 17 00:00:00 2001 From: Kirti Deshmukh Date: Tue, 28 Feb 2023 21:51:45 +0530 Subject: [PATCH] refactor code to have responsibility to respective items --- .../main/java/com/gildedrose/GildedRose.java | 82 +++---------------- .../java/com/gildedrose/GoodsFactory.java | 23 ++++++ Java/src/main/java/com/gildedrose/Item.java | 4 +- .../java/com/gildedrose/model/AgedBrie.java | 28 +++++++ .../com/gildedrose/model/BackstagePasses.java | 40 +++++++++ .../java/com/gildedrose/model/Conjured.java | 24 ++++++ .../main/java/com/gildedrose/model/Goods.java | 15 ++++ .../java/com/gildedrose/model/NormalItem.java | 23 ++++++ .../java/com/gildedrose/model/Sulfuras.java | 13 +++ .../java/com/gildedrose/GildedRoseTest.java | 1 - .../java/com/gildedrose/TexttestFixture.java | 22 ++--- .../com/gildedrose/model/AgedBrieTest.java | 39 +++++++++ .../gildedrose/model/BackstagePassesTest.java | 37 +++++++++ .../com/gildedrose/model/ConjuredTest.java | 36 ++++++++ .../com/gildedrose/model/NormalItemTest.java | 38 +++++++++ .../com/gildedrose/model/SulfurasTest.java | 36 ++++++++ 16 files changed, 375 insertions(+), 86 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/GoodsFactory.java create mode 100644 Java/src/main/java/com/gildedrose/model/AgedBrie.java create mode 100644 Java/src/main/java/com/gildedrose/model/BackstagePasses.java create mode 100644 Java/src/main/java/com/gildedrose/model/Conjured.java create mode 100644 Java/src/main/java/com/gildedrose/model/Goods.java create mode 100644 Java/src/main/java/com/gildedrose/model/NormalItem.java create mode 100644 Java/src/main/java/com/gildedrose/model/Sulfuras.java create mode 100644 Java/src/test/java/com/gildedrose/model/AgedBrieTest.java create mode 100644 Java/src/test/java/com/gildedrose/model/BackstagePassesTest.java create mode 100644 Java/src/test/java/com/gildedrose/model/ConjuredTest.java create mode 100644 Java/src/test/java/com/gildedrose/model/NormalItemTest.java create mode 100644 Java/src/test/java/com/gildedrose/model/SulfurasTest.java diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 63a557b0..35da3f8f 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,6 +1,7 @@ package com.gildedrose; -import static com.gildedrose.Constants.MAX_QUALITY; +import com.gildedrose.model.Goods; + import static com.gildedrose.Constants.MIN_QUALITY; class GildedRose { @@ -12,79 +13,16 @@ class GildedRose { } public void updateQuality() { - for (Item item : items) { - if (item.name.equals("Conjured Mana Cake")) { - updateQualityForConjured(item); - } else - updateQuality(item); + + for (Integer i = 0; i < items.length; i++) { + Goods goods = updateQuality(items[i]); + items[i] = goods; //TODO: remove mutation } } - private void updateQualityForConjured(Item item) { - if (item.sellIn > 0) { - item.quality = degradeQualityBy(item.quality, 2); - } else { - item.quality = degradeQualityBy(item.quality, 4); - } - item.sellIn = item.sellIn - 1; - } - - private void updateQuality(Item item) { - if (!item.name.equals("Aged Brie") - && !item.name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (item.quality > 0) { - if (!item.name.equals("Sulfuras, Hand of Ragnaros")) { - item.quality = degradeQualityBy(item.quality, 1); - } - } - } else { - if (item.quality < 50) { - item.quality = item.quality + 1; - - if (item.name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (item.sellIn < 11) { - if (item.quality < 50) { - item.quality = upgradeQualityBy(item.quality, 1); - } - } - - if (item.sellIn < 6) { - if (item.quality < 50) { - item.quality = upgradeQualityBy(item.quality, 1); - } - } - } - } - } - - if (!item.name.equals("Sulfuras, Hand of Ragnaros")) { - item.sellIn = item.sellIn - 1; - } - - if (item.sellIn < 0) { - if (!item.name.equals("Aged Brie")) { - if (!item.name.equals("Backstage passes to a TAFKAL80ETC concert")) { - if (item.quality > 0) { - if (!item.name.equals("Sulfuras, Hand of Ragnaros")) { - item.quality = degradeQualityBy(item.quality, 1); - } - } - } else { - item.quality = 0; - } - } else { - if (item.quality < 50) { - item.quality = item.quality + 1; - } - } - } - } - - private Integer degradeQualityBy(int currentQuality, int degradeBy) { - return Math.max(currentQuality - degradeBy, MIN_QUALITY); - } - - private Integer upgradeQualityBy(int currentQuality, int upgradeBy) { - return Math.min(currentQuality + upgradeBy, MAX_QUALITY); + private Goods updateQuality(Item item) { + Goods goods = GoodsFactory.getGoods(item.name, item.sellIn, item.quality); + goods.updateQuality(); + return goods; } } diff --git a/Java/src/main/java/com/gildedrose/GoodsFactory.java b/Java/src/main/java/com/gildedrose/GoodsFactory.java new file mode 100644 index 00000000..bff47745 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/GoodsFactory.java @@ -0,0 +1,23 @@ +package com.gildedrose; + +import com.gildedrose.model.*; + +public class GoodsFactory { + + public static Goods getGoods(String name, int initialSellIn, int initialQuality) { + + switch (name) { + case "Aged Brie": + return new AgedBrie(initialSellIn, initialQuality); + case "Conjured Mana Cake": + return new Conjured(initialSellIn, initialQuality); + case "Sulfuras, Hand of Ragnaros": + return new Sulfuras(initialSellIn, initialQuality); + case "Backstage passes to a TAFKAL80ETC concert": + return new BackstagePasses(initialSellIn, initialQuality); + default: + return new NormalItem(name, initialSellIn, initialQuality); + } + + } +} diff --git a/Java/src/main/java/com/gildedrose/Item.java b/Java/src/main/java/com/gildedrose/Item.java index 465729ec..19634c6d 100644 --- a/Java/src/main/java/com/gildedrose/Item.java +++ b/Java/src/main/java/com/gildedrose/Item.java @@ -14,8 +14,8 @@ public class Item { this.quality = quality; } - @Override - public String toString() { + @Override + public String toString() { return this.name + ", " + this.sellIn + ", " + this.quality; } } diff --git a/Java/src/main/java/com/gildedrose/model/AgedBrie.java b/Java/src/main/java/com/gildedrose/model/AgedBrie.java new file mode 100644 index 00000000..92005d8b --- /dev/null +++ b/Java/src/main/java/com/gildedrose/model/AgedBrie.java @@ -0,0 +1,28 @@ +package com.gildedrose.model; + +import static com.gildedrose.Constants.MAX_QUALITY; + +public class AgedBrie extends Goods { + + public static final String AGED_BRIE = "Aged Brie"; + + public AgedBrie(int sellIn, int quality) { + super(AGED_BRIE, sellIn, quality); + } + + @Override + public void updateQuality() { + + sellInPasses(); + upgradeQuality(); + if (sellIn < 0) { + upgradeQuality(); + } + + } + + private void upgradeQuality() { + quality = Math.min(quality + 1, MAX_QUALITY); + } + +} diff --git a/Java/src/main/java/com/gildedrose/model/BackstagePasses.java b/Java/src/main/java/com/gildedrose/model/BackstagePasses.java new file mode 100644 index 00000000..b62dab64 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/model/BackstagePasses.java @@ -0,0 +1,40 @@ +package com.gildedrose.model; + +import static com.gildedrose.Constants.MAX_QUALITY; +import static com.gildedrose.Constants.MIN_QUALITY; + +public class BackstagePasses extends Goods{ + + public BackstagePasses( int sellIn, int quality) { + super("Backstage passes to a TAFKAL80ETC concert", sellIn, quality); + } + + @Override + public void updateQuality() { + + if(isSellInLessThanOrEquals(0)) { + degradeQualityToZero(); + } + else if(isSellInLessThanOrEquals(5)) { + upgradeQuality(3); + } + else if (isSellInLessThanOrEquals(10)) { + upgradeQuality(2); + } else { + upgradeQuality(1); + } + sellInPasses(); + } + + private boolean isSellInLessThanOrEquals(int numberOfDays) { + return sellIn <= numberOfDays; + } + + private void upgradeQuality(int byValue) { + quality = Math.min(quality + byValue, MAX_QUALITY); + } + + private void degradeQualityToZero() { + quality = MIN_QUALITY; + } +} diff --git a/Java/src/main/java/com/gildedrose/model/Conjured.java b/Java/src/main/java/com/gildedrose/model/Conjured.java new file mode 100644 index 00000000..e58d381d --- /dev/null +++ b/Java/src/main/java/com/gildedrose/model/Conjured.java @@ -0,0 +1,24 @@ +package com.gildedrose.model; + +import static com.gildedrose.Constants.MIN_QUALITY; + +public class Conjured extends Goods { + + public Conjured(int sellIn, int quality) { + super("Conjured Mana Cake", sellIn, quality); + } + + @Override + public void updateQuality() { + if (sellIn > 0) { + degradeQualityBy(2); + } else { + degradeQualityBy(4); + } + sellInPasses(); + } + + private void degradeQualityBy(int degradeBy) { + quality = Math.max(quality - degradeBy, MIN_QUALITY); + } +} diff --git a/Java/src/main/java/com/gildedrose/model/Goods.java b/Java/src/main/java/com/gildedrose/model/Goods.java new file mode 100644 index 00000000..5ee4327e --- /dev/null +++ b/Java/src/main/java/com/gildedrose/model/Goods.java @@ -0,0 +1,15 @@ +package com.gildedrose.model; + +import com.gildedrose.Item; + +public abstract class Goods extends Item { + public Goods(String name, int sellIn, int quality) { + super(name, sellIn, quality); + } + + public abstract void updateQuality(); + + public void sellInPasses() { + sellIn = sellIn - 1; + } +} diff --git a/Java/src/main/java/com/gildedrose/model/NormalItem.java b/Java/src/main/java/com/gildedrose/model/NormalItem.java new file mode 100644 index 00000000..1fb36b1e --- /dev/null +++ b/Java/src/main/java/com/gildedrose/model/NormalItem.java @@ -0,0 +1,23 @@ +package com.gildedrose.model; + +import static com.gildedrose.Constants.MIN_QUALITY; + +public class NormalItem extends Goods { + + public NormalItem(String name, int sellIn, int quality) { + super(name, sellIn, quality); + } + + @Override + public void updateQuality() { + sellInPasses(); + degradeQuality(); + if (sellIn < 0) { + degradeQuality(); + } + } + + private void degradeQuality() { + quality = Math.max(quality - 1, MIN_QUALITY); + } +} diff --git a/Java/src/main/java/com/gildedrose/model/Sulfuras.java b/Java/src/main/java/com/gildedrose/model/Sulfuras.java new file mode 100644 index 00000000..e6963c9a --- /dev/null +++ b/Java/src/main/java/com/gildedrose/model/Sulfuras.java @@ -0,0 +1,13 @@ +package com.gildedrose.model; + +public class Sulfuras extends Goods { + + public Sulfuras(int sellIn, int quality) { + super("Sulfuras, Hand of Ragnaros", sellIn, quality); + } + + @Override + public void updateQuality() { + // do nothing + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 6d20eb33..941174a1 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -1,6 +1,5 @@ package com.gildedrose; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java index d059c88f..1be2c8eb 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -4,17 +4,17 @@ public class TexttestFixture { public static void main(String[] args) { System.out.println("OMGHAI!"); - Item[] items = new Item[] { - new Item("+5 Dexterity Vest", 10, 20), // - new Item("Aged Brie", 2, 0), // - new Item("Elixir of the Mongoose", 5, 7), // - new Item("Sulfuras, Hand of Ragnaros", 0, 80), // - new Item("Sulfuras, Hand of Ragnaros", -1, 80), - new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20), - new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49), - new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49), - // this conjured item does not work properly yet - new Item("Conjured Mana Cake", 3, 6) }; + Item[] items = new Item[]{ + new Item("+5 Dexterity Vest", 10, 20), // + new Item("Aged Brie", 2, 0), // + new Item("Elixir of the Mongoose", 5, 7), // + new Item("Sulfuras, Hand of Ragnaros", 0, 80), // + new Item("Sulfuras, Hand of Ragnaros", -1, 80), + new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20), + new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49), + new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49), + // this conjured item does not work properly yet + new Item("Conjured Mana Cake", 3, 6)}; GildedRose app = new GildedRose(items); diff --git a/Java/src/test/java/com/gildedrose/model/AgedBrieTest.java b/Java/src/test/java/com/gildedrose/model/AgedBrieTest.java new file mode 100644 index 00000000..dc8c58b0 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/model/AgedBrieTest.java @@ -0,0 +1,39 @@ +package com.gildedrose.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AgedBrieTest { + + + private static Stream provideInputWhereSellInDayPassesByOneDay() { + + return Stream.of( + + // 3. Aged Brie + // 3.a Before sellIn + Arguments.of(new AgedBrie(2, 0), "Aged Brie", 1, 1), + Arguments.of(new AgedBrie(1, 0), "Aged Brie", 0, 1), + Arguments.of(new AgedBrie(1, 50), "Aged Brie", 0, 50), + + //3.b After sellIn + Arguments.of(new AgedBrie(0, 50), "Aged Brie", -1, 50), + Arguments.of(new AgedBrie(0, 48), "Aged Brie", -1, 50)); + } + + @ParameterizedTest + @MethodSource("provideInputWhereSellInDayPassesByOneDay") + void shouldDegradeQualityForAnItem(AgedBrie agedBrie, String expectedName, int expectedSellIn, int expectedQuality) { + agedBrie.updateQuality(); + assertEquals(expectedName, agedBrie.name); + assertEquals(expectedSellIn, agedBrie.sellIn); + assertEquals(expectedQuality, agedBrie.quality); + } + +} + diff --git a/Java/src/test/java/com/gildedrose/model/BackstagePassesTest.java b/Java/src/test/java/com/gildedrose/model/BackstagePassesTest.java new file mode 100644 index 00000000..13f0d88b --- /dev/null +++ b/Java/src/test/java/com/gildedrose/model/BackstagePassesTest.java @@ -0,0 +1,37 @@ +package com.gildedrose.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class BackstagePassesTest { + + private static Stream provideInputWhereSellInDayPassesByOneDay() { + + return Stream.of( + + //5. "Backstage passes to a TAFKAL80ETC concert" + //5.a Before sellIn + Arguments.of(new BackstagePasses(15, 20), "Backstage passes to a TAFKAL80ETC concert", 14, 21), + Arguments.of(new BackstagePasses(10, 49), "Backstage passes to a TAFKAL80ETC concert", 9, 50), + Arguments.of(new BackstagePasses(10, 49), "Backstage passes to a TAFKAL80ETC concert", 9, 50), + Arguments.of(new BackstagePasses(10, 48), "Backstage passes to a TAFKAL80ETC concert", 9, 50), + Arguments.of(new BackstagePasses(5, 47), "Backstage passes to a TAFKAL80ETC concert", 4, 50), + + //5.b After sellIn + Arguments.of(new BackstagePasses(0, 47), "Backstage passes to a TAFKAL80ETC concert", -1, 0)); + } + + @ParameterizedTest + @MethodSource("provideInputWhereSellInDayPassesByOneDay") + void shouldDegradeQualityForAnItem(BackstagePasses backstagePasses, String expectedName, int expectedSellIn, int expectedQuality) { + backstagePasses.updateQuality(); + assertEquals(expectedName, backstagePasses.name); + assertEquals(expectedSellIn, backstagePasses.sellIn); + assertEquals(expectedQuality, backstagePasses.quality); + } +} diff --git a/Java/src/test/java/com/gildedrose/model/ConjuredTest.java b/Java/src/test/java/com/gildedrose/model/ConjuredTest.java new file mode 100644 index 00000000..f224f977 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/model/ConjuredTest.java @@ -0,0 +1,36 @@ +package com.gildedrose.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ConjuredTest { + + private static Stream provideInputWhereSellInDayPassesByOneDay() { + + return Stream.of( + + //2. Conjured item + //2.a Before sellIn + Arguments.of(new Conjured(1, 10), "Conjured Mana Cake", 0, 8), + Arguments.of(new Conjured(1, 0), "Conjured Mana Cake", 0, 0), + + //2.b After sellIn + Arguments.of(new Conjured(0, 0), "Conjured Mana Cake", -1, 0), + Arguments.of(new Conjured(0, 10), "Conjured Mana Cake", -1, 6)); + } + + @ParameterizedTest + @MethodSource("provideInputWhereSellInDayPassesByOneDay") + void shouldDegradeQualityForAnItem(Conjured conjured, String expectedName, int expectedSellIn, int expectedQuality) { + conjured.updateQuality(); + assertEquals(expectedName, conjured.name); + assertEquals(expectedSellIn, conjured.sellIn); + assertEquals(expectedQuality, conjured.quality); + } + +} diff --git a/Java/src/test/java/com/gildedrose/model/NormalItemTest.java b/Java/src/test/java/com/gildedrose/model/NormalItemTest.java new file mode 100644 index 00000000..796917a0 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/model/NormalItemTest.java @@ -0,0 +1,38 @@ +package com.gildedrose.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class NormalItemTest { + + private static Stream provideInputWhereSellInDayPassesByOneDay() { + + return Stream.of( + + // 1. Normal Item + // 1.a Before sellIn + Arguments.of(new NormalItem("Normal Item", 1, 0), "Normal Item", 0, 0), + Arguments.of(new NormalItem("Normal Item", 1, 10), "Normal Item", 0, 9), + + //1.b After sellIn + Arguments.of(new NormalItem("Normal Item", 0, 0), "Normal Item", -1, 0), + Arguments.of(new NormalItem("Normal Item", 0, 10), "Normal Item", -1, 8)); + + + } + + @ParameterizedTest + @MethodSource("provideInputWhereSellInDayPassesByOneDay") + void shouldDegradeQualityForAnItem(NormalItem normalItem, String expectedName, int expectedSellIn, int expectedQuality) { + normalItem.updateQuality(); + assertEquals(expectedName, normalItem.name); + assertEquals(expectedSellIn, normalItem.sellIn); + assertEquals(expectedQuality, normalItem.quality); + } + +} diff --git a/Java/src/test/java/com/gildedrose/model/SulfurasTest.java b/Java/src/test/java/com/gildedrose/model/SulfurasTest.java new file mode 100644 index 00000000..9bc2fdc5 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/model/SulfurasTest.java @@ -0,0 +1,36 @@ +package com.gildedrose.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SulfurasTest { + + private static Stream provideInputWhereSellInDayPassesByOneDay() { + + return Stream.of( + + //4."Sulfuras, Hand of Ragnaros" + + //4.a before sellIn + Arguments.of(new Sulfuras(10, 80), "Sulfuras, Hand of Ragnaros", 10, 80), + + //4.b after sellIn + Arguments.of(new Sulfuras(0, 80), "Sulfuras, Hand of Ragnaros", 0, 80), + Arguments.of(new Sulfuras(-1, 80), "Sulfuras, Hand of Ragnaros", -1, 80)); + } + + @ParameterizedTest + @MethodSource("provideInputWhereSellInDayPassesByOneDay") + void shouldDegradeQualityForAnItem(Sulfuras sulfuras, String expectedName, int expectedSellIn, int expectedQuality) { + sulfuras.updateQuality(); + assertEquals(expectedName, sulfuras.name); + assertEquals(expectedSellIn, sulfuras.sellIn); + assertEquals(expectedQuality, sulfuras.quality); + } + +}