Java refactor

This commit is contained in:
Christopher Siewert 2022-02-12 00:15:40 -08:00
parent 9d878b7641
commit bb2257fced
10 changed files with 358 additions and 51 deletions

7
Java/chris-readme.txt Normal file
View File

@ -0,0 +1,7 @@
ItemHolder is an abstract class that implements the update template (first update quality then sellIn).
Concrete classes implement algorithm for each item type.
ItemHolder object creation is put into its own factory class as it will change with new item types.
Improvements:
Test code is highly duplicated. I assume Junit has paramaterized tests, just didn't bother looking it up.
ItemHolders do checks for max and min values. Maybe those belong in setSellIn/setQuality methods?

View File

@ -0,0 +1,24 @@
package com.gildedrose;
public class BackstagePassesHolder extends ItemHolder {
public BackstagePassesHolder(Item item) {
super(item);
}
public void updateQuality() {
if (this.item.sellIn > 10) {
this.item.quality += 1;
} else if (this.item.sellIn > 5) {
this.item.quality += 2;
} else if (this.item.sellIn > 0) {
this.item.quality += 3;
} else if (this.item.sellIn <= 0) {
this.item.quality = 0;
}
this.item.quality = Math.min(this.item.quality, 50);
}
public void updateSellIn() {
this.item.sellIn -= 1;
}
}

View File

@ -0,0 +1,17 @@
package com.gildedrose;
public class BrieHolder extends ItemHolder {
public BrieHolder(Item item) {
super(item);
}
public void updateQuality() {
if (this.item.quality < 50) {
this.item.quality += 1;
}
}
public void updateSellIn() {
this.item.sellIn -= 1;
}
}

View File

@ -0,0 +1,20 @@
package com.gildedrose;
public class GenericItemHolder extends ItemHolder {
public GenericItemHolder(Item item) {
super(item);
}
public void updateQuality() {
if (this.item.sellIn > 0) {
this.item.quality -= 1;
} else {
this.item.quality -= 2;
}
this.item.quality = Math.max(this.item.quality, 0);
}
public void updateSellIn() {
this.item.sellIn -= 1;
}
}

View File

@ -2,61 +2,19 @@ package com.gildedrose;
class GildedRose {
Item[] items;
ItemHolder[] itemHolders;
public GildedRose(Item[] items) {
this.items = items;
this.itemHolders = new ItemHolder[items.length];
for (int i=0; i<items.length; i++) {
itemHolders[i] = ItemHolderFactory.createItemHolder(this.items[i]);
}
}
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;
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 (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;
}
}
}
itemHolders[i].update();
}
}
}
}

View File

@ -0,0 +1,17 @@
package com.gildedrose;
public abstract class ItemHolder {
Item item;
public ItemHolder(Item item){
this.item = item;
}
public void update() {
this.updateQuality();
this.updateSellIn();
}
abstract void updateQuality();
abstract void updateSellIn();
}

View File

@ -0,0 +1,15 @@
package com.gildedrose;
public class ItemHolderFactory {
public static ItemHolder createItemHolder(Item item){
if (item.name == "Aged Brie") {
return new BrieHolder(item);
} else if (item.name == "Sulfuras, Hand of Ragnaros") {
return new SulfurasHolder(item);
} else if (item.name == "Backstage passes to a TAFKAL80ETC concert") {
return new BackstagePassesHolder(item);
} else {
return new GenericItemHolder(item);
}
}
}

View File

@ -0,0 +1,11 @@
package com.gildedrose;
public class SulfurasHolder extends ItemHolder {
public SulfurasHolder(Item item) {
super(item);
}
public void updateQuality() {}
public void updateSellIn() {}
}

View File

@ -7,11 +7,129 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
class GildedRoseTest {
@Test
void foo() {
void add_item() {
Item[] items = new Item[] { new Item("foo", 0, 0) };
GildedRose app = new GildedRose(items);
assertEquals("foo", app.items[0].name);
assertEquals(0, app.items[0].sellIn);
assertEquals(0, app.items[0].quality);
}
@Test
void quality_decrease() {
Item[] items = new Item[] { new Item("foo", 1, 40) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals("fixme", app.items[0].name);
assertEquals(0, app.items[0].sellIn);
assertEquals(39, app.items[0].quality);
}
@Test
void fast_quality_decrease() {
Item[] items = new Item[] { new Item("foo", 0, 40) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(-1, app.items[0].sellIn);
assertEquals(38, app.items[0].quality);
}
@Test
void never_negative_quality() {
Item[] items = new Item[] { new Item("foo", -1, 1) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(-2, app.items[0].sellIn);
assertEquals(0, app.items[0].quality);
}
@Test
void aged_brie_quality_increase() {
Item[] items = new Item[] { new Item("Aged Brie", 5, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(4, app.items[0].sellIn);
assertEquals(21, app.items[0].quality);
}
@Test
void aged_brie_max_quality_increase() {
Item[] items = new Item[] { new Item("Aged Brie", 5, 50) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(4, app.items[0].sellIn);
assertEquals(50, app.items[0].quality);
}
@Test
void sulfuras() {
Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", 5, 80) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(5, app.items[0].sellIn);
assertEquals(80, app.items[0].quality);
}
@Test
void sulfuras_expired() {
Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", -2, 80) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(-2, app.items[0].sellIn);
assertEquals(80, app.items[0].quality);
}
@Test
void backstage_passes_quality_increase() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(14, app.items[0].sellIn);
assertEquals(21, app.items[0].quality);
}
@Test
void backstage_passes_max_quality() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 2, 50) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(1, app.items[0].sellIn);
assertEquals(50, app.items[0].quality);
}
@Test
void backstage_passes_day_ten() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 10, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(9, app.items[0].sellIn);
assertEquals(22, app.items[0].quality);
}
@Test
void backstage_passes_day_five() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 5, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(4, app.items[0].sellIn);
assertEquals(23, app.items[0].quality);
}
@Test
void backstage_passes_day_zero() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 1, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(0, app.items[0].sellIn);
assertEquals(23, app.items[0].quality);
}
@Test
void backstage_passes_expired() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 0, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(-1, app.items[0].sellIn);
assertEquals(0, app.items[0].quality);
}
}

View File

@ -0,0 +1,120 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ItemHolderFactoryTest {
@Test
void create_generic_item() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("foo", 0, 0));
assertEquals("foo", itemHolder.item.name);
assertEquals(0, itemHolder.item.sellIn);
assertEquals(0, itemHolder.item.quality);
}
@Test
void quality_decrease() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("foo", 1, 40));
itemHolder.update();
assertEquals(0, itemHolder.item.sellIn);
assertEquals(39, itemHolder.item.quality);
}
@Test
void fast_quality_decrease() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("foo", 0, 40));
itemHolder.update();
assertEquals(-1, itemHolder.item.sellIn);
assertEquals(38, itemHolder.item.quality);
}
@Test
void never_negative_quality() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("foo", -1, 1));
itemHolder.update();
assertEquals(-2, itemHolder.item.sellIn);
assertEquals(0, itemHolder.item.quality);
}
@Test
void aged_brie_quality_increase() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Aged Brie", 5, 20));
itemHolder.update();
assertEquals(4, itemHolder.item.sellIn);
assertEquals(21, itemHolder.item.quality);
}
@Test
void aged_brie_max_quality_increase() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Aged Brie", 5, 50));
itemHolder.update();
assertEquals(4, itemHolder.item.sellIn);
assertEquals(50, itemHolder.item.quality);
}
@Test
void sulfuras() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Sulfuras, Hand of Ragnaros", 5, 80));
itemHolder.update();
assertEquals(5, itemHolder.item.sellIn);
assertEquals(80, itemHolder.item.quality);
}
@Test
void sulfuras_expired() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Sulfuras, Hand of Ragnaros", -2, 80));
itemHolder.update();
assertEquals(-2, itemHolder.item.sellIn);
assertEquals(80, itemHolder.item.quality);
}
@Test
void backstage_passes_quality_increase() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20));
itemHolder.update();
assertEquals(14, itemHolder.item.sellIn);
assertEquals(21, itemHolder.item.quality);
}
@Test
void backstage_passes_max_quality() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Backstage passes to a TAFKAL80ETC concert", 2, 50));
itemHolder.update();
assertEquals(1, itemHolder.item.sellIn);
assertEquals(50, itemHolder.item.quality);
}
@Test
void backstage_passes_day_ten() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Backstage passes to a TAFKAL80ETC concert", 10, 20));
itemHolder.update();
assertEquals(9, itemHolder.item.sellIn);
assertEquals(22, itemHolder.item.quality);
}
@Test
void backstage_passes_day_five() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Backstage passes to a TAFKAL80ETC concert", 5, 20));
itemHolder.update();
assertEquals(4, itemHolder.item.sellIn);
assertEquals(23, itemHolder.item.quality);
}
@Test
void backstage_passes_day_zero() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Backstage passes to a TAFKAL80ETC concert", 1, 20));
itemHolder.update();
assertEquals(0, itemHolder.item.sellIn);
assertEquals(23, itemHolder.item.quality);
}
@Test
void backstage_passes_expired() {
ItemHolder itemHolder = ItemHolderFactory.createItemHolder(new Item("Backstage passes to a TAFKAL80ETC concert", 0, 20));
itemHolder.update();
assertEquals(-1, itemHolder.item.sellIn);
assertEquals(0, itemHolder.item.quality);
}
}