mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-14 22:21:20 +00:00
Merge 4dfcd8081e into c3546d82cf
This commit is contained in:
commit
1b78942317
@ -1,62 +1,21 @@
|
||||
package com.gildedrose;
|
||||
|
||||
import com.gildedrose.item.Item;
|
||||
import com.gildedrose.item.CustomisedItemFactory;
|
||||
|
||||
class GildedRose {
|
||||
|
||||
private final CustomisedItemFactory itemFactory;
|
||||
Item[] items;
|
||||
|
||||
public GildedRose(Item[] items) {
|
||||
this.items = items;
|
||||
this.itemFactory = new CustomisedItemFactory();
|
||||
}
|
||||
|
||||
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 (Item item : items) {
|
||||
itemFactory.customiseItem(item).updateState();
|
||||
}
|
||||
}
|
||||
}
|
||||
13
Java/src/main/java/com/gildedrose/item/AgedBrie.java
Normal file
13
Java/src/main/java/com/gildedrose/item/AgedBrie.java
Normal file
@ -0,0 +1,13 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
class AgedBrie extends CustomisedItem {
|
||||
|
||||
AgedBrie(Item item) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
return item.quality += 1;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
class BackstagePassesItem extends CustomisedItem {
|
||||
|
||||
BackstagePassesItem(Item item) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
if (sellByDayValueIsOver(10)) {
|
||||
return qualityIncreasedBy(1);
|
||||
} else if (sellByDayValueIsOver(5)) {
|
||||
return qualityIncreasedBy(2);
|
||||
} else if (sellByDayValueIsOver(0)) {
|
||||
return qualityIncreasedBy(3);
|
||||
} else {
|
||||
return qualityDroppedToZero();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean sellByDayValueIsOver(int dayNumber) {
|
||||
return item.sellIn > dayNumber;
|
||||
}
|
||||
|
||||
private int qualityIncreasedBy(int qualityValue) {
|
||||
return item.quality += qualityValue;
|
||||
}
|
||||
|
||||
private int qualityDroppedToZero() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
21
Java/src/main/java/com/gildedrose/item/ConjuredItem.java
Normal file
21
Java/src/main/java/com/gildedrose/item/ConjuredItem.java
Normal file
@ -0,0 +1,21 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
class ConjuredItem extends CustomisedItem {
|
||||
|
||||
ConjuredItem(Item item) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
if (sellByDayValueIsOverZero()) {
|
||||
return item.quality -= 2;
|
||||
} else {
|
||||
return item.quality -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean sellByDayValueIsOverZero() {
|
||||
return item.sellIn > 0;
|
||||
}
|
||||
}
|
||||
35
Java/src/main/java/com/gildedrose/item/CustomisedItem.java
Normal file
35
Java/src/main/java/com/gildedrose/item/CustomisedItem.java
Normal file
@ -0,0 +1,35 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
public abstract class CustomisedItem {
|
||||
|
||||
public final Item item;
|
||||
|
||||
CustomisedItem(Item item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public final void updateState() {
|
||||
item.sellIn = updatedItemSellIn();
|
||||
item.quality = updatedItemQuality();
|
||||
|
||||
if (hasReachedLowestQualityValue()) {
|
||||
item.quality = QualityValues.lowestValuePossible();
|
||||
} else if (hasReachedHighestQualityValue()) {
|
||||
item.quality = QualityValues.highestValuePossible(item);
|
||||
}
|
||||
}
|
||||
|
||||
int updatedItemSellIn() {
|
||||
return item.sellIn -= 1;
|
||||
}
|
||||
|
||||
abstract int updatedItemQuality();
|
||||
|
||||
private boolean hasReachedHighestQualityValue() {
|
||||
return item.quality > QualityValues.highestValuePossible(item);
|
||||
}
|
||||
|
||||
private boolean hasReachedLowestQualityValue() {
|
||||
return item.quality < QualityValues.lowestValuePossible();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class CustomisedItemFactory {
|
||||
|
||||
private final static Map<String, Function<Item, CustomisedItem>> ITEM_TYPES_LIST = new HashMap<>();
|
||||
public final static String SULFURAS = "Sulfuras, Hand of Ragnaros";
|
||||
public final static String BRIE = "Aged Brie";
|
||||
public final static String BACKSTAGE_PASSES_ITEM = "Backstage passes to a TAFKAL80ETC concert";
|
||||
public final static String CONJURED_ITEM = "Conjured";
|
||||
|
||||
public CustomisedItemFactory() {
|
||||
ITEM_TYPES_LIST.put(SULFURAS, Sulfuras::new);
|
||||
ITEM_TYPES_LIST.put(BRIE, AgedBrie::new);
|
||||
ITEM_TYPES_LIST.put(BACKSTAGE_PASSES_ITEM, BackstagePassesItem::new);
|
||||
ITEM_TYPES_LIST.put(CONJURED_ITEM, ConjuredItem::new);
|
||||
}
|
||||
|
||||
public CustomisedItem customiseItem(Item item) {
|
||||
String name = item.name;
|
||||
if (isStandardItem(name)) {
|
||||
return new StandardItem(item);
|
||||
}
|
||||
return ITEM_TYPES_LIST.get(name).apply(item);
|
||||
}
|
||||
|
||||
private boolean isStandardItem(String name) {
|
||||
return !ITEM_TYPES_LIST.keySet().contains(name);
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.gildedrose;
|
||||
package com.gildedrose.item;
|
||||
|
||||
public class Item {
|
||||
|
||||
@ -14,8 +14,8 @@ public class Item {
|
||||
this.quality = quality;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name + ", " + this.sellIn + ", " + this.quality;
|
||||
}
|
||||
}
|
||||
15
Java/src/main/java/com/gildedrose/item/QualityValues.java
Normal file
15
Java/src/main/java/com/gildedrose/item/QualityValues.java
Normal file
@ -0,0 +1,15 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
final class QualityValues {
|
||||
|
||||
static int lowestValuePossible() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int highestValuePossible(Item item) {
|
||||
if (item.name.equals(CustomisedItemFactory.SULFURAS)) {
|
||||
return 80;
|
||||
}
|
||||
return 50;
|
||||
}
|
||||
}
|
||||
21
Java/src/main/java/com/gildedrose/item/StandardItem.java
Normal file
21
Java/src/main/java/com/gildedrose/item/StandardItem.java
Normal file
@ -0,0 +1,21 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
class StandardItem extends CustomisedItem {
|
||||
|
||||
StandardItem(Item item) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
if (sellByDayValueIsOverZero()) {
|
||||
return item.quality -= 1;
|
||||
} else {
|
||||
return item.quality -= 2;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean sellByDayValueIsOverZero() {
|
||||
return item.sellIn > 0;
|
||||
}
|
||||
}
|
||||
18
Java/src/main/java/com/gildedrose/item/Sulfuras.java
Normal file
18
Java/src/main/java/com/gildedrose/item/Sulfuras.java
Normal file
@ -0,0 +1,18 @@
|
||||
package com.gildedrose.item;
|
||||
|
||||
class Sulfuras extends CustomisedItem {
|
||||
|
||||
Sulfuras(Item item) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemSellIn() {
|
||||
return item.sellIn;
|
||||
}
|
||||
|
||||
@Override
|
||||
int updatedItemQuality() {
|
||||
return item.quality;
|
||||
}
|
||||
}
|
||||
@ -2,16 +2,203 @@ package com.gildedrose;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import com.gildedrose.item.CustomisedItem;
|
||||
import com.gildedrose.item.Item;
|
||||
import com.gildedrose.item.CustomisedItemFactory;
|
||||
import org.junit.Test;
|
||||
|
||||
public class GildedRoseTest {
|
||||
|
||||
@Test
|
||||
public void foo() {
|
||||
Item[] items = new Item[] { new Item("foo", 0, 0) };
|
||||
GildedRose app = new GildedRose(items);
|
||||
GildedRose app = newGildedRose("foo", 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
assertEquals("fixme", app.items[0].name);
|
||||
|
||||
assertEquals("foo", app.items[0].name);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void standardItemDecreasesSellByDayNumberEachTime() {
|
||||
GildedRose app = newGildedRose("standard item", 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(-1, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void brieDecreasesSellByDayNumberEachTime() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BRIE, 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(-1, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemDecreasesSellByDayNumberEachTime() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(-1, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void conjuredItemDecreasesSellByDayNumberEachTime() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM, 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(-1, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void brieIncreasesInQualityEachTime() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BRIE, 1, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(2, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void brieQualityCannotGoAboveFiftyWhenIncreasing() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BRIE, 1, 49);
|
||||
|
||||
app.updateQuality();
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(50, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemIncreasesQualityByOneIfSellByDayMoreThanEleven() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 12, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(2, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemIncreasesQualityByTwoIfSellByDayIsMoreThanSix() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 10, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(3, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemIncreasesQualityByThreeIfSellByDayIsMoreThanZero() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(4, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemQualityDropsToZeroIfSellByDayIsZeroOrLess() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 0,50);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backstagePassesItemQualityCannotGoAboveFiftyWhenIncreasing() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.BACKSTAGE_PASSES_ITEM, 5, 50);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(50, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void standardItemDecreasesQualityByOneIfSellByDayIsAboveZero() {
|
||||
GildedRose app = newGildedRose("foo", 2, 1);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void standardItemDecreasesQualityByTwoOnceSellByDayIsZeroOrLess() {
|
||||
GildedRose app = newGildedRose("foo",0, 5);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(3, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void standardItemCannotHaveQualityBelowZero() {
|
||||
GildedRose app = newGildedRose("foo", 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sulfurasHasQualityEighty() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.SULFURAS, 1, 80);
|
||||
|
||||
assertEquals(80, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sulfurasItemDoesNotAlterValues() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.SULFURAS, 1, 80);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(80, itemQualityValue(app));
|
||||
assertEquals(1, itemSellByDayNumber(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void conjuredItemDecreasesQualityByTwoIfSellByDayIsAboveZero() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM, 2, 5);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(3, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void conjuredItemDecreasesQualityByFourOnceSellByDayIsZeroOrLess() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM,0, 5);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(1, itemQualityValue(app));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void conjuredItemCannotHaveQualityBelowZero() {
|
||||
GildedRose app = newGildedRose(CustomisedItemFactory.CONJURED_ITEM, 0, 0);
|
||||
|
||||
app.updateQuality();
|
||||
|
||||
assertEquals(0, itemQualityValue(app));
|
||||
}
|
||||
|
||||
private GildedRose newGildedRose(String itemName, int itemSellIn, int itemQuality) {
|
||||
Item[] items = new Item[] { new Item(itemName, itemSellIn, itemQuality)};
|
||||
return new GildedRose(items);
|
||||
}
|
||||
|
||||
private int itemSellByDayNumber(GildedRose app) {
|
||||
return app.items[0].sellIn;
|
||||
}
|
||||
|
||||
private int itemQualityValue(GildedRose app) {
|
||||
return app.items[0].quality;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
package com.gildedrose;
|
||||
|
||||
import com.gildedrose.item.Item;
|
||||
|
||||
public class TexttestFixture {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("OMGHAI!");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user