diff --git a/.github/workflows/release_compose.yml b/.github/workflows/release_compose.yml index 4362178..ea920e6 100644 --- a/.github/workflows/release_compose.yml +++ b/.github/workflows/release_compose.yml @@ -37,11 +37,8 @@ jobs: - name: Publish Library run: | echo "Publishing library🚀" - ./gradlew :mvi-compose:publish --no-daemon --no-parallel + ./gradlew :mvi-compose:publishAndReleaseToMavenCentral --no-configuration-cache echo "Published✅" - echo "Releasing repository...🚀" - ./gradlew closeAndReleaseRepository - echo "Released✅" env: ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_KEY }} ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_PASSWORD }} diff --git a/.github/workflows/release_kotest.yml b/.github/workflows/release_kotest.yml index 12bba74..52fcbb4 100644 --- a/.github/workflows/release_kotest.yml +++ b/.github/workflows/release_kotest.yml @@ -37,11 +37,8 @@ jobs: - name: Publish Library run: | echo "Publishing library🚀" - ./gradlew :mvi-kotest:publish --no-daemon --no-parallel + ./gradlew :mvi-kotest:publishAndReleaseToMavenCentral --no-configuration-cache echo "Published✅" - echo "Releasing repository...🚀" - ./gradlew closeAndReleaseRepository - echo "Released✅" env: ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_KEY }} ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_PASSWORD }} diff --git a/.github/workflows/release_mvi.yml b/.github/workflows/release_mvi.yml index cd4cdfa..f15e6b0 100644 --- a/.github/workflows/release_mvi.yml +++ b/.github/workflows/release_mvi.yml @@ -37,11 +37,8 @@ jobs: - name: Publish Library run: | echo "Publishing library🚀" - ./gradlew :mvi:publish --no-daemon --no-parallel + ./gradlew :mvi:publishAndReleaseToMavenCentral --no-configuration-cache echo "Published✅" - echo "Releasing repository...🚀" - ./gradlew closeAndReleaseRepository - echo "Released✅" env: ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_KEY }} ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_PASSWORD }} diff --git a/build.gradle.kts b/build.gradle.kts index 2d3f0fb..450a05f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,14 +13,15 @@ plugins { alias(libs.plugins.kotlin) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlinMultiplatform) apply false + alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.mavenPublish) } -configure(subprojects) { - +allprojects { pluginManager.withPlugin("com.vanniktech.maven.publish") { mavenPublishing { - publishToMavenCentral(SonatypeHost.S01) + publishToMavenCentral(SonatypeHost.S01, automaticRelease = true) signAllPublications() } } diff --git a/docs/README.md b/docs/README.md index 30c00a9..4fd6428 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ adidas mvi Logo -[![Kotlin](https://img.shields.io/badge/Kotlin-1.9.22-blue.svg?style=flat&logo=kotlin)](https://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/Kotlin-2.0.0-blue.svg?style=flat&logo=kotlin)](https://kotlinlang.org) ![Test workflow](https://github.com/adidas/mvi/actions/workflows/deploy_docs.yml/badge.svg) [![adidas official](https://img.shields.io/badge/adidas-official-000000)](https://github.com/adidas) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 40d4072..3f0caa8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,25 @@ [versions] -ksp = "1.9.23-1.0.19" -appcompat = "1.6.1" -koin = "3.5.3" +ksp = "2.0.20-1.0.25" +appcompat = "1.7.0" +koin = "3.5.6" koin-annotations = "1.3.1" -koin-android = "3.5.3" -koin-compose = "3.5.3" -kotlin = "1.9.23" -coroutines = "1.8.0" -kotest = "5.8.1" -material = "1.6.5" +koin-android = "3.5.6" +koin-compose = "3.5.6" +kotlin = "2.0.0" +coroutines = "1.8.1" +kotest = "5.9.0" +material = "1.7.0" mvi = "1.7.0" mvi-compose = "0.0.3" -activity = "1.8.2" -lifecycle = "2.7.0" +activity = "1.9.2" +lifecycle = "2.8.5" ktlint-gradle = "12.1.0" -android-library = "8.3.1" -maven-publish = "0.25.2" -ui = "1.6.5" -mockk = "1.13.10" +android-library = "8.3.2" +maven-publish = "0.29.0" +ui = "1.7.0" +mockk = "1.13.11" mvi-kotest = "0.0.2" + # its beeing used outside this file ktlint-lib = "1.2.1" @@ -26,7 +27,9 @@ ktlint-lib = "1.2.1" appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } coroutinesCore = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } coroutinesTest = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } +kotest-framework-engine = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" } kotestRunner = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } +kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotlinBom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin" } mvi = { module = "com.adidas.mvi:mvi", version.ref = "mvi" } mviCompose = { module = "com.adidas.mvi:mvi-compose", version.ref = "mvi-compose" } @@ -49,3 +52,9 @@ mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "maven-publi android-library = { id = "com.android.library", version.ref = "android-library" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +kotest = { id = "io.kotest.multiplatform", version.ref = "kotest" } +atomicfu = { id = "org.jetbrains.kotlinx.atomicfu", version = "0.25.0" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } + + diff --git a/mvi-compose/build.gradle.kts b/mvi-compose/build.gradle.kts index 3acadd0..485b9f9 100644 --- a/mvi-compose/build.gradle.kts +++ b/mvi-compose/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) alias(libs.plugins.mavenPublish) + alias(libs.plugins.compose.compiler) } kotlin { @@ -39,10 +40,6 @@ android { buildFeatures { compose = true } - - composeOptions { - kotlinCompilerExtensionVersion = "1.5.11" - } } dependencies { diff --git a/mvi-sample/build.gradle.kts b/mvi-sample/build.gradle.kts index 10ae026..be9e238 100644 --- a/mvi-sample/build.gradle.kts +++ b/mvi-sample/build.gradle.kts @@ -7,6 +7,7 @@ plugins { id("kotlin-android") id("kotlin-kapt") alias(libs.plugins.ksp) + alias(libs.plugins.compose.compiler) } android { @@ -37,10 +38,6 @@ android { jvmTarget = JavaVersion.VERSION_17.toString() } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.11" - } - buildFeatures { compose = true } diff --git a/mvi/build.gradle.kts b/mvi/build.gradle.kts index 9df3c47..a99af87 100644 --- a/mvi/build.gradle.kts +++ b/mvi/build.gradle.kts @@ -1,31 +1,57 @@ import org.jlleitschuh.gradle.ktlint.KtlintExtension plugins { - kotlin("jvm") version libs.versions.kotlin.get() + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.ktlint) alias(libs.plugins.mavenPublish) + alias(libs.plugins.kotest) + alias(libs.plugins.atomicfu) } kotlin { explicitApi() -} -val compileTestKotlin: org.jetbrains.kotlin.gradle.tasks.KotlinCompile by tasks -compileTestKotlin.kotlinOptions { - freeCompilerArgs += "-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi" + jvm { + withJava() + } + + iosX64() + iosArm64() + iosSimulatorArm64() + + macosX64() + macosArm64() + + watchosArm32() + watchosArm64() + watchosDeviceArm64() + watchosSimulatorArm64() + watchosX64() + + tvosArm64() + tvosSimulatorArm64() + tvosX64() + + sourceSets { + commonMain.dependencies { + implementation(libs.coroutinesCore) + } + + jvmTest.dependencies { + implementation(libs.kotest.framework.engine) + implementation(libs.kotest.assertions) + implementation(libs.coroutinesTest) + implementation(libs.kotestRunner) + } + } } configure { version.set(libs.versions.ktlint.lib.get()) } -tasks.getByName("test") { - useJUnitPlatform() -} - -dependencies { - implementation(libs.coroutinesCore) - - testImplementation(libs.kotestRunner) - testImplementation(libs.coroutinesTest) +tasks { + withType { + useJUnitPlatform() + } } diff --git a/mvi/gradle.properties b/mvi/gradle.properties index 23724e8..1e0eb73 100644 --- a/mvi/gradle.properties +++ b/mvi/gradle.properties @@ -1,6 +1,6 @@ POM_ARTIFACT_ID=mvi GROUP=com.adidas.mvi VERSION_CODE=1 -VERSION_NAME=1.7.0 +VERSION_NAME=1.8.0 POM_NAME=Adidas MVI POM_DESCRIPTION=Adidas MVI \ No newline at end of file diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Intent.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Intent.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Intent.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Intent.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/IntentExecutor.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/IntentExecutor.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/IntentExecutor.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/IntentExecutor.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Loggable.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Loggable.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Loggable.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Loggable.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/LoggableState.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/LoggableState.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/LoggableState.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/LoggableState.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Logger.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Logger.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Logger.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Logger.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Multimap.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt similarity index 90% rename from mvi/src/main/kotlin/com/adidas/mvi/Multimap.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt index aec0b1b..d4985fe 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/Multimap.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt @@ -1,13 +1,12 @@ package com.adidas.mvi -import java.util.Collections import kotlin.reflect.KClass internal class Multimap { private val innerMap = hashMapOf>>() val keys: Collection - get() = Collections.unmodifiableSet(innerMap.keys) + get() = innerMap.keys.toSet() fun put( key: TKey, @@ -29,7 +28,7 @@ internal class Multimap { innerMap[key] = MutableList(values.size) { values[it] } } - operator fun get(key: TKey): List> = innerMap[key]?.let(Collections::unmodifiableList) ?: listOf() + operator fun get(key: TKey): List> = innerMap[key]?.toList() ?: listOf() operator fun get(keyClass: KClass): List> = keys diff --git a/mvi/src/main/kotlin/com/adidas/mvi/MviHost.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/MviHost.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/MviHost.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/MviHost.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Reducer.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Reducer.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Reducer.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Reducer.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/State.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/State.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/State.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/State.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/TerminatedIntentException.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/TerminatedIntentException.kt similarity index 86% rename from mvi/src/main/kotlin/com/adidas/mvi/TerminatedIntentException.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/TerminatedIntentException.kt index 914ebbf..0119ef3 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/TerminatedIntentException.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/TerminatedIntentException.kt @@ -2,4 +2,4 @@ package com.adidas.mvi import kotlinx.coroutines.CancellationException -internal class TerminatedIntentException : CancellationException() +internal class TerminatedIntentException : CancellationException("Terminated intent") diff --git a/mvi/src/main/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt similarity index 92% rename from mvi/src/main/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt index adfea9c..16beed5 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt @@ -30,7 +30,7 @@ public fun Reducer( @Suppress("UNCHECKED_CAST") public inline fun Reducer<*, *>.requireView(): TView = (state.value as State).view.apply { - if (this.javaClass != TView::class.java) { - throw ClassCastException("Required view of ${TView::class.java} type, but found ${this.javaClass}") + if (!TView::class.isInstance(this)) { + throw ClassCastException("Required view of ${TView::class} type, but found $this") } } diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt similarity index 57% rename from mvi/src/main/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt index 3b36754..8d83727 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt @@ -1,22 +1,26 @@ package com.adidas.mvi.sideeffects -import java.util.LinkedList -import java.util.Queue +import kotlinx.atomicfu.AtomicRef +import kotlinx.atomicfu.atomic /** * A thread-safe side effect container * It only returns each SideEffect once, if you use it as an [Iterable] it will emit each SideEffect and remove them so it's a perfect case for one shot SideEffects. * It locks itself, so you can't add and read at the same time, also it's not possible to read it at the same time from different threads, being completely thread-safe. */ + public class SideEffects() : Iterable { - private val sideEffects: Queue = LinkedList() + private val sideEffects: AtomicRef> = atomic(ArrayList()) + // Private constructor to initialize from an Iterable private constructor(sideEffects: Iterable) : this() { - this.sideEffects.addAll(sideEffects) + this.sideEffects.value.addAll(sideEffects) } public fun add(vararg sideEffectsToAdd: T): SideEffects { - return SideEffects(sideEffects + sideEffectsToAdd) + val newList = sideEffects.value.toMutableList() + newList.addAll(sideEffectsToAdd) + return SideEffects(newList) } public fun clear(): SideEffects { @@ -25,9 +29,11 @@ public class SideEffects() : Iterable { override fun iterator(): Iterator = iterator { - do { - val nextSideEffect: T? = sideEffects.poll() + while (true) { + val currentList = sideEffects.value + if (currentList.isEmpty()) break + val nextSideEffect = currentList.removeFirstOrNull() nextSideEffect?.let { yield(it) } - } while (nextSideEffect != null) + } } } diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/Operators.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Operators.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/Operators.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Operators.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/Replace.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Replace.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/Replace.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Replace.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/StateTransform.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/StateTransform.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/StateTransform.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/StateTransform.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/ViewTransform.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/ViewTransform.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/ViewTransform.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/ViewTransform.kt diff --git a/mvi/src/jvmTest/kotlin/com/adidas/mvi/CoroutineListener.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/CoroutineListener.kt new file mode 100644 index 0000000..ae7437b --- /dev/null +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/CoroutineListener.kt @@ -0,0 +1,38 @@ +package com.adidas.mvi + +import io.kotest.core.listeners.TestListener +import io.kotest.core.test.TestCase +import io.kotest.core.test.TestResult +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.test.TestCoroutineScheduler +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain + +internal class CoroutineListener( + internal val testCoroutineDispatcher: TestDispatcher = + UnconfinedTestDispatcher( + TestCoroutineScheduler(), + ), +) : TestListener { + internal val dispatchersContainer: DispatchersContainer = + FixedDispatchersContainer(testCoroutineDispatcher) + + override suspend fun beforeContainer(testCase: TestCase) { + Dispatchers.setMain(testCoroutineDispatcher) + } + + override suspend fun afterContainer( + testCase: TestCase, + result: TestResult, + ) { + Dispatchers.resetMain() + testCoroutineDispatcher.scheduler.cancel() + } + + public fun advanceUntilIdle() { + testCoroutineDispatcher.scheduler.advanceUntilIdle() + } +} diff --git a/mvi/src/test/kotlin/com/adidas/mvi/DispatchersContainer.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/DispatchersContainer.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/DispatchersContainer.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/DispatchersContainer.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/MultimapTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/MultimapTests.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/MultimapTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/MultimapTests.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/ProductSideEffect.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/ProductSideEffect.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/ProductState.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductState.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/ProductState.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductState.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt similarity index 98% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt index 24961bd..9096dbf 100644 --- a/mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerTests.kt +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt @@ -197,9 +197,7 @@ private fun createIntentExecutorContainer( flowOf(TestTransform.Transform1) } -private fun createIntentExecutorContainer( - exception: java.lang.Exception, -): (TestIntent) -> Flow>> = +private fun createIntentExecutorContainer(exception: Throwable): (TestIntent) -> Flow>> = { if (it is TestIntent.SimpleIntent) throw exception emptyFlow() diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestIntent.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestIntent.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestState.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestState.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestState.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestState.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestTransform.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestTransform.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt similarity index 98% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt index b1439be..3bcde9f 100644 --- a/mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt @@ -2,7 +2,6 @@ package com.adidas.mvi.reducer.logger import com.adidas.mvi.Loggable import com.adidas.mvi.Logger -import java.lang.StringBuilder private const val SPACE = " " internal const val SUCCESSFUL_INTENT = "SuccessfulIntent:" diff --git a/mvi/src/test/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt similarity index 82% rename from mvi/src/test/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt index 0013a78..3a0ea38 100644 --- a/mvi/src/test/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt @@ -5,8 +5,9 @@ import io.kotest.matchers.booleans.shouldBeFalse import io.kotest.matchers.collections.shouldBeEmpty import io.kotest.matchers.collections.shouldContain import io.kotest.matchers.collections.shouldContainInOrder -import java.util.concurrent.Semaphore -import kotlin.concurrent.thread +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Semaphore import kotlin.time.DurationUnit import kotlin.time.ExperimentalTime import kotlin.time.toDuration @@ -66,18 +67,18 @@ internal class SideEffectsTest : BehaviorSpec({ var returnedSideEffects = sideEffects.add(firstSideEffect) - val semaphore = Semaphore(0) + val semaphore = Semaphore(2) - val readThread = - thread { + val readJob = + launch(Dispatchers.Default) { returnedSideEffects.forEach { _ -> - semaphore.acquire() + semaphore.acquire() // Wait for the signal } } - val addThread = - thread { - returnedSideEffects = returnedSideEffects.add(secondSideEffectToBeAddedLater) + val addJob = + launch(Dispatchers.Default) { + returnedSideEffects = sideEffects.add(secondSideEffectToBeAddedLater) } semaphore.release() @@ -88,11 +89,11 @@ internal class SideEffectsTest : BehaviorSpec({ DurationUnit.SECONDS, ), ) { - readThread.join() - addThread.join() + readJob.join() + addJob.join() - readThread.isAlive.shouldBeFalse() - addThread.isAlive.shouldBeFalse() + readJob.isActive.shouldBeFalse() + addJob.isActive.shouldBeFalse() returnedSideEffects.shouldContain(secondSideEffectToBeAddedLater) } } diff --git a/mvi/src/test/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/OperatorsTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/OperatorsTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/ReplaceTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/ReplaceTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/StateTransformTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/StateTransformTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/CoroutineListener.kt b/mvi/src/test/kotlin/com/adidas/mvi/CoroutineListener.kt deleted file mode 100644 index 44db1e2..0000000 --- a/mvi/src/test/kotlin/com/adidas/mvi/CoroutineListener.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.adidas.mvi - -import io.kotest.core.listeners.TestListener -import io.kotest.core.test.TestCase -import io.kotest.core.test.TestResult -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.test.TestCoroutineDispatcher -import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.setMain - -internal class CoroutineListener( - internal val testCoroutineDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher(), -) : TestListener { - internal val dispatchersContainer: DispatchersContainer = FixedDispatchersContainer(testCoroutineDispatcher) - - override suspend fun beforeContainer(testCase: TestCase) { - Dispatchers.setMain(testCoroutineDispatcher) - } - - override suspend fun afterContainer( - testCase: TestCase, - result: TestResult, - ) { - Dispatchers.resetMain() - testCoroutineDispatcher.cleanupTestCoroutines() - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index ec72b53..8595f08 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,7 +6,7 @@ pluginManagement { } } dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories { google() mavenCentral()