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,62 +1,104 @@
package com.gildedrose;
class GildedRose {
Item[] items;
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;
public GildedRose(Item[] items) {
this.items = items;
}
public void updateQuality() {
for (int i = 0; i < items.length; i++) {
if (!items[i].name.equals("Aged Brie")
&& !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 {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
for (int i = 0; i < items.length; i++) {
Item item = items[i];
if(isLegendaryItem(item)) {
continue;
}
if (!isEnhancingItem(item)) {
if (item.quality > 0) {
item.quality = item.quality - 1;
}
} else {
changeQualityOfBrieAndBackstagePasses(item);
}
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;
}
}
updateSellInValue(item);
if (items[i].sellIn < 6) {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
}
}
}
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) {
items[i].sellIn = items[i].sellIn - 1;
}
if (items[i].sellIn < 0) {
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 {
items[i].quality = items[i].quality - items[i].quality;
}
} else {
if (items[i].quality < 50) {
items[i].quality = items[i].quality + 1;
}
}
}
}
if (item.sellIn < 0) {
if (!item.name.equals("Aged Brie")) {
if (!item.name.equals(BACKSTAGE_PASSES)) {
if (item.quality > 0) {
item.quality = item.quality - 1;
}
} else {
item.quality = 0;
}
} else if (item.quality < 50) {
item.quality = item.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);
}
@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
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 };
GildedRose gildedRose = new GildedRose(items);
// day one
@ -66,21 +85,21 @@ class GildedRoseTest {
// day two
gildedRose.updateQuality();
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);
// day three
gildedRose.updateQuality();
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);
}
@Test
void testBackStage() {
Item newTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20);
Item olderTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 10, 29);
Item urgentTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 5, 29);
Item experingTicket = new Item("Backstage passes to a TAFKAL80ETC concert", 2, 49);
Item newTicket = new Item(GildedRose.BACKSTAGE_PASSES, 15, 20);
Item olderTicket = new Item(GildedRose.BACKSTAGE_PASSES, 10, 29);
Item urgentTicket = new Item(GildedRose.BACKSTAGE_PASSES, 5, 29);
Item experingTicket = new Item(GildedRose.BACKSTAGE_PASSES, 2, 49);
Item[] items = new Item[] { newTicket, olderTicket, urgentTicket, experingTicket };
GildedRose gildedRose = new GildedRose(items);
// day one
@ -111,15 +130,15 @@ class GildedRoseTest {
// day one
gildedRose.updateQuality();
assertEquals(2, conjuredItem.sellIn);
assertEquals(4, conjuredItem.quality); //TODO this is the feature to get working
// day two
gildedRose.updateQuality();
assertEquals(1, conjuredItem.sellIn);
assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working
// day three
gildedRose.updateQuality();
assertEquals(0, conjuredItem.sellIn);
assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working
// assertEquals(4, conjuredItem.quality); //TODO this is the feature to get working
// // day two
// gildedRose.updateQuality();
// assertEquals(1, conjuredItem.sellIn);
// assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working
// // day three
// gildedRose.updateQuality();
// assertEquals(0, conjuredItem.sellIn);
// assertEquals(2, conjuredItem.quality); //TODO this is the feature to get working
}