Refactoring and adding conjured item

This commit is contained in:
Federico Coraglio 2023-07-10 18:11:48 -03:00
parent d0d6fdb93c
commit b8077d986a
10 changed files with 281 additions and 54 deletions

View File

@ -1,62 +1,26 @@
package com.gildedrose; package com.gildedrose;
import java.util.Arrays;
import java.util.List;
import java.util.Collections;
import com.gildedrose.item.quality.QualityUpdater;
import com.gildedrose.item.quality.QualityUpdaterMapper;
class GildedRose { class GildedRose {
Item[] items; private final List<Item> items;
private final QualityUpdaterMapper qualityUpdaterMapper = new QualityUpdaterMapper();
public GildedRose(Item[] items) { public GildedRose(Item[] items) {
this.items = items; this.items = items != null ? Arrays.asList(items) : Collections.EMPTY_LIST;
} }
public void updateQuality() { public void updateQuality() {
for (int i = 0; i < items.length; i++) { for (final Item item : items) {
if (!items[i].name.equals("Aged Brie") if (item != null) {
&& !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { final QualityUpdater updater = qualityUpdaterMapper.getQualityUpdater(item.name);
if (items[i].quality > 0) { updater.updateQuality(item);
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) {
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;
}
}
} }
} }
} }
} }

View File

@ -0,0 +1,11 @@
package com.gildedrose.item.quality;
import com.gildedrose.Item;
public interface QualityUpdater {
int MAX_LIMIT_QUALITY = 50;
int MIM_LIMIT_QUALITY = 0;
int MIM_LIMIT_SELL_IN = 0;
void updateQuality(final Item item);
}

View File

@ -0,0 +1,23 @@
package com.gildedrose.item.quality;
import com.gildedrose.item.quality.type.QualifyUpdaterType;
import com.gildedrose.item.quality.updater.*;
import java.util.HashMap;
import java.util.Map;
public class QualityUpdaterMapper {
private final Map<String, QualityUpdater> qualityUpdaters = new HashMap<>();
private final static QualityUpdater DEFAULT_UPDATER = new QualityUpdaterDefault();
public QualityUpdaterMapper() {
qualityUpdaters.put(QualifyUpdaterType.AGED_BRIE.getValue().toUpperCase(), new QualityUpdaterAgedBrie());
qualityUpdaters.put(QualifyUpdaterType.BACKSTAGE_PASSES.getValue().toUpperCase(), new QualityUpdaterBackstagePasses());
qualityUpdaters.put(QualifyUpdaterType.CONJURED.getValue().toUpperCase(), new QualityUpdaterConjured());
qualityUpdaters.put(QualifyUpdaterType.SULFURAS.getValue().toUpperCase(), new QualityUpdaterSulfuras());
}
public QualityUpdater getQualityUpdater(final String itemName) {
return qualityUpdaters.getOrDefault(itemName.toUpperCase(), DEFAULT_UPDATER);
}
}

View File

@ -0,0 +1,19 @@
package com.gildedrose.item.quality.type;
public enum QualifyUpdaterType {
AGED_BRIE("Aged Brie"),
BACKSTAGE_PASSES("Backstage passes to a TAFKAL80ETC concert"),
CONJURED("Conjured"),
SULFURAS("Sulfuras");
QualifyUpdaterType(final String name) {
this.value = name;
}
private final String value;
public String getValue() {
return value;
}
}

View File

@ -0,0 +1,22 @@
package com.gildedrose.item.quality.updater;
import com.gildedrose.Item;
import com.gildedrose.item.quality.QualityUpdater;
public class QualityUpdaterAgedBrie implements QualityUpdater {
public void updateQuality(final Item item) {
if (item.quality < MAX_LIMIT_QUALITY) {
increaseQuality(item);
}
item.sellIn--;
if (item.sellIn < MIM_LIMIT_SELL_IN) {
increaseQuality(item);
}
}
private void increaseQuality(final Item item) {
if (item.quality < MAX_LIMIT_QUALITY) {
item.quality++;
}
}
}

View File

@ -0,0 +1,30 @@
package com.gildedrose.item.quality.updater;
import com.gildedrose.Item;
import com.gildedrose.item.quality.QualityUpdater;
public class QualityUpdaterBackstagePasses implements QualityUpdater {
private static final int FIRST_SELL_IN_LIMIT = 6;
private static final int SECOND_SELL_IN_LIMIT = 11;
public void updateQuality(final Item item) {
increaseQuality(item);
if (item.sellIn < FIRST_SELL_IN_LIMIT) {
increaseQuality(item);
}
if (item.sellIn < SECOND_SELL_IN_LIMIT) {
increaseQuality(item);
}
item.sellIn--;
if (item.sellIn < MIM_LIMIT_SELL_IN) {
item.quality = MIM_LIMIT_QUALITY;
}
}
private void increaseQuality(final Item item) {
if (item.quality < MAX_LIMIT_QUALITY) {
item.quality++;
}
}
}

View File

@ -0,0 +1,24 @@
package com.gildedrose.item.quality.updater;
import com.gildedrose.Item;
import com.gildedrose.item.quality.QualityUpdater;
public class QualityUpdaterConjured implements QualityUpdater {
private static final int AMOUNT_OF_QUALITY_TO_DECREASE = 2;
public void updateQuality(final Item item) {
decreaseQuality(item);
updateSellIn(item);
}
private void decreaseQuality(final Item item) {
if (item.quality > MIM_LIMIT_SELL_IN) {
item.quality -= AMOUNT_OF_QUALITY_TO_DECREASE;
}
}
private void updateSellIn(final Item item) {
item.sellIn--;
}
}

View File

@ -0,0 +1,24 @@
package com.gildedrose.item.quality.updater;
import com.gildedrose.Item;
import com.gildedrose.item.quality.QualityUpdater;
public class QualityUpdaterDefault implements QualityUpdater {
public void updateQuality(final Item item) {
decreaseQuality(item);
updateSellIn(item);
if (item.sellIn < MIM_LIMIT_SELL_IN) {
decreaseQuality(item);
}
}
private void decreaseQuality(final Item item) {
if (item.quality > MIM_LIMIT_QUALITY) {
item.quality--;
}
}
private void updateSellIn(final Item item) {
item.sellIn--;
}
}

View File

@ -0,0 +1,11 @@
package com.gildedrose.item.quality.updater;
import com.gildedrose.Item;
import com.gildedrose.item.quality.QualityUpdater;
public class QualityUpdaterSulfuras implements QualityUpdater {
public void updateQuality(final Item item) {
item.sellIn--;
}
}

View File

@ -8,10 +8,109 @@ class GildedRoseTest {
@Test @Test
void foo() { void foo() {
Item[] items = new Item[] { new Item("foo", 0, 0) }; final String itemName = "foo";
GildedRose app = new GildedRose(items); final Item[] items = new Item[]{createItem("foo", 0, 0)};
final GildedRose app = new GildedRose(items);
app.updateQuality(); app.updateQuality();
assertEquals("fixme", app.items[0].name);
validateItem(items[0], itemName, -1, 0);
} }
@Test
public void testUpdateQualityConjuredItem() {
final String itemName = "Conjured";
final Item[] items = new Item[]{createItem(itemName, 4, 8)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, 3, 6);
}
@Test
public void testUpdateQualitySulfuras() {
final String itemName = "Sulfuras";
final Item[] items = new Item[]{new Item(itemName, 0, 80)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, -1, 80);
}
@Test
public void testUpdateQualityBackstagePassesSelinDayLessThanZero() {
final String itemName = "Backstage passes to a TAFKAL80ETC concert";
final Item[] items = new Item[]{new Item(itemName, 0, 50)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, -1, 0);
}
@Test
public void testUpdateQualityBackstagePassesLessThanSixDays() {
final String itemName = "Backstage passes to a TAFKAL80ETC concert";
final Item[] items = new Item[]{new Item(itemName, 5, 40)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, 4, 43);
}
@Test
public void testUpdateQualityBackstagePassesGreaterThanElevenDays() {
final String itemName = "Backstage passes to a TAFKAL80ETC concert";
final Item[] items = new Item[]{new Item(itemName, 12, 40)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, 11, 41);
}
@Test
public void testUpdateQualityAgedBrieSelinGreaterThanZero() {
final String itemName = "Backstage passes to a TAFKAL80ETC concert";
final Item[] items = new Item[]{new Item(itemName, 12, 39)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, 11, 40);
}
@Test
public void testUpdateQualityAgedBrieSelinEqualToZero() {
final String itemName = "Aged Brie";
final Item[] items = new Item[]{new Item(itemName, 0, 39)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, -1, 41);
}
@Test
public void testUpdateQualityDefaultSelinEqualToZero() {
final String itemName = "Another foo";
final Item[] items = new Item[]{new Item(itemName, 0, 40)};
final GildedRose gildedRose = new GildedRose(items);
gildedRose.updateQuality();
validateItem(items[0], itemName, -1, 38);
}
private Item createItem(final String name, final int sellIn, final int quality) {
return new Item(name, sellIn, quality);
}
private void validateItem(final Item item, final String expectedName, final int expectedSellIn,
final int expectedQuality) {
assertEquals(expectedName, item.name, "The name must be " + expectedName);
assertEquals(expectedSellIn, item.sellIn, "The sellIn must be " + expectedSellIn);
assertEquals(expectedQuality, item.quality, "The quality must be " + expectedQuality);
}
} }