diff --git a/compose/snippets/build.gradle.kts b/compose/snippets/build.gradle.kts index a1169546c..4de79ecbd 100644 --- a/compose/snippets/build.gradle.kts +++ b/compose/snippets/build.gradle.kts @@ -21,6 +21,7 @@ plugins { alias(libs.plugins.kotlin.parcelize) alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.screenshot) } kotlin { @@ -30,6 +31,7 @@ kotlin { android { compileSdk = libs.versions.compileSdk.get().toInt() namespace = "com.example.compose.snippets" + experimentalProperties["android.experimental.enableScreenshotTest"] = true defaultConfig { applicationId = "com.example.compose.snippets" @@ -181,4 +183,7 @@ dependencies { androidTestImplementation(libs.androidx.glance.testing) androidTestImplementation(libs.androidx.glance.appwidget.testing) + + screenshotTestImplementation(libs.screenshot.validation.api) + screenshotTestImplementation(libs.androidx.ui.tooling) } diff --git a/compose/snippets/src/androidTest/java/com/example/compose/snippets/adaptivelayouts/MyFeedTest.kt b/compose/snippets/src/androidTest/java/com/example/compose/snippets/adaptivelayouts/MyFeedTest.kt new file mode 100644 index 000000000..fb5b5eb3b --- /dev/null +++ b/compose/snippets/src/androidTest/java/com/example/compose/snippets/adaptivelayouts/MyFeedTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2026 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.example.compose.snippets.adaptivelayouts + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.v2.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import org.junit.Rule +import org.junit.Test + +class MyFeedTest { + + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun myFeed_displaysItems() { + val names = listOf("Alice", "Bob", "Charlie") + + composeTestRule.setContent { + MyFeed(names = names) + } + + // Verify that all names in the feed are displayed + for (name in names) { + composeTestRule.onNodeWithText(name).assertIsDisplayed() + } + } +} diff --git a/compose/snippets/src/screenshotTest/java/com/example/compose/snippets/adaptivelayouts/MyFeedScreenShotTest.kt b/compose/snippets/src/screenshotTest/java/com/example/compose/snippets/adaptivelayouts/MyFeedScreenShotTest.kt new file mode 100644 index 000000000..411f85098 --- /dev/null +++ b/compose/snippets/src/screenshotTest/java/com/example/compose/snippets/adaptivelayouts/MyFeedScreenShotTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2026 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.example.compose.snippets.adaptivelayouts + +import android.content.res.Configuration +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.tooling.preview.Wallpapers +import com.android.tools.screenshot.PreviewTest +import com.example.compose.snippets.adaptivelayouts.MyFeed + +class SampleNamesProvider : PreviewParameterProvider> { + override val values = sequenceOf( + listOf("User 1", "User 2", "User 3", "User 4", "User 5") + ) +} + +@PreviewTest +@Preview +@Composable +fun MyFeedPreview( + @PreviewParameter(SampleNamesProvider::class) names: List, +) { + MyFeed(names) +} diff --git a/compose/snippets/src/screenshotTest/java/com/example/compose/snippets/layouts/grid/GridExampleTest.kt b/compose/snippets/src/screenshotTest/java/com/example/compose/snippets/layouts/grid/GridExampleTest.kt new file mode 100644 index 000000000..c36a9fb4e --- /dev/null +++ b/compose/snippets/src/screenshotTest/java/com/example/compose/snippets/layouts/grid/GridExampleTest.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2026 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.example.compose.snippets.layouts.grid + +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.android.tools.screenshot.PreviewTest + + +@Preview +@PreviewTest +@Composable +fun GridExamplePreviewTest() { + GridExample() +} + +@Preview +@PreviewTest +@Composable +fun SixCardsPreviewTest() { + SixCards() +} + +@Preview +@PreviewTest +@Composable +fun DefineGridPreviewTest() { + DefineGrid() +} + +@Preview +@PreviewTest +@Composable +fun DefineGridAndPlaceItemsPreviewTest() { + DefineGridAndPlaceItems() +} + +@Preview +@PreviewTest +@Composable +fun DefineExplicitAndImplicitGridTracksPreviewTest() { + DefineExplicitAndImplicitGridTracks() +} diff --git a/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/adaptivelayouts/MyFeedScreenShotTestKt/MyFeedPreview_0d79e3ce_0.png b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/adaptivelayouts/MyFeedScreenShotTestKt/MyFeedPreview_0d79e3ce_0.png new file mode 100644 index 000000000..66d15837a Binary files /dev/null and b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/adaptivelayouts/MyFeedScreenShotTestKt/MyFeedPreview_0d79e3ce_0.png differ diff --git a/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineExplicitAndImplicitGridTracksPreviewTest_0.png b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineExplicitAndImplicitGridTracksPreviewTest_0.png new file mode 100644 index 000000000..040d0e032 Binary files /dev/null and b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineExplicitAndImplicitGridTracksPreviewTest_0.png differ diff --git a/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineGridAndPlaceItemsPreviewTest_0.png b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineGridAndPlaceItemsPreviewTest_0.png new file mode 100644 index 000000000..7a9395542 Binary files /dev/null and b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineGridAndPlaceItemsPreviewTest_0.png differ diff --git a/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineGridPreviewTest_0.png b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineGridPreviewTest_0.png new file mode 100644 index 000000000..a2ea3e55c Binary files /dev/null and b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/DefineGridPreviewTest_0.png differ diff --git a/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/GridExamplePreviewTest_0.png b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/GridExamplePreviewTest_0.png new file mode 100644 index 000000000..7b347e9e6 Binary files /dev/null and b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/GridExamplePreviewTest_0.png differ diff --git a/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/SixCardsPreviewTest_0.png b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/SixCardsPreviewTest_0.png new file mode 100644 index 000000000..c2ea5a9ab Binary files /dev/null and b/compose/snippets/src/screenshotTestDebug/reference/com/example/compose/snippets/layouts/grid/GridExampleTestKt/SixCardsPreviewTest_0.png differ diff --git a/gradle.properties b/gradle.properties index 0346ade7c..13ee0a799 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,3 +27,5 @@ android.enableR8.fullMode=true # Use an AndroidX snapshot build. # https://androidx.dev/snapshots/builds # snapshotVersion=14793336 + +android.experimental.enableScreenshotTest=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7bd2019bf..3e945d538 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -123,6 +123,7 @@ compose-remote = "1.0.0-alpha11" glance-wear = "1.0.0-alpha10" remote-material3 = "1.0.0-alpha04" screenshotValidationApi = "0.0.1-alpha14" +screenshot = "0.0.1-alpha15" [libraries] accompanist-adaptive = "com.google.accompanist:accompanist-adaptive:0.37.3" @@ -309,6 +310,7 @@ androidx-compose-remote-tooling-preview = { module = "androidx.compose.remote:re glance-preview = { group = "androidx.glance", name = "glance-preview", version.ref = "androidx-glance-appwidget" } glance-appwidget-preview = { group = "androidx.glance", name = "glance-appwidget-preview", version.ref = "androidx-glance-appwidget" } screenshot-validation-api = { group = "com.android.tools.screenshot", name = "screenshot-validation-api", version.ref = "screenshotValidationApi" } +androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling"} [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } @@ -324,5 +326,6 @@ kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" } +screenshot = { id = "com.android.compose.screenshot", version.ref = "screenshot"} spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } version-catalog-update = { id = "nl.littlerobots.version-catalog-update", version.ref = "version-catalog-update" }