diff --git a/.editorconfig b/.editorconfig index 8ee55b89..dc5c6e5b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -18,7 +18,7 @@ ktlint_code_style = ktlint_official ktlint_function_naming_ignore_when_annotated_with = Composable # For Migration and AutoMigration classes -[core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/*Migration*.kt] +[shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/*Migration*.kt] # The class name were directly copied from Google's documentation ktlint_standard_class-naming = disabled # Auto generated SQL lines can be very long diff --git a/app/src/main/java/xyz/sevive/arcaeaoffline/ArcaeaOfflineApplication.kt b/app/src/main/java/xyz/sevive/arcaeaoffline/ArcaeaOfflineApplication.kt index 2cec252b..000df1ff 100644 --- a/app/src/main/java/xyz/sevive/arcaeaoffline/ArcaeaOfflineApplication.kt +++ b/app/src/main/java/xyz/sevive/arcaeaoffline/ArcaeaOfflineApplication.kt @@ -27,7 +27,7 @@ import org.koin.android.ext.koin.androidLogger import org.koin.androidx.workmanager.koin.workManagerFactory import org.koin.core.context.startKoin import org.koin.mp.KoinPlatform.getKoin -import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase +import xyz.sevive.arcaeaoffline.core.database.getArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.core.ocr.device.DeviceOcrOnnxHelper import xyz.sevive.arcaeaoffline.data.maintenance.AppDataMaintenanceManager import xyz.sevive.arcaeaoffline.data.notification.Notifications @@ -89,7 +89,7 @@ class ArcaeaOfflineApplication : Application() { try { val databases = listOf( - ArcaeaOfflineDatabase.getDatabase(this), + getArcaeaOfflineDatabase(this), OcrQueueDatabase.getDatabase(this), ) diff --git a/app/src/main/java/xyz/sevive/arcaeaoffline/helpers/diagnostics/DiagnosticsCollector.kt b/app/src/main/java/xyz/sevive/arcaeaoffline/helpers/diagnostics/DiagnosticsCollector.kt index 9155170a..029134be 100644 --- a/app/src/main/java/xyz/sevive/arcaeaoffline/helpers/diagnostics/DiagnosticsCollector.kt +++ b/app/src/main/java/xyz/sevive/arcaeaoffline/helpers/diagnostics/DiagnosticsCollector.kt @@ -18,6 +18,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import xyz.sevive.arcaeaoffline.BuildConfig import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase +import xyz.sevive.arcaeaoffline.core.database.getArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.data.OcrDependencyPaths import xyz.sevive.arcaeaoffline.database.AppDatabase import xyz.sevive.arcaeaoffline.database.OcrQueueDatabase @@ -231,7 +232,7 @@ class DiagnosticsCollector( databaseInfo( dbFile = File(context.getDatabasePath(ArcaeaOfflineDatabase.DATABASE_FILENAME).path), ) { - ArcaeaOfflineDatabase.getDatabase(context) + getArcaeaOfflineDatabase(context) }, appData = databaseInfo( diff --git a/app/src/main/java/xyz/sevive/arcaeaoffline/ui/activities/EmergencyModeActivityViewModel.kt b/app/src/main/java/xyz/sevive/arcaeaoffline/ui/activities/EmergencyModeActivityViewModel.kt index 73135670..047e24cc 100644 --- a/app/src/main/java/xyz/sevive/arcaeaoffline/ui/activities/EmergencyModeActivityViewModel.kt +++ b/app/src/main/java/xyz/sevive/arcaeaoffline/ui/activities/EmergencyModeActivityViewModel.kt @@ -40,6 +40,7 @@ import kotlinx.io.buffered import kotlinx.io.files.SystemFileSystem import xyz.sevive.arcaeaoffline.R import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase +import xyz.sevive.arcaeaoffline.core.database.getArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.data.OcrDependencyPaths import xyz.sevive.arcaeaoffline.database.OcrQueueDatabase import xyz.sevive.arcaeaoffline.database.daos.OcrQueueTaskDao @@ -358,7 +359,7 @@ class EmergencyModeActivityViewModel( ) { // Merge WAL into the main database file, so that copying it alone // produces a complete backup. - val database = ArcaeaOfflineDatabase.getDatabase(appContext) + val database = getArcaeaOfflineDatabase(appContext) database.useWriterConnection { connection -> connection.executeSQL("PRAGMA wal_checkpoint(TRUNCATE)") } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 6df6691b..19044384 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -5,12 +5,6 @@ plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.plugin.serialization) alias(libs.plugins.koin.compiler) - - alias(androidx.plugins.room3) -} - -room3 { - schemaDirectory("$projectDir/schemas") } kotlin { @@ -46,10 +40,6 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - sourceSets { - // Adds exported schema location as test app assets. - getByName("androidTest").assets.directories += setOf("$projectDir/schemas") - } } dependencies { @@ -69,10 +59,6 @@ dependencies { implementation(androidx.core.ktx) - api(androidx.room3.runtime) - ksp(androidx.room3.compiler) - implementation(androidx.sqlite.bundled) - // 3rd party implementation(libs.kermit) @@ -83,8 +69,5 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.junit) androidTestImplementation(androidx.test.ext.junit) - testImplementation(androidx.room3.testing) - testImplementation(androidx.sqlite.bundled.jvm) androidTestImplementation(androidx.test.runner) - androidTestImplementation(androidx.room3.testing) } diff --git a/core/proguard-rules.pro b/core/proguard-rules.pro index f68198fc..8ec3de1a 100644 --- a/core/proguard-rules.pro +++ b/core/proguard-rules.pro @@ -21,4 +21,3 @@ #-renamesourcefileattribute SourceFile -keep public class org.opencv.core.CvException { *; } --keep class * extends androidx.room3.RoomDatabase { (); } diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/di/CoreModule.kt b/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/di/CoreModule.kt index f38a7781..e68b38bf 100644 --- a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/di/CoreModule.kt +++ b/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/di/CoreModule.kt @@ -19,6 +19,7 @@ import xyz.sevive.arcaeaoffline.core.database.daos.PropertyDao import xyz.sevive.arcaeaoffline.core.database.daos.R30EntryDao import xyz.sevive.arcaeaoffline.core.database.daos.SongDao import xyz.sevive.arcaeaoffline.core.database.daos.SongLocalizedDao +import xyz.sevive.arcaeaoffline.core.database.getArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.core.database.repositories.ChartInfoRepository import xyz.sevive.arcaeaoffline.core.database.repositories.ChartInfoRepositoryImpl import xyz.sevive.arcaeaoffline.core.database.repositories.DifficultyLocalizedRepository @@ -50,7 +51,7 @@ import xyz.sevive.arcaeaoffline.core.database.repositories.SongLocalizedReposito import xyz.sevive.arcaeaoffline.core.database.repositories.SongRepository import xyz.sevive.arcaeaoffline.core.database.repositories.SongRepositoryImpl -internal fun createArcaeaOfflineDatabase(context: Context) = ArcaeaOfflineDatabase.getDatabase(context) +internal fun createArcaeaOfflineDatabase(context: Context) = getArcaeaOfflineDatabase(context) internal fun metaDao(db: ArcaeaOfflineDatabase) = db.metaDao() diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts index 7aaff766..3f7ace09 100644 --- a/desktopApp/build.gradle.kts +++ b/desktopApp/build.gradle.kts @@ -13,6 +13,7 @@ dependencies { implementation(libs.compose.ui) implementation(libs.compose.foundation) implementation(libs.compose.components.resources) + implementation(libs.filekit.core) } compose.desktop { diff --git a/desktopApp/src/main/kotlin/xyz/sevive/arcaeaoffline/desktop/Main.kt b/desktopApp/src/main/kotlin/xyz/sevive/arcaeaoffline/desktop/Main.kt index 84a60acf..e631b200 100644 --- a/desktopApp/src/main/kotlin/xyz/sevive/arcaeaoffline/desktop/Main.kt +++ b/desktopApp/src/main/kotlin/xyz/sevive/arcaeaoffline/desktop/Main.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Window import androidx.compose.ui.window.application +import io.github.vinceglb.filekit.FileKit import org.jetbrains.compose.resources.stringResource import xyz.sevive.arcaeaoffline.core.ArcaeaPartnerModifiers import xyz.sevive.arcaeaoffline.core.calculators.calculatePlayRating @@ -30,7 +31,9 @@ import xyz.sevive.arcaeaoffline.ui.components.rememberArcaeaConstantStepperTextF import xyz.sevive.arcaeaoffline.ui.theme.ArcaeaOfflineTheme import xyz.sevive.arcaeaoffline.ui.theme.spacing -fun main() = +fun main() { + FileKit.init("ArcaeaOffline") + application { Window(onCloseRequest = ::exitApplication, title = "Arcaea Offline (Proof-of-Concept Prototype)") { ArcaeaOfflineTheme { @@ -40,6 +43,7 @@ fun main() = } } } +} @Composable fun CalculatorScreen() { diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 2a643bae..df65718e 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -24,7 +24,6 @@ room3-runtime = { module = "androidx.room3:room3-runtime", version.ref = "room3" room3-compiler = { module = "androidx.room3:room3-compiler", version.ref = "room3" } room3-testing = { module = "androidx.room3:room3-testing", version.ref = "room3" } sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } -sqlite-bundled-jvm = { module = "androidx.sqlite:sqlite-bundled-jvm", version.ref = "sqlite" } datastore-core = { module = "androidx.datastore:datastore-core", version.ref = "datastore" } datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastore" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c352d714..92a83489 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,6 +27,7 @@ github-cheonjaeung-gridlayout = "2.7.4" aboutlibraries = "14.2.1" kermit = "2.1.0" filekit = "0.14.2" +jSystemThemeDetector = "3.9.1" kotlinx-io = "0.9.0" ktor = "3.5.2" bignum = "0.3.10" @@ -67,7 +68,7 @@ materialkolor-color-utilities = { module = "com.materialkolor:material-color-uti opencv = { module = "org.opencv:opencv", version.ref = "opencv" } apache-commons-compress = { module = "org.apache.commons:commons-compress", version.ref = "apache-commons-compress" } -jSystemThemeDetector = { module = "com.github.Dansoftowner:jSystemThemeDetector", version = "3.9.1" } +jSystemThemeDetector = { module = "com.github.Dansoftowner:jSystemThemeDetector", version.ref = "jSystemThemeDetector" } io-sentry-sentryAndroid = { module = "io.sentry:sentry-android", version.ref = "io-sentry-sentryAndroid" } onnxruntime-android = { module = "com.microsoft.onnxruntime:onnxruntime-android", version = "1.26.0" } diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 8d937aab..09547512 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -3,11 +3,18 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.kotlin.multiplatform.library) alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.ksp) alias(libs.plugins.compose.compiler) alias(libs.plugins.jetbrains.compose) alias(libs.plugins.kotlin.plugin.serialization) + + alias(androidx.plugins.room3) +} + +room3 { + schemaDirectory("$projectDir/schemas") } compose { @@ -27,6 +34,11 @@ tasks.withType().configureEach { } kotlin { + compilerOptions { + // Room3 compiler opt out + freeCompilerArgs.add("-Xexpect-actual-classes") + } + jvm() android { @@ -65,11 +77,15 @@ kotlin { implementation(libs.compose.ui.tooling) implementation(libs.kotlinx.serialization) + implementation(libs.kotlinx.datetime) implementation(libs.bignum) implementation(libs.kermit) implementation(libs.ktor.client.core) + + api(androidx.room3.runtime) + implementation(androidx.sqlite.bundled) } androidMain.dependencies { @@ -77,8 +93,17 @@ kotlin { } jvmMain.dependencies { - implementation(libs.jSystemThemeDetector) + // jSystemThemeDetector pulls in jfa, whose POM pins jna with a non-existent + // "jpms" classfier, breaking jvm configuration with "jna--jpms.jar" + // not found. + // + // filekit-core depends on jna-platform which introduces plain jna, so excluding + // this does not affect compilation. + implementation("com.github.Dansoftowner:jSystemThemeDetector:${libs.versions.jSystemThemeDetector.get()}") { + exclude(group = "net.java.dev.jna", module = "jna") + } implementation(libs.ktor.client.cio) + implementation(libs.filekit.core) } commonTest.dependencies { @@ -91,6 +116,12 @@ kotlin { jvmTest.dependencies { implementation(compose.desktop.currentOs) + implementation(androidx.room3.testing) } } } + +dependencies { + add("kspAndroid", androidx.room3.compiler) + add("kspJvm", androidx.room3.compiler) +} diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/10.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/10.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/10.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/10.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/11.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/11.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/11.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/11.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/12.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/12.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/12.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/12.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/13.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/13.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/13.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/13.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/14.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/14.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/14.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/14.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/15.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/15.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/15.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/15.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/16.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/16.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/16.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/16.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/4.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/4.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/4.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/4.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/5.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/5.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/5.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/5.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/6.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/6.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/6.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/6.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/7.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/7.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/7.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/7.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/8.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/8.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/8.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/8.json diff --git a/core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/9.json b/shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/9.json similarity index 100% rename from core/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/9.json rename to shared/schemas/xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase/9.json diff --git a/shared/src/androidMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabaseBuilders.kt b/shared/src/androidMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabaseBuilders.kt new file mode 100644 index 00000000..0950d645 --- /dev/null +++ b/shared/src/androidMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabaseBuilders.kt @@ -0,0 +1,26 @@ +package xyz.sevive.arcaeaoffline.core.database + +import android.content.Context +import androidx.room3.Room +import androidx.room3.RoomDatabase + +@Volatile +private var instance: ArcaeaOfflineDatabase? = null + +private val instanceLock = Any() + +fun getArcaeaOfflineDatabaseBuilder(context: Context): RoomDatabase.Builder { + val appContext = context.applicationContext + val dbFile = appContext.getDatabasePath(ArcaeaOfflineDatabase.DATABASE_FILENAME) + return Room.databaseBuilder( + context = appContext, + name = dbFile.absolutePath, + ) +} + +fun getArcaeaOfflineDatabase(context: Context): ArcaeaOfflineDatabase { + // If the instance is not null, return it, otherwise create a new database instance. + return instance ?: synchronized(instanceLock) { + getArcaeaOfflineDatabase(getArcaeaOfflineDatabaseBuilder(context)).also { instance = it } + } +} diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabase.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabase.kt similarity index 78% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabase.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabase.kt index 8197a969..21cd3a10 100644 --- a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabase.kt +++ b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabase.kt @@ -1,11 +1,11 @@ package xyz.sevive.arcaeaoffline.core.database -import android.content.Context import androidx.room3.AutoMigration import androidx.room3.ColumnTypeConverters +import androidx.room3.ConstructedBy import androidx.room3.Database -import androidx.room3.Room import androidx.room3.RoomDatabase +import androidx.room3.RoomDatabaseConstructor import androidx.sqlite.driver.bundled.BundledSQLiteDriver import kotlinx.coroutines.Dispatchers import xyz.sevive.arcaeaoffline.core.database.converters.ArcaeaLanguageConverters @@ -43,6 +43,7 @@ import xyz.sevive.arcaeaoffline.core.database.migrations.Migration_15_16 import xyz.sevive.arcaeaoffline.core.database.migrations.Migration_6_7 import xyz.sevive.arcaeaoffline.core.database.migrations.Migration_7_8 +@ConstructedBy(ArcaeaOfflineDatabaseConstructor::class) @Database( entities = [ Property::class, @@ -107,33 +108,20 @@ abstract class ArcaeaOfflineDatabase : RoomDatabase() { companion object { const val DATABASE_FILENAME = "arcaea_offline.db" - - @Volatile - private var instance: ArcaeaOfflineDatabase? = null - - private fun getDatabaseBuilder(context: Context): Builder { - val appContext = context.applicationContext - val dbFile = appContext.getDatabasePath(DATABASE_FILENAME) - return Room.databaseBuilder( - context = appContext, - name = dbFile.absolutePath, - ) - } - - fun getDatabase(context: Context): ArcaeaOfflineDatabase { - // If the instance is not null, return it, otherwise create a new database instance. - return instance ?: synchronized(this) { - getDatabaseBuilder(context) - .setDriver(BundledSQLiteDriver()) - .setQueryCoroutineContext(Dispatchers.IO) - .addCallback(ScoringModeCreateCallback) - .addMigrations( - Migration_6_7, - Migration_7_8, - Migration_15_16, - ).build() - .also { instance = it } - } - } } } + +expect object ArcaeaOfflineDatabaseConstructor : RoomDatabaseConstructor { + override fun initialize(): ArcaeaOfflineDatabase +} + +fun getArcaeaOfflineDatabase(builder: RoomDatabase.Builder): ArcaeaOfflineDatabase = + builder + .setDriver(BundledSQLiteDriver()) + .setQueryCoroutineContext(Dispatchers.IO) + .addCallback(ScoringModeCreateCallback) + .addMigrations( + Migration_6_7, + Migration_7_8, + Migration_15_16, + ).build() diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/ScoringModeCreateCallback.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ScoringModeCreateCallback.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/ScoringModeCreateCallback.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ScoringModeCreateCallback.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/EnumConverters.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/EnumConverters.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/EnumConverters.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/EnumConverters.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/InstantConverters.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/InstantConverters.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/InstantConverters.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/InstantConverters.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/UuidByteArrayConverters.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/UuidByteArrayConverters.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/UuidByteArrayConverters.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/converters/UuidByteArrayConverters.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/ChartInfoDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/ChartInfoDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/ChartInfoDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/ChartInfoDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyLocalizedDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyLocalizedDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyLocalizedDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyLocalizedDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyWithSongDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyWithSongDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyWithSongDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/DifficultyWithSongDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/MetaDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/MetaDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/MetaDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/MetaDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackLocalizedDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackLocalizedDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackLocalizedDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PackLocalizedDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultBestDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultBestDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultBestDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultBestDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PlayResultDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PropertyDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PropertyDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PropertyDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/PropertyDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/R30EntryDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/R30EntryDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/R30EntryDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/R30EntryDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongLocalizedDao.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongLocalizedDao.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongLocalizedDao.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/daos/SongLocalizedDao.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/ChartInfo.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/ChartInfo.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/ChartInfo.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/ChartInfo.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Difficulty.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Difficulty.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Difficulty.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Difficulty.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyLocalized.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyLocalized.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyLocalized.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyLocalized.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyWithSong.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyWithSong.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyWithSong.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/DifficultyWithSong.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/MinimumPlayResultPotentialFields.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/MinimumPlayResultPotentialFields.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/MinimumPlayResultPotentialFields.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/MinimumPlayResultPotentialFields.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Pack.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Pack.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Pack.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Pack.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PackLocalized.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PackLocalized.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PackLocalized.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PackLocalized.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResult.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResult.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResult.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResult.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResultCalculated.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResultCalculated.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResultCalculated.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/PlayResultCalculated.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Property.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Property.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Property.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Property.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/R30Entry.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/R30Entry.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/R30Entry.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/R30Entry.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Song.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Song.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Song.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/Song.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/SongLocalized.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/SongLocalized.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/SongLocalized.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/entities/SongLocalized.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/PlayResultSerializer.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/PlayResultSerializer.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/PlayResultSerializer.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/PlayResultSerializer.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/SQLiteStatementExtensions.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/SQLiteStatementExtensions.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/SQLiteStatementExtensions.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/extensions/SQLiteStatementExtensions.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaListDefinitions.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaListDefinitions.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaListDefinitions.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaListDefinitions.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaOfflineDEFv2Definitions.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaOfflineDEFv2Definitions.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaOfflineDEFv2Definitions.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/ArcaeaOfflineDEFv2Definitions.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/exporters/ArcaeaOfflineDEFv2Exporter.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/exporters/ArcaeaOfflineDEFv2Exporter.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/exporters/ArcaeaOfflineDEFv2Exporter.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/exporters/ArcaeaOfflineDEFv2Exporter.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaPacklistImporter.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaPacklistImporter.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaPacklistImporter.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaPacklistImporter.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporter.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporter.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporter.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporter.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporter.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporter.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporter.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporter.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporter.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporter.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporter.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporter.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_5_6.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_5_6.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_5_6.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_5_6.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_9_10.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_9_10.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_9_10.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/AutoMigration_9_10.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_15_16.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_15_16.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_15_16.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_15_16.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_6_7.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_6_7.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_6_7.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_6_7.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_7_8.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_7_8.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_7_8.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/migrations/Migration_7_8.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdater.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdater.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdater.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdater.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/ChartInfoRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/ChartInfoRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/ChartInfoRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/ChartInfoRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyLocalizedRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyLocalizedRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyLocalizedRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyLocalizedRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyWithSongRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyWithSongRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyWithSongRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/DifficultyWithSongRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/MetaRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/MetaRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/MetaRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/MetaRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackLocalizedRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackLocalizedRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackLocalizedRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackLocalizedRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PackRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultBestRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultBestRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultBestRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultBestRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultCalculatedRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultCalculatedRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultCalculatedRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultCalculatedRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PlayResultRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PropertyRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PropertyRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PropertyRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PropertyRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/R30EntryRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/R30EntryRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/R30EntryRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/R30EntryRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongLocalizedRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongLocalizedRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongLocalizedRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongLocalizedRepository.kt diff --git a/core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongRepository.kt b/shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongRepository.kt similarity index 100% rename from core/src/main/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongRepository.kt rename to shared/src/commonMain/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/SongRepository.kt diff --git a/shared/src/jvmMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabaseBuilders.kt b/shared/src/jvmMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabaseBuilders.kt new file mode 100644 index 00000000..f5b9740a --- /dev/null +++ b/shared/src/jvmMain/kotlin/xyz/sevive/arcaeaoffline/core/database/ArcaeaOfflineDatabaseBuilders.kt @@ -0,0 +1,13 @@ +package xyz.sevive.arcaeaoffline.core.database + +import androidx.room3.Room +import androidx.room3.RoomDatabase +import io.github.vinceglb.filekit.FileKit +import io.github.vinceglb.filekit.absolutePath +import io.github.vinceglb.filekit.databasesDir +import io.github.vinceglb.filekit.div + +fun getArcaeaOfflineDatabaseBuilder(): RoomDatabase.Builder = + Room.databaseBuilder( + name = (FileKit.databasesDir / ArcaeaOfflineDatabase.DATABASE_FILENAME).absolutePath(), + ) diff --git a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/DatabaseMigrationsTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/DatabaseMigrationsTest.kt similarity index 89% rename from core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/DatabaseMigrationsTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/DatabaseMigrationsTest.kt index b12445b6..21a53cc1 100644 --- a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/DatabaseMigrationsTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/DatabaseMigrationsTest.kt @@ -2,32 +2,29 @@ package xyz.sevive.arcaeaoffline.core import androidx.room3.testing.MigrationTestHelper import androidx.sqlite.SQLiteConnection -import androidx.sqlite.driver.AndroidSQLiteDriver +import androidx.sqlite.driver.bundled.BundledSQLiteDriver import androidx.sqlite.execSQL -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test -import org.junit.runner.RunWith import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.core.database.migrations.Migration_15_16 import xyz.sevive.arcaeaoffline.core.database.migrations.Migration_7_8 import java.io.IOException +import java.nio.file.Files +import java.nio.file.Path -@RunWith(AndroidJUnit4::class) class DatabaseMigrationsTest { - private val instrumentation = InstrumentationRegistry.getInstrumentation() - private val testDatabaseFile = instrumentation.targetContext.getDatabasePath("migration-test") + private val testDatabaseFile = Files.createTempDirectory("migration-test").resolve("migration-test.db") @get:Rule val helper: MigrationTestHelper = MigrationTestHelper( - instrumentation = instrumentation, - file = testDatabaseFile, - driver = AndroidSQLiteDriver(), + schemaDirectoryPath = Path.of("schemas"), + databasePath = testDatabaseFile, + driver = BundledSQLiteDriver(), databaseClass = ArcaeaOfflineDatabase::class, ) @@ -168,11 +165,13 @@ class DatabaseMigrationsTest { } /** - * All tests share one database file; drop it so each starts from a clean state - * even across instrumented runs. + * All tests share one database file; drop it so each starts from a clean state. */ private fun resetTestDatabase() { - testDatabaseFile.delete() + Files.deleteIfExists(testDatabaseFile) + // The bundled driver runs in WAL mode, so stale sidecar files must not leak into the next test. + Files.deleteIfExists(testDatabaseFile.resolveSibling("migration-test.db-wal")) + Files.deleteIfExists(testDatabaseFile.resolveSibling("migration-test.db-shm")) } private fun execSqlScript( diff --git a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/ScoringModeCreateCallbackTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/ScoringModeCreateCallbackTest.kt similarity index 68% rename from core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/ScoringModeCreateCallbackTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/ScoringModeCreateCallbackTest.kt index fa098e32..ce392a49 100644 --- a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/ScoringModeCreateCallbackTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/ScoringModeCreateCallbackTest.kt @@ -1,38 +1,32 @@ package xyz.sevive.arcaeaoffline.core -import android.content.Context import androidx.room3.Room import androidx.sqlite.driver.bundled.BundledSQLiteDriver -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.core.database.ScoringModeCreateCallback import xyz.sevive.arcaeaoffline.core.database.entities.Property import xyz.sevive.arcaeaoffline.core.database.repositories.PropertyRepository +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals -@RunWith(AndroidJUnit4::class) class ScoringModeCreateCallbackTest { private lateinit var db: ArcaeaOfflineDatabase - @Before + @BeforeTest fun setUp() { - val context = ApplicationProvider.getApplicationContext() db = Room - .inMemoryDatabaseBuilder(context, ArcaeaOfflineDatabase::class.java) + .inMemoryDatabaseBuilder() .setDriver(BundledSQLiteDriver()) .addCallback(ScoringModeCreateCallback) .build() } - @After + @AfterTest fun tearDown() { db.close() } diff --git a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/dao/DifficultyWithSongDaoTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/dao/DifficultyWithSongDaoTest.kt similarity index 90% rename from core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/dao/DifficultyWithSongDaoTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/dao/DifficultyWithSongDaoTest.kt index 314e4942..27c0ead8 100644 --- a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/dao/DifficultyWithSongDaoTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/dao/DifficultyWithSongDaoTest.kt @@ -1,17 +1,9 @@ package xyz.sevive.arcaeaoffline.core.dao -import android.content.Context import androidx.room3.Room -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.sqlite.driver.bundled.BundledSQLiteDriver import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNull -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith import xyz.sevive.arcaeaoffline.core.constants.ArcaeaRatingClass import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.core.database.daos.DifficultyWithSongDao @@ -19,24 +11,27 @@ import xyz.sevive.arcaeaoffline.core.database.entities.ChartInfo import xyz.sevive.arcaeaoffline.core.database.entities.Difficulty import xyz.sevive.arcaeaoffline.core.database.entities.DifficultyWithSong import xyz.sevive.arcaeaoffline.core.database.entities.Song +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull -@RunWith(AndroidJUnit4::class) class DifficultyWithSongDaoTest { private lateinit var db: ArcaeaOfflineDatabase private lateinit var dao: DifficultyWithSongDao - @Before + @BeforeTest fun setUp() { - val context = ApplicationProvider.getApplicationContext() db = Room - .inMemoryDatabaseBuilder(context, ArcaeaOfflineDatabase::class.java) - .allowMainThreadQueries() + .inMemoryDatabaseBuilder() + .setDriver(BundledSQLiteDriver()) .build() dao = db.difficultyWithSongDao() } - @After + @AfterTest fun tearDown() { db.close() } diff --git a/core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporterTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporterTest.kt similarity index 88% rename from core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporterTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporterTest.kt index a419f28f..7ddf0171 100644 --- a/core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporterTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSonglistImporterTest.kt @@ -1,9 +1,9 @@ package xyz.sevive.arcaeaoffline.core.database.externals.importers -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNull -import org.junit.Test import xyz.sevive.arcaeaoffline.core.constants.ArcaeaRatingClass +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull class ArcaeaSonglistImporterTest { private val fixture = diff --git a/core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporterTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporterTest.kt similarity index 97% rename from core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporterTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporterTest.kt index 2c1fca2e..42a8647f 100644 --- a/core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporterTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ArcaeaSt3PlayResultImporterTest.kt @@ -3,14 +3,14 @@ package xyz.sevive.arcaeaoffline.core.database.externals.importers import androidx.sqlite.SQLiteConnection import androidx.sqlite.driver.bundled.BundledSQLiteDriver import kotlinx.datetime.LocalDate -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Test import xyz.sevive.arcaeaoffline.core.constants.ArcaeaPlayResultClearType import xyz.sevive.arcaeaoffline.core.constants.ArcaeaPlayResultModifier import xyz.sevive.arcaeaoffline.core.constants.ArcaeaRatingClass +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue import kotlin.time.Instant class ArcaeaSt3PlayResultImporterTest { @@ -54,12 +54,12 @@ class ArcaeaSt3PlayResultImporterTest { private lateinit var conn: SQLiteConnection - @Before + @BeforeTest fun setUp() { conn = BundledSQLiteDriver().open(":memory:") } - @After + @AfterTest fun tearDown() { conn.close() } diff --git a/core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporterTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporterTest.kt similarity index 93% rename from core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporterTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporterTest.kt index b9d6127e..3661bad6 100644 --- a/core/src/test/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporterTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/externals/importers/ChartInfoDatabaseImporterTest.kt @@ -2,22 +2,22 @@ package xyz.sevive.arcaeaoffline.core.database.externals.importers import androidx.sqlite.SQLiteConnection import androidx.sqlite.driver.bundled.BundledSQLiteDriver -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test import xyz.sevive.arcaeaoffline.core.constants.ArcaeaRatingClass import xyz.sevive.arcaeaoffline.core.database.entities.ChartInfo +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals class ChartInfoDatabaseImporterTest { private lateinit var conn: SQLiteConnection - @Before + @BeforeTest fun setUp() { conn = BundledSQLiteDriver().open(":memory:") } - @After + @AfterTest fun tearDown() { conn.close() } diff --git a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdaterTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdaterTest.kt similarity index 94% rename from core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdaterTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdaterTest.kt index 507c3ca6..958ca230 100644 --- a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdaterTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/r30/R30QueueUpdaterTest.kt @@ -1,20 +1,12 @@ package xyz.sevive.arcaeaoffline.core.database.r30 -import android.content.Context import androidx.room3.Room import androidx.room3.executeSQL import androidx.room3.withWriteTransaction import androidx.sqlite.driver.bundled.BundledSQLiteDriver -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith import xyz.sevive.arcaeaoffline.core.constants.ArcaeaRatingClass import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.core.database.repositories.ChartInfoRepositoryImpl @@ -25,19 +17,21 @@ import xyz.sevive.arcaeaoffline.core.database.repositories.PotentialRepository import xyz.sevive.arcaeaoffline.core.database.repositories.PotentialRepositoryImpl import xyz.sevive.arcaeaoffline.core.database.repositories.R30EntryCombined import xyz.sevive.arcaeaoffline.core.database.repositories.R30EntryRepositoryImpl +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals /** The recent queue rebuilt from the play history. */ -@RunWith(AndroidJUnit4::class) class R30QueueUpdaterTest { private lateinit var db: ArcaeaOfflineDatabase private lateinit var potentialRepository: PotentialRepository - @Before + @BeforeTest fun setUp() { - val context = ApplicationProvider.getApplicationContext() db = Room - .inMemoryDatabaseBuilder(context, ArcaeaOfflineDatabase::class.java) + .inMemoryDatabaseBuilder() .setDriver(BundledSQLiteDriver()) .build() @@ -53,7 +47,7 @@ class R30QueueUpdaterTest { runBlocking { seed() } } - @After + @AfterTest fun tearDown() { db.close() } diff --git a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepositoryTest.kt b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepositoryTest.kt similarity index 90% rename from core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepositoryTest.kt rename to shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepositoryTest.kt index cca302bd..1de33e9b 100644 --- a/core/src/androidTest/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepositoryTest.kt +++ b/shared/src/jvmTest/kotlin/xyz/sevive/arcaeaoffline/core/database/repositories/PotentialRepositoryTest.kt @@ -1,38 +1,32 @@ package xyz.sevive.arcaeaoffline.core.database.repositories -import android.content.Context import androidx.room3.Room import androidx.room3.executeSQL import androidx.room3.withWriteTransaction import androidx.sqlite.driver.bundled.BundledSQLiteDriver -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith import xyz.sevive.arcaeaoffline.core.constants.ArcaeaPlayResultClearType import xyz.sevive.arcaeaoffline.core.constants.ArcaeaRatingClass import xyz.sevive.arcaeaoffline.core.database.ArcaeaOfflineDatabase import xyz.sevive.arcaeaoffline.core.database.entities.PlayResult +import kotlin.test.AfterTest +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue /** * B50 calculation over the play results of a real save. */ -@RunWith(AndroidJUnit4::class) class PotentialRepositoryTest { private lateinit var db: ArcaeaOfflineDatabase private lateinit var potentialRepository: PotentialRepository - @Before + @BeforeTest fun setUp() { - val context = ApplicationProvider.getApplicationContext() - db = Room.inMemoryDatabaseBuilder(context, ArcaeaOfflineDatabase::class.java).setDriver(BundledSQLiteDriver()).build() + db = Room.inMemoryDatabaseBuilder().setDriver(BundledSQLiteDriver()).build() potentialRepository = PotentialRepositoryImpl( @@ -51,7 +45,7 @@ class PotentialRepositoryTest { executeSQL("DELETE FROM play_results WHERE id NOT IN (SELECT id FROM play_results ORDER BY id LIMIT $count)") } - @After + @AfterTest fun tearDown() { db.close() } diff --git a/core/src/androidTest/resources/arcaea_offline_0.0.6.db.sql b/shared/src/jvmTest/resources/arcaea_offline_0.0.6.db.sql similarity index 96% rename from core/src/androidTest/resources/arcaea_offline_0.0.6.db.sql rename to shared/src/jvmTest/resources/arcaea_offline_0.0.6.db.sql index 407baa7a..43ac92fb 100644 --- a/core/src/androidTest/resources/arcaea_offline_0.0.6.db.sql +++ b/shared/src/jvmTest/resources/arcaea_offline_0.0.6.db.sql @@ -1,10 +1,5 @@ BEGIN TRANSACTION; -INSERT INTO - "android_metadata" ("locale") -VALUES - ('zh_CN_#Hans'); - INSERT INTO "charts_info" ("song_id", "rating_class", "constant", "notes") VALUES diff --git a/core/src/test/resources/songlist_alias_fixture.json b/shared/src/jvmTest/resources/songlist_alias_fixture.json similarity index 100% rename from core/src/test/resources/songlist_alias_fixture.json rename to shared/src/jvmTest/resources/songlist_alias_fixture.json diff --git a/core/src/test/resources/xyz/sevive/arcaeaoffline/core/database/externals/importers/st3_seed.sql b/shared/src/jvmTest/resources/xyz/sevive/arcaeaoffline/core/database/externals/importers/st3_seed.sql similarity index 100% rename from core/src/test/resources/xyz/sevive/arcaeaoffline/core/database/externals/importers/st3_seed.sql rename to shared/src/jvmTest/resources/xyz/sevive/arcaeaoffline/core/database/externals/importers/st3_seed.sql diff --git a/core/src/androidTest/resources/xyz/sevive/arcaeaoffline/core/database/r30/r30_seed.sql b/shared/src/jvmTest/resources/xyz/sevive/arcaeaoffline/core/database/r30/r30_seed.sql similarity index 100% rename from core/src/androidTest/resources/xyz/sevive/arcaeaoffline/core/database/r30/r30_seed.sql rename to shared/src/jvmTest/resources/xyz/sevive/arcaeaoffline/core/database/r30/r30_seed.sql diff --git a/core/src/androidTest/resources/xyz/sevive/arcaeaoffline/core/database/repositories/potential_b50_seed.sql b/shared/src/jvmTest/resources/xyz/sevive/arcaeaoffline/core/database/repositories/potential_b50_seed.sql similarity index 100% rename from core/src/androidTest/resources/xyz/sevive/arcaeaoffline/core/database/repositories/potential_b50_seed.sql rename to shared/src/jvmTest/resources/xyz/sevive/arcaeaoffline/core/database/repositories/potential_b50_seed.sql