From f75116eb6fa8ea2de3ecb81501c7f8618d261d7e Mon Sep 17 00:00:00 2001 From: Sushant Singh Date: Mon, 1 Feb 2021 13:01:28 +0000 Subject: [PATCH] Added more Junit Test cases covering most cases , Added logic for Conjure Items, Refactored GildedRose class --- .../main/java/com/gildedrose/GildedRose.java | 124 ++++++++------ .../java/com/gildedrose/GildedRoseTest.java | 153 +++++++++++++++++- 2 files changed, 218 insertions(+), 59 deletions(-) diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e6feb751..95c6fe49 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -1,62 +1,82 @@ package com.gildedrose; class GildedRose { - Item[] items; + Item[] items; - public GildedRose(Item[] items) { - this.items = items; - } + public GildedRose(Item[] items) { + this.items = items; + } - 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; + private static final String AGED_BRIE_STRING = "Aged Brie"; + private static final String BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert"; + private static final String SULFRAS = "Sulfuras, Hand of Ragnaros"; + private static final String CONJURED_ITEM = "Conjured Mana Cake"; + private static final int UPPER_LIMIT_QUALITY = 50; - 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; - } - } + /** + * TODO :: 1.Idea is to replace if else with separate logic depending on the + * type of Item we receive we can have specific methods(We can use Factory + * design Template for this) to handle each scenario like below methods + * backStagePassProcess , ConjuredItemProcess,MiscItemProcess etc. + * + * 2. Can make this update class as static util class but rather go with factory + * pattern to update. Also make ENUMS for Strings. + */ + public void updateQuality() { + for (int i = 0; i < items.length; i++) { + if (!items[i].name.equalsIgnoreCase(AGED_BRIE_STRING) && !items[i].name.equalsIgnoreCase(BACKSTAGE_PASS)) { + if (items[i].quality > 0) { + if (!items[i].name.equalsIgnoreCase(SULFRAS)) { + items[i].quality = items[i].quality - 1; + if (items[i].name.equalsIgnoreCase(CONJURED_ITEM)) + items[i].quality = items[i].quality - 1; - if (items[i].sellIn < 6) { - if (items[i].quality < 50) { - items[i].quality = items[i].quality + 1; - } - } - } - } - } + } + } + } else { + if (items[i].quality < UPPER_LIMIT_QUALITY) { + 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].name.equalsIgnoreCase(BACKSTAGE_PASS)) { + if (items[i].sellIn < 11) { + if (items[i].quality < UPPER_LIMIT_QUALITY) { + items[i].quality = items[i].quality + 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; - } - } - } - } - } + if (items[i].sellIn < 6) { + if (items[i].quality < UPPER_LIMIT_QUALITY) { + items[i].quality = items[i].quality + 1; + } + } + } + } + } + + if (!items[i].name.equalsIgnoreCase(SULFRAS)) { + + items[i].sellIn = items[i].sellIn - 1; + } + + if (items[i].sellIn < 0) { + if (!items[i].name.equalsIgnoreCase(AGED_BRIE_STRING)) { + if (!items[i].name.equalsIgnoreCase(BACKSTAGE_PASS)) { + if (items[i].quality > 0) { + if (!items[i].name.equalsIgnoreCase(SULFRAS)) { + items[i].quality = items[i].quality - 1; + if (items[i].name.equalsIgnoreCase(CONJURED_ITEM)) + 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; + } + } + } + } + } } \ 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..294e22f4 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -6,12 +6,151 @@ 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); - } + @Test + void foo() { + Item[] items = new Item[] { new Item("foo", 0, 0) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals("foo", app.items[0].name); + } + @Test + public void shouldLowerBothValues() { + Item[] items = new Item[] { new Item("foobar", 1, 1) }; + GildedRose app = new GildedRose(items); + app.updateQuality(); + assertEquals(0, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + } + + @Test + public void shouldDowngradeTwiceAsFastAfterSellDate() { + Item[] items = new Item[] { new Item("foobar", 1, 5) }; + GildedRose app = new GildedRose(items); + + // day 1, drop by 1 + app.updateQuality(); + assertEquals(4, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + + // day 2, drop by 2 + app.updateQuality(); + assertEquals(2, app.items[0].quality); + assertEquals(-1, app.items[0].sellIn); + } + + @Test + public void shouldNeverHaveANegativeQuality() { + Item[] items = new Item[] { new Item("foobar", 0, 0) }; + GildedRose app = new GildedRose(items); + + // day 1, drop by 1 + app.updateQuality(); + assertEquals(0, app.items[0].quality); + + // day 2, drop by 1 => quality is still 0 + app.updateQuality(); + assertEquals(0, app.items[0].quality); + } + + @Test + public void shouldSeeAgedBrieIncreasedQualityDayByDay() { + Item[] items = new Item[] { new Item("Aged Brie", 0, 0) }; + GildedRose app = new GildedRose(items); + + // day 1, add 2 + app.updateQuality(); + assertEquals(2, app.items[0].quality); + + // day 2, add 2 + app.updateQuality(); + assertEquals(4, app.items[0].quality); + } + + @Test + public void shouldNeverHaveQualityHigherThan50() { + Item[] items = new Item[] { new Item("Aged Brie", 0, 49) }; + GildedRose app = new GildedRose(items); + + // day 1, add 2 + app.updateQuality(); + assertEquals(50, app.items[0].quality); + + // day 2, add 2 + app.updateQuality(); + assertEquals(50, app.items[0].quality); + } + + @Test + public void shouldSulfrasNotChangeQty() { + Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", 0, 10) }; + GildedRose app = new GildedRose(items); + + // day 1, don't impact quality + app.updateQuality(); + assertEquals(10, app.items[0].quality); + assertEquals(0, app.items[0].sellIn); + + } + + @Test + public void checkForBackStagePasses() { + Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 5, 10) }; + GildedRose app = new GildedRose(items); + + // day 1, increase by 3 the quality + app.updateQuality(); + assertEquals(13, app.items[0].quality); + assertEquals(4, app.items[0].sellIn); + + // day 1, increase by 3 the quality + app.updateQuality(); + assertEquals(16, app.items[0].quality); + assertEquals(3, app.items[0].sellIn); + } + + @Test + public void shouldIncreaseQualityBasedOnSellIn() { + Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 10, 10), + new Item("Backstage passes to a TAFKAL80ETC concert", 5, 10) }; + GildedRose app = new GildedRose(items); + + app.updateQuality(); + assertEquals(12, app.items[0].quality); + assertEquals(9, app.items[0].sellIn); + + assertEquals(13, app.items[1].quality); + assertEquals(4, app.items[1].sellIn); + } + + public void shouldSulfurasNeverAltersForSulfuras() { + Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", 10, 80) }; + + GildedRose app = new GildedRose(items); + + app.updateQuality(); + assertEquals(80, app.items[0].quality); + } + + @Test + public void shouldHaveQualityDroppingToZeroAfterConcert() { + Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 0, 10) }; + + GildedRose app = new GildedRose(items); + + app.updateQuality(); + assertEquals(0, app.items[0].quality); + assertEquals(-1, app.items[0].sellIn); + } + + @Test + public void shouldDegradeConjureItemsTwiceAsNormal() { + Item[] items = new Item[] { new Item("Conjured Mana Cake", 10, 10), new Item("Conjured Mana Cake", 0, 10) }; + + GildedRose app = new GildedRose(items); + + app.updateQuality(); + assertEquals(8, app.items[0].quality); + assertEquals(6, app.items[1].quality); + } }