3 changed files with 54 additions and 0 deletions
@ -0,0 +1,19 @@
|
||||
package com.utun.chat.data |
||||
|
||||
/** Обе границы хранятся одной настройкой в десятичных кбит/с. */ |
||||
data class CallVideoBitrateRange(val minimum: Int = 300, val maximum: Int = 4000) { |
||||
init { require(minimum in 300..4000 && maximum in minimum..4000) } |
||||
|
||||
fun encode(): String = "$minimum:$maximum" |
||||
|
||||
companion object { |
||||
fun parse(value: String): CallVideoBitrateRange? { |
||||
val parts = value.split(':') |
||||
if (parts.size != 2 || parts.any { it.isEmpty() || it.any { digit -> digit !in '0'..'9' } }) return null |
||||
val minimum = parts[0].toIntOrNull() ?: return null |
||||
val maximum = parts[1].toIntOrNull() ?: return null |
||||
if (minimum !in 300..4000 || maximum !in minimum..4000) return null |
||||
return CallVideoBitrateRange(minimum, maximum) |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,20 @@
|
||||
package com.utun.chat.data |
||||
|
||||
import org.junit.Assert.* |
||||
import org.junit.Test |
||||
|
||||
class CallVideoBitrateRangeTest { |
||||
@Test fun defaultsAndRoundTrip() { |
||||
assertEquals("300:4000", CallVideoBitrateRange().encode()) |
||||
for (range in listOf(CallVideoBitrateRange(), CallVideoBitrateRange(500, 1500), CallVideoBitrateRange(300, 300))) { |
||||
assertEquals(range, CallVideoBitrateRange.parse(range.encode())) |
||||
} |
||||
} |
||||
|
||||
@Test fun invalidPersistedRangeIsRejected() { |
||||
for (value in listOf("", "299:4000", "300:4001", "4000:300", "300", "300:4000x", |
||||
"-300:4000", "300:+4000", "300: 4000", "999999999999999999999999:4000")) { |
||||
assertNull(value, CallVideoBitrateRange.parse(value)) |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue