mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-21 09:21:08 +00:00
refactor conditional to polymorphism - Standard items
This commit is contained in:
parent
e169a998b3
commit
b8bd42e9da
@ -1,23 +1,12 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
|
||||||
import com.gildedrose.core.InventoryRuleEngine;
|
import com.gildedrose.core.rule.InventoryRuleEngine;
|
||||||
import com.gildedrose.domain.item.Item;
|
import com.gildedrose.domain.item.Item;
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
import com.gildedrose.domain.item.ItemAdapterSimpleFactory;
|
import com.gildedrose.domain.item.ItemAdapterSimpleFactory;
|
||||||
|
|
||||||
class GildedRose {
|
class GildedRose {
|
||||||
|
|
||||||
public static final String AGED_BRIE = "Aged Brie";
|
|
||||||
public static final String BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert";
|
|
||||||
public static final String SULFURAS = "Sulfuras, Hand of Ragnaros";
|
|
||||||
|
|
||||||
public static final int MINIMUM_QUALITY = 0;
|
|
||||||
public static final int MAXIMUM_QUALITY = 50;
|
|
||||||
|
|
||||||
public static final int SELL_IN_DAY11 = 11;
|
|
||||||
public static final int SELL_IN_DAY6 = 6;
|
|
||||||
public static final int SELL_IN_EXPIRED = 0;
|
|
||||||
|
|
||||||
Item[] items;
|
Item[] items;
|
||||||
|
|
||||||
public GildedRose(Item[] items) {
|
public GildedRose(Item[] items) {
|
||||||
@ -26,61 +15,8 @@ class GildedRose {
|
|||||||
|
|
||||||
public void updateQuality() {
|
public void updateQuality() {
|
||||||
for (Item item : items) {
|
for (Item item : items) {
|
||||||
doUpdateQuality(item);
|
ItemAdapter itemAdapter = ItemAdapterSimpleFactory.createItemAdapter(item);
|
||||||
|
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doUpdateQuality(Item item) {
|
|
||||||
|
|
||||||
boolean isAgedBrie = item.name.equals(AGED_BRIE);
|
|
||||||
boolean isBackstagePasses = item.name.equals(BACKSTAGE_PASSES);
|
|
||||||
boolean isSulfuras = item.name.equals(SULFURAS);
|
|
||||||
ItemAdapter itemAdapter = ItemAdapterSimpleFactory.createItemAdapter(item);
|
|
||||||
|
|
||||||
if (isAgedBrie) {
|
|
||||||
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
|
||||||
} else if (isBackstagePasses) {
|
|
||||||
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
|
||||||
} else if (isSulfuras) {
|
|
||||||
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
|
||||||
} else {
|
|
||||||
//standard item
|
|
||||||
if (shouldDecreaseQuality(item)) {
|
|
||||||
decreaseQuality(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
decreaseDay(item);
|
|
||||||
|
|
||||||
if (isExpired(item)) {
|
|
||||||
if (shouldDecreaseQuality(item)) {
|
|
||||||
decreaseQuality(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean shouldDecreaseQuality(Item item) {
|
|
||||||
return item.quality > MINIMUM_QUALITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean shouldIncreaseQuality(Item item) {
|
|
||||||
return item.quality < MAXIMUM_QUALITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void decreaseDay(Item item) {
|
|
||||||
item.sellIn = item.sellIn - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isExpired(Item item) {
|
|
||||||
return item.sellIn < SELL_IN_EXPIRED;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void decreaseQuality(Item item) {
|
|
||||||
item.quality = item.quality - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void increaseQuality(Item item) {
|
|
||||||
item.quality = item.quality + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
package com.gildedrose.application.agedbrie;
|
package com.gildedrose.application.agedbrie;
|
||||||
|
|
||||||
import com.gildedrose.core.rules.UpdateInventoryTemplateRule;
|
import com.gildedrose.core.rule.UpdateInventoryTemplateRule;
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
|
|
||||||
public class AgedBrieRule extends UpdateInventoryTemplateRule {
|
public class AgedBrieRule extends UpdateInventoryTemplateRule {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
package com.gildedrose.application.backstagepasses;
|
package com.gildedrose.application.backstagepasses;
|
||||||
|
|
||||||
import com.gildedrose.core.rules.UpdateInventoryTemplateRule;
|
import com.gildedrose.core.rule.UpdateInventoryTemplateRule;
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
|
|
||||||
public class BackstagePassesRule extends UpdateInventoryTemplateRule {
|
public class BackstagePassesRule extends UpdateInventoryTemplateRule {
|
||||||
|
|||||||
@ -0,0 +1,27 @@
|
|||||||
|
package com.gildedrose.application.standard;
|
||||||
|
|
||||||
|
import com.gildedrose.core.rule.UpdateInventoryTemplateRule;
|
||||||
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
|
|
||||||
|
public class StandardItemRule extends UpdateInventoryTemplateRule {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean canSubtractSellIn(final ItemAdapter itemAdapter) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getQualityFactor(final boolean isExpired, final ItemAdapter itemAdapter) {
|
||||||
|
return isExpired ? 2 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
package com.gildedrose.application.sulfuras;
|
package com.gildedrose.application.sulfuras;
|
||||||
|
|
||||||
import com.gildedrose.core.rules.UpdateInventoryTemplateRule;
|
import com.gildedrose.core.rule.UpdateInventoryTemplateRule;
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
|
|
||||||
public class SulfurasRule extends UpdateInventoryTemplateRule {
|
public class SulfurasRule extends UpdateInventoryTemplateRule {
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
package com.gildedrose.core;
|
package com.gildedrose.core.rule;
|
||||||
|
|
||||||
import com.gildedrose.application.agedbrie.AgedBrieRule;
|
import com.gildedrose.application.agedbrie.AgedBrieRule;
|
||||||
import com.gildedrose.application.backstagepasses.BackstagePassesRule;
|
import com.gildedrose.application.backstagepasses.BackstagePassesRule;
|
||||||
|
import com.gildedrose.application.standard.StandardItemRule;
|
||||||
import com.gildedrose.application.sulfuras.SulfurasRule;
|
import com.gildedrose.application.sulfuras.SulfurasRule;
|
||||||
import com.gildedrose.core.rules.UpdateInventoryTemplateRule;
|
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
import com.gildedrose.domain.item.ItemType;
|
import com.gildedrose.domain.item.ItemType;
|
||||||
|
|
||||||
@ -16,6 +16,7 @@ public class InventoryRuleEngine {
|
|||||||
put(ItemType.AGEG_BRIE, new AgedBrieRule());
|
put(ItemType.AGEG_BRIE, new AgedBrieRule());
|
||||||
put(ItemType.SULFURAS, new SulfurasRule());
|
put(ItemType.SULFURAS, new SulfurasRule());
|
||||||
put(ItemType.BACKSTAGE_PASSES, new BackstagePassesRule());
|
put(ItemType.BACKSTAGE_PASSES, new BackstagePassesRule());
|
||||||
|
put(ItemType.STANDARD, new StandardItemRule());
|
||||||
}};
|
}};
|
||||||
|
|
||||||
public static void applyUpdateRule(ItemAdapter itemAdapter) {
|
public static void applyUpdateRule(ItemAdapter itemAdapter) {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.gildedrose.core.rules;
|
package com.gildedrose.core.rule;
|
||||||
|
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
|
|
||||||
@ -1,71 +0,0 @@
|
|||||||
package com.gildedrose;
|
|
||||||
|
|
||||||
import com.gildedrose.domain.item.Item;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
||||||
|
|
||||||
class GildedRoseTest {
|
|
||||||
|
|
||||||
//GENERAL RULES
|
|
||||||
@Test
|
|
||||||
void whenSellInDateIsPassed_qualityDegradesTwiceAsFast() {
|
|
||||||
//given
|
|
||||||
Item testItem = new Item("standard item", 0, 3);
|
|
||||||
Item[] items = new Item[] {testItem};
|
|
||||||
|
|
||||||
//when
|
|
||||||
GildedRose app = new GildedRose(items);
|
|
||||||
app.updateQuality();
|
|
||||||
|
|
||||||
//then
|
|
||||||
assertEquals(-1, app.items[0].sellIn);
|
|
||||||
assertEquals(1, app.items[0].quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void qualityOfAnItemIsNeverNegative() {
|
|
||||||
//given
|
|
||||||
Item testItem = new Item("standard item", 0, 0);
|
|
||||||
Item[] items = new Item[] {testItem};
|
|
||||||
|
|
||||||
//when
|
|
||||||
GildedRose app = new GildedRose(items);
|
|
||||||
app.updateQuality();
|
|
||||||
|
|
||||||
//then
|
|
||||||
assertEquals(-1, app.items[0].sellIn);
|
|
||||||
assertEquals(0, app.items[0].quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void qualityOfAnItemIsNeverMoreThan50() {
|
|
||||||
//given
|
|
||||||
Item testItem = new Item("standard item", 5, 50);
|
|
||||||
Item[] items = new Item[] {testItem};
|
|
||||||
|
|
||||||
//when
|
|
||||||
GildedRose app = new GildedRose(items);
|
|
||||||
app.updateQuality();
|
|
||||||
|
|
||||||
//then
|
|
||||||
assertEquals(4, app.items[0].sellIn);
|
|
||||||
assertEquals(50, app.items[0].quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void standardItemQualityDecreasesByOne() {
|
|
||||||
//given
|
|
||||||
Item testItem = new Item("standard item", 5, 2);
|
|
||||||
Item[] items = new Item[] {testItem};
|
|
||||||
|
|
||||||
//when
|
|
||||||
GildedRose app = new GildedRose(items);
|
|
||||||
app.updateQuality();
|
|
||||||
|
|
||||||
//then
|
|
||||||
assertEquals(4, app.items[0].sellIn);
|
|
||||||
assertEquals(1, app.items[0].quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -39,4 +39,34 @@ public class AgedBrieRuleTest {
|
|||||||
assertEquals(-1, agedBrieAdapter.getItem().sellIn);
|
assertEquals(-1, agedBrieAdapter.getItem().sellIn);
|
||||||
assertEquals(4, agedBrieAdapter.getItem().quality);
|
assertEquals(4, agedBrieAdapter.getItem().quality);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void agedBrieQualityIncreasesNoMoreThan50() {
|
||||||
|
//given
|
||||||
|
Item agedBrie = new Item("Aged Brie", 5, 50);
|
||||||
|
ItemAdapter agedBrieAdapter = new ItemAdapter(ItemType.AGEG_BRIE, agedBrie);
|
||||||
|
AgedBrieRule agedBrieRule = new AgedBrieRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
agedBrieRule.processItem(agedBrieAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(4, agedBrieAdapter.getItem().sellIn);
|
||||||
|
assertEquals(50, agedBrieAdapter.getItem().quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void agedBrieQualityIncreasesNoMoreThan50WhenIsExpired() {
|
||||||
|
//given
|
||||||
|
Item agedBrie = new Item("Aged Brie", 0, 50);
|
||||||
|
ItemAdapter agedBrieAdapter = new ItemAdapter(ItemType.AGEG_BRIE, agedBrie);
|
||||||
|
AgedBrieRule agedBrieRule = new AgedBrieRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
agedBrieRule.processItem(agedBrieAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(-1, agedBrieAdapter.getItem().sellIn);
|
||||||
|
assertEquals(50, agedBrieAdapter.getItem().quality);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -68,4 +68,49 @@ public class BackstagePassesRuleTest {
|
|||||||
assertEquals(-1, backstageAdapter.getItem().sellIn);
|
assertEquals(-1, backstageAdapter.getItem().sellIn);
|
||||||
assertEquals(0, backstageAdapter.getItem().quality);
|
assertEquals(0, backstageAdapter.getItem().quality);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void backStageQualityIncreasesNoMoreThan50WhenThereAre5DaysOrLess() {
|
||||||
|
//given
|
||||||
|
Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 50);
|
||||||
|
ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5);
|
||||||
|
BackstagePassesRule backstagePassesRule = new BackstagePassesRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
backstagePassesRule.processItem(backstageAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(4, backstageAdapter.getItem().sellIn);
|
||||||
|
assertEquals(50, backstageAdapter.getItem().quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void backStageQualityIncreasesNoMoreThan50WhenThereAre10DaysOrLess() {
|
||||||
|
//given
|
||||||
|
Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 50);
|
||||||
|
ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5);
|
||||||
|
BackstagePassesRule backstagePassesRule = new BackstagePassesRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
backstagePassesRule.processItem(backstageAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(9, backstageAdapter.getItem().sellIn);
|
||||||
|
assertEquals(50, backstageAdapter.getItem().quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void backStageQualityIncreasesNoMoreThan50WhenIsGreaterThan10Days() {
|
||||||
|
//given
|
||||||
|
Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 11, 50);
|
||||||
|
ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5);
|
||||||
|
BackstagePassesRule backstagePassesRule = new BackstagePassesRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
backstagePassesRule.processItem(backstageAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(10, backstageAdapter.getItem().sellIn);
|
||||||
|
assertEquals(50, backstageAdapter.getItem().quality);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,56 @@
|
|||||||
|
package com.gildedrose.application.standard;
|
||||||
|
|
||||||
|
import com.gildedrose.domain.item.Item;
|
||||||
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
|
import com.gildedrose.domain.item.ItemType;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
public class StandardItemRuleTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenSellInDateIsPassed_qualityDegradesTwiceAsFast() {
|
||||||
|
//given
|
||||||
|
Item testItem = new Item("standard item", 0, 3);
|
||||||
|
ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, testItem);
|
||||||
|
StandardItemRule standardItemRule = new StandardItemRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
standardItemRule.processItem(itemAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(-1, itemAdapter.getItem().sellIn);
|
||||||
|
assertEquals(1, itemAdapter.getItem().quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void qualityOfAnItemIsNeverNegative() {
|
||||||
|
//given
|
||||||
|
Item testItem = new Item("standard item", 0, 0);
|
||||||
|
ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, testItem);
|
||||||
|
StandardItemRule standardItemRule = new StandardItemRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
standardItemRule.processItem(itemAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(-1, itemAdapter.getItem().sellIn);
|
||||||
|
assertEquals(0, itemAdapter.getItem().quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void standardItemQualityDecreasesByOne() {
|
||||||
|
//given
|
||||||
|
Item testItem = new Item("standard item", 5, 2);
|
||||||
|
ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, testItem);
|
||||||
|
StandardItemRule standardItemRule = new StandardItemRule();
|
||||||
|
|
||||||
|
//when
|
||||||
|
standardItemRule.processItem(itemAdapter);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertEquals(4, itemAdapter.getItem().sellIn);
|
||||||
|
assertEquals(1, itemAdapter.getItem().quality);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.gildedrose.core;
|
package com.gildedrose.core.rule;
|
||||||
|
|
||||||
import com.gildedrose.domain.item.Item;
|
import com.gildedrose.domain.item.Item;
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.gildedrose.core.rules;
|
package com.gildedrose.core.rule;
|
||||||
|
|
||||||
import com.gildedrose.domain.item.Item;
|
import com.gildedrose.domain.item.Item;
|
||||||
import com.gildedrose.domain.item.ItemAdapter;
|
import com.gildedrose.domain.item.ItemAdapter;
|
||||||
Loading…
Reference in New Issue
Block a user