diff --git a/compat/compat-parameterize/README.md b/compat/compat-parameterize/README.md index febdb59..8684182 100644 --- a/compat/compat-parameterize/README.md +++ b/compat/compat-parameterize/README.md @@ -37,3 +37,38 @@ suite("A test suite") { } } ``` + +## Prepared values + +[Prepared values][opensavvy.prepared.suite.Prepared] allow declaring lazily-computed test fixtures. Using this module, they can be used as test parameters as well. Depending on the situation, two syntaxes are available. + +When prepared values are heterogeneous, declare them then combine them as parameters: + +```kotlin +suite("A test suite") { + parameterize { + val one by prepared { 1 } + val other by prepared { random.nextInt() } + val number by parameterOf(one, other) + + test("Test $number") { + assertTrue(number().toString().isNotEmpty()) + } + } +} +``` + +When they are constructed by [transforming another parameter][opensavvy.prepared.compat.parameterize.prepare], declare the parameter first: + +```kotlin +suite("A test suite") { + parameterize { + val number by parameterOf(0, 1, Int.MAX_VALUE, -99) + .prepare { expensiveOperation(it) } + + test("Test $number") { + assertTrue(number().successful) + } + } +} +``` diff --git a/compat/compat-parameterize/build.gradle.kts b/compat/compat-parameterize/build.gradle.kts index 9ce6936..4a8d86c 100644 --- a/compat/compat-parameterize/build.gradle.kts +++ b/compat/compat-parameterize/build.gradle.kts @@ -30,6 +30,7 @@ kotlin { val commonTest by sourceSets.getting { dependencies { implementation(projects.runners.runnerKotest) + implementation(projects.compat.compatKotlinxDatetime) } } } diff --git a/compat/compat-parameterize/src/commonMain/kotlin/Parameterize.kt b/compat/compat-parameterize/src/commonMain/kotlin/Parameterize.kt new file mode 100644 index 0000000..8223c08 --- /dev/null +++ b/compat/compat-parameterize/src/commonMain/kotlin/Parameterize.kt @@ -0,0 +1,14 @@ +package opensavvy.prepared.compat.parameterize + +import com.benwoodworth.parameterize.ExperimentalParameterizeApi +import com.benwoodworth.parameterize.ParameterizeScope.Parameter +import opensavvy.prepared.suite.Prepared +import opensavvy.prepared.suite.TestDsl +import opensavvy.prepared.suite.prepared + +@ExperimentalParameterizeApi +fun Parameter.prepare(transform: suspend TestDsl.(I) -> O): Parameter> { + return arguments + .map { prepared(it.toString()) { transform(it) } } + .let { Parameter(it) } +} diff --git a/compat/compat-parameterize/src/commonTest/kotlin/ParamaterizeTests.kt b/compat/compat-parameterize/src/commonTest/kotlin/ParamaterizeTests.kt index 69d6e85..edd1693 100644 --- a/compat/compat-parameterize/src/commonTest/kotlin/ParamaterizeTests.kt +++ b/compat/compat-parameterize/src/commonTest/kotlin/ParamaterizeTests.kt @@ -1,12 +1,21 @@ package opensavvy.prepared.compat.parameterize +import com.benwoodworth.parameterize.ExperimentalParameterizeApi import com.benwoodworth.parameterize.parameterOf import com.benwoodworth.parameterize.parameterize import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe +import kotlinx.coroutines.ExperimentalCoroutinesApi +import opensavvy.prepared.compat.kotlinx.datetime.now +import opensavvy.prepared.compat.kotlinx.datetime.set import opensavvy.prepared.runner.kotest.preparedSuite -import opensavvy.prepared.suite.prepared +import opensavvy.prepared.suite.* +import kotlin.time.Duration.Companion.minutes +import kotlin.time.ExperimentalTime +@ExperimentalCoroutinesApi +@ExperimentalTime +@OptIn(ExperimentalParameterizeApi::class) class ParamaterizeTests : StringSpec({ preparedSuite { parameterize { @@ -18,13 +27,34 @@ class ParamaterizeTests : StringSpec({ } parameterize { - val first by prepared { 1.toString() } - val second by prepared { 2.toString() } - val int by parameterOf(first, second) + val int by parameterOf(1, 2) + .prepare { it.toString() } test("Lazy test for value $int") { (int() in "123456789") shouldBe true } } + + parameterize { + val currentTime by parameterOf("2022-12-31T23:37:00Z", "2000-01-01T23:37:00Z") + .prepare { time.set(it) } + + val seed by parameterOf(0L, 13, -1) + .prepare { random.setSeed(it) } + + val configure by prepared { + currentTime() + seed() + } + + test("Test at $currentTime") { + configure() + + time.advanceBy(5.minutes) + println(time.now) + + println(random.nextInt()) + } + } } })