package org.shahondin1624 import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.width import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.onAllNodesWithTag import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.performClick import androidx.compose.ui.test.runComposeUiTest import androidx.compose.ui.unit.dp import org.shahondin1624.lib.components.TestTags import org.shahondin1624.theme.LocalWindowSizeClass import org.shahondin1624.theme.WindowSizeClass import kotlin.test.Test import kotlin.test.assertEquals /** * Tests that the correct navigation mode is rendered at each window size class. */ @OptIn(ExperimentalTestApi::class) class ResponsiveNavigationModeTest { @Test fun compactShowsModalDrawerHiddenByDefault() = runComposeUiTest { setContent { App() } waitForIdle() // Hamburger menu button should be visible onNodeWithTag(TestTags.MENU_BUTTON).assertIsDisplayed() // Navigation rail and permanent drawer should not exist assertEquals( 0, onAllNodesWithTag(TestTags.NAV_RAIL).fetchSemanticsNodes().size, "NavigationRail should not be present in compact mode" ) assertEquals( 0, onAllNodesWithTag(TestTags.NAV_PERMANENT_DRAWER).fetchSemanticsNodes().size, "PermanentDrawer should not be present in compact mode" ) } @Test fun compactDrawerAppearsOnMenuTap() = runComposeUiTest { setContent { App() } waitForIdle() // Tap hamburger onNodeWithTag(TestTags.MENU_BUTTON).performClick() waitForIdle() // Drawer content should now be visible onNodeWithTag(TestTags.NAV_CHARACTER_SHEET).assertIsDisplayed() onNodeWithTag(TestTags.NAV_SETTINGS).assertIsDisplayed() } @Test fun expandedShowsPermanentSidebar() = runComposeUiTest { setContent { // Force expanded size class by wrapping in a wide box CompositionLocalProvider(LocalWindowSizeClass provides WindowSizeClass.Expanded) { BoxWithConstraints(modifier = Modifier.width(1200.dp).fillMaxSize()) { App() } } } waitForIdle() // Permanent drawer should be visible onNodeWithTag(TestTags.NAV_PERMANENT_DRAWER).assertIsDisplayed() // Hamburger menu button should not exist assertEquals( 0, onAllNodesWithTag(TestTags.MENU_BUTTON).fetchSemanticsNodes().size, "Menu button should not be present in expanded mode" ) // Navigation items always visible onNodeWithTag(TestTags.NAV_CHARACTER_SHEET).assertIsDisplayed() onNodeWithTag(TestTags.NAV_SETTINGS).assertIsDisplayed() } }