Reserve Home hero primary action space
This commit is contained in:
parent
7c67596cb6
commit
f375d88030
3 changed files with 73 additions and 4 deletions
|
|
@ -0,0 +1,53 @@
|
|||
package org.justinvisser.wolfskin.design
|
||||
|
||||
import android.app.Application
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.requiredSize
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.test.assertIsNotDisplayed
|
||||
import androidx.compose.ui.test.junit4.createComposeRule
|
||||
import androidx.compose.ui.test.onNodeWithText
|
||||
import androidx.compose.ui.test.onRoot
|
||||
import com.github.takahirom.roborazzi.captureRoboImage
|
||||
import java.io.File
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.robolectric.RobolectricTestRunner
|
||||
import org.robolectric.annotation.Config
|
||||
import org.robolectric.annotation.GraphicsMode
|
||||
|
||||
/** Fresh watch data may enable playback, but cannot move an already-visible Details action. */
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(sdk = [34], application = Application::class, qualifiers = "w960dp-h540dp-xhdpi")
|
||||
@GraphicsMode(GraphicsMode.Mode.NATIVE)
|
||||
class HomeHeroActionsTest {
|
||||
@get:Rule val rule = createComposeRule()
|
||||
|
||||
@Test fun latePlaybackReadinessKeepsDetailsBoundsForResumePlayAndEpisodeLabels() {
|
||||
val title = HomeTitle("arrival", "Arrival", "movie", overview = "A linguist investigates a mysterious arrival.")
|
||||
val episode = title.copy(id = "episode", type = "episode", season = 3, episode = 7)
|
||||
val directory = File(System.getProperty("wolfskin.captureDirectory"), "hero-actions").apply { mkdirs() }
|
||||
val current = mutableStateOf(HomeRow("hero", HomeRowKind.Hero, cards = listOf(title), heroKind = "resume", watchReady = false))
|
||||
rule.setContent { WolfskinTheme {
|
||||
Box(Modifier.requiredSize(WolfskinTokens.Shell.stageWidth, WolfskinTokens.Shell.stageHeight)) {
|
||||
HomeHero(current.value, false, 0, emptyList(), {}, {})
|
||||
}
|
||||
} }
|
||||
for ((kind, item) in listOf("resume" to episode, "new" to title, "next" to episode)) {
|
||||
rule.runOnIdle { current.value = current.value.copy(cards = listOf(item), heroKind = kind, watchReady = false) }
|
||||
rule.mainClock.advanceTimeBy(1000)
|
||||
val before = rule.onNodeWithText("Details").fetchSemanticsNode().boundsInRoot
|
||||
val primary = (if (kind == "resume") "Resume" else "Play") + if (item.isEpisode) " ${item.episodeLabel}" else ""
|
||||
rule.onNodeWithText(primary).assertIsNotDisplayed()
|
||||
rule.onRoot().captureRoboImage(File(directory, "$kind-pending.png").absolutePath)
|
||||
rule.runOnIdle { current.value = current.value.copy(watchReady = true) }
|
||||
rule.mainClock.advanceTimeBy(400)
|
||||
val after = rule.onNodeWithText("Details").fetchSemanticsNode().boundsInRoot
|
||||
rule.onRoot().captureRoboImage(File(directory, "$kind-ready.png").absolutePath)
|
||||
assertEquals("Late $primary must not move Details", before, after)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue