move design back to contract

This commit is contained in:
Velizar Todorov 2021-11-30 18:44:41 +01:00
parent 7a609b11f1
commit 5f64e3fb2e
6 changed files with 174 additions and 123 deletions

View File

@ -1,22 +1,16 @@
package com.gildedrose.main; package com.gildedrose.main;
import java.util.List;
import static com.gildedrose.item_helpers.ItemFactory.getItemType; import static com.gildedrose.item_helpers.ItemFactory.getItemType;
import static java.util.Collections.singletonList; import static java.util.Arrays.stream;
public class GildedRose { public class GildedRose {
private final List<Item> items; Item[] items;
public GildedRose(List<Item> items) { public GildedRose(Item[] items) {
this.items = items; this.items = items;
} }
public GildedRose(Item items) { public void updateQuality() {
this.items = singletonList(items); stream(items).forEach(item -> getItemType(item).updateQuality());
} }
public void updateQuality() {
items.forEach(item -> getItemType(item).updateQuality());
}
} }

View File

@ -9,30 +9,36 @@ import static org.junit.jupiter.api.Assertions.*;
public class TestHelper { public class TestHelper {
public static void testItem(Item item, int daysToPass, int expectedSellIn, int expectedQuality) { public static void testItem(Item item, int daysToPass, int expectedSellIn, int expectedQuality) {
// given Item[] items = new Item[1];
GildedRose app = new GildedRose(item); items[0] = item;
// when // given
for (int i = 0; i < daysToPass; i++) { GildedRose app = new GildedRose(items);
app.updateQuality(); // when
} for (int i = 0; i < daysToPass; i++) {
//then app.updateQuality();
assertEquals(expectedSellIn, item.sellIn);
assertEquals(expectedQuality, item.quality);
} }
//then
assertEquals(expectedSellIn, item.sellIn);
assertEquals(expectedQuality, item.quality);
}
public static void testItemException(Item item) { public static void testItemException(Item item) {
GildedRose gildedRose = new GildedRose(item); Item[] items = new Item[1];
Exception exception = assertThrows(IllegalArgumentException.class, gildedRose::updateQuality); items[0] = item;
String actualMessage = exception.getMessage(); GildedRose gildedRose = new GildedRose(items);
assertTrue(actualMessage.contains(QUALITY_ERROR_MESSAGE)); Exception exception = assertThrows(IllegalArgumentException.class, gildedRose::updateQuality);
} String actualMessage = exception.getMessage();
assertTrue(actualMessage.contains(QUALITY_ERROR_MESSAGE));
}
public static void testItemQualityAboveLimitException(Item item) { public static void testItemQualityAboveLimitException(Item item) {
GildedRose gildedRose = new GildedRose(item); Item[] items = new Item[1];
Exception exception = assertThrows(IllegalArgumentException.class, gildedRose::updateQuality); items[0] = item;
String actualMessage = exception.getMessage(); GildedRose gildedRose = new GildedRose(items);
assertTrue(actualMessage.contains(OUT_OF_BOUND_QUALITY_MESSAGE)); Exception exception = assertThrows(IllegalArgumentException.class, gildedRose::updateQuality);
} String actualMessage = exception.getMessage();
assertTrue(actualMessage.contains(OUT_OF_BOUND_QUALITY_MESSAGE));
}
} }

View File

@ -35,7 +35,7 @@ class LegendaryItemTest {
@Test @Test
@Order(3) @Order(3)
void testFakeLegendaryItemExceptionFail() { void testFakeLegendaryItemExceptionFail() {
GildedRose gildedRose = new GildedRose(fakeLegendaryItem); GildedRose gildedRose = new GildedRose(new Item[]{fakeLegendaryItem});
Exception exception = assertThrows(IllegalArgumentException.class, gildedRose::updateQuality); Exception exception = assertThrows(IllegalArgumentException.class, gildedRose::updateQuality);
String actualMessage = exception.getMessage(); String actualMessage = exception.getMessage();
assertTrue(actualMessage.contains(NOT_LEGENDARY_ITEM_ERROR_MESSAGE)); assertTrue(actualMessage.contains(NOT_LEGENDARY_ITEM_ERROR_MESSAGE));

View File

@ -0,0 +1,17 @@
package com.gildedrose.main;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class GildedRoseTest {
@Test
void foo() {
Item[] items = new Item[]{new Item("foo", 0, 0)};
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals("foo", app.items[0].name);
}
}

View File

@ -0,0 +1,37 @@
package com.gildedrose.main;
public class TexttestFixture {
public static void main(String[] args) {
System.out.println("OMGHAI!");
Item[] items = new Item[]{
new Item("+5 Dexterity Vest", 10, 20), //
new Item("Aged Brie", 2, 0), //
new Item("Elixir of the Mongoose", 5, 7), //
new Item("Sulfuras, Hand of Ragnaros", 0, 80), //
new Item("Sulfuras, Hand of Ragnaros", -1, 80),
new Item("Backstage passes to a TAFKAL80ETC concert", 15, 20),
new Item("Backstage passes to a TAFKAL80ETC concert", 10, 49),
new Item("Backstage passes to a TAFKAL80ETC concert", 5, 49),
// this conjured item does not work properly yet
new Item("Conjured Mana Cake", 3, 6)};
GildedRose app = new GildedRose(items);
int days = 2;
if (args.length > 0) {
days = Integer.parseInt(args[0]) + 1;
}
for (int i = 0; i < days; i++) {
System.out.println("-------- day " + i + " --------");
System.out.println("name, sellIn, quality");
for (Item item : items) {
System.out.println(item);
}
System.out.println();
app.updateQuality();
}
}
}

View File

@ -8,108 +8,105 @@ import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.TestMethodOrder;
import java.util.List;
import static java.util.Arrays.asList;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@TestMethodOrder(OrderAnnotation.class) @TestMethodOrder(OrderAnnotation.class)
class MultipleItemsTest { class MultipleItemsTest {
public static final String BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert"; public static final String BACKSTAGE_PASS = "Backstage passes to a TAFKAL80ETC concert";
public static final String LEGENDARY_ITEM_NAME = "Sulfuras, Hand of Ragnaros"; public static final String LEGENDARY_ITEM_NAME = "Sulfuras, Hand of Ragnaros";
public static final Item normalItem1 = new Item("+5 Dexterity Vest", 10, 20); public static final Item normalItem1 = new Item("+5 Dexterity Vest", 10, 20);
public static final Item agedBrieItem = new Item("Aged Brie", 2, 0); public static final Item agedBrieItem = new Item("Aged Brie", 2, 0);
public static final Item normalItem2 = new Item("Elixir of the Mongoose", 5, 7); public static final Item normalItem2 = new Item("Elixir of the Mongoose", 5, 7);
public static final Item legendaryItem1 = new Item(LEGENDARY_ITEM_NAME, 0, 80); public static final Item legendaryItem1 = new Item(LEGENDARY_ITEM_NAME, 0, 80);
public static final Item legendaryItem2 = new Item(LEGENDARY_ITEM_NAME, -1, 80); public static final Item legendaryItem2 = new Item(LEGENDARY_ITEM_NAME, -1, 80);
public static final Item backStagePassItem1 = new Item(BACKSTAGE_PASS, 15, 20); public static final Item backStagePassItem1 = new Item(BACKSTAGE_PASS, 15, 20);
public static final Item backStagePassItem2 = new Item(BACKSTAGE_PASS, 10, 49); public static final Item backStagePassItem2 = new Item(BACKSTAGE_PASS, 10, 49);
public static final Item backStagePassItem3 = new Item(BACKSTAGE_PASS, 5, 49); public static final Item backStagePassItem3 = new Item(BACKSTAGE_PASS, 5, 49);
public static final Item conjuredItem = new Item("Conjured Mana Cake", 3, 6); public static final Item conjuredItem = new Item("Conjured Mana Cake", 3, 6);
public static List<Item> getMultipleItems() { public static Item[] getMultipleItems() {
return asList(normalItem1, agedBrieItem, normalItem2, return new Item[]{normalItem1, agedBrieItem, normalItem2,
legendaryItem1, legendaryItem2, legendaryItem1, legendaryItem2,
backStagePassItem1, backStagePassItem2, backStagePassItem3, backStagePassItem1, backStagePassItem2, backStagePassItem3,
conjuredItem); conjuredItem};
}
@BeforeAll
static void updateItemsQualityFor20Days() {
Item[] items = getMultipleItems();
GildedRose gildedRose = new GildedRose(items);
int days = 20;
for (int i = 0; i < days; i++) {
gildedRose.updateQuality();
for (Item item : items) {
System.out.println(item);
}
} }
}
@BeforeAll @Test
static void updateItemsQualityFor20Days() { @Order(1)
List<Item> items = getMultipleItems(); void checkNormalItem1() {
GildedRose gildedRose = new GildedRose(items); assertEquals(-10, normalItem1.sellIn);
int days = 20; assertEquals(0, normalItem1.quality);
for (int i = 0; i < days; i++) { }
gildedRose.updateQuality();
for (Item item : items) {
System.out.println(item);
}
}
}
@Test @Test
@Order(1) @Order(2)
void checkNormalItem1() { void checkAgedBrie() {
assertEquals(-10, normalItem1.sellIn); assertEquals(-18, agedBrieItem.sellIn);
assertEquals(0, normalItem1.quality); assertEquals(38, agedBrieItem.quality);
} }
@Test @Test
@Order(2) @Order(3)
void checkAgedBrie() { void checkNormalItem2() {
assertEquals(-18, agedBrieItem.sellIn); assertEquals(-15, normalItem2.sellIn);
assertEquals(38, agedBrieItem.quality); assertEquals(0, normalItem2.quality);
} }
@Test @Test
@Order(3) @Order(4)
void checkNormalItem2() { void checkLegendaryItem1() {
assertEquals(-15, normalItem2.sellIn); assertEquals(-20, legendaryItem1.sellIn);
assertEquals(0, normalItem2.quality); assertEquals(80, legendaryItem1.quality);
} }
@Test @Test
@Order(4) @Order(5)
void checkLegendaryItem1() { void checkLegendaryItem2() {
assertEquals(-20, legendaryItem1.sellIn); assertEquals(-21, legendaryItem2.sellIn);
assertEquals(80, legendaryItem1.quality); assertEquals(80, legendaryItem2.quality);
} }
@Test @Test
@Order(5) @Order(6)
void checkLegendaryItem2() { void checkBackStagePass1() {
assertEquals(-21, legendaryItem2.sellIn); assertEquals(-5, backStagePassItem1.sellIn);
assertEquals(80, legendaryItem2.quality); assertEquals(0, backStagePassItem1.quality);
} }
@Test @Test
@Order(6) @Order(7)
void checkBackStagePass1() { void checkBackStagePass2() {
assertEquals(-5, backStagePassItem1.sellIn); assertEquals(-10, backStagePassItem2.sellIn);
assertEquals(0, backStagePassItem1.quality); assertEquals(0, backStagePassItem2.quality);
} }
@Test @Test
@Order(7) @Order(8)
void checkBackStagePass2() { void checkBackStagePass3() {
assertEquals(-10, backStagePassItem2.sellIn); assertEquals(-15, backStagePassItem3.sellIn);
assertEquals(0, backStagePassItem2.quality); assertEquals(0, backStagePassItem3.quality);
} }
@Test @Test
@Order(8) @Order(9)
void checkBackStagePass3() { void checkConjuredItem() {
assertEquals(-15, backStagePassItem3.sellIn); assertEquals(-17, conjuredItem.sellIn);
assertEquals(0, backStagePassItem3.quality); assertEquals(0, conjuredItem.quality);
} }
@Test
@Order(9)
void checkConjuredItem() {
assertEquals(-17, conjuredItem.sellIn);
assertEquals(0, conjuredItem.quality);
}
} }