This commit is contained in:
ponzischeme89
2026-08-10 08:37:08 +12:00
parent d2f2eb62be
commit 78d26effbf
18 changed files with 592 additions and 44 deletions
@@ -5,6 +5,8 @@ import com.ponzischeme89.memby.data.model.UserItemData
import com.ponzischeme89.memby.ui.detail.availableSeasons
import com.ponzischeme89.memby.ui.detail.defaultSeason
import com.ponzischeme89.memby.ui.detail.episodesForSeason
import com.ponzischeme89.memby.ui.detail.nextEpisodeToWatch
import com.ponzischeme89.memby.ui.detail.primaryActionLabel
import com.ponzischeme89.memby.ui.detail.seasonLabel
import org.junit.Assert.assertEquals
import org.junit.Test
@@ -15,13 +17,14 @@ class SeriesDetailsTest {
season: Int,
number: Int,
played: Boolean = false,
resumeTicks: Long = 0,
) = BaseItem(
id = id,
name = "Episode $number",
type = "Episode",
parentIndexNumber = season,
indexNumber = number,
userData = UserItemData(played = played),
userData = UserItemData(played = played, playbackPositionTicks = resumeTicks),
)
@Test
@@ -58,6 +61,31 @@ class SeriesDetailsTest {
assertEquals(2, defaultSeason(episodes))
}
@Test
fun `an old resume marker does not pull schedule playback behind later progress`() {
val episodes = (1..7).map { number ->
episode(
id = "s3e$number",
season = 3,
number = number,
played = number in 2..6,
resumeTicks = when (number) {
1 -> 60_000_000L
7 -> 120_000_000L
else -> 0L
},
)
}
val next = requireNotNull(nextEpisodeToWatch(episodes))
assertEquals("s3e7", next.id)
assertEquals("Resume S03E07", primaryActionLabel(
BaseItem(id = "series", name = "Series", type = "Series"),
next,
))
}
@Test
fun `season zero is labelled specials`() {
assertEquals("Specials", seasonLabel(0))
@@ -8,6 +8,27 @@ import org.junit.Assert.assertTrue
import org.junit.Test
class PlaybackRecoveryTest {
@Test
fun `libmpv takes codec failures only after Media3 recovery is exhausted`() {
val codecFailure = describePlaybackFailure(
PlaybackException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED,
)
assertFalse(shouldUseLibmpvFallback(codecFailure, completedAttempts = 0))
assertFalse(shouldUseLibmpvFallback(codecFailure, completedAttempts = 1))
assertTrue(shouldUseLibmpvFallback(codecFailure, completedAttempts = 2))
}
@Test
fun `libmpv does not replace Media3 network recovery`() {
val networkFailure = describePlaybackFailure(
PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED,
)
assertFalse(shouldUseLibmpvFallback(networkFailure, completedAttempts = 2))
}
@Test
fun networkFailuresAreSafeToRetry() {
val failure = describePlaybackFailure(