Minimum quality problem with Backstage fixed

This commit is contained in:
Erol Kaya 2019-08-21 22:06:12 +02:00
parent 8e1b4e9347
commit 35229d0a47
2 changed files with 69 additions and 56 deletions

View File

@ -12,23 +12,24 @@ class BackstagePassUpdater extends CustomItemUpdater {
@Override @Override
boolean canUpdateQuality() { boolean canUpdateQuality() {
return item.quality < HIGHEST_QUALITY && item.quality > MIN_QUALITY; return item.quality < HIGHEST_QUALITY;
} }
@Override @Override
int getUpdateValue() { int getUpdateValue() {
if (sellByDateLessThan(item, 0)) { int sellIn = item.sellIn;
if (sellInLessThan(sellIn, 0)) {
// if sell by date has passed then the quality should be zero // if sell by date has passed then the quality should be zero
return -item.quality; return -item.quality;
} else if (sellByDateLessThan(item, 6)) { } else if (sellInLessThan(sellIn, 6)) {
return INCREASE_THRICE_AS_FAST; return INCREASE_THRICE_AS_FAST;
} else if (sellByDateLessThan(item, 11) ) { } else if (sellInLessThan(sellIn, 11) ) {
return INCREASE_TWICE_AS_FAST; return INCREASE_TWICE_AS_FAST;
} }
return INCREASE_NORMAL; return INCREASE_NORMAL;
} }
private static boolean sellByDateLessThan(final Item item, final int remainingDayCount) { private static boolean sellInLessThan(final int sellIn, final int remainingDayCount) {
return item.sellIn < remainingDayCount; return sellIn < remainingDayCount;
} }
} }

View File

@ -28,6 +28,42 @@ public class GildedRoseTest {
private GildedRose app; private GildedRose app;
@Test
public void agedBrie_shouldIncreaseNormal() {
final int originalQuality = agedBrieWithLowQuality.quality;
final int originalSellIn = agedBrieWithLowQuality.sellIn;
final Item[] items = new Item[]{agedBrieWithLowQuality};
app = new GildedRose(items);
app.updateQuality();
assertEquals(agedBrieWithLowQuality.name, app.items[0].name);
assertEquals(originalSellIn - 1, app.items[0].sellIn);
assertEquals(originalQuality + 1, app.items[0].quality);
}
@Test
public void agedBrie_shouldIncreaseNormal_whenOriginalQualityIsZero() {
final int originalQuality = 0;
final int originalSellIn = 2;
final Item[] items = new Item[]{new Item("Aged Brie", originalSellIn, originalQuality)};
app = new GildedRose(items);
app.updateQuality();
assertEquals("Aged Brie", app.items[0].name);
assertEquals(originalSellIn - 1, app.items[0].sellIn);
assertEquals(originalQuality + 1, app.items[0].quality);
}
@Test
public void agedBrie_shouldNotIncrease_moreThanHighestValue() {
final int originalQuality = agedBrieWithHighestQuality.quality;
final int originalSellIn = agedBrieWithHighestQuality.sellIn;
final Item[] items = new Item[]{agedBrieWithHighestQuality};
app = new GildedRose(items);
app.updateQuality();
assertEquals(agedBrieWithHighestQuality.name, app.items[0].name);
assertEquals(originalSellIn - 1, app.items[0].sellIn);
assertEquals(originalQuality, app.items[0].quality);
}
@Test @Test
public void backstageItem_shouldIncreaseThriceAsFast_whenLessThan5DaysLeftToSellByDate() { public void backstageItem_shouldIncreaseThriceAsFast_whenLessThan5DaysLeftToSellByDate() {
final int originalQuality = 20; final int originalQuality = 20;
@ -61,6 +97,17 @@ public class GildedRoseTest {
assertEquals(originalQuality + 1, app.items[0].quality); assertEquals(originalQuality + 1, app.items[0].quality);
} }
@Test
public void backstageItem_shouldIncreaseNormal_whenQualityIsMinimum() {
final int originalQuality = MIN_QUALITY;
final Item[] items = new Item[]{new Item("Backstage passes to a TAFKAL80ETC concert", 15, originalQuality)};
app = new GildedRose(items);
app.updateQuality();
assertEquals(14, app.items[0].sellIn);
assertEquals(originalQuality + 1, app.items[0].quality);
}
@Test @Test
public void backstageItemQuality_shouldBeZero_whenSellByDatePassed() { public void backstageItemQuality_shouldBeZero_whenSellByDatePassed() {
final int originalQuality = 20; final int originalQuality = 20;
@ -88,6 +135,21 @@ public class GildedRoseTest {
assertEquals(MIN_QUALITY, app.items[0].quality); assertEquals(MIN_QUALITY, app.items[0].quality);
} }
@Test
public void conjuredItems_shouldDegradeAsTwiceAsFast_thenTheStandardItems() {
final Item[] items = new Item[]{conjuredWithHighestQuality};
app = new GildedRose(items);
// First 5 times it should degrade by 2
// Last 2 times (after the sell by date has passed) it should degrade by 4
for (int i = 0; i < 7; i++) {
app.updateQuality();
}
assertEquals(-2, app.items[0].sellIn);
assertEquals(32, app.items[0].quality);
}
@Test @Test
public void standardItem_shouldDegradeNormal_whenSellByDateNotPassed() { public void standardItem_shouldDegradeNormal_whenSellByDateNotPassed() {
final int originalQuality = 40; final int originalQuality = 40;
@ -99,42 +161,6 @@ public class GildedRoseTest {
assertEquals(originalQuality - 1, app.items[0].quality); assertEquals(originalQuality - 1, app.items[0].quality);
} }
@Test
public void agedBrie_shouldIncreaseNormal() {
final int originalQuality = agedBrieWithLowQuality.quality;
final int originalSellIn = agedBrieWithLowQuality.sellIn;
final Item[] items = new Item[]{agedBrieWithLowQuality};
app = new GildedRose(items);
app.updateQuality();
assertEquals(agedBrieWithLowQuality.name, app.items[0].name);
assertEquals(originalSellIn - 1, app.items[0].sellIn);
assertEquals(originalQuality + 1, app.items[0].quality);
}
@Test
public void agedBrie_shouldIncreaseNormal_whenOriginalQualityIsZero() {
final int originalQuality = 0;
final int originalSellIn = 2;
final Item[] items = new Item[]{new Item("Aged Brie", originalSellIn, originalQuality)};
app = new GildedRose(items);
app.updateQuality();
assertEquals("Aged Brie", app.items[0].name);
assertEquals(originalSellIn - 1, app.items[0].sellIn);
assertEquals(originalQuality + 1, app.items[0].quality);
}
@Test
public void agedBrie_shouldNotIncrease_moreThanHighestValue() {
final int originalQuality = agedBrieWithHighestQuality.quality;
final int originalSellIn = agedBrieWithHighestQuality.sellIn;
final Item[] items = new Item[]{agedBrieWithHighestQuality};
app = new GildedRose(items);
app.updateQuality();
assertEquals(agedBrieWithHighestQuality.name, app.items[0].name);
assertEquals(originalSellIn - 1, app.items[0].sellIn);
assertEquals(originalQuality, app.items[0].quality);
}
@Test @Test
public void standardItem_shouldDegradeTwiceAsFast_whenSellByDatePassed() { public void standardItem_shouldDegradeTwiceAsFast_whenSellByDatePassed() {
final int originalQuality = 40; final int originalQuality = 40;
@ -217,19 +243,6 @@ public class GildedRoseTest {
assertEquals(3, minimumQualityItemsCount); assertEquals(3, minimumQualityItemsCount);
} }
@Test
public void conjuredItems_shouldDegradeAsTwiceAsFast_thenTheStandardItems() {
final Item[] items = new Item[]{conjuredWithHighestQuality};
app = new GildedRose(items);
for (int i = 0; i < 7; i++) {
app.updateQuality();
}
assertEquals(-2, app.items[0].sellIn);
assertEquals(32, app.items[0].quality);
}
@Test @Test
public void newStandardItem_shouldDegradeAsNormal() { public void newStandardItem_shouldDegradeAsNormal() {
ItemUpdaterFactory.registerCustomUpdater("New Item", new StandardItemUpdater()); ItemUpdaterFactory.registerCustomUpdater("New Item", new StandardItemUpdater());
@ -244,7 +257,6 @@ public class GildedRoseTest {
assertEquals("New Item", app.items[0].name); assertEquals("New Item", app.items[0].name);
assertEquals(0, app.items[0].sellIn); assertEquals(0, app.items[0].sellIn);
assertEquals(originalQuality -1, app.items[0].quality); assertEquals(originalQuality -1, app.items[0].quality);
assertEquals(newItem.name + ", " + newItem.sellIn + ", " + newItem.quality, app.items[0].toString()); assertEquals(newItem.name + ", " + newItem.sellIn + ", " + newItem.quality, app.items[0].toString());
} }
} }