Add unit tests for quality rules except Aged Brie and Backstage Passes

This commit is contained in:
Ovi Trif 2018-10-05 23:18:50 +02:00
parent 72d6926f8a
commit 7db88cf003
5 changed files with 69 additions and 23 deletions

View File

@ -1,9 +1,8 @@
package com.gildedrose package com.gildedrose
import com.gildedrose.core.TestUtils import com.gildedrose.core.*
import com.gildedrose.core.TestUtils.generateRandomNumber import com.gildedrose.core.TestUtils.generateRandomNumber
import com.gildedrose.core.TestUtils.pickRandomItem import com.gildedrose.core.TestUtils.pickRandomItem
import com.gildedrose.core.advanceTimeBy
import org.assertj.core.api.Java6Assertions.assertThat import org.assertj.core.api.Java6Assertions.assertThat
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@ -18,9 +17,20 @@ class QualityTest {
} }
@Test @Test
fun givenKnownItemExcepSulfuras_afterAnyNumberOfDays_shouldHaveQualityGreaterThanOrEqualToZero() { fun givenSulfuras_afterAnyNumberOfDays_shouldHaveQualityEighty() {
val days = generateRandomNumber()
val item = Item("Sulfuras, Hand of Ragnaros", generateRandomNumber(), 80)
val app = GildedRose(arrayOf(item))
app.advanceTimeBy(days)
assertThat(item.quality).isEqualTo(80)
}
@Test
fun givenKnownItemsExceptSulfuras_afterAnyNumberOfDays_shouldHaveQualityGreaterThanOrEqualToZero() {
store = store.excludeSulfuras()
val days = generateRandomNumber() val days = generateRandomNumber()
store = store.filter { it.name != "Sulfuras, Hand of Ragnaros" }
val app = GildedRose(store.toTypedArray()) val app = GildedRose(store.toTypedArray())
app.advanceTimeBy(days) app.advanceTimeBy(days)
@ -31,9 +41,9 @@ class QualityTest {
} }
@Test @Test
fun givenKnownItemExcepSulfuras_afterAnyNumberOfDays_shouldHaveQualityLessThanOrEqualToFifty() { fun givenKnownItemsExceptSulfuras_afterAnyNumberOfDays_shouldHaveQualityLessThanOrEqualToFifty() {
store = store.excludeSulfuras()
val days = generateRandomNumber() val days = generateRandomNumber()
store = store.filter { it.name != "Sulfuras, Hand of Ragnaros" }
val app = GildedRose(store.toTypedArray()) val app = GildedRose(store.toTypedArray())
app.advanceTimeBy(days) app.advanceTimeBy(days)
@ -42,4 +52,37 @@ class QualityTest {
assertThat(item.quality).isLessThanOrEqualTo(50) assertThat(item.quality).isLessThanOrEqualTo(50)
} }
} }
@Test
fun givenKnownItemWithDegradingQuality_whenSellInIsGreaterThanOrEqualToZero_shouldDegradeQualityByNumberOfDays() {
store = store.excludeSulfuras()
.excludeBackstagePasses()
.excludeAgedBrie()
val days = generateRandomNumber().coerceAtLeast(0)
val item = pickRandomItem(store)
val initialItemQuality = item.quality
val app = GildedRose(arrayOf(item))
app.advanceTimeBy(days)
val expectedQuality = (initialItemQuality - days).coerceAtLeast(0)
assertThat(item.quality).isEqualTo(expectedQuality)
}
@Test
fun givenKnownItemWithDegradingQuality_whenSellInIsLessThanZero_shouldDegradeQualityByTwiceTheNumberOfDays() {
store = store.excludeSulfuras()
.excludeBackstagePasses()
.excludeAgedBrie()
val sellIn = (-99 until 0).shuffled().last()
val days = (0 until 100).shuffled().last()
val item = pickRandomItem(store).copy(sellIn = sellIn)
val initialItemQuality = item.quality
val app = GildedRose(arrayOf(item))
app.advanceTimeBy(days)
val expectedQuality = (initialItemQuality - days * 2).coerceAtLeast(0)
assertThat(item.quality).isEqualTo(expectedQuality)
}
} }

View File

@ -11,11 +11,11 @@ import org.junit.Test
class SellInTest { class SellInTest {
private lateinit var store: Array<Item> private lateinit var store: List<Item>
@Before @Before
fun setUp() { fun setUp() {
store = TestUtils.fixture store = TestUtils.fixture.toList()
} }
@Test @Test
@ -31,14 +31,11 @@ class SellInTest {
} }
@Test @Test
fun givenKnownItemExcepSulfuras_afterRandomNumberOfDays_shouldDecreaseSellInByNumberOfDays() { fun givenKnownItemExceptSulfuras_afterRandomNumberOfDays_shouldDecreaseSellInByNumberOfDays() {
store = store.filter { it.name != "Sulfuras, Hand of Ragnaros" }
val days = generateRandomNumber() val days = generateRandomNumber()
val initialSellIn = generateRandomNumber() val initialSellIn = generateRandomNumber()
var item = pickRandomItem(store).copy(sellIn = initialSellIn) val item = pickRandomItem(store).copy(sellIn = initialSellIn)
while (item.name == "Sulfuras, Hand of Ragnaros") {
item = pickRandomItem(store).copy(sellIn = initialSellIn)
}
val app = GildedRose(arrayOf(item)) val app = GildedRose(arrayOf(item))

View File

@ -0,0 +1,7 @@
package com.gildedrose.core
import com.gildedrose.Item
fun List<Item>.excludeSulfuras() = this.filter { it.name != "Sulfuras, Hand of Ragnaros" }
fun List<Item>.excludeBackstagePasses() = this.filter { it.name != "Backstage passes to a TAFKAL80ETC concert" }
fun List<Item>.excludeAgedBrie() = this.filter { it.name != "Aged Brie" }

View File

@ -21,5 +21,5 @@ object TestUtils {
fun generateRandomNumber() = (0 until 9999).shuffled().last() fun generateRandomNumber() = (0 until 9999).shuffled().last()
fun pickRandomItem(items: Array<Item>) = items[generateRandomNumber().coerceIn(items.indices)] fun pickRandomItem(items: List<Item>) = items[items.indices.shuffled().last()]
} }

View File

@ -1,13 +1,12 @@
SPECS SPECS
LOGIC LOGIC
- sellIn decreases every day # - sellIn decreases every day
- Item.quality - Item.quality
- is >= 0 && <= 50 # - is >= 0 && <= 50
- decreses until sellIn is <= 0 # - decrements with number of days until sellIn is 0 then with the double of it
- when sellIn == 0 quality degrades twice as fast
- Sulfuras - Sulfuras
sellIn = 0 // doesnt change # sellIn = 0 // doesnt change
quality is 80 and does not decrease # quality is 80 and does not decrease
- AgedBrie increases in quality - AgedBrie increases in quality
- BackstagePasses - BackstagePasses
increases in quality like AgedBrie increases in quality like AgedBrie