GithubHelp home page GithubHelp logo

Comments (5)

gagandeep3458 avatar gagandeep3458 commented on May 26, 2024 5

This Worked for me

fun rallyTopAppBarTest_tabSelectionChangesSelectedScreen() {

    val allScreens = RallyScreen.values().toList()

    var currentScreen by mutableStateOf(RallyScreen.Overview)

    composeTestRule.setContent {

        RallyTopAppBar(
            allScreens = allScreens,
            onTabSelected = {
                currentScreen = it
            },
            currentScreen = currentScreen
        )
    }

    composeTestRule.onNode(hasContentDescription(RallyScreen.Bills.name)).performClick()
    assert(currentScreen.name == RallyScreen.Bills.name)
}

from codelab-android-compose.

vkatzyn avatar vkatzyn commented on May 26, 2024 2

@juyeop03
That's a nice solution. But it can be improved so that the test verifies that clicking on any of the tabs will change the selection.
Like this:

composeTestRule.setContent {
    RallyApp()
}

val allScreens = RallyScreen.values().toList()

for (screen in allScreens) {
    composeTestRule
        .onNodeWithContentDescription(screen.name)
        .performClick()
        .assertIsSelected()
}

from codelab-android-compose.

juyeop03 avatar juyeop03 commented on May 26, 2024 1

@gagandeep3458
Thank you give to me a nice idea, your solution is awesome 👍
I also thought another method too, that is to use parent composable RallyApp

composeTestRule.setContent {
    RallyTheme {
        RallyApp()
    }
}

composeTestRule
    .onNodeWithContentDescription(RallyScreen.Bills.name)
    .performClick()
    .assertIsSelected()

from codelab-android-compose.

machado001 avatar machado001 commented on May 26, 2024

@gagandeep3458 Thank you. I have enhanced your solution to handle any combination of screens:

        val allScreens = RallyScreen.values().toList()
        val selectedScreen = allScreens.random() //pick a random screen name
        val anotherScreen = allScreens.filterNot { it == selectedScreen }.random() //pick a random screen excluding selectedScreen
        var currentScreen by mutableStateOf(selectedScreen)

        composeTestRule.setContent {
            RallyTopAppBar(
                allScreens = allScreens,
                onTabSelected = {
                    currentScreen = it
                },
                currentScreen = currentScreen
            )
        }

        composeTestRule.onNodeWithContentDescription(anotherScreen.name)
            .performClick()
            .assertIsSelected()
    }

from codelab-android-compose.

ambageo avatar ambageo commented on May 26, 2024

This is weird - I'm doing the following:

val allScreens = RallyScreen.entries //mock the screens
        var selectedScreen: RallyScreen? = null
        composeTestRule.setContent {
            RallyTheme {
                RallyTopAppBar(
                    allScreens = allScreens,
                    onTabSelected = { screen -> selectedScreen = screen},
                    currentScreen = RallyScreen.Accounts
                )
            }
        }

        composeTestRule.onNodeWithContentDescription(RallyScreen.Overview.name).performClick()
        composeTestRule.onNodeWithContentDescription(RallyScreen.Overview.name).assertIsSelected()
        assertEquals(RallyScreen.Overview, selectedScreen)

assertEquals is true, but the assertIsSelected fails.

from codelab-android-compose.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.