Refactroring completed: 4 methods extracted to update each item indivdaully. Additionally, unit test added to handle most and edge cases

This commit is contained in:
efeleke 2023-01-19 10:29:04 -06:00
parent 100fb3620a
commit baaada9449
3 changed files with 232 additions and 50 deletions

View File

@ -1,62 +1,103 @@
package com.gildedrose;
class GildedRose {
private final String AGED_BRIE = "Aged Brie";
private final String BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert";
private final String SULFURAS = "Sulfuras, Hand of Ragnaros";
Item[] items;
public GildedRose(Item[] items) {
this.items = items;
}
public void updateAgedBrie(Item item) {
// quality for any item can not exceed 50
if (item.quality < 50) {
item.quality = item.quality + 1; // age brie quality update
}
// update sell in date
item.sellIn = item.sellIn - 1;
// quality for age brie gets better as it ages past its sellIn
if (item.sellIn < 0 && item.quality < 50) {
item.quality = item.quality + 1; // age brie quality update
}
}
public void updateBackStage(Item item) {
// no items quality gets above 50
if (item.quality < 50) {
item.quality = item.quality + 1; // backstage quality update
// quality increases twice if 10 days to sellIn
if (item.sellIn < 11 && item.quality < 50) {
item.quality = item.quality + 1;
}
// quality increases by three if 5 days to sellIn
if (item.sellIn < 6 && item.quality < 50) {
item.quality = item.quality + 1;
}
}
// update sell in date for Backstage item
item.sellIn = item.sellIn - 1;
// quality drops to zero if it's past concert date
if (item.sellIn < 0) {
item.quality = item.quality - item.quality;
}
}
public void updateSulfuras(Item item) {
// Sulfuras is a legendary item
// nothing happens for the sulfuras Item
}
public void updateNormalItem(Item item) {
// normal item quality decreases by 1 every day
if (item.quality > 0) {
item.quality = item.quality - 1;
}
// update sell in date for Normal item
item.sellIn = item.sellIn - 1;
// quality drops twice if item is past sellIn Date
if (item.sellIn < 0 && item.quality > 0) {
item.quality = item.quality - 1;
}
}
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 (Item item : this.items) {
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;
}
}
// only sulfuras don't sell
// hence update sellin value for all items except sulfuras here
if (item.name != SULFURAS) {
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;
}
switch (item.name) {
case AGED_BRIE:
updateAgedBrie(item);
continue;
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;
}
}
case BACKSTAGE_PASS:
updateBackStage(item);
continue;
case SULFURAS:
updateSulfuras(item);
continue;
default:
updateNormalItem(item);
continue;
}
}
}
}
}

View File

@ -1,17 +1,158 @@
package com.gildedrose;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.*;
class GildedRoseTest {
private final String AGED_BRIE = "Aged Brie";
private final String BACKSTAGE = "Backstage passes to a TAFKAL80ETC concert";
private final String SULFURAS = "Sulfuras, Hand of Ragnaros";
private final String CAKE = "Conjured Mana Cake";
private final int BACKSTAGE_QUALITY_INCREASE_10_DAYS = 2;
private final int BACKSTAGE_QUALITY_INCREASE_5_DAYS = 3;
private GildedRose app;
@BeforeEach
void setup() {
this.app = new GildedRose(new Item[]{});
}
@Test
void foo() {
Item[] items = new Item[] { new Item("foo", 0, 0) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals("fixme", app.items[0].name);
Item[] items = new Item[]{new Item("foo", 0, 0)};
this.app.items = items;
this.app.updateQuality();
assertEquals("foo", app.items[0].name);
}
@Test
void testNoNegativeQuality() {
Item[] items = new Item[]{
new Item(AGED_BRIE, 0, 0),
new Item(BACKSTAGE, 0, 0),
new Item(SULFURAS, 0, 0),
new Item(CAKE, 0, 0)
};
this.app.items = items;
// update quality two times
this.app.updateQuality();
this.app.updateQuality();
// assert the quality is not negative
for (Item item :
this.app.items) {
assertTrue(item.quality >= 0);
}
}
@Test
void testAgedBrieQualityIncrease() {
Item[] items = new Item[]{new Item(AGED_BRIE, 0, 10)};
this.app.items = items;
// update quality two times
this.app.updateQuality();
this.app.updateQuality();
assertTrue(this.app.items[0].quality > 10);
}
@Test
void testQualityNeverMoreThan50() {
Item[] items = new Item[]{new Item(AGED_BRIE, 0, 50)};
this.app.items = items;
// update quality two times
this.app.updateQuality();
this.app.updateQuality();
assertTrue(this.app.items[0].quality <= 50);
}
@Test
void testSulfurasQualityNeverChange() {
Item[] items = new Item[]{new Item(SULFURAS, 2, 10)};
this.app.items = items;
// update quality two times
this.app.updateQuality();
this.app.updateQuality();
this.app.updateQuality();
assertEquals(10,this.app.items[0].quality);
assertEquals(2,this.app.items[0].sellIn );
}
@Test
void testBackstagePassQuality10DaysBeforeSellIn() {
Item[] items = new Item[]{new Item(BACKSTAGE, 9, 10)};
this.app.items = items;
// update quality two times
int noOfDays = 3;
for (int day = 0; day < noOfDays; day++) {
this.app.updateQuality();
}
int expectedQuality = 10 + BACKSTAGE_QUALITY_INCREASE_10_DAYS * noOfDays;
assertEquals(expectedQuality, this.app.items[0].quality);
}
@Test
void testBackstagePassQuality5DaysBeforeSellIn() {
Item[] items = new Item[]{new Item(BACKSTAGE, 5, 10)};
this.app.items = items;
// update quality two times
int noOfDays = 3;
for (int day = 0; day < noOfDays; day++) {
this.app.updateQuality();
}
int expectedQuality = 10 + BACKSTAGE_QUALITY_INCREASE_5_DAYS * noOfDays;
assertEquals(expectedQuality, this.app.items[0].quality);
}
@Test
void testBackstagePassQuality6DaysBeforeSellIn() {
Item[] items = new Item[]{new Item(BACKSTAGE, 6, 10)};
this.app.items = items;
// update quality two times
this.app.updateQuality();
int expectedQuality = 12;
assertEquals(expectedQuality, this.app.items[0].quality);
}
@Test
void testBackstagePassQuality11DaysBeforeSellIn() {
Item[] items = new Item[]{new Item(BACKSTAGE, 11, 10)};
this.app.items = items;
// update quality two times
this.app.updateQuality();
int expectedQuality = 11;
assertEquals(expectedQuality, this.app.items[0].quality);
}
@Test
void testBackstagePassQualityAfterSellIn() {
Item[] items = new Item[]{new Item(BACKSTAGE, 1, 10)};
this.app.items = items;
// update quality two times
int noOfDays = 2;
for (int day = 0; day < noOfDays; day++) {
this.app.updateQuality();
}
int expectedQuality = 0;
assertEquals(expectedQuality, this.app.items[0].quality);
}
@Test
void testNormalItemQualityDegradeTwiceAsFast() {
Item[] items = new Item[]{new Item(CAKE, 0, 10)};
this.app.items = items;
// update quality two times
int noOfDays = 2;
for (int day = 0; day < noOfDays; day++) {
this.app.updateQuality();
}
int expectedQuality = 6;
assertEquals(expectedQuality, this.app.items[0].quality);
}
}

View File

@ -18,7 +18,7 @@ public class TexttestFixture {
GildedRose app = new GildedRose(items);
int days = 2;
int days = 30;
if (args.length > 0) {
days = Integer.parseInt(args[0]) + 1;
}