parametrize default quality rule

This commit is contained in:
Konstantin Pavlov 2019-06-30 08:53:10 +02:00
parent bffe40a2c8
commit 8d00059cc2
3 changed files with 43 additions and 11 deletions

View File

@ -1,16 +1,13 @@
package com.gildedrose.rules; package com.gildedrose.rules;
import static java.lang.Integer.max; public class ConjuredQualityRule extends DefaultQualityRule {
public class ConjuredQualityRule implements QualityRule { public ConjuredQualityRule() {
super(2, null, true);
}
@Override @Override
public boolean shouldApply(String itemName) { public boolean shouldApply(String itemName) {
return itemName != null && itemName.startsWith("Conjured "); return itemName != null && itemName.startsWith("Conjured ");
} }
@Override
public Result calculateQuality(int oldQuality, int newSellIn) {
return new Result(max(oldQuality - 2, 0), true);
}
} }

View File

@ -4,20 +4,38 @@ import static java.lang.Integer.max;
public class DefaultQualityRule implements QualityRule { public class DefaultQualityRule implements QualityRule {
private final int multiplier;
private final String expectedItemName;
private final boolean isFinalRule;
public DefaultQualityRule() {
this(1, null, false);
}
public DefaultQualityRule(int multiplier, String itemName, boolean isFinalRule) {
this.multiplier = multiplier;
this.expectedItemName = itemName;
this.isFinalRule = isFinalRule;
}
@Override @Override
public boolean shouldApply(String itemName) { public boolean shouldApply(String itemName) {
return true; if (expectedItemName != null) {
return expectedItemName.equals(itemName);
} else {
return true;
}
} }
@Override @Override
public Result calculateQuality(int oldQuality, int newSellIn) { public Result calculateQuality(int oldQuality, int newSellIn) {
final int newQuality; final int newQuality;
if (newSellIn < 0) { if (newSellIn < 0) {
newQuality = oldQuality - 2; newQuality = oldQuality - 2 * multiplier;
} else { } else {
newQuality = oldQuality - 1; newQuality = oldQuality - multiplier;
} }
return new Result(max(newQuality, 0), false); return new Result(max(newQuality, 0), isFinalRule);
} }
} }

View File

@ -29,4 +29,21 @@ class GildedRoseConjuredTest {
final int expectedQuality = max(initialQuality - 2, 0); final int expectedQuality = max(initialQuality - 2, 0);
assertItem(item, ITEM_NAME, 0, expectedQuality); assertItem(item, ITEM_NAME, 0, expectedQuality);
} }
@Feature("\"Conjured\" items degrade in Quality twice as fast as normal items")
@Feature("The Quality of an item is never negative")
@ParameterizedTest(name = "Initial quality: {arguments}")
@ValueSource(ints = {0, 1, 2, 3, 49, 50})
void shouldDegradeInQualityTwiceFastForOverdueItems(int initialQuality) {
// given
GildedRose app = prepareApp(new Item(ITEM_NAME, 0, initialQuality));
// when
app.updateQuality();
// then
final Item item = app.items[0];
final int expectedQuality = max(initialQuality - 4, 0);
assertItem(item, ITEM_NAME, -1, expectedQuality);
}
} }