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

View File

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

View File

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

View File

@ -2,15 +2,15 @@ package com.gildedrose.item;
public class ItemFactory {
public Item createItem(String itemName, int sellIn, int quality) {
if (itemName.equals("Sulfuras, Hand of Ragnaros")) {
return new Sulfuras(itemName, sellIn, quality);
} else if (itemName.equals("Aged Brie")) {
return new AgedBrie(itemName, sellIn, quality);
} else if (itemName.equals("Backstage passes to a TAFKAL80ETC concert")) {
return new BackstagePassesItem(itemName, sellIn, quality);
public CustomisedItem customiseItem(Item item) {
if (item.name.equals("Sulfuras, Hand of Ragnaros")) {
return new Sulfuras(item);
} else if (item.name.equals("Aged Brie")) {
return new AgedBrie(item);
} else if (item.name.equals("Backstage passes to a TAFKAL80ETC concert")) {
return new BackstagePassesItem(item);
} 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;
public class StandardItem extends Item {
public class StandardItem implements CustomisedItem {
public StandardItem(String name, int sellIn, int quality) {
super(name, sellIn, quality);
public Item item;
public StandardItem(Item item) {
this.item = item;
}
public void updateYourState() {
sellIn -= 1;
if (sellIn > 0) {
quality -= 1;
public void updateState() {
item.sellIn -= 1;
if (item.sellIn > 0) {
item.quality -= 1;
} else {
quality -= 2;
item.quality -= 2;
}
}
}

View File

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

View File

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