Files
life-echo/app-expo/tests/features/conversation/message-split.test.ts

60 lines
2.4 KiB
TypeScript
Raw Normal View History

import {
assistantSegmentMessageId,
lastSegmentPreview,
normalizeAssistantContentForSplit,
splitMessageParts,
splitStreamingSegments,
} from '@/features/conversation/message-split';
describe('message-split', () => {
it('splitMessageParts is case-insensitive on delimiter', () => {
expect(splitMessageParts('a [SPLIT] b')).toEqual(['a', 'b']);
expect(splitMessageParts('a [split] b')).toEqual(['a', 'b']);
expect(splitMessageParts('a [Split] b')).toEqual(['a', 'b']);
});
it('splitMessageParts handles spaces inside brackets and fullwidth brackets', () => {
expect(splitMessageParts('a [ SPLIT ] b')).toEqual(['a', 'b']);
expect(splitMessageParts('aSPLITb')).toEqual(['a', 'b']);
expect(splitMessageParts('a【SPLIT】b')).toEqual(['a', 'b']);
});
it('splitMessageParts trims and drops empty segments', () => {
expect(splitMessageParts(' x [SPLIT] y ')).toEqual(['x', 'y']);
expect(splitMessageParts('[SPLIT]only')).toEqual(['only']);
});
it('splitMessageParts splits multi-segment content as persisted / WS-joined', () => {
expect(splitMessageParts('第一段[SPLIT]第二段')).toEqual([
'第一段',
'第二段',
]);
});
it('splitMessageParts falls back to double-newline paragraphs (no [SPLIT] in DB)', () => {
const a = '太为你高兴了!在上海大剧院的舞台绽放,聚光灯下的你。';
const b =
'说到舞台,我忽然想起你黄浦江边的童年。从看着江水流淌,到在舞台上演绎别人的悲欢。';
expect(splitMessageParts(`${a}\n\n${b}`)).toEqual([a, b]);
});
it('splitStreamingSegments keeps empty tail after delimiter', () => {
expect(splitStreamingSegments('first [SPLIT]')).toEqual(['first', '']);
});
it('lastSegmentPreview uses last non-empty part', () => {
expect(lastSegmentPreview('a [SPLIT] b', 10)).toBe('b');
expect(lastSegmentPreview('hello', 3)).toBe('hel');
});
it('assistantSegmentMessageId matches WS / TTS segment binding', () => {
expect(assistantSegmentMessageId('uuid-a', 0)).toBe('uuid-a_seg_0');
expect(assistantSegmentMessageId('uuid-a', 1)).toBe('uuid-a_seg_1');
});
it('normalizeAssistantContentForSplit maps fullwidth brackets', () => {
expect(normalizeAssistantContentForSplit('x')).toBe('[x]');
expect(normalizeAssistantContentForSplit('【x】')).toBe('[x]');
});
});