diff --git a/coroutines-interop/src/commonTest/kotlin/com/badoo/reaktive/coroutinesinterop/ObservableAsFlowTest.kt b/coroutines-interop/src/commonTest/kotlin/com/badoo/reaktive/coroutinesinterop/ObservableAsFlowTest.kt index 241a37996..adaa83f6a 100644 --- a/coroutines-interop/src/commonTest/kotlin/com/badoo/reaktive/coroutinesinterop/ObservableAsFlowTest.kt +++ b/coroutines-interop/src/commonTest/kotlin/com/badoo/reaktive/coroutinesinterop/ObservableAsFlowTest.kt @@ -7,7 +7,6 @@ import com.badoo.reaktive.test.observable.onNext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch @@ -20,13 +19,14 @@ import kotlin.test.assertTrue class ObservableAsFlowTest { private val upstream = TestObservable() + private val scope = CoroutineScope(Dispatchers.Unconfined) @Test fun produces_values_in_correct_order_WHEN_upstream_produced_values() { val values = listOf(0, null, 1, null, 2) val list = ArrayList() - GlobalScope.launch(Dispatchers.Unconfined) { + scope.launch(Dispatchers.Unconfined) { upstream.asFlow().collect { list.add(it) } @@ -40,7 +40,7 @@ class ObservableAsFlowTest { @Test fun completes_WHEN_upstream_completed() { var isCompleted = false - GlobalScope.launch(Dispatchers.Unconfined) { + scope.launch { upstream.asFlow().collect {} isCompleted = true } @@ -54,7 +54,7 @@ class ObservableAsFlowTest { fun produces_error_WHEN_upstream_produced_error() { var isError = false - GlobalScope.launch(Dispatchers.Unconfined) { + scope.launch { try { upstream.asFlow().collect {} } catch (e: Throwable) { @@ -71,7 +71,7 @@ class ObservableAsFlowTest { fun unsubscribes_from_upstream_WHEN_flow_is_cancelled() { val scope = CoroutineScope(Dispatchers.Unconfined) - scope.launch(Dispatchers.Unconfined) { + scope.launch { upstream.asFlow().collect {} } @@ -84,7 +84,7 @@ class ObservableAsFlowTest { fun throws_exception_WHEN_upstream_subscribe_throws_exception() { var isThrown = false - GlobalScope.launch(Dispatchers.Unconfined) { + scope.launch { observableUnsafe { throw Exception() } .asFlow() .run { diff --git a/gradle.properties b/gradle.properties index b3620839d..fe3c444eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,6 +9,7 @@ android.useAndroidX=true android.enableJetifier=true kotlin.mpp.androidSourceSetLayoutVersion=2 +kotlin.mpp.applyDefaultHierarchyTemplate=false # For compatibility with Kotlin 1.9.0, see https://github.com/badoo/Reaktive/issues/697 android.experimental.lint.version=8.1.0 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e6420dc46..a28b9414a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "1.9.10" +kotlin = "1.9.20" kotlinx-coroutines = "1.7.3" detekt = "1.22.0" diff --git a/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/DarwinPlugin.kt b/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/DarwinPlugin.kt index a5170ebf5..319db994b 100644 --- a/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/DarwinPlugin.kt +++ b/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/DarwinPlugin.kt @@ -18,7 +18,6 @@ class DarwinPlugin : Plugin { iosSimulatorArm64().disableIfUndefined(Target.IOS) watchosArm32().disableIfUndefined(Target.WATCHOS) watchosArm64().disableIfUndefined(Target.WATCHOS) - watchosX86().disableIfUndefined(Target.WATCHOS) watchosX64().disableIfUndefined(Target.WATCHOS) watchosSimulatorArm64().disableIfUndefined(Target.WATCHOS) tvosArm64().disableIfUndefined(Target.TVOS) diff --git a/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/MppConfigurationPlugin.kt b/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/MppConfigurationPlugin.kt index ada224592..8b379825b 100644 --- a/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/MppConfigurationPlugin.kt +++ b/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/configuration/MppConfigurationPlugin.kt @@ -33,6 +33,14 @@ class MppConfigurationPlugin : Plugin { implementation(target.getLibrary("kotlin-test-annotations")) } } + + targets.configureEach { + compilations.configureEach { + compilerOptions.configure { + freeCompilerArgs.add("-Xexpect-actual-classes") + } + } + } } } @@ -96,9 +104,6 @@ class MppConfigurationPlugin : Plugin { maybeCreate("watchosArm64Main").dependsOn(getByName("darwinCommonMain")) maybeCreate("watchosArm64Test").dependsOn(getByName("darwinCommonTest")) - maybeCreate("watchosX86Main").dependsOn(getByName("darwinCommonMain")) - maybeCreate("watchosX86Test").dependsOn(getByName("darwinCommonTest")) - maybeCreate("watchosX64Main").dependsOn(getByName("darwinCommonMain")) maybeCreate("watchosX64Test").dependsOn(getByName("darwinCommonTest")) diff --git a/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/publish/PublishConfigurationPlugin.kt b/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/publish/PublishConfigurationPlugin.kt index f004a70a7..042dcd3ab 100644 --- a/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/publish/PublishConfigurationPlugin.kt +++ b/includedBuild/gradleConfiguration/src/main/kotlin/com/badoo/reaktive/publish/PublishConfigurationPlugin.kt @@ -136,7 +136,6 @@ class PublishConfigurationPlugin : Plugin { "iosSimulatorArm64" to Target.shouldPublishTarget(project, Target.IOS), "watchosArm32" to Target.shouldPublishTarget(project, Target.WATCHOS), "watchosArm64" to Target.shouldPublishTarget(project, Target.WATCHOS), - "watchosX86" to Target.shouldPublishTarget(project, Target.WATCHOS), "watchosX64" to Target.shouldPublishTarget(project, Target.WATCHOS), "watchosSimulatorArm64" to Target.shouldPublishTarget(project, Target.WATCHOS), "tvosArm64" to Target.shouldPublishTarget(project, Target.TVOS), diff --git a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/completable/Various.kt b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/completable/Various.kt index 675e37979..ef36a0971 100644 --- a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/completable/Various.kt +++ b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/completable/Various.kt @@ -2,7 +2,6 @@ package com.badoo.reaktive.completable import com.badoo.reaktive.disposable.Disposable import com.badoo.reaktive.plugin.onAssembleCompletable -import kotlin.native.concurrent.SharedImmutable /** * ⚠️ Advanced use only: creates an instance of [Completable] without any safeguards by calling `onSubscribe` with a [CompletableObserver]. @@ -38,7 +37,6 @@ fun completableOfError(error: Throwable): Completable = */ fun Throwable.toCompletableOfError(): Completable = completableOfError(this) -@SharedImmutable private val completableOfEmpty by lazy { completableUnsafe { observer -> val disposable = Disposable() @@ -57,7 +55,6 @@ private val completableOfEmpty by lazy { */ fun completableOfEmpty(): Completable = completableOfEmpty -@SharedImmutable private val completableOfNever by lazy { completableUnsafe { observer -> observer.onSubscribe(Disposable()) diff --git a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/maybe/Various.kt b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/maybe/Various.kt index a9bf25443..c88670c0b 100644 --- a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/maybe/Various.kt +++ b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/maybe/Various.kt @@ -2,7 +2,6 @@ package com.badoo.reaktive.maybe import com.badoo.reaktive.disposable.Disposable import com.badoo.reaktive.plugin.onAssembleMaybe -import kotlin.native.concurrent.SharedImmutable /** * ⚠️ Advanced use only: creates an instance of [Maybe] without any safeguards by calling `onSubscribe` with a [MaybeObserver]. @@ -80,7 +79,6 @@ fun maybeOfError(error: Throwable): Maybe = */ fun Throwable.toMaybeOfError(): Maybe = maybeOfError(this) -@SharedImmutable private val maybeOfEmpty by lazy { maybeUnsafe { observer -> val disposable = Disposable() @@ -99,7 +97,6 @@ private val maybeOfEmpty by lazy { */ fun maybeOfEmpty(): Maybe = maybeOfEmpty -@SharedImmutable private val maybeOfNever by lazy { maybeUnsafe { observer -> observer.onSubscribe(Disposable()) diff --git a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/observable/Various.kt b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/observable/Various.kt index fa40fd6a3..0351b4e63 100644 --- a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/observable/Various.kt +++ b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/observable/Various.kt @@ -2,7 +2,6 @@ package com.badoo.reaktive.observable import com.badoo.reaktive.disposable.Disposable import com.badoo.reaktive.plugin.onAssembleObservable -import kotlin.native.concurrent.SharedImmutable /** * ⚠️ Advanced use only: creates an instance of [Observable] without any safeguards by calling `onSubscribe` with an [ObservableObserver]. @@ -105,7 +104,6 @@ fun observableOfError(error: Throwable): Observable = */ fun Throwable.toObservableOfError(): Observable = observableOfError(this) -@SharedImmutable private val observableOfEmpty by lazy { observableUnsafe { observer -> val disposable = Disposable() @@ -124,7 +122,6 @@ private val observableOfEmpty by lazy { */ fun observableOfEmpty(): Observable = observableOfEmpty -@SharedImmutable private val observableOfNever by lazy { observableUnsafe { observer -> observer.onSubscribe(Disposable()) diff --git a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/scheduler/Schedulers.kt b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/scheduler/Schedulers.kt index fdfc06111..3d8c1d0dc 100644 --- a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/scheduler/Schedulers.kt +++ b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/scheduler/Schedulers.kt @@ -1,7 +1,6 @@ package com.badoo.reaktive.scheduler import com.badoo.reaktive.utils.atomic.AtomicReference -import kotlin.native.concurrent.SharedImmutable /** * Provides the global instance of Main [Scheduler] @@ -33,27 +32,21 @@ val singleScheduler: Scheduler get() = singleSchedulerFactory.value.value */ val newThreadScheduler: Scheduler get() = newThreadSchedulerFactory.value.value -@SharedImmutable private val mainSchedulerFactory: AtomicReference> = AtomicReference(lazy(::createMainScheduler)) -@SharedImmutable private val computationSchedulerFactory: AtomicReference> = AtomicReference(lazy(::createComputationScheduler)) -@SharedImmutable private val ioSchedulerFactory: AtomicReference> = AtomicReference(lazy(::createIoScheduler)) -@SharedImmutable private val trampolineSchedulerFactory: AtomicReference> = AtomicReference(lazy(::createTrampolineScheduler)) -@SharedImmutable private val singleSchedulerFactory: AtomicReference> = AtomicReference(lazy(::createSingleScheduler)) -@SharedImmutable private val newThreadSchedulerFactory: AtomicReference> = AtomicReference(lazy(::createNewThreadScheduler)) diff --git a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/single/Various.kt b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/single/Various.kt index ac3543be9..77fc82605 100644 --- a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/single/Various.kt +++ b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/single/Various.kt @@ -2,7 +2,6 @@ package com.badoo.reaktive.single import com.badoo.reaktive.disposable.Disposable import com.badoo.reaktive.plugin.onAssembleSingle -import kotlin.native.concurrent.SharedImmutable /** * ⚠️ Advanced use only: creates an instance of [Single] without any safeguards by calling `onSubscribe` with a [SingleObserver]. @@ -38,7 +37,6 @@ fun singleOf(value: T): Single = */ fun T.toSingle(): Single = singleOf(this) -@SharedImmutable private val singleOfNever by lazy { singleUnsafe { observer -> observer.onSubscribe(Disposable()) diff --git a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/utils/UncaughtErrorHandler.kt b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/utils/UncaughtErrorHandler.kt index ec8a7a98f..ad287c10a 100644 --- a/reaktive/src/commonMain/kotlin/com/badoo/reaktive/utils/UncaughtErrorHandler.kt +++ b/reaktive/src/commonMain/kotlin/com/badoo/reaktive/utils/UncaughtErrorHandler.kt @@ -1,9 +1,7 @@ package com.badoo.reaktive.utils import com.badoo.reaktive.utils.atomic.AtomicReference -import kotlin.native.concurrent.SharedImmutable -@SharedImmutable @Suppress("ObjectPropertyName") private val _reaktiveUncaughtErrorHandler: AtomicReference<(Throwable) -> Unit> = AtomicReference(createDefaultUncaughtErrorHandler()) diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToCompletableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToCompletableTests.kt index fcb751905..c3a4869f5 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToCompletableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToCompletableTests.kt @@ -23,6 +23,9 @@ class CompletableToCompletableTestsImpl( transform: Completable.() -> Completable ) : CompletableToCompletableTests, SourceTests by SourceTestsImpl(TestCompletable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestCompletable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToMaybeTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToMaybeTests.kt index b54ca0ff4..5740cba67 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToMaybeTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToMaybeTests.kt @@ -25,6 +25,9 @@ class CompletableToMaybeTestsImpl( transform: Completable.() -> Maybe<*> ) : CompletableToMaybeTests, SourceTests by SourceTestsImpl(TestCompletable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestCompletable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToObservableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToObservableTests.kt index db79fe0ac..6fec80f91 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToObservableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToObservableTests.kt @@ -24,6 +24,9 @@ class CompletableToObservableTestsImpl( transform: Completable.() -> Observable<*> ) : CompletableToObservableTests, SourceTests by SourceTestsImpl(TestCompletable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestCompletable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToSingleTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToSingleTests.kt index 792291e58..4ea7aa623 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToSingleTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/completable/CompletableToSingleTests.kt @@ -20,6 +20,9 @@ class CompletableToSingleTestsImpl( transform: Completable.() -> Single<*> ) : CompletableToSingleTests, SourceTests by SourceTestsImpl(TestCompletable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestCompletable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToCompletableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToCompletableTests.kt index a618f96ce..dca2ceab5 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToCompletableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToCompletableTests.kt @@ -27,6 +27,9 @@ class MaybeToCompletableTestsImpl( transform: Maybe.() -> Completable ) : MaybeToCompletableTests, SourceTests by SourceTestsImpl(TestMaybe(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestMaybe() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToMaybeTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToMaybeTests.kt index 88b16e93d..f4f524355 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToMaybeTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToMaybeTests.kt @@ -26,6 +26,9 @@ class MaybeToMaybeTestsImpl( transform: Maybe.() -> Maybe<*> ) : MaybeToMaybeTests, SourceTests by SourceTestsImpl(TestMaybe(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestMaybe() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToObservableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToObservableTests.kt index f94864e16..54ba107b1 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToObservableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToObservableTests.kt @@ -29,6 +29,9 @@ class MaybeToObservableTestsImpl( transform: Maybe.() -> Observable<*> ) : MaybeToObservableTests, SourceTests by SourceTestsImpl(TestMaybe(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestMaybe() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToSingleTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToSingleTests.kt index e72565f27..d4aa7e24c 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToSingleTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/maybe/MaybeToSingleTests.kt @@ -23,6 +23,9 @@ class MaybeToSingleTestsImpl( transform: Maybe.() -> Single<*> ) : MaybeToSingleTests, SourceTests by SourceTestsImpl(TestMaybe(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestMaybe() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/AutoConnectTest.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/AutoConnectTest.kt index 4f058aa6d..69f566458 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/AutoConnectTest.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/AutoConnectTest.kt @@ -69,7 +69,7 @@ class AutoConnectTest { @Test fun does_not_connect_second_time_WHEN_subscriberCount_is_1_and_subscribed_second_time() { - var isConnected = false + var isConnected: Boolean val upstream = testUpstream(connect = { isConnected = true }) val autoConnect = upstream.autoConnect(subscriberCount = 1) autoConnect.test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToCompletableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToCompletableTests.kt index 80fccb82c..1db20a1b4 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToCompletableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToCompletableTests.kt @@ -24,6 +24,9 @@ class ObservableToCompletableTestsImpl( transform: Observable<*>.() -> Completable ) : ObservableToCompletableTests, SourceTests by SourceTestsImpl(TestObservable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestObservable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToMaybeTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToMaybeTests.kt index 9063467e0..20beed6c8 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToMaybeTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToMaybeTests.kt @@ -24,6 +24,9 @@ class ObservableToMaybeTestsImpl( transform: Observable<*>.() -> Maybe<*> ) : ObservableToMaybeTests, SourceTests by SourceTestsImpl(TestObservable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestObservable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToObservableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToObservableTests.kt index f6f351983..f3bc50412 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToObservableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToObservableTests.kt @@ -23,6 +23,9 @@ class ObservableToObservableTestsImpl( transform: Observable<*>.() -> Observable<*> ) : ObservableToObservableTests, SourceTests by SourceTestsImpl(TestObservable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestObservable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToSingleTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToSingleTests.kt index 11ef14539..00396f96d 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToSingleTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/ObservableToSingleTests.kt @@ -20,6 +20,9 @@ class ObservableToSingleTestsImpl( transform: Observable<*>.() -> Single<*> ) : ObservableToSingleTests, SourceTests by SourceTestsImpl(TestObservable(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestObservable() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/PublishGenericTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/PublishGenericTests.kt index 26934701c..a58197bdb 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/PublishGenericTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/PublishGenericTests.kt @@ -102,6 +102,9 @@ class PublishGenericTestsImpl( transform: Observable.() -> ConnectableObservable ) : PublishGenericTests { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestObservable() private val publish = upstream.transform() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/RefCountTest.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/RefCountTest.kt index 3bebc0a3d..f05751d69 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/RefCountTest.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/observable/RefCountTest.kt @@ -60,7 +60,7 @@ class RefCountTest { @Test fun does_not_connect_second_time_WHEN_subscriberCount_is_1_and_subscribed_second_time() { - var isConnected = false + var isConnected: Boolean val upstream = testUpstream(connect = { isConnected = true }) val refCount = upstream.refCount(subscriberCount = 1) refCount.test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToCompletableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToCompletableTests.kt index da19b8ae0..1c9329c2b 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToCompletableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToCompletableTests.kt @@ -20,6 +20,9 @@ class SingleToCompletableTestsImpl( transform: Single.() -> Completable ) : SingleToCompletableTests, SourceTests by SourceTestsImpl(TestSingle(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestSingle() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToMaybeTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToMaybeTests.kt index 85d4271c5..b131cef2c 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToMaybeTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToMaybeTests.kt @@ -20,6 +20,9 @@ class SingleToMaybeTestsImpl( transform: Single.() -> Maybe<*> ) : SingleToMaybeTests, SourceTests by SourceTestsImpl(TestSingle(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestSingle() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToObservableTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToObservableTests.kt index 3602cf7a7..e83a37479 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToObservableTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToObservableTests.kt @@ -20,6 +20,9 @@ class SingleToObservableTestsImpl( transform: Single.() -> Observable<*> ) : SingleToObservableTests, SourceTests by SourceTestsImpl(TestSingle(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestSingle() private val observer = upstream.transform().test() diff --git a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToSingleTests.kt b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToSingleTests.kt index 4028f81f9..76b086b06 100644 --- a/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToSingleTests.kt +++ b/reaktive/src/commonTest/kotlin/com/badoo/reaktive/single/SingleToSingleTests.kt @@ -19,6 +19,9 @@ class SingleToSingleTestsImpl( transform: Single.() -> Single<*> ) : SingleToSingleTests, SourceTests by SourceTestsImpl(TestSingle(), { transform().test() }) { + // See: https://youtrack.jetbrains.com/issue/KT-63132 + constructor() : this(transform = { error("Dummy") }) + private val upstream = TestSingle() private val observer = upstream.transform().test() diff --git a/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/test/DoInBackground.kt b/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/test/DoInBackground.kt index d8596885c..8fd350d51 100644 --- a/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/test/DoInBackground.kt +++ b/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/test/DoInBackground.kt @@ -1,8 +1,10 @@ package com.badoo.reaktive.test +import kotlin.native.concurrent.ObsoleteWorkersApi import kotlin.native.concurrent.TransferMode import kotlin.native.concurrent.Worker +@OptIn(ObsoleteWorkersApi::class) // No replacement yet internal actual fun doInBackground(block: () -> Unit) { Worker.start(errorReporting = true).execute(TransferMode.SAFE, { block }) { it() } } diff --git a/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/DelayQueueTest.kt b/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/DelayQueueTest.kt index 983ad9afa..92a8e02b1 100644 --- a/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/DelayQueueTest.kt +++ b/reaktive/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/DelayQueueTest.kt @@ -1,47 +1,50 @@ package com.badoo.reaktive.utils +import kotlin.native.concurrent.ObsoleteWorkersApi import kotlin.native.concurrent.TransferMode import kotlin.native.concurrent.Worker -import kotlin.system.getTimeMillis import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNull import kotlin.test.assertTrue import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.TimeSource +@OptIn(ObsoleteWorkersApi::class) // No replacement yet class DelayQueueTest { private val queue = DelayQueue() @Test fun provides_item_with_delay() { - val startMillis = getTimeMillis() + val startTime = TimeSource.Monotonic.markNow() queue.offer(0, 200.milliseconds) val value = queue.take() - assertTrue(getTimeMillis() - startMillis >= 200L) + startTime.elapsedNow() + assertTrue(startTime.elapsedNow() >= 200.milliseconds) assertEquals(0, value) } @Test fun provides_items_in_correct_order_and_with_correct_delays() { - val startMillis = getTimeMillis() + val startTime = TimeSource.Monotonic.markNow() queue.offer(2, 300.milliseconds) queue.offer(3, 500.milliseconds) queue.offer(1, 200.milliseconds) val v1 = queue.take() - val t1 = getTimeMillis() - startMillis + val t1 = startTime.elapsedNow() val v2 = queue.take() - val t2 = getTimeMillis() - startMillis + val t2 = startTime.elapsedNow() val v3 = queue.take() - val t3 = getTimeMillis() - startMillis + val t3 = startTime.elapsedNow() - assertTrue(t1 >= 200L) - assertTrue(t2 >= 300L) - assertTrue(t3 >= 500L) + assertTrue(t1 >= 200.milliseconds) + assertTrue(t2 >= 300.milliseconds) + assertTrue(t3 >= 500.milliseconds) assertEquals(1, v1) assertEquals(2, v2) assertEquals(3, v3) @@ -49,14 +52,14 @@ class DelayQueueTest { @Test fun removes_first_item() { - val startMillis = getTimeMillis() + val startTime = TimeSource.Monotonic.markNow() queue.offer(0, 200.milliseconds) queue.offer(1, 100.milliseconds) queue.removeFirst() val value = queue.take() - assertTrue(getTimeMillis() - startMillis >= 200L) + assertTrue(startTime.elapsedNow() >= 200.milliseconds) assertEquals(0, value) } diff --git a/utils-internal/src/darwinCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt b/utils-internal/src/darwinCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt index 336bf4baf..7489dc8fe 100644 --- a/utils-internal/src/darwinCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt +++ b/utils-internal/src/darwinCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt @@ -4,10 +4,9 @@ import com.badoo.reaktive.utils.InternalReaktiveApi import platform.Foundation.NSCondition import platform.Foundation.NSDate import platform.Foundation.dateWithTimeIntervalSinceNow -import kotlin.system.getTimeNanos import kotlin.time.Duration -import kotlin.time.Duration.Companion.nanoseconds import kotlin.time.DurationUnit +import kotlin.time.TimeSource @InternalReaktiveApi actual open class ConditionLock { @@ -31,10 +30,10 @@ actual open class ConditionLock { } private fun awaitTimed(timeout: Duration): Duration { - val startTime = getTimeNanos().nanoseconds + val startTime = TimeSource.Monotonic.markNow() condition.waitUntilDate(NSDate.dateWithTimeIntervalSinceNow(timeout.toDouble(DurationUnit.SECONDS))) - return startTime + timeout - getTimeNanos().nanoseconds + return startTime + timeout - TimeSource.Monotonic.markNow() } actual fun signal() { diff --git a/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicInt.kt b/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicInt.kt index 2c9097f34..e5a895b65 100644 --- a/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicInt.kt +++ b/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicInt.kt @@ -13,6 +13,5 @@ actual class AtomicInt actual constructor(initialValue: Int) : java.util.concurr // See KT-16087 override fun toByte(): Byte = value.toByte() - override fun toChar(): Char = value.toChar() override fun toShort(): Short = value.toShort() } diff --git a/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicLong.kt b/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicLong.kt index 95bac5164..cafaf4bbb 100644 --- a/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicLong.kt +++ b/utils-internal/src/jvmCommonMain/kotlin/com/badoo/reaktive/utils/atomic/AtomicLong.kt @@ -13,6 +13,5 @@ actual class AtomicLong actual constructor(initialValue: Long) : java.util.concu // See KT-16087 override fun toByte(): Byte = value.toByte() - override fun toChar(): Char = value.toInt().toChar() override fun toShort(): Short = value.toShort() } diff --git a/utils-internal/src/linuxCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt b/utils-internal/src/linuxCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt index 500de4291..b2cd79f40 100644 --- a/utils-internal/src/linuxCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt +++ b/utils-internal/src/linuxCommonMain/kotlin/com/badoo/reaktive/utils/lock/ConditionLock.kt @@ -30,11 +30,12 @@ import platform.posix.pthread_mutexattr_init import platform.posix.pthread_mutexattr_settype import platform.posix.pthread_mutexattr_t import platform.posix.timespec -import kotlin.native.internal.createCleaner -import kotlin.system.getTimeNanos +import kotlin.experimental.ExperimentalNativeApi +import kotlin.native.ref.createCleaner import kotlin.time.Duration import kotlin.time.Duration.Companion.nanoseconds import kotlin.time.Duration.Companion.seconds +import kotlin.time.TimeSource @OptIn(ExperimentalForeignApi::class) @InternalReaktiveApi @@ -47,7 +48,7 @@ actual open class ConditionLock { private val cond = arena.alloc() @Suppress("unused") // Must be stored in a property - @OptIn(ExperimentalStdlibApi::class) + @OptIn(ExperimentalNativeApi::class) private val cleaner = createCleaner(Resources(arena, mutexAttr, mutex, condAttr, cond), Resources::destroy) init { @@ -88,10 +89,10 @@ actual open class ConditionLock { memScoped { val ts = alloc { clock_gettime(CLOCK_MONOTONIC, ptr) } ts += timeout - val startNanos = getTimeNanos().nanoseconds + val startNanos = TimeSource.Monotonic.markNow() when (val result = pthread_cond_timedwait(cond.ptr, mutex.ptr, ts.ptr)) { - 0 -> startNanos + timeout - getTimeNanos().nanoseconds + 0 -> startNanos + timeout - TimeSource.Monotonic.markNow() ETIMEDOUT -> Duration.ZERO else -> error("Error waiting for condition: $result") } diff --git a/utils-internal/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/atomic/AtomicReferenceNativeTest.kt b/utils-internal/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/atomic/AtomicReferenceNativeTest.kt deleted file mode 100644 index 351ff50a9..000000000 --- a/utils-internal/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/atomic/AtomicReferenceNativeTest.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.badoo.reaktive.utils.atomic - -import kotlin.native.concurrent.isFrozen -import kotlin.test.Test -import kotlin.test.assertFalse - -class AtomicReferenceNativeTest { - - @Test - fun accepts_not_frozen_initial_value() { - AtomicReference(Any()) - } - - @Test - fun does_not_freeze_initial_value() { - val ref = AtomicReference(Any()) - - assertFalse(ref.value.isFrozen) - } - - @Test - fun does_not_freeze_new_value_IF_not_frozen() { - val ref = AtomicReference(Any()) - - ref.value = Any() - - assertFalse(ref.value.isFrozen) - } -} diff --git a/utils-internal/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/test/DoInBackground.kt b/utils-internal/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/test/DoInBackground.kt index 0256e7401..c76a66aee 100644 --- a/utils-internal/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/test/DoInBackground.kt +++ b/utils-internal/src/nativeCommonTest/kotlin/com/badoo/reaktive/utils/test/DoInBackground.kt @@ -1,9 +1,11 @@ package com.badoo.reaktive.utils.test +import kotlin.native.concurrent.ObsoleteWorkersApi import kotlin.native.concurrent.TransferMode import kotlin.native.concurrent.Worker import kotlin.native.concurrent.freeze +@OptIn(ObsoleteWorkersApi::class) // No replacement yet actual fun doInBackground(block: () -> Unit) { - Worker.start(errorReporting = true).execute(TransferMode.SAFE, { block.freeze() }) { it() } + Worker.start(errorReporting = true).execute(TransferMode.SAFE, { block }) { it() } }