1 /* <lambda>null2 * Copyright 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.wear.compose.material 18 19 import android.os.Build 20 import androidx.compose.foundation.background 21 import androidx.compose.foundation.layout.Box 22 import androidx.compose.foundation.layout.Spacer 23 import androidx.compose.foundation.layout.fillMaxWidth 24 import androidx.compose.foundation.layout.height 25 import androidx.compose.foundation.layout.size 26 import androidx.compose.runtime.Composable 27 import androidx.compose.runtime.CompositionLocalProvider 28 import androidx.compose.testutils.assertAgainstGolden 29 import androidx.compose.ui.Alignment 30 import androidx.compose.ui.Modifier 31 import androidx.compose.ui.platform.LocalLayoutDirection 32 import androidx.compose.ui.platform.testTag 33 import androidx.compose.ui.test.captureToImage 34 import androidx.compose.ui.test.junit4.createComposeRule 35 import androidx.compose.ui.test.onNodeWithTag 36 import androidx.compose.ui.unit.LayoutDirection 37 import androidx.compose.ui.unit.dp 38 import androidx.test.ext.junit.runners.AndroidJUnit4 39 import androidx.test.filters.MediumTest 40 import androidx.test.filters.SdkSuppress 41 import androidx.test.screenshot.AndroidXScreenshotTestRule 42 import org.junit.Rule 43 import org.junit.Test 44 import org.junit.rules.TestName 45 import org.junit.runner.RunWith 46 47 @MediumTest 48 @RunWith(AndroidJUnit4::class) 49 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O) 50 class PickerGroupScreenshotTest { 51 52 @get:Rule val rule = createComposeRule() 53 54 @get:Rule val screenshotRule = AndroidXScreenshotTestRule(SCREENSHOT_GOLDEN_PATH) 55 56 @get:Rule val testName = TestName() 57 58 private val screenHeight = 150.dp 59 60 @Test fun pickerGroup() = verifyScreenshot { samplePickerGroup() } 61 62 @Test 63 fun pickerGroup_withAutoCentering() = verifyScreenshot { samplePickerGroup(autoCenter = true) } 64 65 @Test 66 fun pickerGroup_withManyColumns_withAutoCentering() = verifyScreenshot { 67 samplePickerGroup(pickerCount = 5, autoCenter = true) 68 } 69 70 @Test 71 fun pickerGroup_withRtlAndManyColumns_withAutoCentering() = 72 verifyScreenshot(layoutDirection = LayoutDirection.Rtl) { 73 samplePickerGroup(pickerCount = 5, autoCenter = true) 74 } 75 76 @Composable 77 private fun samplePickerGroup(pickerCount: Int = 2, autoCenter: Boolean = false) { 78 Box( 79 modifier = 80 Modifier.height(screenHeight) 81 .fillMaxWidth() 82 .background(MaterialTheme.colors.background) 83 .testTag(TEST_TAG), 84 contentAlignment = Alignment.Center 85 ) { 86 PickerGroup( 87 pickers = getPickerColumns(pickerCount), 88 autoCenter = autoCenter, 89 separator = { 90 Spacer(modifier = Modifier.size(6.dp)) 91 Text(":") 92 Spacer(modifier = Modifier.size(6.dp)) 93 }, 94 ) 95 } 96 } 97 98 private fun verifyScreenshot( 99 layoutDirection: LayoutDirection = LayoutDirection.Ltr, 100 content: @Composable () -> Unit 101 ) { 102 rule.setContentWithTheme { 103 CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) { content() } 104 } 105 rule.waitForIdle() 106 107 rule 108 .onNodeWithTag(TEST_TAG) 109 .captureToImage() 110 .assertAgainstGolden(screenshotRule, testName.methodName) 111 } 112 113 private fun getPickerColumns(count: Int): Array<PickerGroupItem> = 114 Array(count) { 115 PickerGroupItem( 116 pickerState = PickerState(10), 117 option = { optionIndex, _ -> Text("%02d".format(optionIndex)) } 118 ) 119 } 120 } 121