Add Tests for current code base

add GRItem
add validation for initial quality values + tests
This commit is contained in:
Ben Leers 2020-06-29 09:42:08 +02:00
parent fbe24e35b5
commit 3a0735e237
12 changed files with 364 additions and 69 deletions

View File

@ -13,15 +13,40 @@
<java.version>1.8</java.version>
<junit.jupiter.version>5.6.2</junit.jupiter.version>
<maven.maven-surefire-plugin.version>3.0.0-M4</maven.maven-surefire-plugin.version>
<assertj-core.version>3.16.1</assertj-core.version>
<commons-lang3.version>3.10</commons-lang3.version>
<mockito.version>3.3.3</mockito.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj-core.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View File

@ -0,0 +1,97 @@
package com.gildedrose;
public class GRItem {
private static final String AGED_BRIE = "Aged Brie";
private static final String SULFURAS = "Sulfuras, Hand of Ragnaros";
private static final int MAX_QUALITY = 50;
private static final int MIN_QUALITY = 0;
private final Item item;
public GRItem(Item item) {
this.item = item;
}
public GRItem(String name, int sellIn, int quality) {
this.item = new Item(name, sellIn, quality);
}
public String getName() {
return item.name;
}
public int getSellIn() {
return item.sellIn;
}
public int getQuality() {
return item.quality;
}
public void updateQuality() {
if (!item.name.equals(AGED_BRIE)
&& !item.name.equals("Backstage passes to a TAFKAL80ETC concert")) {
if (item.quality > 0) {
if (!item.name.equals(SULFURAS)) {
item.quality = item.quality - 1;
}
}
} else {
if (item.quality < MAX_QUALITY) {
item.quality = item.quality + 1;
if (item.name.equals("Backstage passes to a TAFKAL80ETC concert")) {
if (item.sellIn < 11) {
if (item.quality < MAX_QUALITY) {
item.quality = item.quality + 1;
}
}
if (item.sellIn < 6) {
if (item.quality < MAX_QUALITY) {
item.quality = item.quality + 1;
}
}
}
}
}
if (!item.name.equals(SULFURAS)) {
item.sellIn = item.sellIn - 1;
}
if (item.sellIn < 0) {
if (!item.name.equals(AGED_BRIE)) {
if (!item.name.equals("Backstage passes to a TAFKAL80ETC concert")) {
if (item.quality > MIN_QUALITY) {
if (!item.name.equals(SULFURAS)) {
item.quality = item.quality - 1;
}
}
} else {
item.quality = 0;
}
} else {
if (item.quality < MAX_QUALITY) {
item.quality = item.quality + 1;
}
}
}
}
public static void validateItem(Item item) {
if (item.quality < GRItem.MIN_QUALITY) {
throw new ItemQualityIsNegativeException(item.name);
} else if (item.quality > GRItem.MAX_QUALITY && !item.name.equals(SULFURAS)) {
throw new ItemQualityExceedsMaxValueException(item.name);
}
}
@Override
public String toString() {
return "GRItem{" +
"item=" + item +
'}';
}
}

View File

@ -1,62 +1,16 @@
package com.gildedrose;
import java.util.Arrays;
class GildedRose {
Item[] items;
public GildedRose(Item[] items) {
Arrays.stream(items).forEach(GRItem::validateItem);
this.items = items;
}
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;
}
}
}
}
Arrays.stream(items).map(GRItem::new).forEach(GRItem::updateQuality);
}
}

View File

@ -14,8 +14,8 @@ public class Item {
this.quality = quality;
}
@Override
public String toString() {
@Override
public String toString() {
return this.name + ", " + this.sellIn + ", " + this.quality;
}
}

View File

@ -0,0 +1,8 @@
package com.gildedrose;
public class ItemQualityExceedsMaxValueException extends RuntimeException {
public ItemQualityExceedsMaxValueException(String name) {
super("Item '" + name + "' exceeds max value for quality ");
}
}

View File

@ -0,0 +1,8 @@
package com.gildedrose;
public class ItemQualityIsNegativeException extends RuntimeException {
public ItemQualityIsNegativeException(String name) {
super("Item '" + name + "' has a negative quality value");
}
}

View File

@ -0,0 +1,22 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class GRItemConstructorTest {
private static final String NAME = "+5 Dexterity Vest";
private static final int SELL_IN = 10;
private static final int QUALITY = 20;
@Test
public void constructsCorrectly() {
Item item = new Item(NAME, SELL_IN, QUALITY);
GRItem grItem = new GRItem(item);
assertThat(grItem.getName()).isEqualTo(NAME);
assertThat(grItem.getSellIn()).isEqualTo(SELL_IN);
assertThat(grItem.getQuality()).isEqualTo(QUALITY);
}
}

View File

@ -0,0 +1,114 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.apache.commons.lang3.RandomStringUtils.random;
import static org.assertj.core.api.Assertions.assertThat;
public class GRItemUpdateQualityTest {
private static final String AGED_BRIE = "Aged Brie";
private static final String SULFURAS = "Sulfuras, Hand of Ragnaros";
private static final String BACKSTAGE_PASSES = "Backstage passes to a TAFKAL80ETC concert";
@Test
public void lowersTheSellInValue() {
GRItem item = new GRItem(random(5), 10, 20);
item.updateQuality();
assertThat(item.getSellIn()).isEqualTo(9);
}
@Test
public void qualityDegrades() {
GRItem item = new GRItem(random(5), 10, 20);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(19);
}
@Test
public void qualityDegradesTwiceAsFastWhenSellByDatePassed() {
GRItem item = new GRItem(random(5), 0, 20);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(18);
}
@Test
public void qualityIsNeverNegative() {
GRItem item = new GRItem(random(5), 10, 0);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(0);
}
@Test
public void qualityOfAgedBrieIncreases() {
GRItem item = new GRItem(AGED_BRIE, 10, 10);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(11);
}
@Test
public void qualityOfAgedBrieIncreasesEvenWhenSellInIsNegative() {
GRItem item = new GRItem(AGED_BRIE, -1, 10);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(12);
}
@Test
public void qualityIncreasesNeverHigherThan50() {
GRItem item = new GRItem(AGED_BRIE, 10, 50);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(50);
}
@ParameterizedTest(name = "with quality {0}")
@ValueSource(ints = {-1, 0, 1, 20, 50})
public void qualityOfSulfurasNeverAlters(int quality) {
GRItem item = new GRItem(SULFURAS, 10, quality);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(quality);
}
@Test
public void sellInOfSulfurasNeverAlters() {
GRItem item = new GRItem(SULFURAS, 10, 20);
item.updateQuality();
assertThat(item.getSellIn()).isEqualTo(10);
}
@ParameterizedTest(name = "with sellIn {0}")
@ValueSource(ints = {10, 9, 8, 7, 6})
public void qualityOfBackstagePassesIncreaseBy2WhenSellIn10DaysOrLess(int sellIn) {
GRItem item = new GRItem(BACKSTAGE_PASSES, sellIn, 10);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(12);
}
@ParameterizedTest(name = "with sellIn {0}")
@ValueSource(ints = {5, 4, 3, 2, 1})
public void qualityOfBackstagePassesIncreaseBy3WhenSellIn5DaysOrLess(int sellIn) {
GRItem item = new GRItem(BACKSTAGE_PASSES, sellIn, 10);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(13);
}
@ParameterizedTest(name = "with sellIn {0}")
@ValueSource(ints = {0, -1})
public void qualityOfBackstagePassesIsZeroAfterConcert(int sellIn) {
GRItem item = new GRItem(BACKSTAGE_PASSES, sellIn, 10);
item.updateQuality();
assertThat(item.getQuality()).isEqualTo(0);
}
}

View File

@ -0,0 +1,33 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.apache.commons.lang3.RandomStringUtils.random;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
class GRItemValidateItemTest {
private static final String SULFURAS = "Sulfuras, Hand of Ragnaros";
@Test
public void throwsExceptionWhenItemValueIsNegative() {
Item item = new Item(random(5), 10, -1);
assertThatThrownBy(() -> GRItem.validateItem(item)).isInstanceOf(ItemQualityIsNegativeException.class);
}
@Test
public void throwsExceptionWhenItemValueExceedsMaxValue() {
Item item = new Item(random(5), 10, 51);
assertThatThrownBy(() -> GRItem.validateItem(item)).isInstanceOf(ItemQualityExceedsMaxValueException.class);
}
@Test
public void doesNotThrowExceptionWhenItemValueExceedsMaxValueAndItemIsSulfuras() {
Item item = new Item(SULFURAS, 10, 51);
GRItem.validateItem(item);
}
}

View File

@ -1,17 +0,0 @@
package com.gildedrose;
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("fixme", app.items[0].name);
}
}

View File

@ -0,0 +1,34 @@
package com.gildedrose;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import static org.apache.commons.lang3.RandomStringUtils.random;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class GildedRoseUpdateQualityTest {
private GildedRose gildedRose;
@BeforeEach
void setUp() {
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("Backstage passes to a TAFKAL80ETC concert", 15, 20),
};
gildedRose = new GildedRose(items);
}
@Test
public void updatesTheQualityOfAllItems() {
assertThat(gildedRose.items).extracting(i -> i.quality).containsExactly(20, 0, 7, 20);
gildedRose.updateQuality();
assertThat(gildedRose.items).extracting(i -> i.quality).containsExactly(19, 1, 6, 21);
}
}

View File

@ -0,0 +1,17 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class GuildedRoseConstructorTest {
@Test
public void validatesInitialItemQualities() {
Item[] items = new Item[]{
new Item("+5 Dexterity Vest", 10, -1)
};
assertThatThrownBy(() -> new GildedRose(items)).isInstanceOf(ItemQualityIsNegativeException.class);
}
}