Added more Junit Test cases covering most cases , Added logic for Conjure Items, Refactored GildedRose class

This commit is contained in:
Sushant Singh 2021-02-01 13:01:28 +00:00
parent 33373d6fd5
commit f75116eb6f
2 changed files with 218 additions and 59 deletions

View File

@ -1,62 +1,82 @@
package com.gildedrose; package com.gildedrose;
class GildedRose { class GildedRose {
Item[] items; Item[] items;
public GildedRose(Item[] items) { public GildedRose(Item[] items) {
this.items = items; this.items = items;
} }
public void updateQuality() { private static final String AGED_BRIE_STRING = "Aged Brie";
for (int i = 0; i < items.length; i++) { private static final String BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert";
if (!items[i].name.equals("Aged Brie") private static final String SULFRAS = "Sulfuras, Hand of Ragnaros";
&& !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { private static final String CONJURED_ITEM = "Conjured Mana Cake";
if (items[i].quality > 0) { private static final int UPPER_LIMIT_QUALITY = 50;
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) { * TODO :: 1.Idea is to replace if else with separate logic depending on the
if (items[i].quality < 50) { * type of Item we receive we can have specific methods(We can use Factory
items[i].quality = items[i].quality + 1; * 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")) { if (items[i].name.equalsIgnoreCase(BACKSTAGE_PASS)) {
items[i].sellIn = items[i].sellIn - 1; 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].sellIn < 6) {
if (!items[i].name.equals("Aged Brie")) { if (items[i].quality < UPPER_LIMIT_QUALITY) {
if (!items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { items[i].quality = items[i].quality + 1;
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; if (!items[i].name.equalsIgnoreCase(SULFRAS)) {
}
} else { items[i].sellIn = items[i].sellIn - 1;
if (items[i].quality < 50) { }
items[i].quality = items[i].quality + 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;
}
}
}
}
}
} }

View File

@ -6,12 +6,151 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
class GildedRoseTest { class GildedRoseTest {
@Test @Test
void foo() { void foo() {
Item[] items = new Item[] { new Item("foo", 0, 0) }; Item[] items = new Item[] { new Item("foo", 0, 0) };
GildedRose app = new GildedRose(items); GildedRose app = new GildedRose(items);
app.updateQuality(); app.updateQuality();
assertEquals("fixme", app.items[0].name); 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);
}
} }