From baaada94492203a592eae476fbed4cdfb1133290 Mon Sep 17 00:00:00 2001 From: efeleke Date: Thu, 19 Jan 2023 10:29:04 -0600 Subject: [PATCH] Refactroring completed: 4 methods extracted to update each item indivdaully. Additionally, unit test added to handle most and edge cases --- .../main/java/com/gildedrose/GildedRose.java | 129 ++++++++++----- .../java/com/gildedrose/GildedRoseTest.java | 151 +++++++++++++++++- .../java/com/gildedrose/TexttestFixture.java | 2 +- 3 files changed, 232 insertions(+), 50 deletions(-) diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..fc5c8503 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,103 @@ package com.gildedrose; class GildedRose { + + private final String AGED_BRIE = "Aged Brie"; + private final String BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert"; + private final String SULFURAS = "Sulfuras, Hand of Ragnaros"; + Item[] items; public GildedRose(Item[] items) { this.items = items; } + + public void updateAgedBrie(Item item) { + + // quality for any item can not exceed 50 + if (item.quality < 50) { + item.quality = item.quality + 1; // age brie quality update + + + } + // update sell in date + item.sellIn = item.sellIn - 1; + // quality for age brie gets better as it ages past its sellIn + if (item.sellIn < 0 && item.quality < 50) { + item.quality = item.quality + 1; // age brie quality update + } + } + + public void updateBackStage(Item item) { + // no items quality gets above 50 + if (item.quality < 50) { + item.quality = item.quality + 1; // backstage quality update + + // quality increases twice if 10 days to sellIn + if (item.sellIn < 11 && item.quality < 50) { + item.quality = item.quality + 1; + } + // quality increases by three if 5 days to sellIn + if (item.sellIn < 6 && item.quality < 50) { + item.quality = item.quality + 1; + } + } + // update sell in date for Backstage item + item.sellIn = item.sellIn - 1; + // quality drops to zero if it's past concert date + if (item.sellIn < 0) { + item.quality = item.quality - item.quality; + } + } + + public void updateSulfuras(Item item) { + // Sulfuras is a legendary item + // nothing happens for the sulfuras Item + } + + public void updateNormalItem(Item item) { + + // normal item quality decreases by 1 every day + if (item.quality > 0) { + item.quality = item.quality - 1; + } + + // update sell in date for Normal item + item.sellIn = item.sellIn - 1; + + // quality drops twice if item is past sellIn Date + if (item.sellIn < 0 && item.quality > 0) { + item.quality = item.quality - 1; + } + } + 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; + for (Item item : this.items) { - 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; - } - } + // only sulfuras don't sell + // hence update sellin value for all items except sulfuras here + + if (item.name != SULFURAS) { - 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; - } + switch (item.name) { + case AGED_BRIE: + updateAgedBrie(item); + continue; - 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; - } - } + case BACKSTAGE_PASS: + updateBackStage(item); + continue; + case SULFURAS: + updateSulfuras(item); + continue; + default: + updateNormalItem(item); + continue; } } } -} \ No newline at end of file + +} diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index 8ae29eec..d13b7329 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -1,17 +1,158 @@ package com.gildedrose; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; class GildedRoseTest { + private final String AGED_BRIE = "Aged Brie"; + private final String BACKSTAGE = "Backstage passes to a TAFKAL80ETC concert"; + private final String SULFURAS = "Sulfuras, Hand of Ragnaros"; + private final String CAKE = "Conjured Mana Cake"; + private final int BACKSTAGE_QUALITY_INCREASE_10_DAYS = 2; + private final int BACKSTAGE_QUALITY_INCREASE_5_DAYS = 3; + private GildedRose app; + + @BeforeEach + void setup() { + this.app = new GildedRose(new Item[]{}); + } @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); + Item[] items = new Item[]{new Item("foo", 0, 0)}; + this.app.items = items; + this.app.updateQuality(); + assertEquals("foo", app.items[0].name); } + @Test + void testNoNegativeQuality() { + Item[] items = new Item[]{ + new Item(AGED_BRIE, 0, 0), + new Item(BACKSTAGE, 0, 0), + new Item(SULFURAS, 0, 0), + new Item(CAKE, 0, 0) + }; + this.app.items = items; + // update quality two times + this.app.updateQuality(); + this.app.updateQuality(); + + // assert the quality is not negative + for (Item item : + this.app.items) { + assertTrue(item.quality >= 0); + } + } + + @Test + void testAgedBrieQualityIncrease() { + Item[] items = new Item[]{new Item(AGED_BRIE, 0, 10)}; + this.app.items = items; + // update quality two times + this.app.updateQuality(); + this.app.updateQuality(); + assertTrue(this.app.items[0].quality > 10); + } + + + @Test + void testQualityNeverMoreThan50() { + Item[] items = new Item[]{new Item(AGED_BRIE, 0, 50)}; + this.app.items = items; + // update quality two times + this.app.updateQuality(); + this.app.updateQuality(); + assertTrue(this.app.items[0].quality <= 50); + } + + + @Test + void testSulfurasQualityNeverChange() { + Item[] items = new Item[]{new Item(SULFURAS, 2, 10)}; + this.app.items = items; + // update quality two times + this.app.updateQuality(); + this.app.updateQuality(); + this.app.updateQuality(); + assertEquals(10,this.app.items[0].quality); + assertEquals(2,this.app.items[0].sellIn ); + } + + + @Test + void testBackstagePassQuality10DaysBeforeSellIn() { + Item[] items = new Item[]{new Item(BACKSTAGE, 9, 10)}; + this.app.items = items; + // update quality two times + int noOfDays = 3; + for (int day = 0; day < noOfDays; day++) { + this.app.updateQuality(); + } + int expectedQuality = 10 + BACKSTAGE_QUALITY_INCREASE_10_DAYS * noOfDays; + assertEquals(expectedQuality, this.app.items[0].quality); + } + + @Test + void testBackstagePassQuality5DaysBeforeSellIn() { + Item[] items = new Item[]{new Item(BACKSTAGE, 5, 10)}; + this.app.items = items; + // update quality two times + int noOfDays = 3; + for (int day = 0; day < noOfDays; day++) { + this.app.updateQuality(); + } + int expectedQuality = 10 + BACKSTAGE_QUALITY_INCREASE_5_DAYS * noOfDays; + assertEquals(expectedQuality, this.app.items[0].quality); + } + + @Test + void testBackstagePassQuality6DaysBeforeSellIn() { + Item[] items = new Item[]{new Item(BACKSTAGE, 6, 10)}; + this.app.items = items; + // update quality two times + this.app.updateQuality(); + int expectedQuality = 12; + assertEquals(expectedQuality, this.app.items[0].quality); + } + + @Test + void testBackstagePassQuality11DaysBeforeSellIn() { + Item[] items = new Item[]{new Item(BACKSTAGE, 11, 10)}; + this.app.items = items; + // update quality two times + this.app.updateQuality(); + int expectedQuality = 11; + assertEquals(expectedQuality, this.app.items[0].quality); + } + + @Test + void testBackstagePassQualityAfterSellIn() { + Item[] items = new Item[]{new Item(BACKSTAGE, 1, 10)}; + this.app.items = items; + // update quality two times + int noOfDays = 2; + for (int day = 0; day < noOfDays; day++) { + this.app.updateQuality(); + } + int expectedQuality = 0; + assertEquals(expectedQuality, this.app.items[0].quality); + } + + @Test + void testNormalItemQualityDegradeTwiceAsFast() { + Item[] items = new Item[]{new Item(CAKE, 0, 10)}; + this.app.items = items; + // update quality two times + int noOfDays = 2; + for (int day = 0; day < noOfDays; day++) { + this.app.updateQuality(); + } + int expectedQuality = 6; + assertEquals(expectedQuality, this.app.items[0].quality); + } + + } diff --git a/Java/src/test/java/com/gildedrose/TexttestFixture.java b/Java/src/test/java/com/gildedrose/TexttestFixture.java index d059c88f..1e1aa928 100644 --- a/Java/src/test/java/com/gildedrose/TexttestFixture.java +++ b/Java/src/test/java/com/gildedrose/TexttestFixture.java @@ -18,7 +18,7 @@ public class TexttestFixture { GildedRose app = new GildedRose(items); - int days = 2; + int days = 30; if (args.length > 0) { days = Integer.parseInt(args[0]) + 1; }