import { describe, expect, it } from 'vitest'; import { AGENT_PROCESS_PREVIEW_MAX_CHARS, agentProcessPreview, } from '../src/features/project-workspace/agentProcessPreview'; describe('思考过程单行预览模型', () => { it('去掉 Markdown 符号与链接目标,只留字面文字', () => { expect(agentProcessPreview('**Planning** 一下')).toBe('Planning 一下'); expect( agentProcessPreview( '先看 [设计文档](https://internal.example/secret) 再动手', ), ).toBe('先看 设计文档 再动手'); expect(agentProcessPreview('用 `npm run build` 验证')).toBe( '用 npm run build 验证', ); }); it('原始 HTML 不进预览(不渲染、也不当文字)', () => { expect(agentProcessPreview('')).toBe(''); expect(agentProcessPreview('图')).toBe(''); expect( agentProcessPreview('先检查\n\n\n\n再继续'), ).toBe('先检查 再继续'); // 行内 HTML 与其文字内容都不泄漏。 expect(agentProcessPreview('结果 加粗 完成')).toBe('结果 加粗 完成'); }); it('GFM 删除线按同源插件解析,波浪号不进预览', () => { // 与正文同源:删除线保留其文字(正文里也是这段字),但 `~~` 控制符不进预览。 expect(agentProcessPreview('~~删除这段~~ 保留这段')).toBe( '删除这段 保留这段', ); expect(agentProcessPreview('~~删除~~')).toBe('删除'); }); it('压成单行并按上限省略', () => { expect(agentProcessPreview('第一行\n\n第二行')).toBe('第一行 第二行'); expect(agentProcessPreview('- 第一项\n- 第二项')).toBe('第一项 第二项'); const long = 'x'.repeat(AGENT_PROCESS_PREVIEW_MAX_CHARS + 20); const preview = agentProcessPreview(long); expect(preview.endsWith('…')).toBe(true); expect(preview.length).toBeLessThanOrEqual( AGENT_PROCESS_PREVIEW_MAX_CHARS + 1, ); expect(agentProcessPreview('')).toBe(''); expect(agentProcessPreview(' ')).toBe(''); }); });