mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-17 23:41:27 +00:00
Create abstract GildedRoseItem to refresh item state
This commit is contained in:
parent
f965df564d
commit
523e656a25
51
Java/src/main/java/com/gildedrose/Quality.java
Normal file
51
Java/src/main/java/com/gildedrose/Quality.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
@ToString
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class Quality {
|
||||||
|
static final int DEFAULT_MAX_QUALITY = 50;
|
||||||
|
static final int DEFAULT_MIN_QUALITY = 0;
|
||||||
|
|
||||||
|
private final int maximumQuality;
|
||||||
|
private final int minimumValue;
|
||||||
|
@Getter @Setter private int value;
|
||||||
|
|
||||||
|
private Quality(int maximumQuality, int minimumValue, int value) {
|
||||||
|
this.maximumQuality = maximumQuality;
|
||||||
|
this.minimumValue = minimumValue;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Quality create(int value) {
|
||||||
|
return Quality.create(value, DEFAULT_MAX_QUALITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Quality create(int value, int maximumQuality) {
|
||||||
|
return new Quality(maximumQuality, DEFAULT_MIN_QUALITY, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Quality copy() {
|
||||||
|
return new Quality(maximumQuality, minimumValue, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decrement() {
|
||||||
|
if (this.value - 1 >= this.minimumValue) {
|
||||||
|
this.value--;
|
||||||
|
} else {
|
||||||
|
this.value = this.minimumValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void increment() {
|
||||||
|
if (this.value + 1 <= this.maximumQuality) {
|
||||||
|
this.value++;
|
||||||
|
} else {
|
||||||
|
this.value = this.maximumQuality;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
31
Java/src/main/java/com/gildedrose/SellIn.java
Normal file
31
Java/src/main/java/com/gildedrose/SellIn.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package com.gildedrose;
|
||||||
|
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
@ToString
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class SellIn {
|
||||||
|
|
||||||
|
private int daysLeftToSell;
|
||||||
|
|
||||||
|
private SellIn(int days) {
|
||||||
|
this.daysLeftToSell = days;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SellIn create(int daysLeftToSell) {
|
||||||
|
return new SellIn(daysLeftToSell);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decrement() {
|
||||||
|
this.daysLeftToSell--;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean daysLeftUntilIsOverAreLessThan(int days) {
|
||||||
|
return this.daysLeftToSell < days;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOver() {
|
||||||
|
return this.daysLeftToSell <= 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
39
Java/src/main/java/com/gildedrose/items/GildedRoseItem.java
Normal file
39
Java/src/main/java/com/gildedrose/items/GildedRoseItem.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package com.gildedrose.items;
|
||||||
|
|
||||||
|
import com.gildedrose.Item;
|
||||||
|
import com.gildedrose.Quality;
|
||||||
|
import com.gildedrose.SellIn;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public abstract class GildedRoseItem {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final Quality quality;
|
||||||
|
private final SellIn sellIn;
|
||||||
|
private final boolean conjured;
|
||||||
|
|
||||||
|
protected GildedRoseItem(Item item) {
|
||||||
|
this(item.name, SellIn.create(item.sellIn), Quality.create(item.quality), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected GildedRoseItem(String name, SellIn sellIn, Quality quality, boolean conjured) {
|
||||||
|
this.name = name;
|
||||||
|
this.sellIn = sellIn;
|
||||||
|
this.quality = quality;
|
||||||
|
this.conjured = conjured;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshState() {
|
||||||
|
this.getSellIn().decrement();
|
||||||
|
Quality nextQuality = this.nextQuality(this.getQuality());
|
||||||
|
if (this.isConjured()) {
|
||||||
|
nextQuality = this.nextQuality(nextQuality);
|
||||||
|
}
|
||||||
|
this.getQuality().setValue(nextQuality.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Quality nextQuality(Quality previous);
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
package com.gildedrose.items;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.Mockito.doCallRealMethod;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import com.gildedrose.Quality;
|
||||||
|
import com.gildedrose.SellIn;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Nested;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class GildedRoseItemTest {
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
class refreshState {
|
||||||
|
GildedRoseItem item;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
item = mock(GildedRoseItem.class);
|
||||||
|
when(item.getSellIn()).thenReturn(SellIn.create(0));
|
||||||
|
when(item.getQuality()).thenReturn(Quality.create(0));
|
||||||
|
when(item.nextQuality(Quality.create(0))).thenReturn(Quality.create(10));
|
||||||
|
when(item.nextQuality(Quality.create(10))).thenReturn(Quality.create(5));
|
||||||
|
doCallRealMethod().when(item).refreshState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void should_decrement_sellIn_in_one() {
|
||||||
|
item.refreshState();
|
||||||
|
|
||||||
|
assertThat(item.getSellIn()).isEqualTo(SellIn.create(-1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void should_update_quality_using_nextQuality() {
|
||||||
|
item.refreshState();
|
||||||
|
|
||||||
|
assertThat(item.getQuality()).isEqualTo(Quality.create(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void should_update_quality_twice_when_is_conjured() {
|
||||||
|
when(item.isConjured()).thenReturn(Boolean.TRUE);
|
||||||
|
|
||||||
|
item.refreshState();
|
||||||
|
|
||||||
|
assertThat(item.getQuality()).isEqualTo(Quality.create(5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user