GildedRose-Refactoring-Kata/Kotlin
2024-06-15 17:06:37 +02:00
..
gradle/wrapper Upgrade build to: Kotlin 1.9.10, Gradle 8.x, JUnit 5.10.0 2023-10-10 21:33:32 +02:00
src Split updateQuality into smaller chunks and update test according to qualityRange constraint. Update README with steps 2024-06-15 17:06:37 +02:00
.gitignore Use gradle to build kotlin files 2018-01-31 10:52:53 +01:00
build.gradle.kts Add jacoco dependency, convert TexttestFixtures to tests. Update README with results and next steps. 2024-06-15 13:55:33 +02:00
gradlew Upgrade build to: Kotlin 1.9.10, Gradle 8.x, JUnit 5.10.0 2023-10-10 21:33:32 +02:00
gradlew.bat Upgrade build to: Kotlin 1.9.10, Gradle 8.x, JUnit 5.10.0 2023-10-10 21:33:32 +02:00
img_1.png Test with generated testcases which cover all paths 2024-06-15 14:36:42 +02:00
img.png Add jacoco dependency, convert TexttestFixtures to tests. Update README with results and next steps. 2024-06-15 13:55:33 +02:00
README.md Split updateQuality into smaller chunks and update test according to qualityRange constraint. Update README with steps 2024-06-15 17:06:37 +02:00
texttest_rig.py Fixed texttests for Kotlin 2023-11-03 16:11:26 +01:00

Gilded Rose starting position in Kotlin

Run the Text Fixture from Command-Line

./gradlew -q text

Specify Number of Days

For e.g. 10 days:

./gradlew run --args 10

You should make sure the gradle commands shown above work when you execute them in a terminal before trying to use TextTest (see below).

Run the TextTest approval test that comes with this project

There are instructions in the TextTest Readme for setting up TextTest. What's unusual for the Java version is there are two executables listed in config.gr for Java. One uses Gradle wrapped in a python script, the other relies on your CLASSPATH being set correctly in 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
  3. Codebase is just 60 LOC and edge-values seems to be small values

Plan of action

  1. Generate all test cases / convert TexttestFixtures to tests
  2. Break complex statements, make code longer and simpler
  3. understand algorithm and propose better solution

Execution

Testing TexttestFixtures

TexttestFixtures indeed do not cover all paths, based on jacoco coverage: img.png

There are two ways to advance:

  1. manually craft extra test cases
  2. auto generate a bunch of test cases

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

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

updateQuality cleanup

I cleaned up updateQuality method, split it into 3 separate methods for each case - verified all tests still pass. During refactor I also found README file in a main directory in which algorithm was explained - there are extra constraints that are not covered in code:

  • quality of Sulfuras is max 80
  • quality cannot be negative

At this point code is readable but not so extensible because all algos are in a single class which might grow to infinity. The usual way to handle this situation is to go with OO approach - I cannot modify Item class so I will implement new one and its specifications.