fix: stabilize native chat selection chrome

This commit is contained in:
kris
2026-03-28 08:45:20 +08:00
parent 7109f1d3db
commit d2291af32c
3 changed files with 215 additions and 28 deletions

View File

@@ -7,6 +7,7 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
@@ -82,4 +83,63 @@ public class ProjectChatUiStateTest {
public void bundleForwardMessageUsesBundleModeLabel() {
assertEquals("聊天记录", ProjectChatUiState.labelForForwardKind("forward_bundle"));
}
@Test
public void chromeStateUsesMultiSelectHeaderAndActionsWhenSelecting() {
ProjectChatUiState.SelectionState state = ProjectChatUiState.toggleSelection(null, "m1");
state = ProjectChatUiState.toggleSelection(state, "m2");
ProjectChatUiState.ChromeState chromeState =
ProjectChatUiState.resolveChromeState(state, true, "北区试产线回归", "归档确认");
assertTrue(chromeState.multiSelecting);
assertFalse(chromeState.showComposer);
assertTrue(chromeState.showMultiSelectBar);
assertFalse(chromeState.showRefresh);
assertFalse(chromeState.showHeaderAction);
assertTrue(chromeState.forwardEnabled);
assertEquals("取消", chromeState.backLabel);
assertEquals("已选 2 条", chromeState.title);
assertEquals("选择要转发的消息", chromeState.subtitle);
}
@Test
public void chromeStateUsesConversationHeaderWhenNotSelecting() {
ProjectChatUiState.ChromeState chromeState =
ProjectChatUiState.resolveChromeState(ProjectChatUiState.emptySelection(), true, "北区试产线回归", "归档确认");
assertFalse(chromeState.multiSelecting);
assertTrue(chromeState.showComposer);
assertFalse(chromeState.showMultiSelectBar);
assertTrue(chromeState.showRefresh);
assertTrue(chromeState.showHeaderAction);
assertFalse(chromeState.forwardEnabled);
assertEquals("返回", chromeState.backLabel);
assertEquals("北区试产线回归", chromeState.title);
assertEquals("归档确认", chromeState.subtitle);
}
@Test
public void reconcileSelectionDropsMessagesMissingFromRenderSet() {
ProjectChatUiState.SelectionState state = ProjectChatUiState.toggleSelection(null, "m1");
state = ProjectChatUiState.toggleSelection(state, "m2");
ProjectChatUiState.SelectionState reconciled =
ProjectChatUiState.reconcileSelection(state, List.of("m2", "m3"));
assertTrue(reconciled.multiSelecting);
assertEquals(List.of("m2"), new ArrayList<>(reconciled.selectedMessageIds));
}
@Test
public void summarizeForwardBundleTruncatesLongLastMessage() {
String summary = ProjectChatUiState.summarizeForwardBundle(
"这是一条很长很长很长的转发消息摘要,用来验证截断逻辑是否生效并避免卡片过高",
3
);
assertTrue(summary.startsWith("3 条消息 · 最后一条:"));
assertTrue(summary.endsWith(""));
assertTrue(summary.contains("这是一条很长很长很长的转发消息摘要"));
}
}