From df2184c18d753c39ff2d98a0a720029ef4540247 Mon Sep 17 00:00:00 2001 From: Hussein Mishobo Date: Thu, 18 Sep 2025 13:05:51 +0300 Subject: [PATCH] new practical test --- .../main/java/com/gildedrose/GildedRose.java | 112 ++++++++++-------- .../gildedrose/helper/ItemAgentService.java | 7 ++ .../gildedrose/helper/ItemUpdaterFactory.java | 20 ++++ .../java/com/gildedrose/GildedRoseTest.java | 18 ++- 4 files changed, 106 insertions(+), 51 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/helper/ItemAgentService.java create mode 100644 Java/src/main/java/com/gildedrose/helper/ItemUpdaterFactory.java diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index 87a3b926..33397872 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,6 +1,8 @@ package com.gildedrose; -class GildedRose { +import com.gildedrose.helper.ItemAgentService; + +public class GildedRose { Item[] items; public GildedRose(Item[] items) { @@ -8,55 +10,69 @@ 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; - } - } + for (Item item : items) { + getUpdater(item).update(item); + } + } + + public ItemAgentService getUpdater(Item item) { + switch (item.name) { + case "Aged Brie": + return new AgedBrieUpdater(); + case "Backstage passes to a TAFKAL80ETC concert": + return new BackstagePassUpdater(); + case "Sulfuras, Hand of Ragnaros": + return new SulfurasUpdater(); + default: + return new NormalItemUpdater(); + } + } + + public static class NormalItemUpdater implements ItemAgentService { + public void update(Item item) { + item.sellIn--; + if (item.quality > 0) item.quality--; + if (item.sellIn < 0 && item.quality > 0) item.quality--; + } + } + + public static class AgedBrieUpdater implements ItemAgentService { + public void update(Item item) { + item.sellIn--; + if (item.quality < 50) item.quality++; + if (item.sellIn < 0 && item.quality < 50) item.quality++; + } + } + + public static class BackstagePassUpdater implements ItemAgentService { + public void update(Item item) { + item.sellIn--; + if (item.sellIn < 0) { + item.quality = 0; + } else if (item.sellIn < 5) { + item.quality = Math.min(item.quality + 3, 50); + } else if (item.sellIn < 10) { + item.quality = Math.min(item.quality + 2, 50); } 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; - } - } + item.quality = Math.min(item.quality + 1, 50); } } } + + public static class SulfurasUpdater implements ItemAgentService { + public void update(Item item) { + // Legendary item: no changes + } + } + + public static class ConjuredItemUpdater implements ItemAgentService { + public void update(Item item) { + item.sellIn--; + if (item.quality > 0) item.quality -= 2; + if (item.sellIn < 0 && item.quality > 0) item.quality -= 2; + if (item.quality < 0) item.quality = 0; // Prevent negative quality + } + } + + } diff --git a/Java/src/main/java/com/gildedrose/helper/ItemAgentService.java b/Java/src/main/java/com/gildedrose/helper/ItemAgentService.java new file mode 100644 index 00000000..92b245af --- /dev/null +++ b/Java/src/main/java/com/gildedrose/helper/ItemAgentService.java @@ -0,0 +1,7 @@ +package com.gildedrose.helper; + +import com.gildedrose.Item; + +public interface ItemAgentService { + void update(Item item); +} diff --git a/Java/src/main/java/com/gildedrose/helper/ItemUpdaterFactory.java b/Java/src/main/java/com/gildedrose/helper/ItemUpdaterFactory.java new file mode 100644 index 00000000..697e4dc7 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/helper/ItemUpdaterFactory.java @@ -0,0 +1,20 @@ +package com.gildedrose.helper; + +import com.gildedrose.GildedRose; +import com.gildedrose.Item; + +public class ItemUpdaterFactory { + public static ItemAgentService getUpdater(Item item) { + switch (item.name) { + case "Aged Brie": + return new GildedRose.AgedBrieUpdater(); + case "Backstage passes to a TAFKAL80ETC concert": + return new GildedRose.BackstagePassUpdater(); + case "Sulfuras, Hand of Ragnaros": + return new GildedRose.SulfurasUpdater(); + case "Conjured Mana Cake": + return new GildedRose.ConjuredItemUpdater(); + default: + return new GildedRose.NormalItemUpdater(); + }} +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..e620530f 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -7,11 +7,23 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class GildedRoseTest { @Test - void foo() { - Item[] items = new Item[] { new Item("foo", 0, 0) }; + void normalItemDegrades() { + Item[] items = new Item[] { new Item("foo", 10, 20) }; GildedRose app = new GildedRose(items); app.updateQuality(); - assertEquals("fixme", app.items[0].name); + assertEquals(9, app.items[0].sellIn); + assertEquals(19, app.items[0].quality); } + @Test + void conjuredItemDegradesTwiceAsFast() { + Item[] items = new Item[] { new Item("Conjured Mana Cake", 5, 10) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(4, items[0].sellIn); + assertEquals(9, items[0].quality); + } + + + }