introduces CustomisedItem interface so that Item class is not altered

This commit is contained in:
Gabba 2017-12-16 11:48:03 +00:00
parent a2b84d2659
commit e8780706a1
10 changed files with 109 additions and 87 deletions

View File

@ -2,11 +2,11 @@ package com.gildedrose;
import com.gildedrose.item.Item; import com.gildedrose.item.Item;
import com.gildedrose.item.ItemFactory; import com.gildedrose.item.ItemFactory;
import com.gildedrose.item.QualityValues;
class GildedRose { class GildedRose {
private static final int LOWEST_QUALITY_LEVEL_POSSIBLE = 0; private static final int LOWEST_QUALITY_VALUE_POSSIBLE = 0;
private static final int HIGHEST_QUALITY_LEVEL_POSSIBLE = 50;
private final ItemFactory itemFactory; private final ItemFactory itemFactory;
Item[] items; Item[] items;
@ -16,28 +16,21 @@ class GildedRose {
} }
public void updateQuality() { public void updateQuality() {
customizeItems();
for (Item item : items) { for (Item item : items) {
item.updateYourState(); itemFactory.customiseItem(item).updateState();
if (hasReachedLowestQualityLimit(item.quality)) { if (hasReachedLowestQualityValue(item)) {
item.quality = LOWEST_QUALITY_LEVEL_POSSIBLE; item.quality = LOWEST_QUALITY_VALUE_POSSIBLE;
} else if (hasReachedHighestQualityLimit(item.quality)) { } else if (hasReachedHighestQualityValue(item)) {
item.quality = HIGHEST_QUALITY_LEVEL_POSSIBLE; item.quality = QualityValues.highestValuePossible(item);
} }
} }
} }
private void customizeItems() { private boolean hasReachedLowestQualityValue(Item item) {
for (Item item : items) { return item.quality < LOWEST_QUALITY_VALUE_POSSIBLE;
items = new Item[]{itemFactory.createItem(item.name, item.sellIn, item.quality)};
}
} }
private boolean hasReachedLowestQualityLimit(int itemQuality) { private boolean hasReachedHighestQualityValue(Item item) {
return itemQuality < LOWEST_QUALITY_LEVEL_POSSIBLE; return item.quality > QualityValues.highestValuePossible(item);
}
private boolean hasReachedHighestQualityLimit(int itemQuality) {
return itemQuality > HIGHEST_QUALITY_LEVEL_POSSIBLE;
} }
} }

View File

@ -1,13 +1,15 @@
package com.gildedrose.item; package com.gildedrose.item;
public class AgedBrie extends Item { public class AgedBrie implements CustomisedItem {
public AgedBrie(String name, int sellIn, int quality) { public Item item;
super(name, sellIn, quality);
public AgedBrie(Item item) {
this.item = item;
} }
public void updateYourState() { public void updateState() {
sellIn -= 1; item.sellIn -= 1;
quality += 1; item.quality += 1;
} }
} }

View File

@ -1,21 +1,23 @@
package com.gildedrose.item; package com.gildedrose.item;
public class BackstagePassesItem extends Item { public class BackstagePassesItem implements CustomisedItem {
public BackstagePassesItem(String name, int sellIn, int quality) { public Item item;
super(name, sellIn, quality);
public BackstagePassesItem(Item item) {
this.item = item;
} }
public void updateYourState() { public void updateState() {
sellIn -= 1; item.sellIn -= 1;
if (sellIn >= 11) { if (item.sellIn >= 11) {
quality += 1; item.quality += 1;
} else if (sellIn > 5) { } else if (item.sellIn > 5) {
quality += 2; item.quality += 2;
} else if (sellIn > 0) { } else if (item.sellIn > 0) {
quality += 3; item.quality += 3;
} else { } else {
quality = 0; item.quality = 0;
} }
} }
} }

View File

@ -0,0 +1,5 @@
package com.gildedrose.item;
public interface CustomisedItem {
void updateState();
}

View File

@ -18,7 +18,4 @@ public class Item {
public String toString() { public String toString() {
return this.name + ", " + this.sellIn + ", " + this.quality; return this.name + ", " + this.sellIn + ", " + this.quality;
} }
public void updateYourState() {
}
} }

View File

@ -2,15 +2,15 @@ package com.gildedrose.item;
public class ItemFactory { public class ItemFactory {
public Item createItem(String itemName, int sellIn, int quality) { public CustomisedItem customiseItem(Item item) {
if (itemName.equals("Sulfuras, Hand of Ragnaros")) { if (item.name.equals("Sulfuras, Hand of Ragnaros")) {
return new Sulfuras(itemName, sellIn, quality); return new Sulfuras(item);
} else if (itemName.equals("Aged Brie")) { } else if (item.name.equals("Aged Brie")) {
return new AgedBrie(itemName, sellIn, quality); return new AgedBrie(item);
} else if (itemName.equals("Backstage passes to a TAFKAL80ETC concert")) { } else if (item.name.equals("Backstage passes to a TAFKAL80ETC concert")) {
return new BackstagePassesItem(itemName, sellIn, quality); return new BackstagePassesItem(item);
} else { } else {
return new StandardItem(itemName, sellIn, quality); return new StandardItem(item);
} }
} }
} }

View File

@ -0,0 +1,11 @@
package com.gildedrose.item;
public final class QualityValues {
public static int highestValuePossible(Item item) {
if (item.name.equals("Sulfuras, Hand of Ragnaros")) {
return 80;
}
return 50;
}
}

View File

@ -1,17 +1,21 @@
package com.gildedrose.item; package com.gildedrose.item;
public class StandardItem extends Item { public class StandardItem implements CustomisedItem {
public StandardItem(String name, int sellIn, int quality) { public Item item;
super(name, sellIn, quality);
public StandardItem(Item item) {
this.item = item;
} }
public void updateYourState() { public void updateState() {
sellIn -= 1; item.sellIn -= 1;
if (sellIn > 0) { if (item.sellIn > 0) {
quality -= 1; item.quality -= 1;
} else { } else {
quality -= 2; item.quality -= 2;
} }
} }
} }

View File

@ -1,11 +1,12 @@
package com.gildedrose.item; package com.gildedrose.item;
public class Sulfuras extends Item { public class Sulfuras implements CustomisedItem {
public Sulfuras(String name, int sellIn, int quality) { public Item item;
super(name, sellIn, quality);
public Sulfuras(Item item) {
} }
public void updateYourState() { public void updateState() {
} }
} }

View File

@ -43,22 +43,13 @@ public class GildedRoseTest {
assertEquals(-1, itemSellByDayNumber(app)); assertEquals(-1, itemSellByDayNumber(app));
} }
@Test
public void sulfurasItemDoesNotDecreaseSellByDayNumberEachTime() {
GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 0, 0);
app.updateQuality();
assertEquals(0, itemSellByDayNumber(app));
}
@Test @Test
public void brieIncreasesInQualityEachTime() { public void brieIncreasesInQualityEachTime() {
GildedRose app = newGildedRose("Aged Brie", 1, 1); GildedRose app = newGildedRose("Aged Brie", 1, 1);
app.updateQuality(); app.updateQuality();
assertEquals(2, itemQualityNumber(app)); assertEquals(2, itemQualityValue(app));
} }
@Test @Test
@ -68,7 +59,7 @@ public class GildedRoseTest {
app.updateQuality(); app.updateQuality();
app.updateQuality(); app.updateQuality();
assertEquals(50, itemQualityNumber(app)); assertEquals(50, itemQualityValue(app));
} }
@Test @Test
@ -77,70 +68,86 @@ public class GildedRoseTest {
app.updateQuality(); app.updateQuality();
assertEquals(2, itemQualityNumber(app)); assertEquals(2, itemQualityValue(app));
} }
@Test @Test
public void backstagePassesItemDecreasesQualityByTwoIfSellByDayLessThanEleven() { public void backstagePassesItemDecreasesQualityByTwoIfSellByDayIsMoreThanSix() {
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 10, 1); GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 10, 1);
app.updateQuality(); app.updateQuality();
assertEquals(3, itemQualityNumber(app)); assertEquals(3, itemQualityValue(app));
} }
@Test @Test
public void backstagePassesItemDecreasesQualityByThreeIfSellByDayLessThanSix() { public void backstagePassesItemDecreasesQualityByThreeIfSellByDayIsMoreThanZero() {
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 5, 1); GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 5, 1);
app.updateQuality(); app.updateQuality();
assertEquals(4, itemQualityNumber(app)); assertEquals(4, itemQualityValue(app));
} }
@Test @Test
public void backstagePassesItemQualityDropsToZeroIfSellByDayHasPassed() { public void backstagePassesItemQualityDropsToZeroIfSellByDayIsZeroOrLess() {
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 0,50); GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 0,50);
app.updateQuality(); app.updateQuality();
assertEquals(0, itemQualityNumber(app)); assertEquals(0, itemQualityValue(app));
} }
@Test @Test
public void normalItemDecreasesQualityByOneIfSellByDayIsAboveZero() { public void backstagePassesItemQualityCannotGoAboveFiftyWhenIncreasing() {
GildedRose app = newGildedRose("Backstage passes to a TAFKAL80ETC concert", 5, 50);
app.updateQuality();
assertEquals(50, itemQualityValue(app));
}
@Test
public void standardItemDecreasesQualityByOneIfSellByDayIsAboveZero() {
GildedRose app = newGildedRose("foo", 2, 1); GildedRose app = newGildedRose("foo", 2, 1);
app.updateQuality(); app.updateQuality();
assertEquals(0, itemQualityNumber(app)); assertEquals(0, itemQualityValue(app));
} }
@Test @Test
public void normalItemDecreasesQualityByTwoOnceSellByDayHasPassed() { public void standardItemDecreasesQualityByTwoOnceSellByDayIsZeroOrLess() {
GildedRose app = newGildedRose("foo",0, 5); GildedRose app = newGildedRose("foo",0, 5);
app.updateQuality(); app.updateQuality();
assertEquals(3, itemQualityNumber(app)); assertEquals(3, itemQualityValue(app));
} }
@Test @Test
public void normalItemCannotHaveQualityBelowZero() { public void standardItemCannotHaveQualityBelowZero() {
GildedRose app = newGildedRose("foo", 0, 0); GildedRose app = newGildedRose("foo", 0, 0);
app.updateQuality(); app.updateQuality();
assertEquals(0, itemQualityNumber(app)); assertEquals(0, itemQualityValue(app));
} }
@Test @Test
public void nothingHappensToSulfurasItem() { public void sulfurasHasQualityEighty() {
GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 1, 1); GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 1, 80);
assertEquals(80, itemQualityValue(app));
}
@Test
public void sulfurasItemDoesNotAlterValues() {
GildedRose app = newGildedRose("Sulfuras, Hand of Ragnaros", 1, 80);
app.updateQuality(); app.updateQuality();
assertEquals(1, itemQualityNumber(app)); assertEquals(80, itemQualityValue(app));
assertEquals(1, itemSellByDayNumber(app)); assertEquals(1, itemSellByDayNumber(app));
} }
@ -153,7 +160,7 @@ public class GildedRoseTest {
return app.items[0].sellIn; return app.items[0].sellIn;
} }
private int itemQualityNumber(GildedRose app) { private int itemQualityValue(GildedRose app) {
return app.items[0].quality; return app.items[0].quality;
} }
} }