From e8780706a1d310d4a6a04d3efeb89126ea1870d9 Mon Sep 17 00:00:00 2001 From: Gabba Date: Sat, 16 Dec 2017 11:48:03 +0000 Subject: [PATCH] introduces CustomisedItem interface so that Item class is not altered --- .../main/java/com/gildedrose/GildedRose.java | 29 ++++----- .../java/com/gildedrose/item/AgedBrie.java | 14 +++-- .../gildedrose/item/BackstagePassesItem.java | 26 ++++---- .../com/gildedrose/item/CustomisedItem.java | 5 ++ .../main/java/com/gildedrose/item/Item.java | 3 - .../java/com/gildedrose/item/ItemFactory.java | 16 ++--- .../com/gildedrose/item/QualityValues.java | 11 ++++ .../com/gildedrose/item/StandardItem.java | 20 +++--- .../java/com/gildedrose/item/Sulfuras.java | 9 +-- .../java/com/gildedrose/GildedRoseTest.java | 63 ++++++++++--------- 10 files changed, 109 insertions(+), 87 deletions(-) create mode 100644 Java/src/main/java/com/gildedrose/item/CustomisedItem.java create mode 100644 Java/src/main/java/com/gildedrose/item/QualityValues.java diff --git a/Java/src/main/java/com/gildedrose/GildedRose.java b/Java/src/main/java/com/gildedrose/GildedRose.java index e7b49768..a1c51a76 100644 --- a/Java/src/main/java/com/gildedrose/GildedRose.java +++ b/Java/src/main/java/com/gildedrose/GildedRose.java @@ -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); } } \ No newline at end of file diff --git a/Java/src/main/java/com/gildedrose/item/AgedBrie.java b/Java/src/main/java/com/gildedrose/item/AgedBrie.java index 8b8f9dc2..2943eca4 100644 --- a/Java/src/main/java/com/gildedrose/item/AgedBrie.java +++ b/Java/src/main/java/com/gildedrose/item/AgedBrie.java @@ -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; } } diff --git a/Java/src/main/java/com/gildedrose/item/BackstagePassesItem.java b/Java/src/main/java/com/gildedrose/item/BackstagePassesItem.java index 1589b42f..65e77429 100644 --- a/Java/src/main/java/com/gildedrose/item/BackstagePassesItem.java +++ b/Java/src/main/java/com/gildedrose/item/BackstagePassesItem.java @@ -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; } } } diff --git a/Java/src/main/java/com/gildedrose/item/CustomisedItem.java b/Java/src/main/java/com/gildedrose/item/CustomisedItem.java new file mode 100644 index 00000000..7b619438 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/CustomisedItem.java @@ -0,0 +1,5 @@ +package com.gildedrose.item; + +public interface CustomisedItem { + void updateState(); +} diff --git a/Java/src/main/java/com/gildedrose/item/Item.java b/Java/src/main/java/com/gildedrose/item/Item.java index fa2e373e..d756624b 100644 --- a/Java/src/main/java/com/gildedrose/item/Item.java +++ b/Java/src/main/java/com/gildedrose/item/Item.java @@ -18,7 +18,4 @@ public class Item { public String toString() { return this.name + ", " + this.sellIn + ", " + this.quality; } - - public void updateYourState() { - } } diff --git a/Java/src/main/java/com/gildedrose/item/ItemFactory.java b/Java/src/main/java/com/gildedrose/item/ItemFactory.java index 23a1cbb0..6dc3637c 100644 --- a/Java/src/main/java/com/gildedrose/item/ItemFactory.java +++ b/Java/src/main/java/com/gildedrose/item/ItemFactory.java @@ -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); } } } diff --git a/Java/src/main/java/com/gildedrose/item/QualityValues.java b/Java/src/main/java/com/gildedrose/item/QualityValues.java new file mode 100644 index 00000000..0f69718d --- /dev/null +++ b/Java/src/main/java/com/gildedrose/item/QualityValues.java @@ -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; + } +} diff --git a/Java/src/main/java/com/gildedrose/item/StandardItem.java b/Java/src/main/java/com/gildedrose/item/StandardItem.java index 4e355223..b61d10f5 100644 --- a/Java/src/main/java/com/gildedrose/item/StandardItem.java +++ b/Java/src/main/java/com/gildedrose/item/StandardItem.java @@ -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; } } + + } diff --git a/Java/src/main/java/com/gildedrose/item/Sulfuras.java b/Java/src/main/java/com/gildedrose/item/Sulfuras.java index 3843a166..bc70499c 100644 --- a/Java/src/main/java/com/gildedrose/item/Sulfuras.java +++ b/Java/src/main/java/com/gildedrose/item/Sulfuras.java @@ -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() { } } diff --git a/Java/src/test/java/com/gildedrose/GildedRoseTest.java b/Java/src/test/java/com/gildedrose/GildedRoseTest.java index ee262fa2..9f78578c 100644 --- a/Java/src/test/java/com/gildedrose/GildedRoseTest.java +++ b/Java/src/test/java/com/gildedrose/GildedRoseTest.java @@ -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; } }