Adding unit tests and refactoring - looks good ;-)

This commit is contained in:
Adam 2022-09-25 18:14:21 +01:00
parent bdcea60169
commit 30ed72f8de
3 changed files with 171 additions and 45 deletions

View File

@ -1,62 +1,89 @@
package com.gildedrose; package com.gildedrose;
class GildedRose { class GildedRose {
public static final String SULFURAS = "Sulfuras, Hand of Ragnaros";
public static final String CHEESE = "Aged Brie";
//TODO: brainstorm the naming a bit here.
public static final String BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT
= "Backstage passes to a TAFKAL80ETC concert";
Item[] items; Item[] items;
public GildedRose(Item[] items) { public GildedRose(Item[] items) {
this.items = items; this.items = items;
} }
/**
* Update the staet of the items.
*/
public void updateQuality() { public void updateQuality() {
for (int i = 0; i < items.length; i++) { for (Item item : items) {
if (!items[i].name.equals("Aged Brie") if (!item.name.equals(CHEESE)
&& !items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { && !item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) {
if (items[i].quality > 0) { if (item.quality > 0) {
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { if (!item.name.equals(SULFURAS)) {
items[i].quality = items[i].quality - 1; item.quality = item.quality - 1;
} }
} }
} else { } else {
if (items[i].quality < 50) { dealWithPasses(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) { if (!item.name.equals("Sulfuras, Hand of Ragnaros")) {
if (items[i].quality < 50) { decrementSellIn(item);
items[i].quality = items[i].quality + 1;
} }
if (item.sellIn < 0) {
if (!item.name.equals(CHEESE) &&
!item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) {
dealWithExpiredItem(item);
} else {
dealWithExpiredCheeseOrPasses(item);
} }
} }
} }
} }
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { private void decrementSellIn(Item item) {
items[i].sellIn = items[i].sellIn - 1; item.sellIn = item.sellIn - 1;
} }
if (items[i].sellIn < 0) { private void dealWithPasses(Item item) {
if (!items[i].name.equals("Aged Brie")) { if (item.quality < 50) {
if (!items[i].name.equals("Backstage passes to a TAFKAL80ETC concert")) { item.quality = item.quality + 1;
if (items[i].quality > 0) {
if (!items[i].name.equals("Sulfuras, Hand of Ragnaros")) { if (item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) {
items[i].quality = items[i].quality - 1; if (item.sellIn < 11) {
if (item.quality < 50) {
item.quality = item.quality + 1;
} }
} }
// If the sellIn is 5 days or fewer add to the quality again
if (item.sellIn < 6) {
item.quality = item.quality + 1;
}
}
}
}
private void dealWithExpiredItem(Item item) {
if (item.quality > 0) {
if (!item.name.equals(SULFURAS)) {
item.quality = item.quality - 1;
}
} else { } else {
items[i].quality = items[i].quality - items[i].quality; item.quality = 0;
} }
}
private void dealWithExpiredCheeseOrPasses(Item item) {
if (item.quality < 50 && !item.name.equals(BACKSTAGE_PASSES_TO_A_TAFKAL_80_ETC_CONCERT)) {
item.quality = item.quality + 1;
} else { } else {
if (items[i].quality < 50) { item.quality = 0;
items[i].quality = items[i].quality + 1;
}
}
}
} }
} }
} }

View File

@ -18,4 +18,32 @@ public class Item {
public String toString() { public String toString() {
return this.name + ", " + this.sellIn + ", " + this.quality; return this.name + ", " + this.sellIn + ", " + this.quality;
} }
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Item item = (Item) o;
if (sellIn != item.sellIn) {
return false;
}
if (quality != item.quality) {
return false;
}
return name != null ? name.equals(item.name) : item.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + sellIn;
result = 31 * result + quality;
return result;
}
} }

View File

@ -7,11 +7,82 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
class GildedRoseTest { class GildedRoseTest {
@Test @Test
void foo() { void testNormalDegrade() {
Item[] items = new Item[] { new Item("foo", 0, 0) }; Item testItem = new Item("test_item", 3, 10);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items); GildedRose app = new GildedRose(items);
app.updateQuality(); app.updateQuality();
assertEquals("fixme", app.items[0].name); Item updatedItem = app.items[0];
assertEquals(new Item("test_item", 2, 9), updatedItem);
} }
@Test
void testPastSellInDegrade() {
Item testItem = new Item("test_item", 0, 10);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items);
app.updateQuality();
Item updatedItem = app.items[0];
assertEquals(new Item("test_item", -1, 8), updatedItem);
}
@Test
void testQualityMustNotEverGoUnderZero() {
Item testItem = new Item("test_item", 5, 0);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items);
app.updateQuality();
Item updatedItem = app.items[0];
assertEquals(0, testItem.quality);
}
@Test
void testAgedBrieGetsBetterWithAge() {
Item testItem = new Item("Aged Brie", 5, 10);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items);
app.updateQuality();
Item updatedItem = app.items[0];
assertEquals(new Item("Aged Brie", 4, 11), updatedItem);
}
@Test
void testQualityIsCappedAt50() {
Item testItem = new Item("Aged Brie", 5, 50);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items);
app.updateQuality();
Item updatedItem = app.items[0];
assertEquals(50, updatedItem.quality);
}
@Test
void testBackstagePass() {
Item testItem = new Item("Backstage passes to a TAFKAL80ETC concert", 6, 10);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items);
app.updateQuality();
Item updatedItem = app.items[0];
assertEquals(12, updatedItem.quality);
}
@Test
void testBackstagePassWhenLessThan3DaysRemaining() {
Item testItem = new Item("Backstage passes to a TAFKAL80ETC concert", 3, 10);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items);
app.updateQuality();
Item updatedItem = app.items[0];
assertEquals(13, updatedItem.quality);
}
@Test
void testExpiredBackstagePass() {
Item testItem = new Item("Backstage passes to a TAFKAL80ETC concert", 0, 10);
Item[] items = new Item[] {testItem};
GildedRose app = new GildedRose(items);
app.updateQuality();
Item updatedItem = app.items[0];
assertEquals(0, updatedItem.quality);
}
} }