From 83b245a17e4701e0794e22f37f3fcf7ca4a49ed2 Mon Sep 17 00:00:00 2001 From: cartland Date: Fri, 22 Aug 2025 14:04:25 -0700 Subject: [PATCH 1/3] feat(compose): Add Compose testing common patterns snippet --- .../compose/testing/CommonPatternsSample.kt | 62 +++++++++++++++++++ .../snippets/src/main/res/values/strings.xml | 1 + 2 files changed, 63 insertions(+) create mode 100644 compose/snippets/src/androidTest/java/com/android/example/compose/testing/CommonPatternsSample.kt diff --git a/compose/snippets/src/androidTest/java/com/android/example/compose/testing/CommonPatternsSample.kt b/compose/snippets/src/androidTest/java/com/android/example/compose/testing/CommonPatternsSample.kt new file mode 100644 index 000000000..9a719297b --- /dev/null +++ b/compose/snippets/src/androidTest/java/com/android/example/compose/testing/CommonPatternsSample.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2025 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.android.example.compose.testing + +import androidx.activity.ComponentActivity +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import org.junit.Rule +import org.junit.Test +import com.example.compose.snippets.R + +class CommonPatternsSample { + + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @Test + fun myTest() { + // [START android_snippets_compose_testing_common_patterns] + // Start the app + composeTestRule.setContent { + MyAppTheme { + MainScreen(uiState = exampleUiState, /*...*/) + } + } + val continueLabel = composeTestRule.activity.getString(R.string.next) + composeTestRule.onNodeWithText(continueLabel).performClick() + // [END android_snippets_compose_testing_common_patterns] + } +} + +@Composable +fun MyAppTheme(content: @Composable () -> Unit) { + content() +} + +@Composable +fun MainScreen(uiState: ExampleUiState) { + Text(text = "Hello ${uiState.name}") + Text(text = "Next") +} + +data class ExampleUiState(val name: String) + +val exampleUiState = ExampleUiState("world") diff --git a/compose/snippets/src/main/res/values/strings.xml b/compose/snippets/src/main/res/values/strings.xml index 02254e29a..210a99718 100644 --- a/compose/snippets/src/main/res/values/strings.xml +++ b/compose/snippets/src/main/res/values/strings.xml @@ -16,6 +16,7 @@ --> snippets + Next Golden Retriever in fall leaves Shopping cart Bus From 41aeef127638aefa521b58314389b96d57ef74c5 Mon Sep 17 00:00:00 2001 From: cartland Date: Fri, 22 Aug 2025 15:05:11 -0700 Subject: [PATCH 2/3] feat: Add MyComposeTest snippet Region-Tag: android_snippets_compose_testing_common_patterns --- ...mmonPatternsSample.kt => MyComposeTest.kt} | 32 +++++++++++++------ .../snippets/src/main/res/values/strings.xml | 3 +- 2 files changed, 24 insertions(+), 11 deletions(-) rename compose/snippets/src/androidTest/java/com/android/example/compose/testing/{CommonPatternsSample.kt => MyComposeTest.kt} (60%) diff --git a/compose/snippets/src/androidTest/java/com/android/example/compose/testing/CommonPatternsSample.kt b/compose/snippets/src/androidTest/java/com/android/example/compose/testing/MyComposeTest.kt similarity index 60% rename from compose/snippets/src/androidTest/java/com/android/example/compose/testing/CommonPatternsSample.kt rename to compose/snippets/src/androidTest/java/com/android/example/compose/testing/MyComposeTest.kt index 9a719297b..382222634 100644 --- a/compose/snippets/src/androidTest/java/com/android/example/compose/testing/CommonPatternsSample.kt +++ b/compose/snippets/src/androidTest/java/com/android/example/compose/testing/MyComposeTest.kt @@ -17,34 +17,41 @@ package com.android.example.compose.testing import androidx.activity.ComponentActivity +import androidx.compose.foundation.clickable import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import org.junit.Rule import org.junit.Test -import com.example.compose.snippets.R -class CommonPatternsSample { +// [START android_snippets_compose_testing_common_patterns] +class MyComposeTest { @get:Rule val composeTestRule = createAndroidComposeRule() @Test fun myTest() { - // [START android_snippets_compose_testing_common_patterns] // Start the app composeTestRule.setContent { MyAppTheme { - MainScreen(uiState = exampleUiState, /*...*/) + MainScreen(uiState = exampleUiState) } } - val continueLabel = composeTestRule.activity.getString(R.string.next) - composeTestRule.onNodeWithText(continueLabel).performClick() - // [END android_snippets_compose_testing_common_patterns] + composeTestRule.onNodeWithText("Continue").performClick() + + composeTestRule.onNodeWithText("Welcome").assertIsDisplayed() } } +// [END android_snippets_compose_testing_common_patterns] @Composable fun MyAppTheme(content: @Composable () -> Unit) { @@ -53,10 +60,15 @@ fun MyAppTheme(content: @Composable () -> Unit) { @Composable fun MainScreen(uiState: ExampleUiState) { - Text(text = "Hello ${uiState.name}") - Text(text = "Next") + var showWelcome by remember { mutableStateOf(false) } + if (showWelcome) { + Text(text = "Welcome") + } else { + Text(text = "Hello ${uiState.name}") + Text(text = "Continue", modifier = Modifier.clickable { showWelcome = true }) + } } data class ExampleUiState(val name: String) -val exampleUiState = ExampleUiState("world") +val exampleUiState = ExampleUiState("world") \ No newline at end of file diff --git a/compose/snippets/src/main/res/values/strings.xml b/compose/snippets/src/main/res/values/strings.xml index 210a99718..850b2a2b8 100644 --- a/compose/snippets/src/main/res/values/strings.xml +++ b/compose/snippets/src/main/res/values/strings.xml @@ -16,7 +16,8 @@ --> snippets - Next + Continue + Welcome Golden Retriever in fall leaves Shopping cart Bus From 31051d61345eec1e2818d08ccf84f60191f58f5e Mon Sep 17 00:00:00 2001 From: cartland <846051+cartland@users.noreply.github.com> Date: Fri, 22 Aug 2025 22:20:17 +0000 Subject: [PATCH 3/3] Apply Spotless --- .../java/com/android/example/compose/testing/MyComposeTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose/snippets/src/androidTest/java/com/android/example/compose/testing/MyComposeTest.kt b/compose/snippets/src/androidTest/java/com/android/example/compose/testing/MyComposeTest.kt index 382222634..24aa5d5ed 100644 --- a/compose/snippets/src/androidTest/java/com/android/example/compose/testing/MyComposeTest.kt +++ b/compose/snippets/src/androidTest/java/com/android/example/compose/testing/MyComposeTest.kt @@ -71,4 +71,4 @@ fun MainScreen(uiState: ExampleUiState) { data class ExampleUiState(val name: String) -val exampleUiState = ExampleUiState("world") \ No newline at end of file +val exampleUiState = ExampleUiState("world")