From 45d735969e49a6325b189ce06cac4ad0c00f396f Mon Sep 17 00:00:00 2001 From: "ah.jo" Date: Tue, 16 Jan 2024 16:40:14 +0900 Subject: [PATCH] Add better support Kotest --- docs/content/v1.0.x/release-notes/_index.md | 2 ++ .../fixturemonkey/kotest/ArbExtension.kt | 21 ++++++++++++++++++- .../kotlin/ExpressionGenerators.kt | 4 ++-- .../kotlin-tests/build.gradle.kts | 1 + .../tests/kotlin/KotestInJunitTest.kt | 16 ++++++++++++++ .../tests/kotlin/KotestInKotestTest.kt | 2 +- 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/docs/content/v1.0.x/release-notes/_index.md b/docs/content/v1.0.x/release-notes/_index.md index 4c9a0a7e8b..f71ab01c8b 100644 --- a/docs/content/v1.0.x/release-notes/_index.md +++ b/docs/content/v1.0.x/release-notes/_index.md @@ -11,6 +11,8 @@ Fix setting object field by any other type. Refactor does not throw exception when it cannot generate, the next ArbitraryIntrospector will be used. +Add better support Kotest by modifying `giveMeArb` more Kotlin-like, by adding `setArb` API. + sectionEnd sectionStart diff --git a/fixture-monkey-kotest/src/main/kotlin/com/navercorp/fixturemonkey/kotest/ArbExtension.kt b/fixture-monkey-kotest/src/main/kotlin/com/navercorp/fixturemonkey/kotest/ArbExtension.kt index b165da6b3a..221a9a81e3 100644 --- a/fixture-monkey-kotest/src/main/kotlin/com/navercorp/fixturemonkey/kotest/ArbExtension.kt +++ b/fixture-monkey-kotest/src/main/kotlin/com/navercorp/fixturemonkey/kotest/ArbExtension.kt @@ -22,14 +22,19 @@ package com.navercorp.fixturemonkey.kotest import com.navercorp.fixturemonkey.ArbitraryBuilder import com.navercorp.fixturemonkey.FixtureMonkey +import com.navercorp.fixturemonkey.api.property.PropertySelector import com.navercorp.fixturemonkey.api.type.TypeReference import com.navercorp.fixturemonkey.api.type.Types import com.navercorp.fixturemonkey.kotlin.giveMeBuilder import com.navercorp.fixturemonkey.kotlin.giveMeOne +import com.navercorp.fixturemonkey.kotlin.property import io.kotest.property.Arb import io.kotest.property.arbitrary.arbitrary +import io.kotest.property.arbitrary.single import java.lang.reflect.AnnotatedType import java.lang.reflect.Type +import java.util.function.Supplier +import kotlin.reflect.KProperty1 import kotlin.reflect.full.isSubtypeOf import kotlin.reflect.jvm.javaType import kotlin.reflect.typeOf @@ -62,7 +67,21 @@ inline fun FixtureMonkey.giveMeArb(): Arb { } } -inline fun FixtureMonkey.giveMeArb(crossinline applyBuilder: (ArbitraryBuilder) -> ArbitraryBuilder): Arb = +inline fun FixtureMonkey.giveMeArb(crossinline applyBuilder: ArbitraryBuilder.() -> ArbitraryBuilder): Arb = arbitrary { applyBuilder.invoke(this@giveMeArb.giveMeBuilder()).sample() } + +fun ArbitraryBuilder.setArb(expression: String, arb: Arb): ArbitraryBuilder = this.set( + expression, + Supplier { arb.single() } +) + +fun ArbitraryBuilder.setArb(propertySelector: PropertySelector, arb: Arb): ArbitraryBuilder = + this.set( + propertySelector, + Supplier { arb.single() } + ) + +fun ArbitraryBuilder.setArb(p: KProperty1, arb: Arb): ArbitraryBuilder = + this.set(property(p), Supplier { arb.single() }) diff --git a/fixture-monkey-kotlin/src/main/kotlin/com/navercorp/fixturemonkey/kotlin/ExpressionGenerators.kt b/fixture-monkey-kotlin/src/main/kotlin/com/navercorp/fixturemonkey/kotlin/ExpressionGenerators.kt index 030a538081..8d16c23dd4 100644 --- a/fixture-monkey-kotlin/src/main/kotlin/com/navercorp/fixturemonkey/kotlin/ExpressionGenerators.kt +++ b/fixture-monkey-kotlin/src/main/kotlin/com/navercorp/fixturemonkey/kotlin/ExpressionGenerators.kt @@ -295,10 +295,10 @@ private class EmptyExpressionGenerator : ExpressionGenerator { override fun generate(propertyNameResolver: PropertyNameResolver): String = "" } -internal fun property(property: KProperty1): ExpressionGenerator = +fun property(property: KProperty1): ExpressionGenerator = PropertyExpressionGenerator(KotlinProperty(property)) -internal fun property(function: KFunction1): ExpressionGenerator = +fun property(function: KFunction1): ExpressionGenerator = PropertyExpressionGenerator(KotlinGetterProperty(function)) @JvmName("collection") diff --git a/fixture-monkey-tests/kotlin-tests/build.gradle.kts b/fixture-monkey-tests/kotlin-tests/build.gradle.kts index 2201acbfa0..30ec3b950f 100644 --- a/fixture-monkey-tests/kotlin-tests/build.gradle.kts +++ b/fixture-monkey-tests/kotlin-tests/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { testImplementation(project(":fixture-monkey-javax-validation")) testImplementation("io.kotest:kotest-runner-junit5:${Versions.KOTEST}") testImplementation("io.kotest:kotest-assertions-core:${Versions.KOTEST}") + testImplementation("io.kotest.extensions:kotest-property-arbs:2.1.2") testImplementation("org.projectlombok:lombok:${Versions.LOMBOK}") testAnnotationProcessor("org.projectlombok:lombok:${Versions.LOMBOK}") } diff --git a/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInJunitTest.kt b/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInJunitTest.kt index c5e32c0489..5c38037404 100644 --- a/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInJunitTest.kt +++ b/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInJunitTest.kt @@ -21,11 +21,16 @@ package com.navercorp.fixturemonkey.tests.kotlin import com.navercorp.fixturemonkey.FixtureMonkey import com.navercorp.fixturemonkey.javax.validation.plugin.JavaxValidationPlugin import com.navercorp.fixturemonkey.kotest.KotestPlugin +import com.navercorp.fixturemonkey.kotest.giveMeArb +import com.navercorp.fixturemonkey.kotest.setArb import com.navercorp.fixturemonkey.kotlin.KotlinPlugin import com.navercorp.fixturemonkey.kotlin.giveMeBuilder import com.navercorp.fixturemonkey.kotlin.giveMeOne import com.navercorp.fixturemonkey.kotlin.setPostCondition import com.navercorp.fixturemonkey.tests.TestEnvironment.TEST_COUNT +import io.kotest.property.Arb +import io.kotest.property.arbitrary.single +import io.kotest.property.arbs.geo.zipcodes import org.assertj.core.api.BDDAssertions.then import org.junit.jupiter.api.RepeatedTest import java.math.BigDecimal @@ -747,6 +752,17 @@ class KotestInJunitTest { then(actual).isGreaterThanOrEqualTo(0.0) } + @RepeatedTest(TEST_COUNT) + fun sampleSetArb() { + class StringObject(val string: String) + + val actual = SUT.giveMeArb { setArb(StringObject::string, Arb.zipcodes()) } + .single() + .string + + then(actual).hasSize(5) + } + companion object { private val SUT: FixtureMonkey = FixtureMonkey.builder() .plugin(JavaxValidationPlugin()) diff --git a/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInKotestTest.kt b/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInKotestTest.kt index c989318e7d..b247871160 100644 --- a/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInKotestTest.kt +++ b/fixture-monkey-tests/kotlin-tests/src/test/kotlin/com/navercorp/fixturemonkey/tests/kotlin/KotestInKotestTest.kt @@ -51,7 +51,7 @@ class KotestInKotestTest : StringSpec({ } } "forAll" { - forAll(SUT.giveMeArb { it.set("test") }) { a -> + forAll(SUT.giveMeArb { set("test") }) { a -> a == "test" } }