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