library: cover starred/downloaded shuffle in tests, dedupe list predicate

This commit is contained in:
austinried
2026-10-09 09:15:36 +00:00
parent 0bdac8fa22
commit adabe21d63
3 changed files with 52 additions and 7 deletions
@@ -101,8 +101,9 @@ fun ScrollToTopOnRequest(
) {
var previous by remember { mutableStateOf(request) }
LaunchedEffect(request) {
if (request != null && previous != null && request != previous) state.animateScrollToItem(0)
val stale = previous
previous = request
if (request != null && stale != null && request != stale) state.animateScrollToItem(0)
}
}
@@ -113,7 +114,8 @@ fun ScrollToTopOnRequest(
) {
var previous by remember { mutableStateOf(request) }
LaunchedEffect(request) {
if (request != null && previous != null && request != previous) state.animateScrollToItem(0)
val stale = previous
previous = request
if (request != null && stale != null && request != stale) state.animateScrollToItem(0)
}
}
@@ -148,10 +148,6 @@ fun HomeListScreen(
val resources = LocalResources.current
val scope = rememberCoroutineScope()
val songListState = rememberLazyListState()
val isSongList =
request.downloaded == OfflineListKind.Songs ||
request.section == HomeSection.RecentlyStarredSongs ||
request.genre != null
Scaffold(
modifier = modifier,
topBar = {
@@ -163,7 +159,7 @@ fun HomeListScreen(
}
},
modifier =
if (isSongList) {
if (onShuffle != null) {
Modifier.clickable(onClickLabel = stringResource(R.string.scroll_to_top)) {
scope.launch { songListState.animateScrollToItem(0) }
}
@@ -2413,6 +2413,40 @@ class PlaybackControllerTest {
assertEquals(setOf("r1", "r2"), handle.items.map { it.id }.toSet())
}
@Test
fun shuffleStarredPlaysOnlyStarredSongs() {
seedStarred()
controller.shuffleStarred(1)
await { controller.state.value.item != null && controller.state.value.shuffle }
assertTrue(controller.state.value.shuffle)
assertEquals(
QueueKind.Starred,
controller.state.value.context
?.kind,
)
assertEquals(setOf("t1", "t2"), handle.items.map { it.id }.toSet())
}
@Test
fun shuffleDownloadedPlaysOnlyDownloadedSongs() {
seedAlbum(3, sourceId = 1)
markDownloaded(1, "s1")
markDownloaded(1, "s3")
controller.shuffleDownloaded(1)
await { controller.state.value.item != null && controller.state.value.shuffle }
assertTrue(controller.state.value.shuffle)
assertEquals(
QueueKind.Downloaded,
controller.state.value.context
?.kind,
)
assertEquals(setOf("s1", "s3"), handle.items.map { it.id }.toSet())
}
@Test
fun artistQueueRowsFollowTheFlatShuffleIdOrder() {
seedArtist()
@@ -3142,6 +3176,19 @@ class PlaybackControllerTest {
}
}
private fun seedStarred() {
runBlocking {
db.sourcesDao().upsertSource(Source(1, "source 1", "http://localhost:1", true, 1))
db.libraryDao().upsertSongs(
listOf(
Song(1, "t1", "al1", "ar1", "Star 1", "Album", "Artist", 100, 1, 1, 1_700_000_000L, null),
Song(1, "t2", "al1", "ar1", "Star 2", "Album", "Artist", 100, 2, 1, 1_700_000_000L, null),
Song(1, "n1", "al1", "ar1", "Plain 1", "Album", "Artist", 100, 3, 1, null, null),
),
)
}
}
private fun seedAlbumTracks(
albumId: String,
count: Int,