Refactored Code : Moved implementation of expired items quality update to specific classes.

This commit is contained in:
lekshmysasidhar 2023-03-31 12:31:33 +02:00
parent cec7b6ad04
commit df61c9c901
11 changed files with 98 additions and 40 deletions

View File

@ -9,6 +9,14 @@ public class AgedBrie implements Goods {
} }
@Override
public void updateQualityForExpiredItem(Item item) {
if (item.sellIn < 0) {
addQualityWhenWithInLimit(item);
}
}
private void addQualityWhenWithInLimit(Item item) { private void addQualityWhenWithInLimit(Item item) {
if (item.quality < MAX_ALLOWED_QUALITY) { if (item.quality < MAX_ALLOWED_QUALITY) {
item.quality++; item.quality++;

View File

@ -5,6 +5,7 @@ public class BackStagePasses implements Goods {
private static final int MAX_ALLOWED_QUALITY = 50; private static final int MAX_ALLOWED_QUALITY = 50;
private static final int SELL_IN_MAX_THRESHOLD_DAY = 11; private static final int SELL_IN_MAX_THRESHOLD_DAY = 11;
private static final int SELL_IN_MIN_THRESHOLD_DAY = 6; private static final int SELL_IN_MIN_THRESHOLD_DAY = 6;
private static final int ZERO = 0;
@Override @Override
public void updateQuality(Item item) { public void updateQuality(Item item) {
@ -22,4 +23,11 @@ public class BackStagePasses implements Goods {
item.quality++; item.quality++;
} }
} }
@Override
public void updateQualityForExpiredItem(Item item) {
if (item.sellIn < 0) {
item.quality = ZERO;
}
}
} }

View File

@ -7,4 +7,11 @@ public class Generic implements Goods {
item.quality--; item.quality--;
} }
} }
@Override
public void updateQualityForExpiredItem(Item item) {
if (item.sellIn < 0 && item.quality > 0) {
item.quality--;
}
}
} }

View File

@ -9,47 +9,13 @@ class GildedRose {
this.items = items; this.items = items;
} }
public void updateQuality() { public void updateQuality() {
for (Item item : items) { for (Item item : items) {
Goods goods = GoodsFactory.getGoods(item.name); Goods goods = GoodsFactory.getGoods(item.name);
goods.updateQuality(item); goods.updateQuality(item);
goods.updateSellInDays(item); goods.updateSellInDays(item);
goods.updateQualityForExpiredItem(item);
updateQualityForExpiredItem(item);
}
}
private void addQualityWhenWithInLimit(Item item) {
if (item.quality < 50) {
item.quality = item.quality + 1;
} }
} }
private void updateQualityForExpiredItem(Item item) {
if (item.sellIn < 0) {
if (!item.name.equals("Aged Brie")) {
if (!item.name.equals("Backstage passes to a TAFKAL80ETC concert")) {
if (item.quality > 0) {
if (!item.name.equals("Sulfuras, Hand of Ragnaros")) {
updateQualityForExpiredItemNormal(item);
}
}
} else {
updateQualityForExpiredItemBackstagePasses(item);
}
} else {
addQualityWhenWithInLimit(item);
}
}
}
private void updateQualityForExpiredItemBackstagePasses(Item item) {
item.quality = 0;
}
private void updateQualityForExpiredItemNormal(Item item) {
item.quality--;
}
} }

View File

@ -7,4 +7,6 @@ public interface Goods {
default void updateSellInDays(Item item) { default void updateSellInDays(Item item) {
item.sellIn--; item.sellIn--;
} }
public void updateQualityForExpiredItem(Item item);
} }

View File

@ -15,4 +15,10 @@ public class Sulfuras implements Goods {
// decreases in quality. // decreases in quality.
} }
@Override
public void updateQualityForExpiredItem(Item item) {
// Do nothing because Sulfuras being a legendary item, never has to be sold or
// decreases in quality.
}
} }

View File

@ -24,6 +24,13 @@ class AgedBrieTest {
); );
} }
private static Stream<Arguments> getTestExpiredItemsWithExpectedQuality() {
return Stream.of(
Arguments.of(new Item(GoodsType.AGED_BRIE.getGoodsName(), -1, 2), 3),
Arguments.of(new Item(GoodsType.AGED_BRIE.getGoodsName(), 1, 2), 2)
);
}
@ParameterizedTest(name = "Test updateQuality - {index}") @ParameterizedTest(name = "Test updateQuality - {index}")
@MethodSource("getTestItemsWithExpectedQuality") @MethodSource("getTestItemsWithExpectedQuality")
@ -42,4 +49,12 @@ class AgedBrieTest {
} }
@ParameterizedTest(name = "Test updateQuality for expired items - {index}")
@MethodSource("getTestExpiredItemsWithExpectedQuality")
void testtestUpdateQualityForExpiredItems(Item item, int expectedQuality) {
AgedBrie agedBrie = new AgedBrie();
agedBrie.updateQualityForExpiredItem(item);
assertEquals(expectedQuality, item.quality);
}
} }

View File

@ -25,6 +25,12 @@ class BackStagePassesTest {
); );
} }
private static Stream<Arguments> getTestExpiredItemsWithExpectedQuality() {
return Stream.of(
Arguments.of(new Item(GoodsType.BACK_STAGE_PASSES.getGoodsName(), -1, 2), 0),
Arguments.of(new Item(GoodsType.BACK_STAGE_PASSES.getGoodsName(), 1, 2), 2));
}
@ParameterizedTest(name = "Test updateQuality - {index}") @ParameterizedTest(name = "Test updateQuality - {index}")
@ -33,7 +39,6 @@ class BackStagePassesTest {
BackStagePasses backStagePasses = new BackStagePasses(); BackStagePasses backStagePasses = new BackStagePasses();
backStagePasses.updateQuality(item); backStagePasses.updateQuality(item);
assertEquals(expectedQuality, item.quality); assertEquals(expectedQuality, item.quality);
} }
@ParameterizedTest(name = "Test updateSellIn - {index}") @ParameterizedTest(name = "Test updateSellIn - {index}")
@ -42,7 +47,14 @@ class BackStagePassesTest {
BackStagePasses backStagePasses = new BackStagePasses(); BackStagePasses backStagePasses = new BackStagePasses();
backStagePasses.updateSellInDays(item); backStagePasses.updateSellInDays(item);
assertEquals(expectedSellin, item.sellIn); assertEquals(expectedSellin, item.sellIn);
}
@ParameterizedTest(name = "Test updateQuality for expired items - {index}")
@MethodSource("getTestExpiredItemsWithExpectedQuality")
void testUpdateQualityForExpiredItems(Item item, int expectedQuality) {
BackStagePasses backStagePasses = new BackStagePasses();
backStagePasses.updateQualityForExpiredItem(item);
assertEquals(expectedQuality, item.quality);
} }
} }

View File

@ -24,6 +24,14 @@ class GenericTest {
); );
} }
private static Stream<Arguments> getTestExpiredItemsWithExpectedQuality() {
return Stream.of(
Arguments.of(new Item("Generic Item", -1, 1), 0),
Arguments.of(new Item("Generic Item", 0, 2), 2),
Arguments.of(new Item("Generic Item", -1, -1), -1)
);
}
@ParameterizedTest(name = "Test updateQuality - {index}") @ParameterizedTest(name = "Test updateQuality - {index}")
@ -32,7 +40,6 @@ class GenericTest {
Generic generic = new Generic(); Generic generic = new Generic();
generic.updateQuality(item); generic.updateQuality(item);
assertEquals(expectedQuality, item.quality); assertEquals(expectedQuality, item.quality);
} }
@ParameterizedTest(name = "Test updateSellIn - {index}") @ParameterizedTest(name = "Test updateSellIn - {index}")
@ -43,4 +50,12 @@ class GenericTest {
assertEquals(expectedSellin, item.sellIn); assertEquals(expectedSellin, item.sellIn);
} }
@ParameterizedTest(name = "Test updateQuality for expired items- {index}")
@MethodSource("getTestExpiredItemsWithExpectedQuality")
void testUpdateQualityForExpiredItems(Item item, int expectedQuality) {
Generic generic = new Generic();
generic.updateQualityForExpiredItem(item);
assertEquals(expectedQuality, item.quality);
}
} }

View File

@ -45,7 +45,10 @@ class GildedRoseTest {
Arguments.of(new Item[] { new Item("Coffee Day", 1, 1) }, 0), Arguments.of(new Item[] { new Item("Coffee Day", 1, 1) }, 0),
Arguments.of(new Item[] { new Item("Coffee Day", -1, 1) }, 0), Arguments.of(new Item[] { new Item("Coffee Day", -1, 1) }, 0),
Arguments.of(new Item[] { new Item("Coffee Day", -1, 2) }, 0) Arguments.of(new Item[] { new Item("Coffee Day", -1, 2) }, 0),
Arguments.of(new Item[] { new Item(GoodsType.SULFURAS.getGoodsName(), -1, 10) }, 10),
Arguments.of(new Item[] { new Item(GoodsType.SULFURAS.getGoodsName(), 1, 10) }, 10)
); );
} }

View File

@ -22,6 +22,13 @@ class SulfurasTest {
Arguments.of(new Item(GoodsType.SULFURAS.getGoodsName(), 1, 50), 1)); Arguments.of(new Item(GoodsType.SULFURAS.getGoodsName(), 1, 50), 1));
} }
private static Stream<Arguments> getTestExpiredItemsWithExpectedQuality() {
return Stream.of(
Arguments.of(new Item(GoodsType.SULFURAS.getGoodsName(), -1, 2), 2),
Arguments.of(new Item(GoodsType.SULFURAS.getGoodsName(), -1, 50), 50)
);
}
@ParameterizedTest(name = "Test updateQuality - {index}") @ParameterizedTest(name = "Test updateQuality - {index}")
@MethodSource("getTestItemsWithExpectedQuality") @MethodSource("getTestItemsWithExpectedQuality")
void testUpdateQuality(Item item, int expectedQuality) { void testUpdateQuality(Item item, int expectedQuality) {
@ -38,4 +45,13 @@ class SulfurasTest {
assertEquals(expectedSellin, item.sellIn); assertEquals(expectedSellin, item.sellIn);
} }
@ParameterizedTest(name = "Test updateQuality for expired items- {index}")
@MethodSource("getTestExpiredItemsWithExpectedQuality")
void testUpdateQualityForExpiredItems(Item item, int expectedQuality) {
Sulfuras sulfurus = new Sulfuras();
sulfurus.updateQualityForExpiredItem(item);
assertEquals(expectedQuality, item.quality);
}
} }