Solution Java v1

This commit is contained in:
Sebastian Lechowicz 2021-11-22 14:24:50 +01:00
parent 263a07d58d
commit 1b1fba57f4
15 changed files with 372 additions and 69 deletions

View File

@ -15,7 +15,7 @@ dependencies {
group = 'com.gildedrose'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
sourceCompatibility = '14'
test {
useJUnitPlatform()

View File

@ -1,5 +1,9 @@
package com.gildedrose;
import com.gildedrose.policies.ItemUpdater;
import java.util.Arrays;
class GildedRose {
Item[] items;
@ -8,55 +12,6 @@ class GildedRose {
}
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).forEach(ItemUpdater::updateItem);
}
}
}

View File

@ -0,0 +1,15 @@
package com.gildedrose.policies;
import com.gildedrose.Item;
class AgedBrieUpdatePolicy extends UpdatePolicy {
AgedBrieUpdatePolicy(Item item) {
super(item);
}
@Override
void updateItem() {
decreaseSellIn();
increaseQuality();
}
}

View File

@ -0,0 +1,31 @@
package com.gildedrose.policies;
import com.gildedrose.Item;
class BackstagePassesUpdatePolicy extends UpdatePolicy {
BackstagePassesUpdatePolicy(Item item) {
super(item);
}
@Override
void updateItem() {
decreaseSellIn();
var sellIn = item.sellIn;
if (sellIn < 0) {
item.quality = 0;
return;
}
increaseQuality();
if (sellIn < 10) {
increaseQuality();
}
if (sellIn < 5) {
increaseQuality();
}
}
}

View File

@ -0,0 +1,15 @@
package com.gildedrose.policies;
import com.gildedrose.Item;
class ConjuredUpdatePolicy extends UpdatePolicy {
ConjuredUpdatePolicy(Item item) {
super(item);
}
@Override
void updateItem() {
super.updateItem();
decreaseQuality();
}
}

View File

@ -0,0 +1,10 @@
package com.gildedrose.policies;
import com.gildedrose.Item;
public class ItemUpdater {
public static void updateItem(Item item){
UpdatePolicesFactory.getUpdatePolicy(item).updateItem();
}
}

View File

@ -0,0 +1,14 @@
package com.gildedrose.policies;
import com.gildedrose.Item;
class SulfurasUpdatePolicy extends UpdatePolicy{
SulfurasUpdatePolicy(Item item) {
super(item);
}
@Override
void updateItem() {
// Do nothing
}
}

View File

@ -0,0 +1,17 @@
package com.gildedrose.policies;
import com.gildedrose.Item;
class UpdatePolicesFactory {
static UpdatePolicy getUpdatePolicy(Item item) {
return switch (item.name) {
case "Aged Brie" -> new AgedBrieUpdatePolicy(item);
case "Backstage passes to a TAFKAL80ETC concert" -> new BackstagePassesUpdatePolicy(item);
case "Sulfuras, Hand of Ragnaros" -> new SulfurasUpdatePolicy(item);
case "Conjured" -> new ConjuredUpdatePolicy(item);
default -> new UpdatePolicy(item);
};
}
}

View File

@ -0,0 +1,36 @@
package com.gildedrose.policies;
import com.gildedrose.Item;
class UpdatePolicy {
private final int MAX_QUALITY = 50;
private final int MIN_QUALITY = 0;
protected Item item;
UpdatePolicy(Item item) {
this.item = item;
}
void updateItem() {
decreaseSellIn();
decreaseQuality();
}
void decreaseSellIn() {
item.sellIn -= 1;
}
void decreaseQuality() {
item.quality = item.quality <= MIN_QUALITY ? MIN_QUALITY : isExpired() ? item.quality - 2 : item.quality - 1;
}
void increaseQuality() {
item.quality = item.quality >= MAX_QUALITY ? MAX_QUALITY : isExpired() ? item.quality + 2 : item.quality + 1;
}
private boolean isExpired() {
return item.sellIn < 0;
}
}

View File

@ -0,0 +1,56 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class AgedBrieItemTest extends ItemTest {
@Override
@Test
void sellInDecreaseTest() {
Item[] items = new Item[] { new Item("Aged Brie", 2, 2) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(3, app.items[0].quality);
assertEquals(1, app.items[0].sellIn);
app.updateQuality();
assertEquals(4, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
}
@Override
@Test
void afterSellInQualityChangeTest() {
Item[] items = new Item[] { new Item("Aged Brie", 1, 2) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(3, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
app.updateQuality();
assertEquals(5, app.items[0].quality);
assertEquals(-1, app.items[0].sellIn);
}
@Test
void qualityNotAbove50Test() {
Item[] items = new Item[] { new Item("Aged Brie", 2, 49) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(50, app.items[0].quality);
assertEquals(1, app.items[0].sellIn);
app.updateQuality();
assertEquals(50, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
}
}

View File

@ -0,0 +1,61 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class BackstagePassesItemTest extends ItemTest{
@Override
@Test
void sellInDecreaseTest() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 11, 0),
new Item("Backstage passes to a TAFKAL80ETC concert", 6, 10) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(1, app.items[0].quality);
assertEquals(10, app.items[0].sellIn);
assertEquals(12, app.items[1].quality);
assertEquals(5, app.items[1].sellIn);
app.updateQuality();
assertEquals(3, app.items[0].quality);
assertEquals(9, app.items[0].sellIn);
assertEquals(15, app.items[1].quality);
assertEquals(4, app.items[1].sellIn);
}
@Override
@Test
void afterSellInQualityChangeTest() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 1, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(23, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
app.updateQuality();
assertEquals(0, app.items[0].quality);
assertEquals(-1, app.items[0].sellIn);
}
@Test
void qualityNotAbove50Test() {
Item[] items = new Item[] { new Item("Backstage passes to a TAFKAL80ETC concert", 2, 49) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(50, app.items[0].quality);
assertEquals(1, app.items[0].sellIn);
app.updateQuality();
assertEquals(50, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
}
}

View File

@ -0,0 +1,41 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ConjuredItemTest extends ItemTest{
@Override
@Test
void sellInDecreaseTest() {
Item[] items = new Item[] { new Item("Conjured", 2, 10) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(8, app.items[0].quality);
assertEquals(1, app.items[0].sellIn);
app.updateQuality();
assertEquals(6, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
}
@Override
@Test
void afterSellInQualityChangeTest() {
Item[] items = new Item[] { new Item("Conjured", 1, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(18, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
app.updateQuality();
assertEquals(14, app.items[0].quality);
assertEquals(-1, app.items[0].sellIn);
}
}

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,50 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ItemTest {
@Test
void sellInDecreaseTest() {
Item[] items = new Item[] { new Item("foo", 2, 2) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(1, app.items[0].quality);
assertEquals(1, app.items[0].sellIn);
app.updateQuality();
assertEquals(0, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
}
@Test
void notNegativeQualityTest() {
Item[] items = new Item[] { new Item("foo", 0, 0) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(0, app.items[0].quality);
assertEquals(-1, app.items[0].sellIn);
}
@Test
void afterSellInQualityChangeTest() {
Item[] items = new Item[] { new Item("foo", 1, 20) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(19, app.items[0].quality);
assertEquals(0, app.items[0].sellIn);
app.updateQuality();
assertEquals(17, app.items[0].quality);
assertEquals(-1, app.items[0].sellIn);
}
}

View File

@ -0,0 +1,19 @@
package com.gildedrose;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SulfurasItemTest {
@Test
void standardChangeTest() {
Item[] items = new Item[] { new Item("Sulfuras, Hand of Ragnaros", 5, 80) };
GildedRose app = new GildedRose(items);
app.updateQuality();
assertEquals(80, app.items[0].quality);
assertEquals(5, app.items[0].sellIn);
}
}