42 lines
1.8 KiB
TypeScript
42 lines
1.8 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
import { createVisibleSpeechDeltaSanitizer, sanitizeVisibleSpeech } from '@/lib/chat/pi/prompts';
|
||
|
||
describe('sanitizeVisibleSpeech', () => {
|
||
it('removes bold, italic, heading, and code markers', () => {
|
||
expect(sanitizeVisibleSpeech('**重点**在这里')).toBe('重点在这里');
|
||
expect(sanitizeVisibleSpeech('这是*斜体*字')).toBe('这是斜体字');
|
||
expect(sanitizeVisibleSpeech('## 标题\n正文')).toBe('标题\n正文');
|
||
expect(sanitizeVisibleSpeech('用 `code` 表示')).toBe('用 code 表示');
|
||
});
|
||
|
||
it('strips stray markdown characters that survive paired-marker removal', () => {
|
||
expect(sanitizeVisibleSpeech('**未闭合的加粗')).toBe('未闭合的加粗');
|
||
expect(sanitizeVisibleSpeech('* 列表项')).toBe(' 列表项');
|
||
});
|
||
});
|
||
|
||
describe('createVisibleSpeechDeltaSanitizer', () => {
|
||
function runStream(deltas: string[]): string {
|
||
const sanitize = createVisibleSpeechDeltaSanitizer();
|
||
return deltas.map((delta) => sanitize(delta)).join('');
|
||
}
|
||
|
||
it('removes bold markers even when ** is split across streamed deltas', () => {
|
||
const output = runStream(['这是', '**重', '点**', '内容']);
|
||
expect(output).toBe('这是重点内容');
|
||
expect(output).not.toContain('*');
|
||
});
|
||
|
||
it('never emits a leading marker before its closing pair arrives', () => {
|
||
const sanitize = createVisibleSpeechDeltaSanitizer();
|
||
// The opening "**" alone must not leak into visible speech.
|
||
expect(sanitize('**')).not.toContain('*');
|
||
expect(sanitize('关键')).toBe('关键');
|
||
expect(sanitize('**')).not.toContain('*');
|
||
});
|
||
|
||
it('passes plain streamed text through unchanged', () => {
|
||
expect(runStream(['你好', ',', '世界'])).toBe('你好,世界');
|
||
});
|
||
});
|