diff --git a/app/src/main/java/com/hoc/flowmvi/App.kt b/app/src/main/java/com/hoc/flowmvi/App.kt index ab285f8f..8476125e 100644 --- a/app/src/main/java/com/hoc/flowmvi/App.kt +++ b/app/src/main/java/com/hoc/flowmvi/App.kt @@ -8,6 +8,7 @@ import com.hoc.flowmvi.domain.domainModule import com.hoc.flowmvi.ui.add.addModule import com.hoc.flowmvi.ui.main.mainModule import com.hoc.flowmvi.ui.search.searchModule +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import org.koin.android.ext.koin.androidContext @@ -15,7 +16,6 @@ import org.koin.android.ext.koin.androidLogger import org.koin.core.context.startKoin import org.koin.core.logger.Level import timber.log.Timber -import kotlin.time.ExperimentalTime @FlowPreview @ExperimentalCoroutinesApi diff --git a/app/src/test/java/com/hoc/flowmvi/CheckModulesTest.kt b/app/src/test/java/com/hoc/flowmvi/CheckModulesTest.kt index 71a3089f..67ca784a 100644 --- a/app/src/test/java/com/hoc/flowmvi/CheckModulesTest.kt +++ b/app/src/test/java/com/hoc/flowmvi/CheckModulesTest.kt @@ -4,6 +4,8 @@ import androidx.lifecycle.SavedStateHandle import com.hoc.flowmvi.test_utils.TestCoroutineDispatcherRule import io.mockk.every import io.mockk.mockk +import kotlin.test.Test +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import org.junit.Rule @@ -12,8 +14,6 @@ import org.koin.dsl.koinApplication import org.koin.test.AutoCloseKoinTest import org.koin.test.check.checkModules import org.koin.test.mock.MockProviderRule -import kotlin.test.Test -import kotlin.time.ExperimentalTime @ExperimentalStdlibApi @FlowPreview @@ -24,7 +24,7 @@ class CheckModulesTest : AutoCloseKoinTest() { val mockProvider = MockProviderRule.create { clazz -> when (clazz) { SavedStateHandle::class -> { - mockk() { + mockk { every { get(any()) } returns null } } diff --git a/build.gradle.kts b/build.gradle.kts index bf508faf..2e559fd7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,7 +15,7 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:7.2.1") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - classpath("com.diffplug.spotless:spotless-plugin-gradle:6.7.1") + classpath("com.diffplug.spotless:spotless-plugin-gradle:6.7.2") classpath("dev.ahmedmourad.nocopy:nocopy-gradle-plugin:1.4.0") classpath("org.jacoco:org.jacoco.core:0.8.8") classpath("com.vanniktech:gradle-android-junit-jacoco-plugin:0.17.0-SNAPSHOT") @@ -29,19 +29,34 @@ subprojects { apply(plugin = "com.github.ben-manes.versions") configure { + val EDITOR_CONFIG_KEYS: Set = hashSetOf( + "ij_kotlin_imports_layout", + "indent_size", + "end_of_line", + "charset" + ) + kotlin { target("**/*.kt") - ktlint(ktlintVersion).userData( - // TODO this should all come from editorconfig https://github.com/diffplug/spotless/issues/142 - mapOf( - "indent_size" to "2", - "ij_kotlin_imports_layout" to "*", - "end_of_line" to "lf", - "charset" to "utf-8" - ) + // TODO this should all come from editorconfig https://github.com/diffplug/spotless/issues/142 + val data = mapOf( + "indent_size" to "2", + "ij_kotlin_imports_layout" to "*", + "end_of_line" to "lf", + "charset" to "utf-8", + "disabled_rules" to arrayOf( + "experimental:package-name", + "experimental:trailing-comma", + "experimental:type-parameter-list-spacing", + ).joinToString(separator = ","), ) + ktlint(ktlintVersion) + .setUseExperimental(true) + .userData(data.filterKeys { it !in EDITOR_CONFIG_KEYS }) + .editorConfigOverride(data.filterKeys { it in EDITOR_CONFIG_KEYS }) + trimTrailingWhitespace() indentWithSpaces() endWithNewline() @@ -58,14 +73,16 @@ subprojects { kotlinGradle { target("**/*.gradle.kts", "*.gradle.kts") - ktlint(ktlintVersion).userData( - mapOf( - "indent_size" to "2", - "ij_kotlin_imports_layout" to "*", - "end_of_line" to "lf", - "charset" to "utf-8" - ) + val data = mapOf( + "indent_size" to "2", + "ij_kotlin_imports_layout" to "*", + "end_of_line" to "lf", + "charset" to "utf-8" ) + ktlint(ktlintVersion) + .setUseExperimental(true) + .userData(data.filterKeys { it !in EDITOR_CONFIG_KEYS }) + .editorConfigOverride(data.filterKeys { it in EDITOR_CONFIG_KEYS }) trimTrailingWhitespace() indentWithSpaces() @@ -114,8 +131,6 @@ allprojects { kotlinOptions { val version = JavaVersion.VERSION_11.toString() jvmTarget = version - sourceCompatibility = version - targetCompatibility = version } } diff --git a/buildSrc/src/main/kotlin/deps.kt b/buildSrc/src/main/kotlin/deps.kt index 0792927c..39c3f9b7 100644 --- a/buildSrc/src/main/kotlin/deps.kt +++ b/buildSrc/src/main/kotlin/deps.kt @@ -6,8 +6,8 @@ import org.gradle.kotlin.dsl.project import org.gradle.plugin.use.PluginDependenciesSpec import org.gradle.plugin.use.PluginDependencySpec -const val ktlintVersion = "0.44.0" -const val kotlinVersion = "1.6.21" +const val ktlintVersion = "0.45.2" +const val kotlinVersion = "1.7.0" object appConfig { const val applicationId = "com.hoc.flowmvi" diff --git a/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt index 9e2e5e61..44f910a6 100644 --- a/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt +++ b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/FlowBinding.kt @@ -8,13 +8,13 @@ import androidx.appcompat.widget.SearchView import androidx.core.widget.doOnTextChanged import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.hoc081098.flowext.startWith +import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.take import timber.log.Timber -import kotlin.coroutines.EmptyCoroutineContext internal fun checkMainThread() { check(Looper.myLooper() == Looper.getMainLooper()) { diff --git a/data/src/main/java/com/hoc/flowmvi/data/DataModule.kt b/data/src/main/java/com/hoc/flowmvi/data/DataModule.kt index 3852c7f2..9fd02a0e 100644 --- a/data/src/main/java/com/hoc/flowmvi/data/DataModule.kt +++ b/data/src/main/java/com/hoc/flowmvi/data/DataModule.kt @@ -9,6 +9,8 @@ import com.hoc.flowmvi.domain.repository.UserRepository import com.squareup.moshi.Moshi import com.squareup.moshi.adapter import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import java.util.concurrent.TimeUnit +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import okhttp3.OkHttpClient @@ -19,8 +21,6 @@ import org.koin.core.qualifier.named import org.koin.dsl.module import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory -import java.util.concurrent.TimeUnit -import kotlin.time.ExperimentalTime internal val BASE_URL_QUALIFIER = named("BASE_URL") internal val ERROR_RESPONSE_JSON_ADAPTER = named("ERROR_RESPONSE_JSON_ADAPTER") diff --git a/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt b/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt index b9b7fce1..9297e6c1 100644 --- a/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt +++ b/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt @@ -1,5 +1,6 @@ package com.hoc.flowmvi.data +import arrow.core.Either.Companion.catch as catchEither import arrow.core.ValidatedNel import arrow.core.continuations.either import arrow.core.left @@ -16,6 +17,9 @@ import com.hoc.flowmvi.domain.model.UserError import com.hoc.flowmvi.domain.model.UserValidationError import com.hoc.flowmvi.domain.repository.UserRepository import com.hoc081098.flowext.retryWithExponentialBackoff +import java.io.IOException +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow @@ -29,10 +33,6 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.scan import kotlinx.coroutines.withContext import timber.log.Timber -import java.io.IOException -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime -import arrow.core.Either.Companion.catch as catchEither @FlowPreview @ExperimentalTime diff --git a/data/src/main/java/com/hoc/flowmvi/data/mapper/UserErrorMapper.kt b/data/src/main/java/com/hoc/flowmvi/data/mapper/UserErrorMapper.kt index 9125621a..71d36900 100644 --- a/data/src/main/java/com/hoc/flowmvi/data/mapper/UserErrorMapper.kt +++ b/data/src/main/java/com/hoc/flowmvi/data/mapper/UserErrorMapper.kt @@ -5,12 +5,12 @@ import com.hoc.flowmvi.core.Mapper import com.hoc.flowmvi.data.remote.ErrorResponse import com.hoc.flowmvi.domain.model.UserError import com.squareup.moshi.JsonAdapter -import okhttp3.ResponseBody -import retrofit2.HttpException import java.io.IOException import java.net.SocketException import java.net.SocketTimeoutException import java.net.UnknownHostException +import okhttp3.ResponseBody +import retrofit2.HttpException internal class UserErrorMapper(private val errorResponseJsonAdapter: JsonAdapter) : Mapper { diff --git a/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplRealAPITest.kt b/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplRealAPITest.kt index c23917bf..3604a43a 100644 --- a/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplRealAPITest.kt +++ b/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplRealAPITest.kt @@ -4,6 +4,11 @@ import android.util.Log import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers import com.hoc.flowmvi.domain.repository.UserRepository import com.hoc.flowmvi.test_utils.getOrThrow +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import kotlin.test.Test +import kotlin.test.assertTrue +import kotlin.time.ExperimentalTime import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main @@ -20,11 +25,6 @@ import org.koin.test.KoinTest import org.koin.test.KoinTestRule import org.koin.test.inject import timber.log.Timber -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter -import kotlin.test.Test -import kotlin.test.assertTrue -import kotlin.time.ExperimentalTime @FlowPreview @ExperimentalCoroutinesApi diff --git a/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplTest.kt b/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplTest.kt index 52e17ba0..cd5fcf78 100644 --- a/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplTest.kt +++ b/data/src/test/java/com/hoc/flowmvi/data/UserRepositoryImplTest.kt @@ -24,14 +24,6 @@ import io.mockk.every import io.mockk.mockk import io.mockk.verify import io.mockk.verifySequence -import kotlinx.coroutines.CoroutineStart -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.launch -import kotlinx.coroutines.test.runTest -import org.junit.Rule import java.io.IOException import kotlin.test.AfterTest import kotlin.test.BeforeTest @@ -42,6 +34,14 @@ import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue import kotlin.time.ExperimentalTime +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.runTest +import org.junit.Rule private val USER_BODY = UserBody( email = "email1@gmail.com", diff --git a/data/src/test/java/com/hoc/flowmvi/data/mapper/UserErrorMapperTest.kt b/data/src/test/java/com/hoc/flowmvi/data/mapper/UserErrorMapperTest.kt index 68d79432..9daeac95 100644 --- a/data/src/test/java/com/hoc/flowmvi/data/mapper/UserErrorMapperTest.kt +++ b/data/src/test/java/com/hoc/flowmvi/data/mapper/UserErrorMapperTest.kt @@ -5,19 +5,19 @@ import com.hoc.flowmvi.domain.model.UserError import com.squareup.moshi.Moshi import com.squareup.moshi.adapter import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.ResponseBody.Companion.toResponseBody -import retrofit2.HttpException -import retrofit2.Response import java.io.IOException import java.net.SocketException import java.net.SocketTimeoutException import java.net.UnknownHostException +import kotlin.coroutines.cancellation.CancellationException as KotlinCancellationException import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith -import kotlin.coroutines.cancellation.CancellationException as KotlinCancellationException import kotlinx.coroutines.CancellationException as KotlinXCancellationException +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.ResponseBody.Companion.toResponseBody +import retrofit2.HttpException +import retrofit2.Response @ExperimentalStdlibApi class UserErrorMapperTest { diff --git a/domain/src/test/java/com/hoc/flowmvi/domain/Email_FirstName_LastName_Test.kt b/domain/src/test/java/com/hoc/flowmvi/domain/Email_FirstName_LastName_Test.kt index 3f1e8219..af75b925 100644 --- a/domain/src/test/java/com/hoc/flowmvi/domain/Email_FirstName_LastName_Test.kt +++ b/domain/src/test/java/com/hoc/flowmvi/domain/Email_FirstName_LastName_Test.kt @@ -5,10 +5,10 @@ import com.hoc.flowmvi.domain.model.Email import com.hoc.flowmvi.domain.model.FirstName import com.hoc.flowmvi.domain.model.LastName import com.hoc.flowmvi.domain.model.UserValidationError -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import kotlinx.coroutines.ExperimentalCoroutinesApi @ExperimentalCoroutinesApi @Suppress("ClassName") diff --git a/domain/src/test/java/com/hoc/flowmvi/domain/UseCaseTest.kt b/domain/src/test/java/com/hoc/flowmvi/domain/UseCaseTest.kt index af430476..a0bbb45e 100644 --- a/domain/src/test/java/com/hoc/flowmvi/domain/UseCaseTest.kt +++ b/domain/src/test/java/com/hoc/flowmvi/domain/UseCaseTest.kt @@ -19,15 +19,15 @@ import io.mockk.confirmVerified import io.mockk.every import io.mockk.mockk import io.mockk.verify +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Rule -import kotlin.test.AfterTest -import kotlin.test.BeforeTest -import kotlin.test.Test -import kotlin.test.assertEquals private val USERS = listOf( User.create( diff --git a/feature-add/src/test/java/com/hoc/flowmvi/ui/add/AddVMTest.kt b/feature-add/src/test/java/com/hoc/flowmvi/ui/add/AddVMTest.kt index b5e16cae..0f03a327 100644 --- a/feature-add/src/test/java/com/hoc/flowmvi/ui/add/AddVMTest.kt +++ b/feature-add/src/test/java/com/hoc/flowmvi/ui/add/AddVMTest.kt @@ -18,10 +18,10 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.confirmVerified import io.mockk.mockk -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.flowOf import kotlin.test.Test import kotlin.time.ExperimentalTime +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.flowOf private val ALL_ERRORS = UserValidationError.values().toSet() private const val EMAIL = "hoc081098@gmail.com" diff --git a/feature-main/src/test/java/com/hoc/flowmvi/ui/main/MainVMTest.kt b/feature-main/src/test/java/com/hoc/flowmvi/ui/main/MainVMTest.kt index 20ffb36f..c0a295e8 100644 --- a/feature-main/src/test/java/com/hoc/flowmvi/ui/main/MainVMTest.kt +++ b/feature-main/src/test/java/com/hoc/flowmvi/ui/main/MainVMTest.kt @@ -19,26 +19,24 @@ import io.mockk.confirmVerified import io.mockk.every import io.mockk.mockk import io.mockk.verify +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.update -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertIs -import kotlin.time.ExperimentalTime @ExperimentalTime @ExperimentalCoroutinesApi @FlowPreview -class MainVMTest : BaseMviViewModelTest< - ViewIntent, +class MainVMTest : BaseMviViewModelTest() { + MainVM>() { private lateinit var vm: MainVM private lateinit var getUserUseCase: GetUsersUseCase private lateinit var refreshGetUsersUseCase: RefreshGetUsersUseCase diff --git a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt index e31d508b..746d66d5 100644 --- a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt +++ b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt @@ -21,6 +21,7 @@ import com.hoc.flowmvi.domain.model.UserError import com.hoc.flowmvi.mvi_base.AbstractMviActivity import com.hoc.flowmvi.ui.search.databinding.ActivitySearchBinding import com.hoc081098.viewbindingdelegate.viewBinding +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.channels.Channel @@ -32,7 +33,6 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import org.koin.androidx.viewmodel.ext.android.stateViewModel import timber.log.Timber -import kotlin.time.ExperimentalTime @ExperimentalCoroutinesApi @FlowPreview diff --git a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchModule.kt b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchModule.kt index a7195932..e0d6d785 100644 --- a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchModule.kt +++ b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchModule.kt @@ -1,13 +1,13 @@ package com.hoc.flowmvi.ui.search import com.hoc.flowmvi.core_ui.navigator.IntentProviders +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.core.module.dsl.bind import org.koin.core.module.dsl.singleOf import org.koin.dsl.module -import kotlin.time.ExperimentalTime @JvmField @ExperimentalCoroutinesApi diff --git a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt index f234f1ba..3b21094d 100644 --- a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt +++ b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchVM.kt @@ -9,6 +9,8 @@ import com.hoc081098.flowext.flatMapFirst import com.hoc081098.flowext.flowFromSuspend import com.hoc081098.flowext.startWith import com.hoc081098.flowext.takeUntil +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow @@ -28,8 +30,6 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.scan import kotlinx.coroutines.flow.stateIn import timber.log.Timber -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime @FlowPreview @ExperimentalTime diff --git a/feature-search/src/test/java/com/hoc/flowmvi/ui/search/SearchVMTest.kt b/feature-search/src/test/java/com/hoc/flowmvi/ui/search/SearchVMTest.kt index da9514bf..9e29b66b 100644 --- a/feature-search/src/test/java/com/hoc/flowmvi/ui/search/SearchVMTest.kt +++ b/feature-search/src/test/java/com/hoc/flowmvi/ui/search/SearchVMTest.kt @@ -18,6 +18,9 @@ import io.mockk.coVerify import io.mockk.coVerifySequence import io.mockk.confirmVerified import io.mockk.mockk +import kotlin.test.Test +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.delay @@ -26,9 +29,6 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onEach -import kotlin.test.Test -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime @ExperimentalCoroutinesApi @FlowPreview diff --git a/mvi/mvi-base/src/androidTest/java/com/hoc/flowmvi/mvi_base/ExampleInstrumentedTest.kt b/mvi/mvi-base/src/androidTest/java/com/hoc/flowmvi/mvi_base/ExampleInstrumentedTest.kt index 53dd6e35..25e75cae 100644 --- a/mvi/mvi-base/src/androidTest/java/com/hoc/flowmvi/mvi_base/ExampleInstrumentedTest.kt +++ b/mvi/mvi-base/src/androidTest/java/com/hoc/flowmvi/mvi_base/ExampleInstrumentedTest.kt @@ -2,9 +2,9 @@ package com.hoc.flowmvi.mvi_base import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import kotlin.test.assertEquals import org.junit.Test import org.junit.runner.RunWith -import kotlin.test.assertEquals /** * Instrumented test, which will execute on an Android device. diff --git a/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviActivity.kt b/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviActivity.kt index 3ccbe35a..f2896328 100644 --- a/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviActivity.kt +++ b/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviActivity.kt @@ -9,12 +9,10 @@ import com.hoc.flowmvi.core_ui.collectIn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -abstract class AbstractMviActivity< - I : MviIntent, +abstract class AbstractMviActivity, - >( + VM : MviViewModel,>( @LayoutRes contentLayoutId: Int, ) : AppCompatActivity(contentLayoutId), MviView { diff --git a/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviViewModel.kt b/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviViewModel.kt index c2609e77..2036d336 100644 --- a/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviViewModel.kt +++ b/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/AbstractMviViewModel.kt @@ -5,6 +5,8 @@ import androidx.annotation.CallSuper import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.hoc.flowmvi.core.dispatchers.AppCoroutineDispatchers +import kotlin.LazyThreadSafetyMode.PUBLICATION +import kotlin.coroutines.ContinuationInterceptor import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.flow.Flow @@ -18,8 +20,6 @@ import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.withContext import timber.log.Timber -import kotlin.LazyThreadSafetyMode.PUBLICATION -import kotlin.coroutines.ContinuationInterceptor abstract class AbstractMviViewModel( private val appCoroutineDispatchers: AppCoroutineDispatchers, diff --git a/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/MviView.kt b/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/MviView.kt index c0859ee3..62f5dc16 100644 --- a/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/MviView.kt +++ b/mvi/mvi-base/src/main/java/com/hoc/flowmvi/mvi_base/MviView.kt @@ -13,11 +13,9 @@ import kotlinx.coroutines.flow.Flow * @param S Top class of the [MviViewState] the [MviView] will be subscribing to. * @param E Top class of the [MviSingleEvent] the [MviView] will be subscribing to. */ -interface MviView< - I : MviIntent, +interface MviView { + E : MviSingleEvent,> { /** * Entry point for the [MviView] to render itself based on a [MviViewState]. */ diff --git a/mvi/mvi-testing/build.gradle.kts b/mvi/mvi-testing/build.gradle.kts index 6613add3..f7d3a528 100644 --- a/mvi/mvi-testing/build.gradle.kts +++ b/mvi/mvi-testing/build.gradle.kts @@ -21,7 +21,7 @@ android { buildConfigField( type = it::class.java.simpleName, name = "ENABLE_LOG_TEST", - value = it.toString(), + value = it.toString() ) } } @@ -35,7 +35,7 @@ android { buildConfigField( type = it::class.java.simpleName, name = "ENABLE_LOG_TEST", - value = it.toString(), + value = it.toString() ) } } diff --git a/mvi/mvi-testing/src/androidTest/java/com/flowmvi/mvi_testing/ExampleInstrumentedTest.kt b/mvi/mvi-testing/src/androidTest/java/com/flowmvi/mvi_testing/ExampleInstrumentedTest.kt index bde64a57..4443af63 100644 --- a/mvi/mvi-testing/src/androidTest/java/com/flowmvi/mvi_testing/ExampleInstrumentedTest.kt +++ b/mvi/mvi-testing/src/androidTest/java/com/flowmvi/mvi_testing/ExampleInstrumentedTest.kt @@ -2,9 +2,9 @@ package com.flowmvi.mvi_testing import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import org.junit.runner.RunWith import kotlin.test.Test import kotlin.test.assertEquals +import org.junit.runner.RunWith /** * Instrumented test, which will execute on an Android device. diff --git a/mvi/mvi-testing/src/main/java/com/hoc/flowmvi/mvi_testing/BaseMviViewModelTest.kt b/mvi/mvi-testing/src/main/java/com/hoc/flowmvi/mvi_testing/BaseMviViewModelTest.kt index 655f6ac6..b2aed025 100644 --- a/mvi/mvi-testing/src/main/java/com/hoc/flowmvi/mvi_testing/BaseMviViewModelTest.kt +++ b/mvi/mvi-testing/src/main/java/com/hoc/flowmvi/mvi_testing/BaseMviViewModelTest.kt @@ -11,6 +11,11 @@ import com.hoc.flowmvi.test_utils.TestCoroutineDispatcherRule import io.mockk.MockKAdditionalAnswerScope import io.mockk.MockKStubScope import io.mockk.clearAllMocks +import java.util.LinkedList +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.assertEquals +import kotlin.time.ExperimentalTime import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.cancelAndJoin @@ -25,11 +30,6 @@ import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Rule -import java.util.LinkedList -import kotlin.test.AfterTest -import kotlin.test.BeforeTest -import kotlin.test.assertEquals -import kotlin.time.ExperimentalTime fun Iterable.mapRight(): List Unit, T>> = map { it.right() } @@ -63,12 +63,10 @@ infix fun MockKStubScope.returnsManyWithDelay(values: List) { @ExperimentalTime @ExperimentalCoroutinesApi -abstract class BaseMviViewModelTest< - I : MviIntent, +abstract class BaseMviViewModelTest, - > { + VM : MviViewModel,> { @get:Rule val coroutineRule = TestCoroutineDispatcherRule( testDispatcher = UnconfinedTestDispatcher(