diff --git a/Java/src/main/java/com/gildedrose/Quality.java b/Java/src/main/java/com/gildedrose/Quality.java new file mode 100644 index 00000000..bab4a7d4 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/Quality.java @@ -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; + } + } +} diff --git a/Java/src/main/java/com/gildedrose/SellIn.java b/Java/src/main/java/com/gildedrose/SellIn.java new file mode 100644 index 00000000..30d64142 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/SellIn.java @@ -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; + } +} diff --git a/Java/src/main/java/com/gildedrose/items/GildedRoseItem.java b/Java/src/main/java/com/gildedrose/items/GildedRoseItem.java new file mode 100644 index 00000000..3540c005 --- /dev/null +++ b/Java/src/main/java/com/gildedrose/items/GildedRoseItem.java @@ -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); +} diff --git a/Java/src/test/java/com/gildedrose/items/GildedRoseItemTest.java b/Java/src/test/java/com/gildedrose/items/GildedRoseItemTest.java new file mode 100644 index 00000000..2fcf59d9 --- /dev/null +++ b/Java/src/test/java/com/gildedrose/items/GildedRoseItemTest.java @@ -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)); + } + } +}