From 4037feedbabfda7338d6450b985b0128de4c7572 Mon Sep 17 00:00:00 2001 From: Jacek Weremko Date: Sat, 15 Jun 2024 14:36:06 +0200 Subject: [PATCH] Test with generated testcases which cover all paths --- Kotlin/README.md | 15 ++++- Kotlin/img_1.png | Bin 0 -> 65159 bytes Kotlin/src/main/kotlin/com/gildedrose/Item.kt | 2 +- .../kotlin/com/gildedrose/PlatinumRose.kt | 58 ++++++++++++++++++ .../com/gildedrose/TestcasesGenerator.kt | 43 +++++++++++++ .../kotlin/com/gildedrose/TexttestFixture.kt | 18 +++--- .../kotlin/com/gildedrose/GildedRoseTest.kt | 10 ++- .../kotlin/com/gildedrose/PlatinumRoseTest.kt | 48 +++++++++++++++ 8 files changed, 182 insertions(+), 12 deletions(-) create mode 100644 Kotlin/img_1.png create mode 100644 Kotlin/src/main/kotlin/com/gildedrose/PlatinumRose.kt create mode 100644 Kotlin/src/main/kotlin/com/gildedrose/TestcasesGenerator.kt create mode 100644 Kotlin/src/test/kotlin/com/gildedrose/PlatinumRoseTest.kt diff --git a/Kotlin/README.md b/Kotlin/README.md index 01b53561..83f52fac 100644 --- a/Kotlin/README.md +++ b/Kotlin/README.md @@ -22,6 +22,8 @@ You should make sure the gradle commands shown above work when you execute them There are instructions in the [TextTest Readme](../texttests/README.md) for setting up TextTest. What's unusual for the Java version is there are two executables listed in [config.gr](../texttests/config.gr) for Java. One uses Gradle wrapped in a python script, the other relies on your CLASSPATH being set correctly in [environment.gr](../texttests/environment.gr). +## Starting Point + ### Project info 1. Code is highly unreadable and impossible to extend 2. Algorithm and test cases are unknown, I do not trust that `TexttestFixtures` covers all paths so I want to validate it with jacoco @@ -33,7 +35,8 @@ There are instructions in the [TextTest Readme](../texttests/README.md) for sett 3. understand algorithm and propose better solution -### Execution +## Execution +### Testing TexttestFixtures TexttestFixtures indeed do not cover all paths, based on jacoco coverage: ![img.png](img.png) @@ -43,3 +46,13 @@ There are two ways to advance: I prefer to go with (2) because it seems to me to be more resilient way. I need to check if execution time is not bloated. Also minimize number of test cases. + +### Test cases generation +I copied GildedRose class to PlatinumRose and implemented a test which executes both app +and then compare results. Time of execution is under 500ms which is great. Also all paths are covered: + +![img_1.png](img_1.png) + +One noticeable fact i that items are declared as `var` which makes it possible to update during/after execution. +In my opinion this is a design issue, code-smell and I'm going to change it to `val`. +So far I only changed Item to data class so that object comparison is easier, also it seems to be DTO/record so it suppose to be a data class diff --git a/Kotlin/img_1.png b/Kotlin/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..769ec7917404f3e1e2722aafaa11f31dbc2b9a15 GIT binary patch literal 65159 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 literal 0 HcmV?d00001 diff --git a/Kotlin/src/main/kotlin/com/gildedrose/Item.kt b/Kotlin/src/main/kotlin/com/gildedrose/Item.kt index eaf62a40..5059f949 100644 --- a/Kotlin/src/main/kotlin/com/gildedrose/Item.kt +++ b/Kotlin/src/main/kotlin/com/gildedrose/Item.kt @@ -1,6 +1,6 @@ package com.gildedrose -open class Item(var name: String, var sellIn: Int, var quality: Int) { +data class Item(var name: String, var sellIn: Int, var quality: Int) { override fun toString(): String { return this.name + ", " + this.sellIn + ", " + this.quality } diff --git a/Kotlin/src/main/kotlin/com/gildedrose/PlatinumRose.kt b/Kotlin/src/main/kotlin/com/gildedrose/PlatinumRose.kt new file mode 100644 index 00000000..dc478702 --- /dev/null +++ b/Kotlin/src/main/kotlin/com/gildedrose/PlatinumRose.kt @@ -0,0 +1,58 @@ +package com.gildedrose + +class PlatinumRose(var items: List) { + + fun updateQuality() { + for (i in items.indices) { + if (items[i].name != "Aged Brie" && items[i].name != "Backstage passes to a TAFKAL80ETC concert") { + if (items[i].quality > 0) { + if (items[i].name != "Sulfuras, Hand of Ragnaros") { + items[i].quality = items[i].quality - 1 + } + } + } else { + if (items[i].quality < 50) { + items[i].quality = items[i].quality + 1 + + if (items[i].name == "Backstage passes to a TAFKAL80ETC concert") { + if (items[i].sellIn < 11) { + if (items[i].quality < 50) { + items[i].quality = items[i].quality + 1 + } + } + + if (items[i].sellIn < 6) { + if (items[i].quality < 50) { + items[i].quality = items[i].quality + 1 + } + } + } + } + } + + if (items[i].name != "Sulfuras, Hand of Ragnaros") { + items[i].sellIn = items[i].sellIn - 1 + } + + if (items[i].sellIn < 0) { + if (items[i].name != "Aged Brie") { + if (items[i].name != "Backstage passes to a TAFKAL80ETC concert") { + if (items[i].quality > 0) { + if (items[i].name != "Sulfuras, Hand of Ragnaros") { + items[i].quality = items[i].quality - 1 + } + } + } else { + items[i].quality = items[i].quality - items[i].quality + } + } else { + if (items[i].quality < 50) { + items[i].quality = items[i].quality + 1 + } + } + } + } + } + +} + diff --git a/Kotlin/src/main/kotlin/com/gildedrose/TestcasesGenerator.kt b/Kotlin/src/main/kotlin/com/gildedrose/TestcasesGenerator.kt new file mode 100644 index 00000000..b259b9ab --- /dev/null +++ b/Kotlin/src/main/kotlin/com/gildedrose/TestcasesGenerator.kt @@ -0,0 +1,43 @@ +package com.gildedrose + +import java.util.* + + +fun generateTestCasesInRanger(names: List, sellInRange: IntRange, qualityRange: IntRange): List { + val items = LinkedList() + for (name in names) { + for (sellIn in sellInRange) { + for (quality in qualityRange) { + items.add(Item(name, sellIn, quality)) + } + } + } + return items +} + +fun main(args: Array) { + val names = listOf( + "Aged Brie", + "Backstage passes to a TAFKAL80ETC concert", + "Sulfuras, Hand of Ragnaros", + "new none-existing on code name" + ) + val sellInRange = -100..100 + val qualityRange = -100..100 + val allTestCases = generateTestCasesInRanger(names, sellInRange, qualityRange) + + + var testCasesCounter = 0 + for (testCase in allTestCases) { + val app = GildedRose(listOf(Item(testCase.name, testCase.sellIn, testCase.quality))) + app.updateQuality() + + + if (testCase.sellIn != app.items[0].sellIn || testCase.quality != app.items[0].quality) { + //println("$testCasesCounter: $testCase vs ${app.items[0]}") + testCasesCounter += 1 + } + } + println("Found $testCasesCounter testCasesCounter of out ${allTestCases.size} allTestCases") + +} diff --git a/Kotlin/src/main/kotlin/com/gildedrose/TexttestFixture.kt b/Kotlin/src/main/kotlin/com/gildedrose/TexttestFixture.kt index 72f27b9e..b6f83333 100644 --- a/Kotlin/src/main/kotlin/com/gildedrose/TexttestFixture.kt +++ b/Kotlin/src/main/kotlin/com/gildedrose/TexttestFixture.kt @@ -6,15 +6,15 @@ fun main(args: Array) { val items = listOf( Item("+5 Dexterity Vest", 10, 20), // - Item("Aged Brie", 2, 0), // - Item("Elixir of the Mongoose", 5, 7), // - Item("Sulfuras, Hand of Ragnaros", 0, 80), // - Item("Sulfuras, Hand of Ragnaros", -1, 80), - Item("Backstage passes to a TAFKAL80ETC concert", 15, 20), - Item("Backstage passes to a TAFKAL80ETC concert", 10, 49), - Item("Backstage passes to a TAFKAL80ETC concert", 5, 49), - // this conjured item does not work properly yet - Item("Conjured Mana Cake", 3, 6) + Item("Aged Brie", 2, 0), // + Item("Elixir of the Mongoose", 5, 7), // + Item("Sulfuras, Hand of Ragnaros", 0, 80), // + Item("Sulfuras, Hand of Ragnaros", -1, 80), + Item("Backstage passes to a TAFKAL80ETC concert", 15, 20), + Item("Backstage passes to a TAFKAL80ETC concert", 10, 49), + Item("Backstage passes to a TAFKAL80ETC concert", 5, 49), + // this conjured item does not work properly yet + Item("Conjured Mana Cake", 3, 6) ) val app = GildedRose(items) diff --git a/Kotlin/src/test/kotlin/com/gildedrose/GildedRoseTest.kt b/Kotlin/src/test/kotlin/com/gildedrose/GildedRoseTest.kt index 52af8f7d..bf805dc3 100644 --- a/Kotlin/src/test/kotlin/com/gildedrose/GildedRoseTest.kt +++ b/Kotlin/src/test/kotlin/com/gildedrose/GildedRoseTest.kt @@ -20,7 +20,16 @@ internal class GildedRoseTest { val app = GildedRose(items) app.updateQuality() assertEquals("foo", app.items[0].name) + } + @Test + fun `should execute without exception for empty list`() { + val items = listOf() + val app = GildedRose(items) + app.updateQuality() + assertAll( + { assertEquals(items, app.items) } + ) } @ParameterizedTest @@ -53,7 +62,6 @@ internal class GildedRoseTest { ) } } - } diff --git a/Kotlin/src/test/kotlin/com/gildedrose/PlatinumRoseTest.kt b/Kotlin/src/test/kotlin/com/gildedrose/PlatinumRoseTest.kt new file mode 100644 index 00000000..290a3262 --- /dev/null +++ b/Kotlin/src/test/kotlin/com/gildedrose/PlatinumRoseTest.kt @@ -0,0 +1,48 @@ +package com.gildedrose + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.util.* + +class PlatinumRoseTest { + + @Test + fun `should update quality for generated test cases and compare with GlidedRose`() { + val names = listOf( + "Aged Brie", + "Backstage passes to a TAFKAL80ETC concert", + "Sulfuras, Hand of Ragnaros", + "new none-existing on code name" + ) + val sellInRange = -100..100 + val qualityRange = -100..100 + val allTestCases = generateTestCasesInRanger(names, sellInRange, qualityRange) + + + for (testCase in allTestCases) { + val platinumRose = PlatinumRose(listOf(Item(testCase.name, testCase.sellIn, testCase.quality))) + val gildedRose = GildedRose(listOf(Item(testCase.name, testCase.sellIn, testCase.quality))) + + platinumRose.updateQuality() + gildedRose.updateQuality() + + assertEquals(gildedRose.items, platinumRose.items) + } + } + + private fun generateTestCasesInRanger( + names: List, + sellInRange: IntRange, + qualityRange: IntRange + ): List { + val items = LinkedList() + for (name in names) { + for (sellIn in sellInRange) { + for (quality in qualityRange) { + items.add(Item(name, sellIn, quality)) + } + } + } + return items + } +} \ No newline at end of file