mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-16 06:51:27 +00:00
Solution Java v1
This commit is contained in:
parent
263a07d58d
commit
1b1fba57f4
@ -15,7 +15,7 @@ dependencies {
|
|||||||
|
|
||||||
group = 'com.gildedrose'
|
group = 'com.gildedrose'
|
||||||
version = '0.0.1-SNAPSHOT'
|
version = '0.0.1-SNAPSHOT'
|
||||||
sourceCompatibility = '1.8'
|
sourceCompatibility = '14'
|
||||||
|
|
||||||
test {
|
test {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
package com.gildedrose;
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import com.gildedrose.policies.ItemUpdater;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
class GildedRose {
|
class GildedRose {
|
||||||
Item[] items;
|
Item[] items;
|
||||||
|
|
||||||
@ -8,55 +12,6 @@ class GildedRose {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void updateQuality() {
|
public void updateQuality() {
|
||||||
for (int i = 0; i < items.length; i++) {
|
Arrays.stream(items).forEach(ItemUpdater::updateItem);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
10
Java/src/main/java/com/gildedrose/policies/ItemUpdater.java
Normal file
10
Java/src/main/java/com/gildedrose/policies/ItemUpdater.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
36
Java/src/main/java/com/gildedrose/policies/UpdatePolicy.java
Normal file
36
Java/src/main/java/com/gildedrose/policies/UpdatePolicy.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
56
Java/src/test/java/com/gildedrose/AgedBrieItemTest.java
Normal file
56
Java/src/test/java/com/gildedrose/AgedBrieItemTest.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
41
Java/src/test/java/com/gildedrose/ConjuredItemTest.java
Normal file
41
Java/src/test/java/com/gildedrose/ConjuredItemTest.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
50
Java/src/test/java/com/gildedrose/ItemTest.java
Normal file
50
Java/src/test/java/com/gildedrose/ItemTest.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
Java/src/test/java/com/gildedrose/SulfurasItemTest.java
Normal file
19
Java/src/test/java/com/gildedrose/SulfurasItemTest.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user