This commit is contained in:
Gabriella Medas 2018-02-21 13:04:15 +00:00 committed by GitHub
commit 1b78942317
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 392 additions and 55 deletions

View File

@ -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;
}
}
}
} }
} }
} }

View 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;
}
}

View File

@ -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;
}
}

View 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;
}
}

View 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();
}
}

View File

@ -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);
}
}

View File

@ -1,4 +1,4 @@
package com.gildedrose; package com.gildedrose.item;
public class Item { public class Item {

View 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;
}
}

View 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;
}
}

View 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;
}
}

View File

@ -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;
}
} }

View File

@ -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!");