From 1b1fba57f4fb30c4178ffe37fdb77b3b39ed87d4 Mon Sep 17 00:00:00 2001 From: Sebastian Lechowicz Date: Mon, 22 Nov 2021 14:24:50 +0100 Subject: [PATCH] Solution Java v1 --- Java/build.gradle | 2 +- .../main/java/com/gildedrose/GildedRose.java | 57 ++--------------- .../policies/AgedBrieUpdatePolicy.java | 15 +++++ .../policies/BackstagePassesUpdatePolicy.java | 31 ++++++++++ .../policies/ConjuredUpdatePolicy.java | 15 +++++ .../com/gildedrose/policies/ItemUpdater.java | 10 +++ .../policies/SulfurasUpdatePolicy.java | 14 +++++ .../policies/UpdatePolicesFactory.java | 17 ++++++ .../com/gildedrose/policies/UpdatePolicy.java | 36 +++++++++++ .../java/com/gildedrose/AgedBrieItemTest.java | 56 +++++++++++++++++ .../gildedrose/BackstagePassesItemTest.java | 61 +++++++++++++++++++ .../java/com/gildedrose/ConjuredItemTest.java | 41 +++++++++++++ .../java/com/gildedrose/GildedRoseTest.java | 17 ------ .../test/java/com/gildedrose/ItemTest.java | 50 +++++++++++++++ .../java/com/gildedrose/SulfurasItemTest.java | 19 ++++++ 15 files changed, 372 insertions(+), 69 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/policies/AgedBrieUpdatePolicy.java create mode 100644 Java/src/main/java/com/gildedrose/policies/BackstagePassesUpdatePolicy.java create mode 100644 Java/src/main/java/com/gildedrose/policies/ConjuredUpdatePolicy.java create mode 100644 Java/src/main/java/com/gildedrose/policies/ItemUpdater.java create mode 100644 Java/src/main/java/com/gildedrose/policies/SulfurasUpdatePolicy.java create mode 100644 Java/src/main/java/com/gildedrose/policies/UpdatePolicesFactory.java create mode 100644 Java/src/main/java/com/gildedrose/policies/UpdatePolicy.java create mode 100644 Java/src/test/java/com/gildedrose/AgedBrieItemTest.java create mode 100644 Java/src/test/java/com/gildedrose/BackstagePassesItemTest.java create mode 100644 Java/src/test/java/com/gildedrose/ConjuredItemTest.java delete mode 100644 Java/src/test/java/com/gildedrose/GildedRoseTest.java create mode 100644 Java/src/test/java/com/gildedrose/ItemTest.java create mode 100644 Java/src/test/java/com/gildedrose/SulfurasItemTest.java diff --git a/Java/build.gradle b/Java/build.gradle index f3773536..fd09a677 100644 --- a/Java/build.gradle +++ b/Java/build.gradle @@ -15,7 +15,7 @@ dependencies { group = 'com.gildedrose' version = '0.0.1-SNAPSHOT' -sourceCompatibility = '1.8' +sourceCompatibility = '14' test { useJUnitPlatform() diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..4c097474 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,5 +1,9 @@ package com.gildedrose; +import com.gildedrose.policies.ItemUpdater; + +import java.util.Arrays; + class GildedRose { Item[] items; @@ -8,55 +12,6 @@ class GildedRose { } 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; - } - } - } - } + Arrays.stream(items).forEach(ItemUpdater::updateItem); } -} \ No newline at end of file +} diff --git a/Java/src/main/java/com/gildedrose/policies/AgedBrieUpdatePolicy.java b/Java/src/main/java/com/gildedrose/policies/AgedBrieUpdatePolicy.java new file mode 100644 index 00000000..91acd759 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/policies/AgedBrieUpdatePolicy.java @@ -0,0 +1,15 @@ +package com.gildedrose.policies; + +import com.gildedrose.Item; + +class AgedBrieUpdatePolicy extends UpdatePolicy { + AgedBrieUpdatePolicy(Item item) { + super(item); + } + + @Override + void updateItem() { + decreaseSellIn(); + increaseQuality(); + } +} diff --git a/Java/src/main/java/com/gildedrose/policies/BackstagePassesUpdatePolicy.java b/Java/src/main/java/com/gildedrose/policies/BackstagePassesUpdatePolicy.java new file mode 100644 index 00000000..1f52b356 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/policies/BackstagePassesUpdatePolicy.java @@ -0,0 +1,31 @@ +package com.gildedrose.policies; + +import com.gildedrose.Item; + +class BackstagePassesUpdatePolicy extends UpdatePolicy { + BackstagePassesUpdatePolicy(Item item) { + super(item); + } + + @Override + void updateItem() { + decreaseSellIn(); + + var sellIn = item.sellIn; + + if (sellIn < 0) { + item.quality = 0; + return; + } + + increaseQuality(); + + if (sellIn < 10) { + increaseQuality(); + } + + if (sellIn < 5) { + increaseQuality(); + } + } +} diff --git a/Java/src/main/java/com/gildedrose/policies/ConjuredUpdatePolicy.java b/Java/src/main/java/com/gildedrose/policies/ConjuredUpdatePolicy.java new file mode 100644 index 00000000..8db919fe --- /dev/null +++ b/Java/src/main/java/com/gildedrose/policies/ConjuredUpdatePolicy.java @@ -0,0 +1,15 @@ +package com.gildedrose.policies; + +import com.gildedrose.Item; + +class ConjuredUpdatePolicy extends UpdatePolicy { + ConjuredUpdatePolicy(Item item) { + super(item); + } + + @Override + void updateItem() { + super.updateItem(); + decreaseQuality(); + } +} diff --git a/Java/src/main/java/com/gildedrose/policies/ItemUpdater.java b/Java/src/main/java/com/gildedrose/policies/ItemUpdater.java new file mode 100644 index 00000000..50d0b219 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/policies/ItemUpdater.java @@ -0,0 +1,10 @@ +package com.gildedrose.policies; + +import com.gildedrose.Item; + +public class ItemUpdater { + + public static void updateItem(Item item){ + UpdatePolicesFactory.getUpdatePolicy(item).updateItem(); + } +} diff --git a/Java/src/main/java/com/gildedrose/policies/SulfurasUpdatePolicy.java b/Java/src/main/java/com/gildedrose/policies/SulfurasUpdatePolicy.java new file mode 100644 index 00000000..bb10c8f0 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/policies/SulfurasUpdatePolicy.java @@ -0,0 +1,14 @@ +package com.gildedrose.policies; + +import com.gildedrose.Item; + +class SulfurasUpdatePolicy extends UpdatePolicy{ + SulfurasUpdatePolicy(Item item) { + super(item); + } + + @Override + void updateItem() { + // Do nothing + } +} diff --git a/Java/src/main/java/com/gildedrose/policies/UpdatePolicesFactory.java b/Java/src/main/java/com/gildedrose/policies/UpdatePolicesFactory.java new file mode 100644 index 00000000..4878ca64 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/policies/UpdatePolicesFactory.java @@ -0,0 +1,17 @@ +package com.gildedrose.policies; + +import com.gildedrose.Item; + + class UpdatePolicesFactory { + + static UpdatePolicy getUpdatePolicy(Item item) { + return switch (item.name) { + case "Aged Brie" -> new AgedBrieUpdatePolicy(item); + case "Backstage passes to a TAFKAL80ETC concert" -> new BackstagePassesUpdatePolicy(item); + case "Sulfuras, Hand of Ragnaros" -> new SulfurasUpdatePolicy(item); + case "Conjured" -> new ConjuredUpdatePolicy(item); + default -> new UpdatePolicy(item); + }; + } + +} diff --git a/Java/src/main/java/com/gildedrose/policies/UpdatePolicy.java b/Java/src/main/java/com/gildedrose/policies/UpdatePolicy.java new file mode 100644 index 00000000..fbde8002 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/policies/UpdatePolicy.java @@ -0,0 +1,36 @@ +package com.gildedrose.policies; + +import com.gildedrose.Item; + +class UpdatePolicy { + + private final int MAX_QUALITY = 50; + private final int MIN_QUALITY = 0; + + protected Item item; + + UpdatePolicy(Item item) { + this.item = item; + } + + void updateItem() { + decreaseSellIn(); + decreaseQuality(); + } + + void decreaseSellIn() { + item.sellIn -= 1; + } + + void decreaseQuality() { + item.quality = item.quality <= MIN_QUALITY ? MIN_QUALITY : isExpired() ? item.quality - 2 : item.quality - 1; + } + + void increaseQuality() { + item.quality = item.quality >= MAX_QUALITY ? MAX_QUALITY : isExpired() ? item.quality + 2 : item.quality + 1; + } + + private boolean isExpired() { + return item.sellIn < 0; + } +} diff --git a/Java/src/test/java/com/gildedrose/AgedBrieItemTest.java b/Java/src/test/java/com/gildedrose/AgedBrieItemTest.java new file mode 100644 index 00000000..af397192 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/AgedBrieItemTest.java @@ -0,0 +1,56 @@ +package com.gildedrose; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AgedBrieItemTest extends ItemTest { + + @Override + @Test + void sellInDecreaseTest() { + Item[] items = new Item[] { new Item("Aged Brie", 2, 2) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + + assertEquals(3, app.items[0].quality); + assertEquals(1, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(4, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + } + + @Override + @Test + void afterSellInQualityChangeTest() { + Item[] items = new Item[] { new Item("Aged Brie", 1, 2) }; + GildedRose app = new GildedRose(items); + + app.updateQuality(); + + assertEquals(3, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(5, app.items[0].quality); + assertEquals(-1, app.items[0].sellIn); + } + + @Test + void qualityNotAbove50Test() { + Item[] items = new Item[] { new Item("Aged Brie", 2, 49) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + + assertEquals(50, app.items[0].quality); + assertEquals(1, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(50, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + } +} diff --git a/Java/src/test/java/com/gildedrose/BackstagePassesItemTest.java b/Java/src/test/java/com/gildedrose/BackstagePassesItemTest.java new file mode 100644 index 00000000..75731025 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/BackstagePassesItemTest.java @@ -0,0 +1,61 @@ +package com.gildedrose; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BackstagePassesItemTest extends ItemTest{ + + @Override + @Test + void sellInDecreaseTest() { + Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 11, 0), + new Item("Backstage passes to a TAFKAL80ETC concert", 6, 10) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + + assertEquals(1, app.items[0].quality); + assertEquals(10, app.items[0].sellIn); + assertEquals(12, app.items[1].quality); + assertEquals(5, app.items[1].sellIn); + + app.updateQuality(); + + assertEquals(3, app.items[0].quality); + assertEquals(9, app.items[0].sellIn); + assertEquals(15, app.items[1].quality); + assertEquals(4, app.items[1].sellIn); + } + + @Override + @Test + void afterSellInQualityChangeTest() { + Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 1, 20) }; + GildedRose app = new GildedRose(items); + + app.updateQuality(); + + assertEquals(23, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(0, app.items[0].quality); + assertEquals(-1, app.items[0].sellIn); + } + + @Test + void qualityNotAbove50Test() { + Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 2, 49) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + + assertEquals(50, app.items[0].quality); + assertEquals(1, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(50, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + } +} diff --git a/Java/src/test/java/com/gildedrose/ConjuredItemTest.java b/Java/src/test/java/com/gildedrose/ConjuredItemTest.java new file mode 100644 index 00000000..8be0eecb --- /dev/null +++ b/Java/src/test/java/com/gildedrose/ConjuredItemTest.java @@ -0,0 +1,41 @@ +package com.gildedrose; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ConjuredItemTest extends ItemTest{ + + @Override + @Test + void sellInDecreaseTest() { + Item[] items = new Item[] { new Item("Conjured", 2, 10) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + + assertEquals(8, app.items[0].quality); + assertEquals(1, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(6, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + } + + @Override + @Test + void afterSellInQualityChangeTest() { + Item[] items = new Item[] { new Item("Conjured", 1, 20) }; + GildedRose app = new GildedRose(items); + + app.updateQuality(); + + assertEquals(18, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(14, app.items[0].quality); + assertEquals(-1, app.items[0].sellIn); + } +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java deleted file mode 100644 index 8ae29eec..00000000 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gildedrose; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class GildedRoseTest { - - @Test - void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; - GildedRose app = new GildedRose(items); - app.updateQuality(); - assertEquals("fixme", app.items[0].name); - } - -} diff --git a/Java/src/test/java/com/gildedrose/ItemTest.java b/Java/src/test/java/com/gildedrose/ItemTest.java new file mode 100644 index 00000000..e5c2affe --- /dev/null +++ b/Java/src/test/java/com/gildedrose/ItemTest.java @@ -0,0 +1,50 @@ +package com.gildedrose; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ItemTest { + + @Test + void sellInDecreaseTest() { + Item[] items = new Item[] { new Item("foo", 2, 2) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + + assertEquals(1, app.items[0].quality); + assertEquals(1, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(0, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + } + + @Test + void notNegativeQualityTest() { + Item[] items = new Item[] { new Item("foo", 0, 0) }; + GildedRose app = new GildedRose(items); + + app.updateQuality(); + + assertEquals(0, app.items[0].quality); + assertEquals(-1, app.items[0].sellIn); + } + + @Test + void afterSellInQualityChangeTest() { + Item[] items = new Item[] { new Item("foo", 1, 20) }; + GildedRose app = new GildedRose(items); + + app.updateQuality(); + + assertEquals(19, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + + app.updateQuality(); + + assertEquals(17, app.items[0].quality); + assertEquals(-1, app.items[0].sellIn); + } +} diff --git a/Java/src/test/java/com/gildedrose/SulfurasItemTest.java b/Java/src/test/java/com/gildedrose/SulfurasItemTest.java new file mode 100644 index 00000000..362930b2 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/SulfurasItemTest.java @@ -0,0 +1,19 @@ +package com.gildedrose; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SulfurasItemTest { + + @Test + void standardChangeTest() { + Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", 5, 80) }; + GildedRose app = new GildedRose(items); + + app.updateQuality(); + + assertEquals(80, app.items[0].quality); + assertEquals(5, app.items[0].sellIn); + } +}