From b39b3f95c7da2e1fc29be791a4ef36294b38dc53 Mon Sep 17 00:00:00 2001 From: KremeCN <3265494849@qq.com> Date: Wed, 26 Aug 2026 07:04:31 +0800 Subject: [PATCH] test: add Compose screenshot baseline --- android/app/build.gradle.kts | 4 ++++ .../abox/manager/ui/AppScreenshotSmokeTest.kt | 14 ++++++++++++++ .../AppSmokePreview_0.png | Bin 0 -> 4626 bytes android/core/designsystem/build.gradle.kts | 4 ++++ .../manager/designsystem/ScreenshotSmokeTest.kt | 13 +++++++++++++ .../DesignSystemSmokePreview_0.png | Bin 0 -> 3836 bytes build.gradle.kts | 1 + gradle.properties | 3 ++- gradle/libs.versions.toml | 1 + 9 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 android/app/src/screenshotTest/kotlin/com/flagship/abox/manager/ui/AppScreenshotSmokeTest.kt create mode 100644 android/app/src/screenshotTestDebug/reference/com/flagship/abox/manager/ui/AppScreenshotSmokeTestKt/AppSmokePreview_0.png create mode 100644 android/core/designsystem/src/screenshotTest/kotlin/com/flagship/abox/manager/designsystem/ScreenshotSmokeTest.kt create mode 100644 android/core/designsystem/src/screenshotTestDebug/reference/com/flagship/abox/manager/designsystem/ScreenshotSmokeTestKt/DesignSystemSmokePreview_0.png diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index f34df9c..aa9f30a 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -6,12 +6,15 @@ plugins { alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.kapt) alias(libs.plugins.hilt.android) + alias(libs.plugins.compose.screenshot) } android { namespace = "com.flagship.abox.manager" compileSdk = 37 + experimentalProperties["android.experimental.enableScreenshotTest"] = true + defaultConfig { applicationId = "com.flagship.abox.manager" minSdk = 26 @@ -94,4 +97,5 @@ dependencies { androidTestImplementation(libs.compose.ui.test.junit4) debugImplementation(libs.compose.ui.tooling) debugImplementation(libs.compose.ui.test.manifest) + screenshotTestImplementation(libs.compose.screenshot.test) } diff --git a/android/app/src/screenshotTest/kotlin/com/flagship/abox/manager/ui/AppScreenshotSmokeTest.kt b/android/app/src/screenshotTest/kotlin/com/flagship/abox/manager/ui/AppScreenshotSmokeTest.kt new file mode 100644 index 0000000..e5ab6c5 --- /dev/null +++ b/android/app/src/screenshotTest/kotlin/com/flagship/abox/manager/ui/AppScreenshotSmokeTest.kt @@ -0,0 +1,14 @@ +package com.flagship.abox.manager.ui + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.android.tools.screenshot.PreviewTest +import com.flagship.abox.manager.designsystem.ABoxTheme + +@PreviewTest +@Preview +@Composable +fun AppSmokePreview() { + ABoxTheme(darkTheme = false) { Text("ABox Manager") } +} diff --git a/android/app/src/screenshotTestDebug/reference/com/flagship/abox/manager/ui/AppScreenshotSmokeTestKt/AppSmokePreview_0.png b/android/app/src/screenshotTestDebug/reference/com/flagship/abox/manager/ui/AppScreenshotSmokeTestKt/AppSmokePreview_0.png new file mode 100644 index 0000000000000000000000000000000000000000..067f3edf6abccbe86f8ad5a89bf43a889b923388 GIT binary patch literal 4626 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
    pP+7OneY8K`m*>ge3`=q7hN_rGfIo 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 literal 0 HcmV?d00001 diff --git a/build.gradle.kts b/build.gradle.kts index 1db8c35..3f079d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,4 +6,5 @@ plugins { alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.kapt) apply false alias(libs.plugins.hilt.android) apply false + alias(libs.plugins.compose.screenshot) apply false } diff --git a/gradle.properties b/gradle.properties index 1cd37dd..db68989 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,5 @@ -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 +android.experimental.enableScreenshotTest=true org.gradle.configuration-cache=false android.useAndroidX=true android.nonTransitiveRClass=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 45965b6..11f7d0e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,6 +39,7 @@ compose-material3 = { module = "androidx.compose.material3:material3" } compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" } +compose-screenshot-test = { module = "com.android.tools.screenshot:screenshot-validation-api", version.ref = "composeScreenshot" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }