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