All checks were successful
Build TV app / build (push) Successful in 3m9s
A three-hour window was empty most of the day, which is exactly when someone wants to know whether their club plays tonight. The scan now runs until midnight, never less than three hours, so a late-evening question still covers the rest of the night. A channel can carry several of the club's broadcasts in one evening — a preview at 18:20 and the match at 21:45 on the same station. The row names the next one and appends "+n weitere" instead of silently hiding the rest, so the list stays a channel list where one click means one station. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
81 lines
2.8 KiB
Kotlin
81 lines
2.8 KiB
Kotlin
package dev.castarr.tv.data
|
|
|
|
import org.junit.Assert.assertEquals
|
|
import org.junit.Assert.assertFalse
|
|
import org.junit.Assert.assertTrue
|
|
import org.junit.Test
|
|
|
|
class TeamFiltersTest {
|
|
|
|
private val hansa = TeamFilters.byKey("hansa")!!
|
|
private val vfb = TeamFilters.byKey("stuttgart")!!
|
|
|
|
@Test
|
|
fun `matches the club regardless of case and surrounding text`() {
|
|
assertTrue(hansa.matches("3. Liga: FC Hansa Rostock - Dynamo Dresden"))
|
|
assertTrue(hansa.matches("HANSA ROSTOCK KOMPAKT"))
|
|
assertTrue(vfb.matches("Bundesliga: VfB Stuttgart - Bayern München"))
|
|
}
|
|
|
|
@Test
|
|
fun `does not match unrelated programmes`() {
|
|
assertFalse(hansa.matches("Tagesschau"))
|
|
assertFalse(vfb.matches("Hansa Rostock - Saarbrücken"))
|
|
}
|
|
|
|
@Test
|
|
fun `scans sport and free-to-air groups`() {
|
|
listOf("DAZN Event", "Sky Sport", "Magenta Sport", "Amazon Prime", "Free TV / HD+", "DYN Sport")
|
|
.forEach { assertTrue(it, TeamFilters.scansGroup(it)) }
|
|
}
|
|
|
|
@Test
|
|
fun `skips NFL and unrelated groups`() {
|
|
assertFalse(TeamFilters.scansGroup("DAZN Event NFL"))
|
|
assertFalse(TeamFilters.scansGroup("Kids"))
|
|
assertFalse(TeamFilters.scansGroup("Musik"))
|
|
}
|
|
|
|
@Test
|
|
fun `assigns each viewer their own club by default`() {
|
|
assertEquals(listOf("hansa"), TeamFilters.defaultKeysFor("benjamin"))
|
|
assertEquals(listOf("stuttgart"), TeamFilters.defaultKeysFor("TobiasB"))
|
|
assertTrue(TeamFilters.defaultKeysFor("someone-else").isEmpty())
|
|
}
|
|
|
|
@Test
|
|
fun `club keys are unique and every club has needles`() {
|
|
val keys = TeamFilters.all.map { it.key }
|
|
assertEquals(keys.size, keys.toSet().size)
|
|
assertTrue(TeamFilters.all.all { it.needles.isNotEmpty() })
|
|
assertTrue(TeamFilters.all.all { c -> c.needles.all { it == it.lowercase() } })
|
|
}
|
|
|
|
@Test
|
|
fun `window reaches midnight but never falls below three hours`() {
|
|
val cal = java.util.Calendar.getInstance()
|
|
// Morning: the window must reach into the evening.
|
|
cal.set(java.util.Calendar.HOUR_OF_DAY, 9)
|
|
cal.set(java.util.Calendar.MINUTE, 0)
|
|
val morning = cal.timeInMillis
|
|
val eveningKickoff = morning + 12 * 60 * 60 * 1000L
|
|
assertTrue(TeamFilters.windowEnd(morning) > eveningKickoff)
|
|
|
|
// Late at night: still at least three hours ahead.
|
|
cal.set(java.util.Calendar.HOUR_OF_DAY, 23)
|
|
cal.set(java.util.Calendar.MINUTE, 30)
|
|
val lateNight = cal.timeInMillis
|
|
assertTrue(
|
|
TeamFilters.windowEnd(lateNight) >= lateNight + TeamFilters.MIN_WINDOW_MS
|
|
)
|
|
}
|
|
|
|
@Test
|
|
fun `covers all three divisions`() {
|
|
assertTrue(TeamFilters.all.size > 50)
|
|
listOf("bayern", "schalke", "hansa").forEach {
|
|
assertTrue(it, TeamFilters.byKey(it) != null)
|
|
}
|
|
}
|
|
}
|