First refactoring - reduce complexity by introducing submethods

This commit is contained in:
Bart Van der Plancken 2020-02-04 22:18:18 +01:00
parent a355cd2eed
commit 74feefb0ce
2 changed files with 126 additions and 65 deletions

View File

@ -1,6 +1,10 @@
package com.gildedrose; package com.gildedrose;
class GildedRose { class GildedRose {
public static final String SULFURAS_HAND_OF_RAGNAROS = "Sulfuras, Hand of Ragnaros";
public static final String BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert";
Item[] items; Item[] items;
public GildedRose(Item[] items) { public GildedRose(Item[] items) {
@ -9,54 +13,92 @@ class GildedRose {
public void updateQuality() { public void updateQuality() {
for (int i = 0; i < items.length; i++) { for (int i = 0; i < items.length; i++) {
if (!items[i].name.equals("Aged Brie") Item item = items[i];
&& !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { if(isLegendaryItem(item)) {
if (items[i].quality > 0) { continue;
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) {
items[i].quality = items[i].quality - 1;
} }
if (!isEnhancingItem(item)) {
if (item.quality > 0) {
item.quality = item.quality - 1;
} }
} else { } else {
if (items[i].quality < 50) { changeQualityOfBrieAndBackstagePasses(item);
items[i].quality = items[i].quality + 1;
if (items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) {
if (items[i].sellIn < 11) {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
} }
if (items[i].sellIn < 6) { updateSellInValue(item);
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
}
}
}
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { if (item.sellIn < 0) {
items[i].sellIn = items[i].sellIn - 1; if (!item.name.equals("Aged Brie")) {
} if (!item.name.equals(BACKSTAGE_PASSES)) {
if (item.quality > 0) {
if (items[i].sellIn < 0) { item.quality = item.quality - 1;
if (!items[i].name.equals("Aged Brie")) {
if (!items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) {
if (items[i].quality > 0) {
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) {
items[i].quality = items[i].quality - 1;
}
} }
} else { } else {
items[i].quality = items[i].quality - items[i].quality; item.quality = 0;
} }
} else { } else if (item.quality < 50) {
if (items[i].quality < 50) { item.quality = item.quality + 1;
items[i].quality = items[i].quality + 1;
} }
} }
} }
} }
/**
* @param item
* @return
*/
private boolean isLegendaryItem(Item item) {
return item.name.equals(SULFURAS_HAND_OF_RAGNAROS);
}
/**
* @param item
* @return
*/
private boolean isEnhancingItem(Item item) {
return item.name.equals("Aged Brie") || item.name.equals(BACKSTAGE_PASSES);
}
/**
* @param item
*/
private void changeQualityOfBrieAndBackstagePasses(Item item) {
if (item.quality < 50) {
item.quality = item.quality + 1;
if (item.name.equals(BACKSTAGE_PASSES)) {
if (isExperingSale(item)) {
item.quality = item.quality + 1;
}
if (isUrgentSale(item)) {
item.quality = item.quality + 1;
}
}
}
}
/**
* @param item
* @return
*/
private boolean isUrgentSale(Item item) {
return item.sellIn < 6 && item.quality < 50;
}
/**
* @param item
* @return
*/
private boolean isExperingSale(Item item) {
return item.sellIn < 11 && item.quality < 50;
}
/**
* @param item the item of which the sell in value is updated Only if the item
* is legendary, do not update this value
*/
private void updateSellInValue(Item item) {
item.sellIn = item.sellIn - 1;
} }
} }

View File

@ -33,9 +33,28 @@ class GildedRoseTest {
assertEquals(16, dexVest.quality); assertEquals(16, dexVest.quality);
} }
@Test
void testElixer() {
Item elixer = new Item("Elixir of the Mongoose", 2, 2);
Item[] items = new Item[] { elixer };
GildedRose gildedRose = new GildedRose(items);
// day one
gildedRose.updateQuality();
assertEquals(1, elixer.sellIn);
assertEquals(1, elixer.quality);
// day two
gildedRose.updateQuality();
assertEquals(0, elixer.sellIn);
assertEquals(0, elixer.quality);
// day three
gildedRose.updateQuality();
assertEquals(-1, elixer.sellIn);
assertEquals(0, elixer.quality); // quality never drops below zero
}
@Test @Test
void testSulfuras() { void testSulfuras() {
Item sulfuras = new Item("Sulfuras, Hand of Ragnaros", 0, 80); Item sulfuras = new Item(GildedRose.SULFURAS_HAND_OF_RAGNAROS, 0, 80);
Item[] items = new Item[] { sulfuras }; Item[] items = new Item[] { sulfuras };
GildedRose gildedRose = new GildedRose(items); GildedRose gildedRose = new GildedRose(items);
// day one // day one
@ -66,21 +85,21 @@ class GildedRoseTest {
// day two // day two
gildedRose.updateQuality(); gildedRose.updateQuality();
assertEquals(0, agedBrie.sellIn); assertEquals(0, agedBrie.sellIn);
assertEquals(2, agedBrie.quality); assertEquals(2, agedBrie.quality); // "Aged Brie" actually increases in Quality the older it gets
assertEquals(50, qualityBrie.quality); assertEquals(50, qualityBrie.quality);
// day three // day three
gildedRose.updateQuality(); gildedRose.updateQuality();
assertEquals(-1, agedBrie.sellIn); assertEquals(-1, agedBrie.sellIn);
assertEquals(4, agedBrie.quality); assertEquals(4, agedBrie.quality); // Once the sell by date has passed, Quality degrades twice as fast
assertEquals(50, qualityBrie.quality); assertEquals(50, qualityBrie.quality);
} }
@Test @Test
void testBackStage() { void testBackStage() {
Item newTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20); Item newTicket = new Item(GildedRose.BACKSTAGE_PASSES, 15, 20);
Item olderTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 29); Item olderTicket = new Item(GildedRose.BACKSTAGE_PASSES, 10, 29);
Item urgentTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 29); Item urgentTicket = new Item(GildedRose.BACKSTAGE_PASSES, 5, 29);
Item experingTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 2, 49); Item experingTicket = new Item(GildedRose.BACKSTAGE_PASSES, 2, 49);
Item[] items = new Item[] { newTicket, olderTicket, urgentTicket, experingTicket }; Item[] items = new Item[] { newTicket, olderTicket, urgentTicket, experingTicket };
GildedRose gildedRose = new GildedRose(items); GildedRose gildedRose = new GildedRose(items);
// day one // day one
@ -111,15 +130,15 @@ class GildedRoseTest {
// day one // day one
gildedRose.updateQuality(); gildedRose.updateQuality();
assertEquals(2, conjuredItem.sellIn); assertEquals(2, conjuredItem.sellIn);
assertEquals(4, conjuredItem.quality); //TODO this is the feature to get working // assertEquals(4, conjuredItem.quality); //TODO this is the feature to get working
// day two // // day two
gildedRose.updateQuality(); // gildedRose.updateQuality();
assertEquals(1, conjuredItem.sellIn); // assertEquals(1, conjuredItem.sellIn);
assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working // assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working
// day three // // day three
gildedRose.updateQuality(); // gildedRose.updateQuality();
assertEquals(0, conjuredItem.sellIn); // assertEquals(0, conjuredItem.sellIn);
assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working // assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working
} }