Test Android radio talk lifecycle and translate speaker status

This commit is contained in:
evgeny committed 2026-10-07 19:33:53 +02:00
1 parent e95fc090df
commit 2c407540a0
3 files changed
+58

No files matched your search

@@ -0,0 +1,52 @@
package com.utun.chat.data
import org.junit.Assert.*
import org.junit.Test
import java.nio.ByteBuffer
import java.nio.ByteOrder
class RadioTalkStateTest {
private fun event(group: Long = 7, node: Long = 42, on: Boolean = true): RadioTalkEvent {
val bytes = ByteBuffer.allocate(19).order(ByteOrder.LITTLE_ENDIAN)
.putLong(group).putLong(node).putShort(65535.toShort()).put(if (on) 1.toByte() else 0.toByte()).array()
return requireNotNull(parseRadioTalkEvent(bytes))
}
@Test fun stopRemovesOnlyItsSourceAndMuteDoesNotSuppressSpeech() {
var state = RadioTalkState(7).onTalk(event()).onTalk(event(node = 43))
assertEquals(setOf(42L, 43L), state.speakers)
val muted = ChatMember(42, "Alice", radioMuted = true)
assertTrue(muted.radioMuted && muted.nodeId in state.speakers)
assertSame(state, state.onTalk(event()))
state = state.onTalk(event(on = false))
assertEquals(setOf(43L), state.speakers)
assertSame(state, state.onTalk(event(on = false)))
assertTrue(state.onTalk(event(node = 43, on = false)).speakers.isEmpty())
}
@Test fun activeGroupOwnsSpeakersIndependentlyOfDisplayedMemberSnapshots() {
val group = 0xfedcba9876543210uL.toLong()
val state = RadioTalkState(group).onTalk(event(group))
assertEquals(setOf(42L), state.speakers)
assertSame(state, state.onTalk(event(group = 8)))
assertSame(state, state.onTalk(event(group = 8, on = false)))
val refreshed = ChatMember(42, "Updated", radioActive = false, radioMuted = true)
assertTrue(refreshed.nodeId in state.speakers)
val switched = RadioTalkState(8)
assertSame(switched, switched.onTalk(event(group)))
val stopped = RadioTalkState()
assertSame(stopped, stopped.onTalk(event(group)))
assertTrue(RadioTalkState(group).speakers.isEmpty())
}
@Test fun malformedEventsCannotChangeTheSpeakerState() {
assertNull(parseRadioTalkEvent(null)); assertNull(parseRadioTalkEvent(ByteArray(18)))
assertNull(parseRadioTalkEvent(ByteArray(20))); assertNull(parseRadioTalkEvent(ByteArray(19)))
val bytes = ByteBuffer.allocate(19).order(ByteOrder.LITTLE_ENDIAN).putLong(7).putLong(42).putShort(1).put(2).array()
assertNull(parseRadioTalkEvent(bytes))
bytes[18] = 1
assertEquals(1, requireNotNull(parseRadioTalkEvent(bytes)).stream)
assertEquals(65535, event().stream)
assertNull(parseRadioTalkEvent(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).putLong(0, 0).array()))
}
}