1 /*
2  * Copyright 2022 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.BoxScope
22 import androidx.compose.runtime.Composable
23 import androidx.compose.runtime.CompositionLocalProvider
24 import androidx.compose.testutils.assertAgainstGolden
25 import androidx.compose.ui.Modifier
26 import androidx.compose.ui.graphics.compositeOver
27 import androidx.compose.ui.platform.LocalLayoutDirection
28 import androidx.compose.ui.platform.testTag
29 import androidx.compose.ui.test.captureToImage
30 import androidx.compose.ui.test.junit4.createComposeRule
31 import androidx.compose.ui.test.onNodeWithTag
32 import androidx.compose.ui.unit.LayoutDirection
33 import androidx.test.ext.junit.runners.AndroidJUnit4
34 import androidx.test.filters.MediumTest
35 import androidx.test.filters.SdkSuppress
36 import androidx.test.screenshot.AndroidXScreenshotTestRule
37 import androidx.test.screenshot.matchers.MSSIMMatcher
38 import org.junit.Rule
39 import org.junit.Test
40 import org.junit.rules.TestName
41 import org.junit.runner.RunWith
42 
43 @MediumTest
44 @RunWith(AndroidJUnit4::class)
45 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
46 class ToggleControlScreenshotTest {
47 
48     @get:Rule val rule = createComposeRule()
49 
50     @get:Rule val screenshotRule = AndroidXScreenshotTestRule(SCREENSHOT_GOLDEN_PATH)
51 
52     @get:Rule val testName = TestName()
53 
54     @Test
checkbox_checked_enablednull55     fun checkbox_checked_enabled() = verifyScreenshot {
56         Checkbox(checked = true, enabled = true, modifier = testBackgroundModifier())
57     }
58 
59     @Test
<lambda>null60     fun checkbox_unchecked_enabled() = verifyScreenshot {
61         Checkbox(checked = false, enabled = true, modifier = testBackgroundModifier())
62     }
63 
64     @Test
<lambda>null65     fun checkbox_checked_disabled() = verifyScreenshot {
66         Checkbox(checked = true, enabled = false, modifier = testBackgroundModifier())
67     }
68 
69     @Test
checkbox_unchecked_disablednull70     fun checkbox_unchecked_disabled() = verifyScreenshot {
71         Checkbox(checked = false, enabled = false, modifier = testBackgroundModifier())
72     }
73 
74     @Test
<lambda>null75     fun switch_checked_enabled() = verifyScreenshot {
76         Switch(checked = true, enabled = true, modifier = testBackgroundModifier())
77     }
78 
79     @Test
<lambda>null80     fun switch_unchecked_enabled() = verifyScreenshot {
81         Switch(checked = false, enabled = true, modifier = testBackgroundModifier())
82     }
83 
84     @Test
<lambda>null85     fun switch_checked_disabled() = verifyScreenshot {
86         Switch(checked = true, enabled = false, modifier = testBackgroundModifier())
87     }
88 
89     @Test
<lambda>null90     fun switch_unchecked_disabled() = verifyScreenshot {
91         Switch(checked = false, enabled = false, modifier = testBackgroundModifier())
92     }
93 
94     @Test
<lambda>null95     fun switch_rtl_checked_enabled() = verifyScreenshot {
96         CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
97             Switch(checked = true, enabled = true, modifier = testBackgroundModifier())
98         }
99     }
100 
101     @Test
<lambda>null102     fun switch_rtl_unchecked_enabled() = verifyScreenshot {
103         CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
104             Switch(checked = false, enabled = true, modifier = testBackgroundModifier())
105         }
106     }
107 
108     @Test
<lambda>null109     fun switch_rtl_checked_disabled() = verifyScreenshot {
110         CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
111             Switch(checked = true, enabled = false, modifier = testBackgroundModifier())
112         }
113     }
114 
115     @Test
<lambda>null116     fun switch_rtl_unchecked_disabled() = verifyScreenshot {
117         CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
118             Switch(checked = false, enabled = false, modifier = testBackgroundModifier())
119         }
120     }
121 
122     @Test
<lambda>null123     fun radiobutton_checked_enabled() = verifyScreenshot {
124         RadioButton(selected = true, enabled = true, modifier = testBackgroundModifier())
125     }
126 
127     @Test
<lambda>null128     fun radiobutton_unchecked_enabled() = verifyScreenshot {
129         RadioButton(selected = false, enabled = true, modifier = testBackgroundModifier())
130     }
131 
132     @Test
<lambda>null133     fun radiobutton_checked_disabled() = verifyScreenshot {
134         RadioButton(selected = true, enabled = false, modifier = testBackgroundModifier())
135     }
136 
137     @Test
<lambda>null138     fun radiobutton_unchecked_disabled() = verifyScreenshot {
139         RadioButton(selected = false, enabled = false, modifier = testBackgroundModifier())
140     }
141 
verifyScreenshotnull142     private fun verifyScreenshot(
143         threshold: Double = 0.98,
144         content: @Composable BoxScope.() -> Unit
145     ) {
146         rule.setContentWithTheme(composable = content)
147         rule
148             .onNodeWithTag(TEST_TAG)
149             .captureToImage()
150             .assertAgainstGolden(screenshotRule, testName.methodName, MSSIMMatcher(threshold))
151     }
152 
153     @Composable
testBackgroundModifiernull154     private fun testBackgroundModifier(): Modifier =
155         Modifier.testTag(TEST_TAG)
156             .background(
157                 MaterialTheme.colors.primary
158                     .copy(alpha = 0.5f)
159                     .compositeOver(MaterialTheme.colors.surface)
160             )
161 }
162