CanvasScaffoldTest.kt (3590B)
1 package org.harvestcircle.ui.shell 2 3 import androidx.compose.runtime.CompositionLocalProvider 4 import androidx.compose.ui.semantics.SemanticsActions 5 import androidx.compose.ui.test.ExperimentalTestApi 6 import androidx.compose.ui.test.assertCountEquals 7 import androidx.compose.ui.test.assertIsDisplayed 8 import androidx.compose.ui.test.onAllNodesWithTag 9 import androidx.compose.ui.test.onNodeWithTag 10 import androidx.compose.ui.test.v2.runComposeUiTest 11 import androidx.compose.ui.unit.dp 12 import org.harvestcircle.appearance.AppearanceState 13 import org.harvestcircle.appearance.TextSizePreference 14 import org.harvestcircle.designsystem.layout.HarvestCircleWindowChromeEdge 15 import org.harvestcircle.designsystem.layout.HarvestCircleWindowChromeExclusion 16 import kotlin.test.Test 17 import kotlin.test.assertEquals 18 import kotlin.test.assertFalse 19 import kotlin.test.assertTrue 20 21 @OptIn(ExperimentalTestApi::class) 22 class CanvasScaffoldTest { 23 @Test 24 fun baselineCanvasKeepsHeaderBodyAndActionRegionsFixed() = 25 runComposeUiTest { 26 setHarvestCircleContent { canvas(TextSizePreference.Default) } 27 onNodeWithTag("canvas-header").assertIsDisplayed() 28 onNodeWithTag("canvas-body").assertIsDisplayed() 29 onNodeWithTag("canvas-action-bar").assertIsDisplayed() 30 onAllNodesWithTag("canvas-navigation").assertCountEquals(1) 31 assertFalse(onNodeWithTag("canvas-body").fetchSemanticsNode().config.contains(SemanticsActions.ScrollBy)) 32 } 33 34 @Test 35 fun veryLargeTextEnablesOnlyBoundedBodyScrolling() = 36 runComposeUiTest { 37 setHarvestCircleContent { canvas(TextSizePreference.VeryLarge) } 38 assertTrue(onNodeWithTag("canvas-body").fetchSemanticsNode().config.contains(SemanticsActions.ScrollBy)) 39 onNodeWithTag("canvas-action-bar").assertIsDisplayed() 40 } 41 42 @Test 43 fun shellAppearanceEnablesLargeTextFallbackForDefaultCanvases() = 44 runComposeUiTest { 45 setHarvestCircleContent { 46 CompositionLocalProvider( 47 LocalShellAppearance provides AppearanceState(textSize = TextSizePreference.VeryLarge), 48 ) { 49 canvas(TextSizePreference.Default) 50 } 51 } 52 assertTrue(onNodeWithTag("canvas-body").fetchSemanticsNode().config.contains(SemanticsActions.ScrollBy)) 53 } 54 55 @Test 56 fun macOsChromeExclusionProtectsHeaderForegroundAndMovesBodyBelowTallChrome() = 57 runComposeUiTest { 58 setHarvestCircleContent( 59 windowChromeExclusion = 60 HarvestCircleWindowChromeExclusion( 61 edge = HarvestCircleWindowChromeEdge.Left, 62 width = 112.dp, 63 height = 56.dp, 64 ), 65 ) { 66 canvas(TextSizePreference.Default) 67 } 68 69 val chromeContent = onNodeWithTag("harvestcircle-canvas-chrome-content").fetchSemanticsNode().boundsInRoot 70 val header = onNodeWithTag("canvas-header").fetchSemanticsNode().boundsInRoot 71 val body = onNodeWithTag("canvas-body").fetchSemanticsNode().boundsInRoot 72 73 assertEquals(112f, chromeContent.left) 74 assertTrue(header.left >= 112f) 75 assertTrue(body.top >= 56f) 76 } 77 } 78 79 @androidx.compose.runtime.Composable 80 private fun canvas(textSize: TextSizePreference) { 81 CanvasScaffold( 82 textSize = textSize, 83 navigation = {}, 84 header = {}, 85 step = {}, 86 body = {}, 87 actionBar = {}, 88 ) 89 }