From 7db88cf00355e0cecd9770d587ee01379a3c43ae Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Fri, 5 Oct 2018 23:18:50 +0200 Subject: [PATCH] Add unit tests for quality rules except Aged Brie and Backstage Passes --- src/test/kotlin/com/gildedrose/QualityTest.kt | 59 ++++++++++++++++--- src/test/kotlin/com/gildedrose/SellInTest.kt | 13 ++-- .../com/gildedrose/core/TestExtensions.kt | 7 +++ .../kotlin/com/gildedrose/core/TestUtils.kt | 2 +- texttest/specs.txt | 11 ++-- 5 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 src/test/kotlin/com/gildedrose/core/TestExtensions.kt diff --git a/src/test/kotlin/com/gildedrose/QualityTest.kt b/src/test/kotlin/com/gildedrose/QualityTest.kt index 93738bef..8453c9ff 100644 --- a/src/test/kotlin/com/gildedrose/QualityTest.kt +++ b/src/test/kotlin/com/gildedrose/QualityTest.kt @@ -1,9 +1,8 @@ package com.gildedrose -import com.gildedrose.core.TestUtils +import com.gildedrose.core.* import com.gildedrose.core.TestUtils.generateRandomNumber import com.gildedrose.core.TestUtils.pickRandomItem -import com.gildedrose.core.advanceTimeBy import org.assertj.core.api.Java6Assertions.assertThat import org.junit.Before import org.junit.Test @@ -18,28 +17,72 @@ class QualityTest { } @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() - store = store.filter { it.name != "Sulfuras, Hand of Ragnaros" } val app = GildedRose(store.toTypedArray()) app.advanceTimeBy(days) - store.forEach {item -> + store.forEach { item -> assertThat(item.quality).isGreaterThanOrEqualTo(0) } } @Test - fun givenKnownItemExcepSulfuras_afterAnyNumberOfDays_shouldHaveQualityLessThanOrEqualToFifty() { + fun givenKnownItemsExceptSulfuras_afterAnyNumberOfDays_shouldHaveQualityLessThanOrEqualToFifty() { + store = store.excludeSulfuras() val days = generateRandomNumber() - store = store.filter { it.name != "Sulfuras, Hand of Ragnaros" } val app = GildedRose(store.toTypedArray()) app.advanceTimeBy(days) - store.forEach {item -> + store.forEach { item -> 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) + } } diff --git a/src/test/kotlin/com/gildedrose/SellInTest.kt b/src/test/kotlin/com/gildedrose/SellInTest.kt index 11e20edf..b0ebacf4 100644 --- a/src/test/kotlin/com/gildedrose/SellInTest.kt +++ b/src/test/kotlin/com/gildedrose/SellInTest.kt @@ -11,11 +11,11 @@ import org.junit.Test class SellInTest { - private lateinit var store: Array + private lateinit var store: List @Before fun setUp() { - store = TestUtils.fixture + store = TestUtils.fixture.toList() } @Test @@ -31,14 +31,11 @@ class SellInTest { } @Test - fun givenKnownItemExcepSulfuras_afterRandomNumberOfDays_shouldDecreaseSellInByNumberOfDays() { + fun givenKnownItemExceptSulfuras_afterRandomNumberOfDays_shouldDecreaseSellInByNumberOfDays() { + store = store.filter { it.name != "Sulfuras, Hand of Ragnaros" } val days = generateRandomNumber() val initialSellIn = generateRandomNumber() - var item = pickRandomItem(store).copy(sellIn = initialSellIn) - - while (item.name == "Sulfuras, Hand of Ragnaros") { - item = pickRandomItem(store).copy(sellIn = initialSellIn) - } + val item = pickRandomItem(store).copy(sellIn = initialSellIn) val app = GildedRose(arrayOf(item)) diff --git a/src/test/kotlin/com/gildedrose/core/TestExtensions.kt b/src/test/kotlin/com/gildedrose/core/TestExtensions.kt new file mode 100644 index 00000000..d907dd5e --- /dev/null +++ b/src/test/kotlin/com/gildedrose/core/TestExtensions.kt @@ -0,0 +1,7 @@ +package com.gildedrose.core + +import com.gildedrose.Item + +fun List.excludeSulfuras() = this.filter { it.name != "Sulfuras, Hand of Ragnaros" } +fun List.excludeBackstagePasses() = this.filter { it.name != "Backstage passes to a TAFKAL80ETC concert" } +fun List.excludeAgedBrie() = this.filter { it.name != "Aged Brie" } \ No newline at end of file diff --git a/src/test/kotlin/com/gildedrose/core/TestUtils.kt b/src/test/kotlin/com/gildedrose/core/TestUtils.kt index 3433ba02..f7997a82 100644 --- a/src/test/kotlin/com/gildedrose/core/TestUtils.kt +++ b/src/test/kotlin/com/gildedrose/core/TestUtils.kt @@ -21,5 +21,5 @@ object TestUtils { fun generateRandomNumber() = (0 until 9999).shuffled().last() - fun pickRandomItem(items: Array) = items[generateRandomNumber().coerceIn(items.indices)] + fun pickRandomItem(items: List) = items[items.indices.shuffled().last()] } \ No newline at end of file diff --git a/texttest/specs.txt b/texttest/specs.txt index 4d1ef7d3..2eba86aa 100644 --- a/texttest/specs.txt +++ b/texttest/specs.txt @@ -1,13 +1,12 @@ SPECS LOGIC - - sellIn decreases every day + # - sellIn decreases every day - Item.quality - - is >= 0 && <= 50 - - decreses until sellIn is <= 0 - - when sellIn == 0 quality degrades twice as fast + # - is >= 0 && <= 50 + # - decrements with number of days until sellIn is 0 then with the double of it - Sulfuras - sellIn = 0 // doesnt change - quality is 80 and does not decrease + # sellIn = 0 // doesnt change + # quality is 80 and does not decrease - AgedBrie increases in quality - BackstagePasses increases in quality like AgedBrie