From e6fa41db81535e345a1b6d35b94b72f51e0eeafb Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 11:04:28 -0700 Subject: [PATCH 1/8] Fix errors in tests in the data module --- .../repository/OfflineFirstNewsRepository.kt | 6 ++++-- .../OfflineFirstTopicsRepository.kt | 3 ++- .../OfflineFirstNewsRepositoryTest.kt | 20 +++++++++---------- .../OfflineFirstTopicsRepositoryTest.kt | 17 ++++++++++------ 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt index 02c75c04a..5b3dc8769 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt @@ -22,7 +22,9 @@ import com.google.samples.apps.nowinandroid.core.data.model.asEntity import com.google.samples.apps.nowinandroid.core.data.model.topicCrossReferences import com.google.samples.apps.nowinandroid.core.data.model.topicEntityShells import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDao +import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDaoInterface import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao +import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface import com.google.samples.apps.nowinandroid.core.database.model.PopulatedNewsResource import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel @@ -48,8 +50,8 @@ private const val SYNC_BATCH_SIZE = 40 @Inject internal class OfflineFirstNewsRepository( private val niaPreferencesDataSource: NiaPreferencesDataSource, - private val newsResourceDao: NewsResourceDao, - private val topicDao: TopicDao, + private val newsResourceDao: NewsResourceDaoInterface, + private val topicDao: TopicDaoInterface, private val network: NiaNetworkDataSource, private val notifier: Notifier, ) : NewsRepository { diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt index 864be34e6..ada9d032f 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt @@ -20,6 +20,7 @@ import com.google.samples.apps.nowinandroid.core.data.Synchronizer import com.google.samples.apps.nowinandroid.core.data.changeListSync import com.google.samples.apps.nowinandroid.core.data.model.asEntity import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao +import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.datastore.ChangeListVersions @@ -36,7 +37,7 @@ import me.tatarka.inject.annotations.Inject */ @Inject internal class OfflineFirstTopicsRepository( - private val topicDao: TopicDao, + private val topicDao: TopicDaoInterface, private val network: NiaNetworkDataSource, ) : TopicsRepository { diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt index 70af5f12b..9b0e03439 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt @@ -32,18 +32,17 @@ import com.google.samples.apps.nowinandroid.core.database.model.PopulatedNewsRes import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSource -import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.testing.notifications.TestNotifier +import com.russhwolf.settings.MapSettings +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest -import org.junit.Rule -import org.junit.rules.TemporaryFolder import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals @@ -51,7 +50,10 @@ import kotlin.test.assertTrue class OfflineFirstNewsRepositoryTest { - private val testScope = TestScope(UnconfinedTestDispatcher()) + @OptIn(ExperimentalCoroutinesApi::class) + private val dispatcher = UnconfinedTestDispatcher() + + private val testScope = TestScope(dispatcher) private lateinit var subject: OfflineFirstNewsRepository @@ -67,13 +69,11 @@ class OfflineFirstNewsRepositoryTest { private lateinit var synchronizer: Synchronizer - @get:Rule - val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() - @BeforeTest fun setup() { niaPreferencesDataSource = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore(testScope), + settings = MapSettings(), + dispatcher = dispatcher, ) newsResourceDao = TestNewsResourceDao() topicDao = TestTopicDao() @@ -176,7 +176,7 @@ class OfflineFirstNewsRepositoryTest { // Delete half of the items on the network val deletedItems = newsResourcesFromNetwork .map(NewsResource::id) - .partition { it.chars().sum() % 2 == 0 } + .partition { it.length % 2 == 0 } .first .toSet() @@ -327,7 +327,7 @@ class OfflineFirstNewsRepositoryTest { val followedTopicIds = networkNewsResources .flatMap(NetworkNewsResource::topicEntityShells) .mapNotNull { topic -> - when (topic.id.chars().sum() % 2) { + when (topic.id.length % 2) { 0 -> topic.id else -> null } diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt index fef25ea4b..30cb7f2ed 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt @@ -21,13 +21,14 @@ import com.google.samples.apps.nowinandroid.core.data.model.asEntity import com.google.samples.apps.nowinandroid.core.data.testdoubles.CollectionType import com.google.samples.apps.nowinandroid.core.data.testdoubles.TestNiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.data.testdoubles.TestTopicDao -import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao +import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSource -import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic +import com.russhwolf.settings.MapSettings +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -38,11 +39,14 @@ import kotlin.test.assertEquals class OfflineFirstTopicsRepositoryTest { - private val testScope = TestScope(UnconfinedTestDispatcher()) + @OptIn(ExperimentalCoroutinesApi::class) + private val dispatcher = UnconfinedTestDispatcher() + + private val testScope = TestScope(dispatcher) private lateinit var subject: OfflineFirstTopicsRepository - private lateinit var topicDao: TopicDao + private lateinit var topicDao: TopicDaoInterface private lateinit var network: TestNiaNetworkDataSource @@ -55,7 +59,8 @@ class OfflineFirstTopicsRepositoryTest { topicDao = TestTopicDao() network = TestNiaNetworkDataSource() niaPreferences = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore(testScope), + settings = MapSettings(), + dispatcher = dispatcher, ) synchronizer = TestSynchronizer(niaPreferences) @@ -140,7 +145,7 @@ class OfflineFirstTopicsRepositoryTest { // Delete half of the items on the network val deletedItems = networkTopics .map(Topic::id) - .partition { it.chars().sum() % 2 == 0 } + .partition { it.length % 2 == 0 } .first .toSet() From 8d3aa5c5c620e11c6960baddde13352d99a91603 Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 11:22:37 -0700 Subject: [PATCH 2/8] Add back datastore-proto module --- core/datastore-proto/build.gradle.kts | 50 +++++++++++++++++ .../core/datastore/DarkThemeConfigProto.kt | 24 +++++++++ .../core/datastore/ThemeBrandProto.kt | 23 ++++++++ .../core/datastore/UserPreferences.kt | 53 +++++++++++++++++++ .../nowinandroid/data/dark_theme_config.proto | 27 ++++++++++ .../apps/nowinandroid/data/theme_brand.proto | 26 +++++++++ .../nowinandroid/data/user_preferences.proto | 53 +++++++++++++++++++ core/datastore/build.gradle.kts | 1 + settings.gradle.kts | 1 + 9 files changed, 258 insertions(+) create mode 100644 core/datastore-proto/build.gradle.kts create mode 100644 core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto.kt create mode 100644 core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/ThemeBrandProto.kt create mode 100644 core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt create mode 100644 core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/dark_theme_config.proto create mode 100644 core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/theme_brand.proto create mode 100644 core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto diff --git a/core/datastore-proto/build.gradle.kts b/core/datastore-proto/build.gradle.kts new file mode 100644 index 000000000..cd160b9ba --- /dev/null +++ b/core/datastore-proto/build.gradle.kts @@ -0,0 +1,50 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + alias(libs.plugins.nowinandroid.kmp.library) + alias(libs.plugins.protobuf) + id("kotlinx-serialization") +} + +android { + namespace = "com.google.samples.apps.nowinandroid.core.datastore.proto" +} + +// Setup protobuf configuration, generating lite Java and Kotlin classes +protobuf { + protoc { + artifact = libs.protobuf.protoc.get().toString() + } + generateProtoTasks { + all().forEach { task -> + task.builtins { + register("kotlin") { + option("lite") + } + } + } + } +} + +kotlin { + sourceSets { + commonMain.dependencies { + api(libs.protobuf.kotlin.lite) + implementation(libs.kotlinx.serialization.core) + } + } +} diff --git a/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto.kt b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto.kt new file mode 100644 index 000000000..38c047828 --- /dev/null +++ b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/DarkThemeConfigProto.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.datastore + +enum class DarkThemeConfigProto { + DARK_THEME_CONFIG_UNSPECIFIED, + DARK_THEME_CONFIG_FOLLOW_SYSTEM, + DARK_THEME_CONFIG_LIGHT, + DARK_THEME_CONFIG_DARK, +} diff --git a/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/ThemeBrandProto.kt b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/ThemeBrandProto.kt new file mode 100644 index 000000000..1b10258ff --- /dev/null +++ b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/ThemeBrandProto.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.datastore + +enum class ThemeBrandProto { + THEME_BRAND_UNSPECIFIED, + THEME_BRAND_DEFAULT, + THEME_BRAND_ANDROID, +} diff --git a/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt new file mode 100644 index 000000000..f8168fc0c --- /dev/null +++ b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.datastore + +import com.google.samples.apps.nowinandroid.core.datastore.DarkThemeConfigProto.DARK_THEME_CONFIG_FOLLOW_SYSTEM +import com.google.samples.apps.nowinandroid.core.datastore.ThemeBrandProto.THEME_BRAND_UNSPECIFIED +import kotlinx.serialization.Serializable + +// A lot of workaround brought by Proto +@Serializable +data class UserPreferences( + val topicChangeListVersion: Int, + val authorChangeListVersion: Int, + val newsResourceChangeListVersion: Int, + val hasDoneIntToStringIdMigration: Boolean, + val hasDoneListToMapMigration: Boolean, + val followedTopicIds: Set = emptySet(), + val followedAuthorIds: Set = emptySet(), + val bookmarkedNewsResourceIds: Set = emptySet(), + val viewedNewsResourceIds: Set = emptySet(), + val themeBrand: ThemeBrandProto, + val darkThemeConfig: DarkThemeConfigProto, + val shouldHideOnboarding: Boolean, + val useDynamicColor: Boolean, +) { + companion object { + val DEFAULT = UserPreferences( + topicChangeListVersion = 0, + authorChangeListVersion = 0, + newsResourceChangeListVersion = 0, + hasDoneIntToStringIdMigration = false, + hasDoneListToMapMigration = false, + themeBrand = THEME_BRAND_UNSPECIFIED, + darkThemeConfig = DARK_THEME_CONFIG_FOLLOW_SYSTEM, + shouldHideOnboarding = false, + useDynamicColor = false, + ) + } +} diff --git a/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/dark_theme_config.proto b/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/dark_theme_config.proto new file mode 100644 index 000000000..82bac8366 --- /dev/null +++ b/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/dark_theme_config.proto @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto3"; + +option java_package = "com.google.samples.apps.nowinandroid.core.datastore"; +option java_multiple_files = true; + +enum DarkThemeConfigProto { + DARK_THEME_CONFIG_UNSPECIFIED = 0; + DARK_THEME_CONFIG_FOLLOW_SYSTEM = 1; + DARK_THEME_CONFIG_LIGHT = 2; + DARK_THEME_CONFIG_DARK = 3; +} diff --git a/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/theme_brand.proto b/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/theme_brand.proto new file mode 100644 index 000000000..8bcf5859b --- /dev/null +++ b/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/theme_brand.proto @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto3"; + +option java_package = "com.google.samples.apps.nowinandroid.core.datastore"; +option java_multiple_files = true; + +enum ThemeBrandProto { + THEME_BRAND_UNSPECIFIED = 0; + THEME_BRAND_DEFAULT = 1; + THEME_BRAND_ANDROID = 2; +} diff --git a/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto b/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto new file mode 100644 index 000000000..11386613c --- /dev/null +++ b/core/datastore-proto/src/commonMain/proto/com/google/samples/apps/nowinandroid/data/user_preferences.proto @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto3"; + +import "com/google/samples/apps/nowinandroid/data/dark_theme_config.proto"; +import "com/google/samples/apps/nowinandroid/data/theme_brand.proto"; + +option java_package = "com.google.samples.apps.nowinandroid.core.datastore"; +option java_multiple_files = true; + +message UserPreferences { + reserved 2; + repeated int32 deprecated_int_followed_topic_ids = 1; + int32 topicChangeListVersion = 3; + int32 authorChangeListVersion = 4; + int32 newsResourceChangeListVersion = 6; + repeated int32 deprecated_int_followed_author_ids = 7; + bool has_done_int_to_string_id_migration = 8; + repeated string deprecated_followed_topic_ids = 9; + repeated string deprecated_followed_author_ids = 10; + repeated string deprecated_bookmarked_news_resource_ids = 11; + bool has_done_list_to_map_migration = 12; + + // Each map is used to store a set of string IDs. The bool has no meaning, but proto3 doesn't + // have a Set type so this is the closest we can get to a Set. + map followed_topic_ids = 13; + map followed_author_ids = 14; + map bookmarked_news_resource_ids = 15; + map viewed_news_resource_ids = 20; + + ThemeBrandProto theme_brand = 16; + DarkThemeConfigProto dark_theme_config = 17; + + bool should_hide_onboarding = 18; + + bool use_dynamic_color = 19; + + // NEXT AVAILABLE ID: 21 +} diff --git a/core/datastore/build.gradle.kts b/core/datastore/build.gradle.kts index 9e28bae6e..ffa4331da 100644 --- a/core/datastore/build.gradle.kts +++ b/core/datastore/build.gradle.kts @@ -42,6 +42,7 @@ kotlin { implementation(libs.kotlinx.serialization.core) implementation(projects.core.model) implementation(projects.core.common) + implementation(projects.core.datastoreProto) } commonTest.dependencies { implementation(libs.multiplatform.settings.test) diff --git a/settings.gradle.kts b/settings.gradle.kts index e1b0eddfa..e7b6d8b06 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -45,6 +45,7 @@ include(":core:data") include(":core:data-test") include(":core:database") include(":core:datastore") +include(":core:datastore-proto") include(":core:designsystem") include(":core:domain") include(":core:model") From 277bfb744dd2d77301c719cd1998852aaadf319a Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 11:33:26 -0700 Subject: [PATCH 3/8] Import correct dependencies for data and testing module --- core/data/build.gradle.kts | 1 + .../data/repository/CompositeUserNewsResourceRepository.kt | 2 ++ .../core/data/repository/DefaultSearchContentsRepository.kt | 2 ++ .../core/data/repository/OfflineFirstUserDataRepositoryTest.kt | 3 ++- core/testing/build.gradle.kts | 3 --- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts index bb16a65de..6494bdec3 100644 --- a/core/data/build.gradle.kts +++ b/core/data/build.gradle.kts @@ -43,6 +43,7 @@ kotlin { } commonTest.dependencies { + implementation(libs.multiplatform.settings) implementation(libs.multiplatform.settings.test) implementation(libs.kotlinx.serialization.json) implementation(projects.core.testing) diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/CompositeUserNewsResourceRepository.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/CompositeUserNewsResourceRepository.kt index a02967bf2..d518edf7b 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/CompositeUserNewsResourceRepository.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/CompositeUserNewsResourceRepository.kt @@ -18,6 +18,7 @@ package com.google.samples.apps.nowinandroid.core.data.repository import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource import com.google.samples.apps.nowinandroid.core.model.data.mapToUserNewsResources +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged @@ -30,6 +31,7 @@ import me.tatarka.inject.annotations.Inject * Implements a [UserNewsResourceRepository] by combining a [NewsRepository] with a * [UserDataRepository]. */ +@OptIn(ExperimentalCoroutinesApi::class) @Inject class CompositeUserNewsResourceRepository( val newsRepository: NewsRepository, diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt index 7b6b48e8d..e76093691 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt @@ -25,6 +25,7 @@ import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.database.model.asFtsEntity import com.google.samples.apps.nowinandroid.core.di.IODispatcher import com.google.samples.apps.nowinandroid.core.model.data.SearchResult +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged @@ -34,6 +35,7 @@ import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.withContext import me.tatarka.inject.annotations.Inject +@OptIn(ExperimentalCoroutinesApi::class) @Inject internal class DefaultSearchContentsRepository( private val newsResourceDao: NewsResourceDao, diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt index 84cec3c03..e62a5c4c1 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt @@ -22,6 +22,7 @@ import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData import com.russhwolf.settings.MapSettings +import com.russhwolf.settings.Settings import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @@ -39,7 +40,7 @@ class OfflineFirstUserDataRepositoryTest { @OptIn(ExperimentalCoroutinesApi::class) private val dispatcher = UnconfinedTestDispatcher() - private val settings = MapSettings() + private val settings: Settings = MapSettings() private val testScope = TestScope(dispatcher) diff --git a/core/testing/build.gradle.kts b/core/testing/build.gradle.kts index 2b7083286..12b9228a9 100644 --- a/core/testing/build.gradle.kts +++ b/core/testing/build.gradle.kts @@ -16,8 +16,6 @@ plugins { alias(libs.plugins.nowinandroid.kmp.library) alias(libs.plugins.nowinandroid.kotlin.inject) - alias(libs.plugins.nowinandroid.android.library.compose) - alias(libs.plugins.nowinandroid.android.hilt) } android { @@ -28,7 +26,6 @@ kotlin { sourceSets { commonMain.dependencies { api(kotlin("test")) -// api(libs.androidx.compose.ui.test) api(projects.core.analytics) api(projects.core.data) api(projects.core.model) From a9ac795b1a1705c632cee09bfaf3562321a5ba5c Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 11:38:29 -0700 Subject: [PATCH 4/8] Fix spotless issues --- .../core/data/repository/OfflineFirstNewsRepository.kt | 2 -- .../core/data/repository/OfflineFirstTopicsRepository.kt | 1 - 2 files changed, 3 deletions(-) diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt index 5b3dc8769..67e1e7e12 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt @@ -21,9 +21,7 @@ import com.google.samples.apps.nowinandroid.core.data.changeListSync import com.google.samples.apps.nowinandroid.core.data.model.asEntity import com.google.samples.apps.nowinandroid.core.data.model.topicCrossReferences import com.google.samples.apps.nowinandroid.core.data.model.topicEntityShells -import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDao import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDaoInterface -import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface import com.google.samples.apps.nowinandroid.core.database.model.PopulatedNewsResource import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity diff --git a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt index ada9d032f..485370927 100644 --- a/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt @@ -19,7 +19,6 @@ package com.google.samples.apps.nowinandroid.core.data.repository import com.google.samples.apps.nowinandroid.core.data.Synchronizer import com.google.samples.apps.nowinandroid.core.data.changeListSync import com.google.samples.apps.nowinandroid.core.data.model.asEntity -import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel From 343c421f22eb181d1171d9d88eef015842f6fcd4 Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 13:41:12 -0700 Subject: [PATCH 5/8] Remove defaults to pass test --- .../data/testdoubles/TestNiaNetworkDataSource.kt | 2 ++ .../nowinandroid/core/datastore/UserPreferences.kt | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt index 7f9a69959..1a81e84b5 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt @@ -21,6 +21,7 @@ import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkData import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.serialization.json.Json @@ -33,6 +34,7 @@ enum class CollectionType { /** * Test double for [NiaNetworkDataSource] */ +@OptIn(ExperimentalCoroutinesApi::class) class TestNiaNetworkDataSource : NiaNetworkDataSource { private val source = FakeNiaNetworkDataSource( diff --git a/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt index f8168fc0c..9307ffc22 100644 --- a/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt +++ b/core/datastore-proto/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/datastore/UserPreferences.kt @@ -28,10 +28,10 @@ data class UserPreferences( val newsResourceChangeListVersion: Int, val hasDoneIntToStringIdMigration: Boolean, val hasDoneListToMapMigration: Boolean, - val followedTopicIds: Set = emptySet(), - val followedAuthorIds: Set = emptySet(), - val bookmarkedNewsResourceIds: Set = emptySet(), - val viewedNewsResourceIds: Set = emptySet(), + val followedTopicIds: Set, + val followedAuthorIds: Set, + val bookmarkedNewsResourceIds: Set, + val viewedNewsResourceIds: Set, val themeBrand: ThemeBrandProto, val darkThemeConfig: DarkThemeConfigProto, val shouldHideOnboarding: Boolean, @@ -48,6 +48,10 @@ data class UserPreferences( darkThemeConfig = DARK_THEME_CONFIG_FOLLOW_SYSTEM, shouldHideOnboarding = false, useDynamicColor = false, + followedTopicIds = emptySet(), + followedAuthorIds = emptySet(), + bookmarkedNewsResourceIds = emptySet(), + viewedNewsResourceIds = emptySet(), ) } } From 05567c6701630ea2cc1d788e4e911d214c6ac525 Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 13:45:02 -0700 Subject: [PATCH 6/8] Add ExperimentalRoborazziApi in ScreenshotHelper.kt --- .../apps/nowinandroid/core/testing/util/ScreenshotHelper.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/screenshot-testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/ScreenshotHelper.kt b/core/screenshot-testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/ScreenshotHelper.kt index 468fff8df..f0469d358 100644 --- a/core/screenshot-testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/ScreenshotHelper.kt +++ b/core/screenshot-testing/src/main/kotlin/com/google/samples/apps/nowinandroid/core/testing/util/ScreenshotHelper.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.onRoot import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.github.takahirom.roborazzi.ExperimentalRoborazziApi import com.github.takahirom.roborazzi.RoborazziOptions import com.github.takahirom.roborazzi.RoborazziOptions.CompareOptions import com.github.takahirom.roborazzi.RoborazziOptions.RecordOptions @@ -36,6 +37,7 @@ import com.google.accompanist.testharness.TestHarness import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import org.robolectric.RuntimeEnvironment +@OptIn(ExperimentalRoborazziApi::class) val DefaultRoborazziOptions = RoborazziOptions( // Pixel-perfect matching From 7c0dd986e62ce7eed4fd3d74883b2aaaef637dda Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 14:05:39 -0700 Subject: [PATCH 7/8] Convert :core:domain to the multiplatform module --- core/domain/build.gradle.kts | 22 +++++++++++-------- .../core/domain/GetFollowableTopicsUseCase.kt | 3 +-- .../domain/GetRecentSearchQueriesUseCase.kt | 5 +++-- .../domain/GetSearchContentsCountUseCase.kt | 5 +++-- .../core/domain/GetSearchContentsUseCase.kt | 5 +++-- .../domain/GetFollowableTopicsUseCaseTest.kt | 7 +----- core/domain/src/main/AndroidManifest.xml | 17 -------------- 7 files changed, 24 insertions(+), 40 deletions(-) rename core/domain/src/{main => commonMain}/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt (96%) rename core/domain/src/{main => commonMain}/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetRecentSearchQueriesUseCase.kt (92%) rename core/domain/src/{main => commonMain}/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsCountUseCase.kt (92%) rename core/domain/src/{main => commonMain}/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt (96%) rename core/domain/src/{test => commonTest}/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt (94%) delete mode 100644 core/domain/src/main/AndroidManifest.xml diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts index 191877459..db86380d1 100644 --- a/core/domain/build.gradle.kts +++ b/core/domain/build.gradle.kts @@ -14,7 +14,8 @@ * limitations under the License. */ plugins { - alias(libs.plugins.nowinandroid.android.library) + alias(libs.plugins.nowinandroid.kmp.library) + alias(libs.plugins.nowinandroid.kotlin.inject) alias(libs.plugins.nowinandroid.android.library.jacoco) id("com.google.devtools.ksp") } @@ -23,11 +24,14 @@ android { namespace = "com.google.samples.apps.nowinandroid.core.domain" } -dependencies { - api(projects.core.data) - api(projects.core.model) - - implementation(libs.javax.inject) - - testImplementation(projects.core.testing) -} \ No newline at end of file +kotlin { + sourceSets { + commonMain.dependencies { + api(projects.core.data) + api(projects.core.model) + } + commonTest.dependencies { + implementation(projects.core.testing) + } + } +} diff --git a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt similarity index 96% rename from core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt rename to core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt index 0167a3192..37200d204 100644 --- a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt +++ b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt @@ -23,12 +23,11 @@ import com.google.samples.apps.nowinandroid.core.domain.TopicSortField.NONE import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import javax.inject.Inject /** * A use case which obtains a list of topics with their followed state. */ -class GetFollowableTopicsUseCase @Inject constructor( +class GetFollowableTopicsUseCase( private val topicsRepository: TopicsRepository, private val userDataRepository: UserDataRepository, ) { diff --git a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetRecentSearchQueriesUseCase.kt b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetRecentSearchQueriesUseCase.kt similarity index 92% rename from core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetRecentSearchQueriesUseCase.kt rename to core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetRecentSearchQueriesUseCase.kt index 51f87d6fd..892bf6737 100644 --- a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetRecentSearchQueriesUseCase.kt +++ b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetRecentSearchQueriesUseCase.kt @@ -19,12 +19,13 @@ package com.google.samples.apps.nowinandroid.core.domain import com.google.samples.apps.nowinandroid.core.data.model.RecentSearchQuery import com.google.samples.apps.nowinandroid.core.data.repository.RecentSearchRepository import kotlinx.coroutines.flow.Flow -import javax.inject.Inject +import me.tatarka.inject.annotations.Inject /** * A use case which returns the recent search queries. */ -class GetRecentSearchQueriesUseCase @Inject constructor( +@Inject +class GetRecentSearchQueriesUseCase( private val recentSearchRepository: RecentSearchRepository, ) { operator fun invoke(limit: Int = 10): Flow> = diff --git a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsCountUseCase.kt b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsCountUseCase.kt similarity index 92% rename from core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsCountUseCase.kt rename to core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsCountUseCase.kt index 3e3e1952e..b8c2fbf3d 100644 --- a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsCountUseCase.kt +++ b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsCountUseCase.kt @@ -18,12 +18,13 @@ package com.google.samples.apps.nowinandroid.core.domain import com.google.samples.apps.nowinandroid.core.data.repository.SearchContentsRepository import kotlinx.coroutines.flow.Flow -import javax.inject.Inject +import me.tatarka.inject.annotations.Inject /** * A use case which returns total count of *Fts tables */ -class GetSearchContentsCountUseCase @Inject constructor( +@Inject +class GetSearchContentsCountUseCase( private val searchContentsRepository: SearchContentsRepository, ) { operator fun invoke(): Flow = diff --git a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt similarity index 96% rename from core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt rename to core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt index d1065e87c..a06984f61 100644 --- a/core/domain/src/main/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt +++ b/core/domain/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetSearchContentsUseCase.kt @@ -25,12 +25,13 @@ import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource import com.google.samples.apps.nowinandroid.core.model.data.UserSearchResult import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import javax.inject.Inject +import me.tatarka.inject.annotations.Inject /** * A use case which returns the searched contents matched with the search query. */ -class GetSearchContentsUseCase @Inject constructor( +@Inject +class GetSearchContentsUseCase( private val searchContentsRepository: SearchContentsRepository, private val userDataRepository: UserDataRepository, ) { diff --git a/core/domain/src/test/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt b/core/domain/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt similarity index 94% rename from core/domain/src/test/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt rename to core/domain/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt index 42a31f858..51aab0edc 100644 --- a/core/domain/src/test/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt +++ b/core/domain/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt @@ -21,18 +21,13 @@ import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository -import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest -import org.junit.Rule -import org.junit.Test +import kotlin.test.Test import kotlin.test.assertEquals class GetFollowableTopicsUseCaseTest { - @get:Rule - val mainDispatcherRule = MainDispatcherRule() - private val topicsRepository = TestTopicsRepository() private val userDataRepository = TestUserDataRepository() diff --git a/core/domain/src/main/AndroidManifest.xml b/core/domain/src/main/AndroidManifest.xml deleted file mode 100644 index 51d0cfc2e..000000000 --- a/core/domain/src/main/AndroidManifest.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - \ No newline at end of file From 0aac9206f0bda2d0f4c1fc13d1f659e292c19fb8 Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 13 Mar 2024 14:17:28 -0700 Subject: [PATCH 8/8] Fix test errors in tests in :core:designsystem module --- core/designsystem/build.gradle.kts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/designsystem/build.gradle.kts b/core/designsystem/build.gradle.kts index c9a973ac7..82f8aa022 100644 --- a/core/designsystem/build.gradle.kts +++ b/core/designsystem/build.gradle.kts @@ -25,6 +25,11 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } namespace = "com.google.samples.apps.nowinandroid.core.designsystem" + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } } kotlin {