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 @@
-[](https://kotlinlang.org)
+[](https://kotlinlang.org)

[](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()