3 changed files with 58 additions and 0 deletions
@ -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())) |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue