Create abstract GildedRoseItem to refresh item state

This commit is contained in:
Alvaro Gomez Traveso 2022-12-16 11:39:13 +01:00
parent f965df564d
commit 523e656a25
4 changed files with 174 additions and 0 deletions

View 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;
}
}
}

View 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;
}
}

View 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);
}

View File

@ -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));
}
}
}