mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-04 09:11:39 +00:00
refactor conditional to polymorphism - BackstagePasses
This commit is contained in:
parent
cf46998049
commit
e169a998b3
@ -38,31 +38,11 @@ class GildedRose {
|
||||
ItemAdapter itemAdapter = ItemAdapterSimpleFactory.createItemAdapter(item);
|
||||
|
||||
if (isAgedBrie) {
|
||||
InventoryRuleEngine.processUpdateInventoryRule(itemAdapter);
|
||||
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
||||
} else if (isBackstagePasses) {
|
||||
if (shouldIncreaseQuality(item)) {
|
||||
increaseQuality(item);
|
||||
|
||||
if (item.sellIn < SELL_IN_DAY11) {
|
||||
if (shouldIncreaseQuality(item)) {
|
||||
increaseQuality(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (item.sellIn < SELL_IN_DAY6) {
|
||||
if (shouldIncreaseQuality(item)) {
|
||||
increaseQuality(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
decreaseDay(item);
|
||||
|
||||
if (isExpired(item)) {
|
||||
item.quality = MINIMUM_QUALITY;
|
||||
}
|
||||
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
||||
} else if (isSulfuras) {
|
||||
InventoryRuleEngine.processUpdateInventoryRule(itemAdapter);
|
||||
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
||||
} else {
|
||||
//standard item
|
||||
if (shouldDecreaseQuality(item)) {
|
||||
|
||||
@ -16,12 +16,12 @@ public class AgedBrieRule extends UpdateInventoryTemplateRule {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canIncreaseQuality(final ItemAdapter itemAdapter) {
|
||||
protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canDecreaseQuality(final ItemAdapter itemAdapter) {
|
||||
protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,40 @@
|
||||
package com.gildedrose.application.backstagepasses;
|
||||
|
||||
import com.gildedrose.core.rules.UpdateInventoryTemplateRule;
|
||||
import com.gildedrose.domain.item.ItemAdapter;
|
||||
|
||||
public class BackstagePassesRule extends UpdateInventoryTemplateRule {
|
||||
|
||||
final int SELL_IN_DAY10 = 10;
|
||||
final int SELL_IN_DAY5 = 5;
|
||||
|
||||
@Override
|
||||
protected boolean canSubtractSellIn(final ItemAdapter itemAdapter) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getQualityFactor(final boolean isExpired, final ItemAdapter itemAdapter) {
|
||||
return isExpired ? itemAdapter.getItem().quality : checkSellInRange(itemAdapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||
return !isExpired;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||
return isExpired;
|
||||
}
|
||||
|
||||
private int checkSellInRange(final ItemAdapter itemAdapter) {
|
||||
int qualityFactor = 1;
|
||||
if (itemAdapter.getItem().sellIn <= SELL_IN_DAY5) {
|
||||
qualityFactor = 3;
|
||||
} else if (itemAdapter.getItem().sellIn <= SELL_IN_DAY10) {
|
||||
qualityFactor = 2;
|
||||
}
|
||||
return qualityFactor;
|
||||
}
|
||||
}
|
||||
@ -16,12 +16,12 @@ public class SulfurasRule extends UpdateInventoryTemplateRule {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canIncreaseQuality(final ItemAdapter itemAdapter) {
|
||||
protected boolean canIncreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canDecreaseQuality(final ItemAdapter itemAdapter) {
|
||||
protected boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package com.gildedrose.core;
|
||||
|
||||
import com.gildedrose.application.agedbrie.AgedBrieRule;
|
||||
import com.gildedrose.application.backstagepasses.BackstagePassesRule;
|
||||
import com.gildedrose.application.sulfuras.SulfurasRule;
|
||||
import com.gildedrose.core.rules.UpdateInventoryTemplateRule;
|
||||
import com.gildedrose.domain.item.ItemAdapter;
|
||||
@ -14,9 +15,10 @@ public class InventoryRuleEngine {
|
||||
private static final Map<ItemType, UpdateInventoryTemplateRule> updateInventoryRules = new HashMap<>(){{
|
||||
put(ItemType.AGEG_BRIE, new AgedBrieRule());
|
||||
put(ItemType.SULFURAS, new SulfurasRule());
|
||||
put(ItemType.BACKSTAGE_PASSES, new BackstagePassesRule());
|
||||
}};
|
||||
|
||||
public static void processUpdateInventoryRule(ItemAdapter itemAdapter) {
|
||||
public static void applyUpdateRule(ItemAdapter itemAdapter) {
|
||||
if (null != updateInventoryRules.get(itemAdapter.getItemType())) {
|
||||
updateInventoryRules.get(itemAdapter.getItemType()).processItem(itemAdapter);
|
||||
}
|
||||
|
||||
@ -11,33 +11,33 @@ public abstract class UpdateInventoryTemplateRule {
|
||||
|
||||
public final void processItem(final ItemAdapter itemAdapter) {
|
||||
|
||||
boolean isExpired = isExpired(itemAdapter);
|
||||
int qualityFactor = getQualityFactor(isExpired, itemAdapter);
|
||||
|
||||
if (canIncreaseQuality(isExpired, itemAdapter)) {
|
||||
increaseQuality(itemAdapter, qualityFactor);
|
||||
}
|
||||
|
||||
if (canSubtractSellIn(itemAdapter)) {
|
||||
subtractSellIn(itemAdapter);
|
||||
}
|
||||
|
||||
boolean isExpired = isExpired(itemAdapter);
|
||||
int qualityFactor = getQualityFactor(isExpired, itemAdapter);
|
||||
|
||||
if (canIncreaseQuality(itemAdapter)) {
|
||||
increaseQuality(itemAdapter, qualityFactor);
|
||||
}
|
||||
|
||||
if (canDecreaseQuality(itemAdapter)) {
|
||||
if (canDecreaseQuality(isExpired, itemAdapter)) {
|
||||
decreaseQuality(itemAdapter, qualityFactor);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract boolean canSubtractSellIn(final ItemAdapter itemAdapter);
|
||||
protected abstract int getQualityFactor(final boolean isExpired, final ItemAdapter itemAdapter);
|
||||
protected abstract boolean canIncreaseQuality(final ItemAdapter itemAdapter);
|
||||
protected abstract boolean canDecreaseQuality(final ItemAdapter itemAdapter);
|
||||
protected abstract boolean canIncreaseQuality(final boolean isExpired, final ItemAdapter itemAdapter);
|
||||
protected abstract boolean canDecreaseQuality(boolean isExpired, final ItemAdapter itemAdapter);
|
||||
|
||||
private void subtractSellIn(final ItemAdapter itemAdapter) {
|
||||
itemAdapter.getItem().sellIn -= SELL_IN_UNIT;
|
||||
}
|
||||
|
||||
private boolean isExpired(final ItemAdapter itemAdapter) {
|
||||
return itemAdapter.getItem().sellIn < SELL_IN_EXPIRED;
|
||||
return itemAdapter.getItem().sellIn <= SELL_IN_EXPIRED;
|
||||
}
|
||||
|
||||
private void increaseQuality(final ItemAdapter itemAdapter, final int qualityFactor) {
|
||||
@ -47,6 +47,6 @@ public abstract class UpdateInventoryTemplateRule {
|
||||
|
||||
private void decreaseQuality(final ItemAdapter itemAdapter, final int qualityFactor) {
|
||||
int decreasedQuality = itemAdapter.getItem().quality - qualityFactor;
|
||||
itemAdapter.getItem().quality = Math.min(decreasedQuality, MINIMUM_QUALITY);
|
||||
itemAdapter.getItem().quality = Math.max(decreasedQuality, MINIMUM_QUALITY);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,62 +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 BackStageTest {
|
||||
|
||||
@Test
|
||||
void backStageQualityIncreasesByTwoWhenThereAre10DaysOrLess() {
|
||||
//given
|
||||
Item backStage10 = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 2);
|
||||
Item backStage6 = new Item("Backstage passes to a TAFKAL80ETC concert", 6, 2);
|
||||
Item[] items = new Item[] {backStage10, backStage6};
|
||||
|
||||
//when
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
|
||||
//then
|
||||
assertEquals(9, app.items[0].sellIn);
|
||||
assertEquals(4, app.items[0].quality);
|
||||
|
||||
assertEquals(5, app.items[1].sellIn);
|
||||
assertEquals(4, app.items[1].quality);
|
||||
}
|
||||
|
||||
@Test
|
||||
void backStageQualityIncreasesByThreeWhenThereAre5DaysOrLess() {
|
||||
//given
|
||||
Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 3);
|
||||
Item backStage4 = new Item("Backstage passes to a TAFKAL80ETC concert", 4, 3);
|
||||
Item[] items = new Item[] {backStage5, backStage4};
|
||||
|
||||
//when
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
|
||||
//then
|
||||
assertEquals(4, app.items[0].sellIn);
|
||||
assertEquals(6, app.items[0].quality);
|
||||
|
||||
assertEquals(3, app.items[1].sellIn);
|
||||
assertEquals(6, app.items[1].quality);
|
||||
}
|
||||
|
||||
@Test
|
||||
void backStageQualityDecreasesToZeroWhenIsExpired() {
|
||||
//given
|
||||
Item backStage = new Item("Backstage passes to a TAFKAL80ETC concert", 0, 3);
|
||||
Item[] items = new Item[] {backStage};
|
||||
|
||||
//when
|
||||
GildedRose app = new GildedRose(items);
|
||||
app.updateQuality();
|
||||
|
||||
//then
|
||||
assertEquals(-1, app.items[0].sellIn);
|
||||
assertEquals(0, app.items[0].quality);
|
||||
}
|
||||
}
|
||||
@ -16,11 +16,12 @@ public class TexttestFixture {
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49),
|
||||
new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49),
|
||||
// this conjured item does not work properly yet
|
||||
new Item("Conjured Mana Cake", 3, 6) };
|
||||
new Item("Conjured Mana Cake", 3, 6)
|
||||
};
|
||||
|
||||
GildedRose app = new GildedRose(items);
|
||||
|
||||
int days = 5;
|
||||
int days = 32;
|
||||
if (args.length > 0) {
|
||||
days = Integer.parseInt(args[0]) + 1;
|
||||
}
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
package com.gildedrose.application.backstagepasses;
|
||||
|
||||
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 BackstagePassesRuleTest {
|
||||
|
||||
@Test
|
||||
void backStageQualityIncreasesByOneWhenIsGreaterThan10Days() {
|
||||
//given
|
||||
Item backStage11 = new Item("Backstage passes to a TAFKAL80ETC concert", 11, 2);
|
||||
ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage11);
|
||||
BackstagePassesRule backstagePassesRule = new BackstagePassesRule();
|
||||
|
||||
//when
|
||||
backstagePassesRule.processItem(backstageAdapter);
|
||||
|
||||
//then
|
||||
assertEquals(10, backstageAdapter.getItem().sellIn);
|
||||
assertEquals(3, backstageAdapter.getItem().quality);
|
||||
}
|
||||
|
||||
@Test
|
||||
void backStageQualityIncreasesByTwoWhenThereAre10DaysOrLess() {
|
||||
//given
|
||||
Item backStage10 = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 2);
|
||||
ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage10);
|
||||
BackstagePassesRule backstagePassesRule = new BackstagePassesRule();
|
||||
|
||||
//when
|
||||
backstagePassesRule.processItem(backstageAdapter);
|
||||
|
||||
//then
|
||||
assertEquals(9, backstageAdapter.getItem().sellIn);
|
||||
assertEquals(4, backstageAdapter.getItem().quality);
|
||||
}
|
||||
|
||||
@Test
|
||||
void backStageQualityIncreasesByThreeWhenThereAre5DaysOrLess() {
|
||||
//given
|
||||
Item backStage5 = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 3);
|
||||
ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage5);
|
||||
BackstagePassesRule backstagePassesRule = new BackstagePassesRule();
|
||||
|
||||
//when
|
||||
backstagePassesRule.processItem(backstageAdapter);
|
||||
|
||||
//then
|
||||
assertEquals(4, backstageAdapter.getItem().sellIn);
|
||||
assertEquals(6, backstageAdapter.getItem().quality);
|
||||
}
|
||||
|
||||
@Test
|
||||
void backStageQualityDecreasesToZeroWhenIsExpired() {
|
||||
//given
|
||||
Item backStage = new Item("Backstage passes to a TAFKAL80ETC concert", 0, 3);
|
||||
ItemAdapter backstageAdapter = new ItemAdapter(ItemType.BACKSTAGE_PASSES, backStage);
|
||||
BackstagePassesRule backstagePassesRule = new BackstagePassesRule();
|
||||
|
||||
//when
|
||||
backstagePassesRule.processItem(backstageAdapter);
|
||||
|
||||
//then
|
||||
assertEquals(-1, backstageAdapter.getItem().sellIn);
|
||||
assertEquals(0, backstageAdapter.getItem().quality);
|
||||
}
|
||||
}
|
||||
@ -14,7 +14,7 @@ public class InventoryRuleEngineTest {
|
||||
ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Aged Brie", 3, 0));
|
||||
|
||||
//when
|
||||
InventoryRuleEngine.processUpdateInventoryRule(itemAdapter);
|
||||
InventoryRuleEngine.applyUpdateRule(itemAdapter);
|
||||
|
||||
//then
|
||||
assertEquals(2, itemAdapter.getItem().sellIn);
|
||||
|
||||
@ -13,7 +13,7 @@ public class UpdateInventoryTemplateRuleTest {
|
||||
void processItemCorrectly() {
|
||||
//given
|
||||
UpdateInventoryTemplateRule testRule = createTestRule(true, true, true);
|
||||
ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Just a test item", 3, 0));
|
||||
ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, new Item("Just a test item", 3, 0));
|
||||
//when
|
||||
testRule.processItem(itemAdapter);
|
||||
|
||||
@ -26,20 +26,20 @@ public class UpdateInventoryTemplateRuleTest {
|
||||
void processItemCorrectlyWhenIsExpired() {
|
||||
//given
|
||||
UpdateInventoryTemplateRule testRule = createTestRule(true, true, true);
|
||||
ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Just a test item", 0, 2));
|
||||
ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, new Item("Just a test item", 0, 2));
|
||||
//when
|
||||
testRule.processItem(itemAdapter);
|
||||
|
||||
//then
|
||||
assertEquals(-1, itemAdapter.getItem().sellIn);
|
||||
assertEquals(0, itemAdapter.getItem().quality);
|
||||
assertEquals(2, itemAdapter.getItem().quality);
|
||||
}
|
||||
|
||||
@Test
|
||||
void processItemCorrectlyWhenNoChangesAreAllowed() {
|
||||
//given
|
||||
UpdateInventoryTemplateRule testRule = createTestRule(false, false, false);
|
||||
ItemAdapter itemAdapter = new ItemAdapter(ItemType.AGEG_BRIE, new Item("Just a test item", 10, 2));
|
||||
ItemAdapter itemAdapter = new ItemAdapter(ItemType.STANDARD, new Item("Just a test item", 10, 2));
|
||||
//when
|
||||
testRule.processItem(itemAdapter);
|
||||
|
||||
@ -63,12 +63,12 @@ public class UpdateInventoryTemplateRuleTest {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canIncreaseQuality(ItemAdapter itemAdapter) {
|
||||
protected boolean canIncreaseQuality(boolean isExpired, ItemAdapter itemAdapter) {
|
||||
return canIncreaseQuality;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canDecreaseQuality(ItemAdapter itemAdapter) {
|
||||
protected boolean canDecreaseQuality(boolean isExpired, ItemAdapter itemAdapter) {
|
||||
return canDecreaseQuality;
|
||||
}
|
||||
};
|
||||
|
||||
Loading…
Reference in New Issue
Block a user