mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 14:31:28 +00:00
Refactoring and adding conjured item
This commit is contained in:
parent
d0d6fdb93c
commit
b8077d986a
@ -1,62 +1,26 @@
|
||||
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 {
|
||||
Item[] items;
|
||||
private final List<Item> items;
|
||||
private final QualityUpdaterMapper qualityUpdaterMapper = new QualityUpdaterMapper();
|
||||
|
||||
public GildedRose(Item[] items) {
|
||||
this.items = items;
|
||||
this.items = items != null ? Arrays.asList(items) : Collections.EMPTY_LIST;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
for (final Item item : items) {
|
||||
if (item != null) {
|
||||
final QualityUpdater updater = qualityUpdaterMapper.getQualityUpdater(item.name);
|
||||
updater.updateQuality(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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--;
|
||||
}
|
||||
}
|
||||
@ -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--;
|
||||
}
|
||||
}
|
||||
@ -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--;
|
||||
}
|
||||
}
|
||||
@ -8,10 +8,109 @@ class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
void foo() {
|
||||
Item[] items = new Item[] { new Item("foo", 0, 0) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
final String itemName = "foo";
|
||||
final Item[] items = new Item[]{createItem("foo", 0, 0)};
|
||||
final GildedRose app = new GildedRose(items);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user