mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 06:21:29 +00:00
Merge 4dfcd8081e into c3546d82cf
This commit is contained in:
commit
1b78942317
@ -1,62 +1,21 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import com.gildedrose.item.Item;
|
||||||
|
import com.gildedrose.item.CustomisedItemFactory;
|
||||||
|
|
||||||
class GildedRose {
|
class GildedRose {
|
||||||
|
|
||||||
|
private final CustomisedItemFactory itemFactory;
|
||||||
Item[] items;
|
Item[] items;
|
||||||
|
|
||||||
public GildedRose(Item[] items) {
|
public GildedRose(Item[] items) {
|
||||||
this.items = items;
|
this.items = items;
|
||||||
|
this.itemFactory = new CustomisedItemFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateQuality() {
|
public void updateQuality() {
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (Item item : items) {
|
||||||
if (!items[i].name.equals("Aged Brie")
|
itemFactory.customiseItem(item).updateState();
|
||||||
&& !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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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 {
|
public class Item {
|
||||||
|
|
||||||
@ -14,8 +14,8 @@ public class Item {
|
|||||||
this.quality = quality;
|
this.quality = quality;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.name + ", " + this.sellIn + ", " + this.quality;
|
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 static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import com.gildedrose.item.CustomisedItem;
|
||||||
|
import com.gildedrose.item.Item;
|
||||||
|
import com.gildedrose.item.CustomisedItemFactory;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class GildedRoseTest {
|
public class GildedRoseTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void foo() {
|
public void foo() {
|
||||||
Item[] items = new Item[] { new Item("foo", 0, 0) };
|
GildedRose app = newGildedRose("foo", 0, 0);
|
||||||
GildedRose app = new GildedRose(items);
|
|
||||||
app.updateQuality();
|
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;
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import com.gildedrose.item.Item;
|
||||||
|
|
||||||
public class TexttestFixture {
|
public class TexttestFixture {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.println("OMGHAI!");
|
System.out.println("OMGHAI!");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user