fix: tighten chat selection state invariants

This commit is contained in:
kris
2026-03-28 08:18:22 +08:00
parent c90dea4b7c
commit 42063db78f
2 changed files with 43 additions and 11 deletions

View File

@@ -1,8 +1,12 @@
package com.hyzq.boss;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import org.junit.Test;
@@ -32,8 +36,7 @@ public class ProjectChatUiStateTest {
@Test
public void deselectingLastMessageExitsMultiSelectMode() {
ProjectChatUiState.SelectionState state =
new ProjectChatUiState.SelectionState(true, java.util.Set.of("m1"));
ProjectChatUiState.SelectionState state = ProjectChatUiState.toggleSelection(null, "m1");
ProjectChatUiState.SelectionState next = ProjectChatUiState.toggleSelection(state, "m1");
assertFalse(next.multiSelecting);
assertTrue(next.selectedMessageIds.isEmpty());
@@ -41,8 +44,32 @@ public class ProjectChatUiStateTest {
@Test
public void bundleForwardRequiresAtLeastTwoMessages() {
ProjectChatUiState.SelectionState state =
new ProjectChatUiState.SelectionState(true, java.util.Set.of("m1"));
ProjectChatUiState.SelectionState state = ProjectChatUiState.toggleSelection(null, "m1");
assertFalse(ProjectChatUiState.canForwardSelection(state));
ProjectChatUiState.SelectionState next = ProjectChatUiState.toggleSelection(state, "m2");
assertTrue(ProjectChatUiState.canForwardSelection(next));
}
@Test
public void selectionPreservesInsertionOrder() {
ProjectChatUiState.SelectionState state = ProjectChatUiState.toggleSelection(null, "m2");
state = ProjectChatUiState.toggleSelection(state, "m1");
state = ProjectChatUiState.toggleSelection(state, "m3");
assertArrayEquals(
new String[] {"m2", "m1", "m3"},
new ArrayList<>(state.selectedMessageIds).toArray(new String[0])
);
}
@Test
public void toggleSelectionRejectsBlankMessageIds() {
try {
ProjectChatUiState.toggleSelection(null, " ");
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException expected) {
assertEquals("messageId must not be blank", expected.getMessage());
}
}
}