android: add message action state machine core
Some checks failed
CI / test (push) Has been cancelled
Some checks failed
CI / test (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
package ru.daemonlord.messenger.ui.chat
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import ru.daemonlord.messenger.domain.message.model.MessageItem
|
||||
|
||||
class MessageActionStateTest {
|
||||
|
||||
@Test
|
||||
fun selectSingle_setsSingleModeAndIntents() {
|
||||
val message = message(id = 1L)
|
||||
val state = MessageActionState().selectSingle(
|
||||
message = message,
|
||||
canEdit = true,
|
||||
canDeleteForAll = true,
|
||||
)
|
||||
|
||||
assertEquals(MessageSelectionMode.SINGLE, state.mode)
|
||||
assertEquals(setOf(1L), state.selectedMessageIds)
|
||||
assertEquals(1L, state.focusedMessageId)
|
||||
assertTrue(state.availableIntents.contains(MessageActionIntent.REPLY))
|
||||
assertTrue(state.availableIntents.contains(MessageActionIntent.EDIT))
|
||||
assertTrue(state.availableIntents.contains(MessageActionIntent.DELETE_FOR_ALL))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun selectMulti_setsMultiModeAndBulkIntent() {
|
||||
val state = MessageActionState().selectMulti(
|
||||
selectedIds = setOf(10L, 11L),
|
||||
focusedMessageId = 11L,
|
||||
)
|
||||
|
||||
assertEquals(MessageSelectionMode.MULTI, state.mode)
|
||||
assertEquals(2, state.selectedCount)
|
||||
assertEquals(11L, state.focusedMessageId)
|
||||
assertTrue(state.availableIntents.contains(MessageActionIntent.FORWARD_BULK))
|
||||
assertTrue(state.availableIntents.contains(MessageActionIntent.DELETE_FOR_ME))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun clearSelection_resetsState() {
|
||||
val state = MessageActionState(
|
||||
mode = MessageSelectionMode.MULTI,
|
||||
selectedMessageIds = setOf(1L, 2L),
|
||||
focusedMessageId = 2L,
|
||||
availableIntents = setOf(MessageActionIntent.FORWARD_BULK),
|
||||
).clearSelection()
|
||||
|
||||
assertEquals(MessageSelectionMode.NONE, state.mode)
|
||||
assertTrue(state.selectedMessageIds.isEmpty())
|
||||
assertEquals(null, state.focusedMessageId)
|
||||
assertTrue(state.availableIntents.isEmpty())
|
||||
}
|
||||
|
||||
private fun message(id: Long): MessageItem {
|
||||
return MessageItem(
|
||||
id = id,
|
||||
chatId = 1L,
|
||||
senderId = 1L,
|
||||
senderDisplayName = null,
|
||||
type = "text",
|
||||
text = "hi",
|
||||
createdAt = "2026-03-09T10:00:00Z",
|
||||
updatedAt = null,
|
||||
isOutgoing = true,
|
||||
status = "sent",
|
||||
replyToMessageId = null,
|
||||
forwardedFromMessageId = null,
|
||||
attachmentWaveform = null,
|
||||
attachments = emptyList(),
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user