app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

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 }