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