mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-16 06:51: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